Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-05-03 04:10:19

0001 #include "TauAnalysis/MCEmbeddingTools/plugins/DoubleCollectionMerger.h"
0002 #include "FWCore/Framework/interface/MakerMacros.h"
0003 
0004 #include "DataFormats/Common/interface/SortedCollection.h"
0005 
0006 #include "DataFormats/EcalDigi/interface/EBSrFlag.h"
0007 #include "DataFormats/EcalDigi/interface/EESrFlag.h"
0008 #include "DataFormats/EcalDigi/interface/EcalSrFlag.h"
0009 #include "DataFormats/HcalDigi/interface/HcalDigiCollections.h"
0010 
0011 #include "DataFormats/Common/interface/OwnVector.h"
0012 #include "DataFormats/Common/interface/RangeMap.h"
0013 
0014 typedef DoubleCollectionMerger<edm::SortedCollection<EESrFlag>, EESrFlag, edm::SortedCollection<EBSrFlag>, EBSrFlag>
0015     EcalSrFlagColMerger;
0016 typedef DoubleCollectionMerger<HBHEDigiCollection, HBHEDataFrame, HcalCalibDigiCollection, HcalCalibDataFrame>
0017     HcalDigiColMerger;
0018 
0019 template <typename T1, typename T2, typename T3, typename T4>
0020 DoubleCollectionMerger<T1, T2, T3, T4>::DoubleCollectionMerger(const edm::ParameterSet &iConfig) {
0021   std::vector<edm::InputTag> inCollections = iConfig.getParameter<std::vector<edm::InputTag>>("mergCollections");
0022   for (auto const &inCollection : inCollections) {
0023     inputs1_[inCollection.instance()].push_back(consumes<MergeCollection1>(inCollection));
0024     inputs2_[inCollection.instance()].push_back(consumes<MergeCollection2>(inCollection));
0025   }
0026   for (const auto &toproduce : inputs1_) {
0027     produces<MergeCollection1>(toproduce.first);
0028   }
0029   for (const auto &toproduce : inputs2_) {
0030     produces<MergeCollection2>(toproduce.first);
0031   }
0032 }
0033 
0034 template <typename T1, typename T2, typename T3, typename T4>
0035 DoubleCollectionMerger<T1, T2, T3, T4>::~DoubleCollectionMerger() {
0036   // nothing to be done yet...
0037 }
0038 
0039 template <typename T1, typename T2, typename T3, typename T4>
0040 void DoubleCollectionMerger<T1, T2, T3, T4>::produce(edm::Event &iEvent, const edm::EventSetup &iSetup) {
0041   for (auto input_ : inputs1_) {
0042     std::unique_ptr<MergeCollection1> output(new MergeCollection1());
0043     std::vector<edm::Handle<MergeCollection1>> inputCollections;
0044     inputCollections.resize(input_.second.size());
0045     for (unsigned id = 0; id < input_.second.size(); id++) {
0046       iEvent.getByToken(input_.second[id], inputCollections[id]);
0047     }
0048     fill_output_obj(output, inputCollections);
0049     iEvent.put(std::move(output), input_.first);
0050   }
0051 
0052   for (auto input_ : inputs2_) {
0053     std::unique_ptr<MergeCollection2> output(new MergeCollection2());
0054     std::vector<edm::Handle<MergeCollection2>> inputCollections;
0055     inputCollections.resize(input_.second.size());
0056     for (unsigned id = 0; id < input_.second.size(); id++) {
0057       iEvent.getByToken(input_.second[id], inputCollections[id]);
0058     }
0059     fill_output_obj(output, inputCollections);
0060     iEvent.put(std::move(output), input_.first);
0061   }
0062 }
0063 
0064 template <typename T1, typename T2, typename T3, typename T4>
0065 void DoubleCollectionMerger<T1, T2, T3, T4>::fill_output_obj(
0066     std::unique_ptr<MergeCollection1> &output, std::vector<edm::Handle<MergeCollection1>> &inputCollections) {
0067   assert(0);
0068 }
0069 
0070 template <typename T1, typename T2, typename T3, typename T4>
0071 void DoubleCollectionMerger<T1, T2, T3, T4>::fill_output_obj(
0072     std::unique_ptr<MergeCollection2> &output, std::vector<edm::Handle<MergeCollection2>> &inputCollections) {
0073   assert(0);
0074 }
0075 
0076 template <typename T1, typename T2, typename T3, typename T4>
0077 void DoubleCollectionMerger<T1, T2, T3, T4>::fill_output_obj_digiflag(
0078     std::unique_ptr<MergeCollection1> &output, std::vector<edm::Handle<MergeCollection1>> &inputCollections) {
0079   std::map<uint32_t, BaseHit1> output_map;
0080 
0081   // First merge the two collections again
0082   for (auto const &inputCollection : inputCollections) {
0083     for (typename MergeCollection1::const_iterator obj = inputCollection->begin(); obj != inputCollection->end();
0084          ++obj) {
0085       DetId detIdObject(obj->id().rawId());
0086 
0087       std::map<uint32_t, EESrFlag>::iterator it = output_map.find(detIdObject.rawId());
0088       if (it == output_map.end()) {
0089         BaseHit1 *akt_flag_obj = &output_map[detIdObject.rawId()];
0090         const T2 &newSrFlag(*obj);
0091         *akt_flag_obj = newSrFlag;
0092       } else {
0093         // re-determine flag
0094         BaseHit1 preFlag = it->second;
0095         BaseHit1 *akt_flag_obj = &output_map[detIdObject.rawId()];
0096         T2 newSrFlag(*obj);
0097 
0098         newSrFlag.setValue(std::max(obj->value(), preFlag.value()));
0099         if (preFlag.value() == 3 or obj->value() == 3)
0100           newSrFlag.setValue(3);
0101         if (preFlag.value() == 7 or obj->value() == 7)
0102           newSrFlag.setValue(7);
0103 
0104         *akt_flag_obj = newSrFlag;
0105       }
0106     }
0107   }
0108 
0109   // Now save it into the standard CMSSW format
0110   for (typename std::map<uint32_t, BaseHit1>::const_iterator outFlags = output_map.begin();
0111        outFlags != output_map.end();
0112        ++outFlags) {
0113     BaseHit1 currFlag = outFlags->second;
0114     output->push_back(outFlags->second);
0115   }
0116   output->sort();  // Do a sort for this collection
0117 }
0118 
0119 template <typename T1, typename T2, typename T3, typename T4>
0120 void DoubleCollectionMerger<T1, T2, T3, T4>::fill_output_obj_digiflag(
0121     std::unique_ptr<MergeCollection2> &output, std::vector<edm::Handle<MergeCollection2>> &inputCollections) {
0122   std::map<uint32_t, BaseHit2> output_map;
0123 
0124   // First merge the two collections again
0125   for (auto const &inputCollection : inputCollections) {
0126     for (typename MergeCollection2::const_iterator obj = inputCollection->begin(); obj != inputCollection->end();
0127          ++obj) {
0128       DetId detIdObject(obj->id().rawId());
0129 
0130       std::map<uint32_t, EBSrFlag>::iterator it = output_map.find(detIdObject.rawId());
0131       if (it == output_map.end()) {
0132         BaseHit2 *akt_flag_obj = &output_map[detIdObject.rawId()];
0133         const T4 &newSrFlag(*obj);
0134         *akt_flag_obj = newSrFlag;
0135       } else {
0136         // re-determine flag
0137         BaseHit2 preFlag = it->second;
0138         BaseHit2 *akt_flag_obj = &output_map[detIdObject.rawId()];
0139         T4 newSrFlag(*obj);
0140 
0141         newSrFlag.setValue(std::max(obj->value(), preFlag.value()));
0142         if (preFlag.value() == 3 or obj->value() == 3)
0143           newSrFlag.setValue(3);
0144         if (preFlag.value() == 7 or obj->value() == 7)
0145           newSrFlag.setValue(7);
0146 
0147         *akt_flag_obj = newSrFlag;
0148       }
0149     }
0150   }
0151 
0152   // Now save it into the standard CMSSW format
0153   for (typename std::map<uint32_t, BaseHit2>::const_iterator outFlags = output_map.begin();
0154        outFlags != output_map.end();
0155        ++outFlags) {
0156     BaseHit2 currFlag = outFlags->second;
0157     output->push_back(outFlags->second);
0158   }
0159   output->sort();  // Do a sort for this collection
0160 }
0161 
0162 template <typename T1, typename T2, typename T3, typename T4>
0163 void DoubleCollectionMerger<T1, T2, T3, T4>::fill_output_obj_hcaldigi(
0164     std::unique_ptr<MergeCollection1> &output, std::vector<edm::Handle<MergeCollection1>> &inputCollections) {
0165   // TODO: implement proper merging, only skeleton for the time-being
0166   return;
0167 }
0168 
0169 template <typename T1, typename T2, typename T3, typename T4>
0170 void DoubleCollectionMerger<T1, T2, T3, T4>::fill_output_obj_hcaldigi(
0171     std::unique_ptr<MergeCollection2> &output, std::vector<edm::Handle<MergeCollection2>> &inputCollections) {
0172   // TODO: implement proper merging, only skeleton for the time-being
0173   return;
0174 }
0175 
0176 template <>
0177 void DoubleCollectionMerger<edm::SortedCollection<EESrFlag>, EESrFlag, edm::SortedCollection<EBSrFlag>, EBSrFlag>::
0178     fill_output_obj(std::unique_ptr<MergeCollection1> &output,
0179                     std::vector<edm::Handle<MergeCollection1>> &inputCollections) {
0180   fill_output_obj_digiflag(output, inputCollections);
0181 }
0182 
0183 template <>
0184 void DoubleCollectionMerger<edm::SortedCollection<EESrFlag>, EESrFlag, edm::SortedCollection<EBSrFlag>, EBSrFlag>::
0185     fill_output_obj(std::unique_ptr<MergeCollection2> &output,
0186                     std::vector<edm::Handle<MergeCollection2>> &inputCollections) {
0187   fill_output_obj_digiflag(output, inputCollections);
0188 }
0189 
0190 template <>
0191 void DoubleCollectionMerger<HBHEDigiCollection, HBHEDataFrame, HcalCalibDigiCollection, HcalCalibDataFrame>::
0192     fill_output_obj(std::unique_ptr<MergeCollection1> &output,
0193                     std::vector<edm::Handle<MergeCollection1>> &inputCollections) {
0194   fill_output_obj_hcaldigi(output, inputCollections);
0195 }
0196 
0197 template <>
0198 void DoubleCollectionMerger<HBHEDigiCollection, HBHEDataFrame, HcalCalibDigiCollection, HcalCalibDataFrame>::
0199     fill_output_obj(std::unique_ptr<MergeCollection2> &output,
0200                     std::vector<edm::Handle<MergeCollection2>> &inputCollections) {
0201   fill_output_obj_hcaldigi(output, inputCollections);
0202 }
0203 
0204 DEFINE_FWK_MODULE(EcalSrFlagColMerger);
0205 DEFINE_FWK_MODULE(HcalDigiColMerger);