File indexing completed on 2024-05-02 05:10:04
0001 #include "TauAnalysis/MCEmbeddingTools/plugins/CollectionMerger.h"
0002 #include "FWCore/Framework/interface/MakerMacros.h"
0003
0004 #include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h"
0005 #include "DataFormats/SiStripCluster/interface/SiStripCluster.h"
0006
0007 #include "DataFormats/Common/interface/SortedCollection.h"
0008 #include "DataFormats/EcalRecHit/interface/EcalRecHit.h"
0009
0010 #include "DataFormats/EgammaReco/interface/SuperCluster.h"
0011 #include "DataFormats/EgammaReco/interface/SuperClusterFwd.h"
0012
0013 #include "DataFormats/ParticleFlowReco/interface/PFCluster.h"
0014 #include "DataFormats/ParticleFlowReco/interface/PFClusterFwd.h"
0015
0016 #include "DataFormats/CaloRecHit/interface/CaloCluster.h"
0017
0018 #include "DataFormats/DTRecHit/interface/DTRecHit1DPair.h"
0019 #include "DataFormats/DTRecHit/interface/DTSLRecCluster.h"
0020 #include "DataFormats/MuonDetId/interface/DTLayerId.h"
0021
0022 #include "DataFormats/CSCRecHit/interface/CSCRecHit2D.h"
0023 #include "DataFormats/HcalRecHit/interface/ZDCRecHit.h"
0024 #include "DataFormats/MuonDetId/interface/CSCDetId.h"
0025 #include "DataFormats/MuonDetId/interface/RPCDetId.h"
0026 #include "DataFormats/RPCRecHit/interface/RPCRecHit.h"
0027
0028 #include "DataFormats/TrackReco/interface/Track.h"
0029 #include "DataFormats/TrackReco/interface/TrackFwd.h"
0030 #include "DataFormats/TrackReco/interface/TrackToTrackMap.h"
0031
0032 #include "DataFormats/EgammaReco/interface/ElectronSeed.h"
0033 #include "DataFormats/ParticleFlowReco/interface/PreId.h"
0034
0035 #include "DataFormats/TrajectorySeed/interface/TrajectorySeed.h"
0036
0037 #include "DataFormats/EgammaCandidates/interface/Conversion.h"
0038
0039 #include "DataFormats/Candidate/interface/VertexCompositeCandidate.h"
0040 #include "DataFormats/VertexReco/interface/Vertex.h"
0041
0042 #include "DataFormats/Common/interface/OwnVector.h"
0043 #include "DataFormats/Common/interface/RangeMap.h"
0044
0045 typedef CollectionMerger<edmNew::DetSetVector<SiPixelCluster>, SiPixelCluster> PixelColMerger;
0046 typedef CollectionMerger<edmNew::DetSetVector<SiStripCluster>, SiStripCluster> StripColMerger;
0047
0048 typedef CollectionMerger<std::vector<reco::ElectronSeed>, reco::ElectronSeed> ElectronSeedColMerger;
0049 typedef CollectionMerger<std::vector<reco::ElectronSeed>, reco::ElectronSeed> EcalDrivenElectronSeedColMerger;
0050 typedef CollectionMerger<edm::SortedCollection<EcalRecHit>, EcalRecHit> EcalRecHitColMerger;
0051 typedef CollectionMerger<edm::SortedCollection<HBHERecHit>, HBHERecHit> HBHERecHitColMerger;
0052 typedef CollectionMerger<edm::SortedCollection<HFRecHit>, HFRecHit> HFRecHitColMerger;
0053 typedef CollectionMerger<edm::SortedCollection<HORecHit>, HORecHit> HORecHitColMerger;
0054 typedef CollectionMerger<edm::SortedCollection<ZDCRecHit>, ZDCRecHit> ZDCRecHitColMerger;
0055
0056 typedef CollectionMerger<edm::RangeMap<DTLayerId, edm::OwnVector<DTRecHit1DPair>>, DTRecHit1DPair> DTRecHitColMerger;
0057 typedef CollectionMerger<edm::RangeMap<CSCDetId, edm::OwnVector<CSCRecHit2D>>, CSCRecHit2D> CSCRecHitColMerger;
0058 typedef CollectionMerger<edm::RangeMap<RPCDetId, edm::OwnVector<RPCRecHit>>, RPCRecHit> RPCRecHitColMerger;
0059
0060 template <typename T1, typename T2>
0061 CollectionMerger<T1, T2>::CollectionMerger(const edm::ParameterSet &iConfig) {
0062 std::vector<edm::InputTag> inCollections = iConfig.getParameter<std::vector<edm::InputTag>>("mergCollections");
0063 for (auto const &inCollection : inCollections) {
0064 inputs_[inCollection.instance()].push_back(consumes<MergeCollection>(inCollection));
0065 }
0066 willconsume(iConfig);
0067 for (const auto &toproduce : inputs_) {
0068 std::string alias(iConfig.getParameter<std::string>("@module_label"));
0069 willproduce(toproduce.first, alias);
0070 }
0071 }
0072
0073 template <typename T1, typename T2>
0074 CollectionMerger<T1, T2>::~CollectionMerger() {
0075
0076 }
0077
0078 template <typename T1, typename T2>
0079 void CollectionMerger<T1, T2>::produce(edm::Event &iEvent, const edm::EventSetup &iSetup) {
0080 for (auto input_ : inputs_) {
0081 std::unique_ptr<MergeCollection> output(new MergeCollection());
0082 std::vector<edm::Handle<MergeCollection>> inputCollections;
0083 inputCollections.resize(input_.second.size());
0084 for (unsigned id = 0; id < input_.second.size(); id++) {
0085 iEvent.getByToken(input_.second[id], inputCollections[id]);
0086 }
0087 fill_output_obj(iEvent, output, inputCollections);
0088 iEvent.put(std::move(output), input_.first);
0089 }
0090 }
0091
0092 template <typename T1, typename T2>
0093 void CollectionMerger<T1, T2>::willconsume(const edm::ParameterSet &iConfig) {}
0094
0095 template <typename T1, typename T2>
0096 void CollectionMerger<T1, T2>::willproduce(std::string instance, std::string alias) {
0097 produces<MergeCollection>(instance);
0098 }
0099
0100
0101 template <typename T1, typename T2>
0102 void CollectionMerger<T1, T2>::fill_output_obj_tracker(std::unique_ptr<MergeCollection> &output,
0103 std::vector<edm::Handle<MergeCollection>> &inputCollections,
0104 bool print_pixel) {
0105 std::map<uint32_t, std::vector<BaseHit>> output_map;
0106
0107 for (auto const &inputCollection : inputCollections) {
0108 for (typename MergeCollection::const_iterator clustSet = inputCollection->begin();
0109 clustSet != inputCollection->end();
0110 ++clustSet) {
0111 DetId detIdObject(clustSet->detId());
0112 for (typename edmNew::DetSet<BaseHit>::const_iterator clustIt = clustSet->begin(); clustIt != clustSet->end();
0113 ++clustIt) {
0114 output_map[detIdObject.rawId()].push_back(*clustIt);
0115 }
0116 }
0117 }
0118
0119 for (typename std::map<uint32_t, std::vector<BaseHit>>::const_iterator outHits = output_map.begin();
0120 outHits != output_map.end();
0121 ++outHits) {
0122 DetId detIdObject(outHits->first);
0123 typename MergeCollection::FastFiller spc(*output, detIdObject);
0124 for (const auto &Hit : outHits->second) {
0125 spc.push_back(Hit);
0126 }
0127 }
0128 }
0129
0130 template <typename T1, typename T2>
0131 void CollectionMerger<T1, T2>::fill_output_obj_calo(std::unique_ptr<MergeCollection> &output,
0132 std::vector<edm::Handle<MergeCollection>> &inputCollections) {
0133 std::map<uint32_t, BaseHit> output_map;
0134
0135 for (auto const &inputCollection : inputCollections) {
0136 for (typename MergeCollection::const_iterator recHit = inputCollection->begin(); recHit != inputCollection->end();
0137 ++recHit) {
0138 DetId detIdObject(recHit->detid().rawId());
0139 T2 *akt_calo_obj = &output_map[detIdObject.rawId()];
0140 float new_energy = akt_calo_obj->energy() + recHit->energy();
0141 T2 newRecHit(*recHit);
0142 newRecHit.setEnergy(new_energy);
0143 *akt_calo_obj = newRecHit;
0144 }
0145 }
0146
0147 for (typename std::map<uint32_t, BaseHit>::const_iterator outHits = output_map.begin(); outHits != output_map.end();
0148 ++outHits) {
0149 output->push_back(outHits->second);
0150 }
0151 output->sort();
0152 }
0153
0154
0155 template <typename T1, typename T2>
0156 void CollectionMerger<T1, T2>::fill_output_obj_muonchamber(
0157 std::unique_ptr<MergeCollection> &output, std::vector<edm::Handle<MergeCollection>> &inputCollections) {
0158 std::map<uint32_t, std::vector<BaseHit>> output_map;
0159
0160 for (auto const &inputCollection : inputCollections) {
0161 for (typename MergeCollection::const_iterator recHit = inputCollection->begin(); recHit != inputCollection->end();
0162 ++recHit) {
0163 DetId detIdObject(recHit->geographicalId());
0164 output_map[detIdObject].push_back(*recHit);
0165 }
0166 }
0167
0168 for (typename std::map<uint32_t, std::vector<BaseHit>>::const_iterator outHits = output_map.begin();
0169 outHits != output_map.end();
0170 ++outHits) {
0171 output->put((typename T1::id_iterator::value_type)outHits->first,
0172 outHits->second.begin(),
0173 outHits->second.end());
0174 }
0175 }
0176
0177
0178
0179 template <>
0180 void CollectionMerger<std::vector<reco::ElectronSeed>, reco::ElectronSeed>::willconsume(
0181 const edm::ParameterSet &iConfig) {
0182
0183 inputs_fixtrackrefs_ = consumes<TrackToTrackMapnew>(edm::InputTag("generalTracks"));
0184 inputs_fixtrackcol_ = consumes<reco::TrackCollection>(edm::InputTag("generalTracks"));
0185
0186
0187 inputs_scEB_ = consumes<reco::SuperClusterCollection>(
0188 edm::InputTag("particleFlowSuperClusterECAL:particleFlowSuperClusterECALBarrel"));
0189 inputs_scEE_ = consumes<reco::SuperClusterCollection>(
0190 edm::InputTag("particleFlowSuperClusterECAL:particleFlowSuperClusterECALEndcapWithPreshower"));
0191 }
0192
0193 template <>
0194 void CollectionMerger<std::vector<reco::ElectronSeed>, reco::ElectronSeed>::willproduce(std::string instance,
0195 std::string alias) {
0196 produces<MergeCollection>(instance);
0197 }
0198
0199 template <typename T1, typename T2>
0200 void CollectionMerger<T1, T2>::fill_output_obj_seed(edm::Event &iEvent,
0201 std::unique_ptr<MergeCollection> &output,
0202 std::vector<edm::Handle<MergeCollection>> &inputCollections) {
0203
0204 edm::Handle<TrackToTrackMapnew> track_ref_map;
0205 iEvent.getByToken(inputs_fixtrackrefs_, track_ref_map);
0206
0207 edm::Handle<reco::TrackCollection> track_new_col;
0208 iEvent.getByToken(inputs_fixtrackcol_, track_new_col);
0209 std::map<reco::TrackRef, reco::TrackRef> simple_track_to_track_map;
0210 for (unsigned abc = 0; abc < track_new_col->size(); ++abc) {
0211 reco::TrackRef trackRef(track_new_col, abc);
0212 simple_track_to_track_map[((*track_ref_map)[trackRef])[0]] = trackRef;
0213 }
0214
0215
0216 edm::Handle<reco::SuperClusterCollection> scEB;
0217 iEvent.getByToken(inputs_scEB_, scEB);
0218 auto bScEB = scEB->cbegin();
0219 auto eScEB = scEB->cend();
0220
0221
0222 edm::Handle<reco::SuperClusterCollection> scEE;
0223 iEvent.getByToken(inputs_scEE_, scEE);
0224 auto bScEE = scEE->cbegin();
0225 auto eScEE = scEE->cend();
0226
0227
0228 for (auto const &inputCollection : inputCollections) {
0229 for (typename MergeCollection::const_iterator seed = inputCollection->begin(); seed != inputCollection->end();
0230 ++seed) {
0231 T2 newSeed(*seed);
0232
0233
0234 if (seed->isEcalDriven()) {
0235 const reco::ElectronSeed::CaloClusterRef &seedCcRef(seed->caloCluster());
0236 if (seedCcRef.isNonnull()) {
0237
0238 float dx, dy, dz, dr;
0239 float drMin = std::numeric_limits<float>::infinity();
0240 reco::ElectronSeed::CaloClusterRef ccRefMin;
0241 for (auto sc = bScEB; sc != eScEB; ++sc) {
0242 const reco::SuperClusterRef &scRef(reco::SuperClusterRef(scEB, std::distance(bScEB, sc)));
0243 dx = fabs(scRef->x() - seedCcRef->x());
0244 dy = fabs(scRef->y() - seedCcRef->y());
0245 dz = fabs(scRef->z() - seedCcRef->z());
0246 dr = sqrt(dx * dx + dy * dy + dz * dz);
0247 if (dr < drMin) {
0248 drMin = dr;
0249 ccRefMin = reco::ElectronSeed::CaloClusterRef(scRef);
0250 }
0251 }
0252 for (auto sc = bScEE; sc != eScEE; ++sc) {
0253 const reco::SuperClusterRef &scRef(reco::SuperClusterRef(scEE, std::distance(bScEE, sc)));
0254 dx = fabs(scRef->x() - seedCcRef->x());
0255 dy = fabs(scRef->y() - seedCcRef->y());
0256 dz = fabs(scRef->z() - seedCcRef->z());
0257 dr = sqrt(dx * dx + dy * dy + dz * dz);
0258 if (dr < drMin) {
0259 drMin = dr;
0260 ccRefMin = reco::ElectronSeed::CaloClusterRef(scRef);
0261 }
0262 }
0263
0264 if (drMin < 10.0) {
0265 newSeed.setCaloCluster(ccRefMin);
0266 }
0267 }
0268 }
0269 if (seed->isTrackerDriven()) {
0270 const reco::ElectronSeed::CtfTrackRef &ctfTrackRef(seed->ctfTrack());
0271 if (ctfTrackRef.isNonnull()) {
0272 newSeed.setCtfTrack(simple_track_to_track_map[ctfTrackRef]);
0273 }
0274 }
0275 output->push_back(newSeed);
0276 }
0277 }
0278 }
0279
0280
0281 template <typename T1, typename T2>
0282 void CollectionMerger<T1, T2>::fill_output_obj(edm::Event &iEvent,
0283 std::unique_ptr<MergeCollection> &output,
0284 std::vector<edm::Handle<MergeCollection>> &inputCollections) {
0285 assert(0);
0286 }
0287
0288
0289 template <>
0290 void CollectionMerger<edmNew::DetSetVector<SiPixelCluster>, SiPixelCluster>::fill_output_obj(
0291 edm::Event &iEvent,
0292 std::unique_ptr<MergeCollection> &output,
0293 std::vector<edm::Handle<MergeCollection>> &inputCollections) {
0294 fill_output_obj_tracker(output, inputCollections, true);
0295 }
0296
0297 template <>
0298 void CollectionMerger<edmNew::DetSetVector<SiStripCluster>, SiStripCluster>::fill_output_obj(
0299 edm::Event &iEvent,
0300 std::unique_ptr<MergeCollection> &output,
0301 std::vector<edm::Handle<MergeCollection>> &inputCollections) {
0302 fill_output_obj_tracker(output, inputCollections);
0303 }
0304
0305 template <>
0306 void CollectionMerger<edm::SortedCollection<EcalRecHit>, EcalRecHit>::fill_output_obj(
0307 edm::Event &iEvent,
0308 std::unique_ptr<MergeCollection> &output,
0309 std::vector<edm::Handle<MergeCollection>> &inputCollections) {
0310 fill_output_obj_calo(output, inputCollections);
0311 }
0312
0313 template <>
0314 void CollectionMerger<edm::SortedCollection<HBHERecHit>, HBHERecHit>::fill_output_obj(
0315 edm::Event &iEvent,
0316 std::unique_ptr<MergeCollection> &output,
0317 std::vector<edm::Handle<MergeCollection>> &inputCollections) {
0318 fill_output_obj_calo(output, inputCollections);
0319 }
0320
0321 template <>
0322 void CollectionMerger<edm::SortedCollection<HFRecHit>, HFRecHit>::fill_output_obj(
0323 edm::Event &iEvent,
0324 std::unique_ptr<MergeCollection> &output,
0325 std::vector<edm::Handle<MergeCollection>> &inputCollections) {
0326 fill_output_obj_calo(output, inputCollections);
0327 }
0328
0329 template <>
0330 void CollectionMerger<edm::SortedCollection<HORecHit>, HORecHit>::fill_output_obj(
0331 edm::Event &iEvent,
0332 std::unique_ptr<MergeCollection> &output,
0333 std::vector<edm::Handle<MergeCollection>> &inputCollections) {
0334 fill_output_obj_calo(output, inputCollections);
0335 }
0336
0337 template <>
0338 void CollectionMerger<edm::SortedCollection<ZDCRecHit>, ZDCRecHit>::fill_output_obj(
0339 edm::Event &iEvent,
0340 std::unique_ptr<MergeCollection> &output,
0341 std::vector<edm::Handle<MergeCollection>> &inputCollections) {
0342 fill_output_obj_calo(output, inputCollections);
0343 }
0344
0345 template <>
0346 void CollectionMerger<edm::RangeMap<DTLayerId, edm::OwnVector<DTRecHit1DPair>>, DTRecHit1DPair>::fill_output_obj(
0347 edm::Event &iEvent,
0348 std::unique_ptr<MergeCollection> &output,
0349 std::vector<edm::Handle<MergeCollection>> &inputCollections) {
0350 fill_output_obj_muonchamber(output, inputCollections);
0351 }
0352
0353 template <>
0354 void CollectionMerger<edm::RangeMap<CSCDetId, edm::OwnVector<CSCRecHit2D>>, CSCRecHit2D>::fill_output_obj(
0355 edm::Event &iEvent,
0356 std::unique_ptr<MergeCollection> &output,
0357 std::vector<edm::Handle<MergeCollection>> &inputCollections) {
0358 fill_output_obj_muonchamber(output, inputCollections);
0359 }
0360
0361 template <>
0362 void CollectionMerger<edm::RangeMap<RPCDetId, edm::OwnVector<RPCRecHit>>, RPCRecHit>::fill_output_obj(
0363 edm::Event &iEvent,
0364 std::unique_ptr<MergeCollection> &output,
0365 std::vector<edm::Handle<MergeCollection>> &inputCollections) {
0366 fill_output_obj_muonchamber(output, inputCollections);
0367 }
0368
0369 template <>
0370 void CollectionMerger<std::vector<reco::ElectronSeed>, reco::ElectronSeed>::fill_output_obj(
0371 edm::Event &iEvent,
0372 std::unique_ptr<MergeCollection> &output,
0373 std::vector<edm::Handle<MergeCollection>> &inputCollections) {
0374 fill_output_obj_seed(iEvent, output, inputCollections);
0375 }
0376
0377 DEFINE_FWK_MODULE(PixelColMerger);
0378 DEFINE_FWK_MODULE(StripColMerger);
0379
0380 DEFINE_FWK_MODULE(ElectronSeedColMerger);
0381 DEFINE_FWK_MODULE(EcalDrivenElectronSeedColMerger);
0382
0383 DEFINE_FWK_MODULE(EcalRecHitColMerger);
0384 DEFINE_FWK_MODULE(HBHERecHitColMerger);
0385 DEFINE_FWK_MODULE(HFRecHitColMerger);
0386 DEFINE_FWK_MODULE(HORecHitColMerger);
0387 DEFINE_FWK_MODULE(ZDCRecHitColMerger);
0388
0389 DEFINE_FWK_MODULE(DTRecHitColMerger);
0390 DEFINE_FWK_MODULE(CSCRecHitColMerger);
0391 DEFINE_FWK_MODULE(RPCRecHitColMerger);