File indexing completed on 2024-04-06 12:30:46
0001 #include "DataFormats/Common/interface/Handle.h"
0002 #include "SimDataFormats/Associations/interface/TrackAssociation.h"
0003 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0004 #include "SimMuon/MCTruth/plugins/MuonAssociatorEDProducer.h"
0005 #include <memory>
0006
0007 MuonAssociatorEDProducer::MuonAssociatorEDProducer(const edm::ParameterSet &parset)
0008 : tracksTag(parset.getParameter<edm::InputTag>("tracksTag")),
0009 tpTag(parset.getParameter<edm::InputTag>("tpTag")),
0010 tpRefVector(parset.getParameter<bool>("tpRefVector")),
0011 ignoreMissingTrackCollection(parset.getUntrackedParameter<bool>("ignoreMissingTrackCollection", false)),
0012 parset_(parset) {
0013 edm::LogVerbatim("MuonAssociatorEDProducer") << "constructing MuonAssociatorEDProducer";
0014 produces<reco::RecoToSimCollection>();
0015 produces<reco::SimToRecoCollection>();
0016 if (tpRefVector)
0017 tpRefVectorToken_ = consumes<TrackingParticleRefVector>(tpTag);
0018 else
0019 tpToken_ = consumes<TrackingParticleCollection>(tpTag);
0020 tracksToken_ = consumes<edm::View<reco::Track>>(tracksTag);
0021
0022
0023 LogTrace("MuonAssociatorEDProducer") << "constructing MuonAssociatorByHits" << parset_.dump();
0024 edm::LogVerbatim("MuonAssociatorEDProducer") << "\n MuonAssociatorByHits will associate reco::Tracks with "
0025 << tracksTag << "\n\t\t and TrackingParticles with " << tpTag;
0026 const std::string recoTracksLabel = tracksTag.label();
0027
0028
0029
0030 if (recoTracksLabel == "seedsOfSTAmuons" || recoTracksLabel == "standAloneMuons" ||
0031 recoTracksLabel == "refittedStandAloneMuons" || recoTracksLabel == "seedsOfDisplacedSTAmuons" ||
0032 recoTracksLabel == "displacedStandAloneMuons" || recoTracksLabel == "cosmicMuons" ||
0033 recoTracksLabel == "cosmicMuons1Leg" || recoTracksLabel == "hltL2Muons") {
0034 if (parset_.getParameter<bool>("UseTracker")) {
0035 edm::LogWarning("MuonAssociatorEDProducer")
0036 << "\n*** WARNING : inconsistent input tracksTag = " << tracksTag << "\n with UseTracker = true"
0037 << "\n ---> setting UseTracker = false ";
0038 parset_.addParameter<bool>("UseTracker", false);
0039 }
0040 if (!parset_.getParameter<bool>("UseMuon")) {
0041 edm::LogWarning("MuonAssociatorEDProducer")
0042 << "\n*** WARNING : inconsistent input tracksTag = " << tracksTag << "\n with UseMuon = false"
0043 << "\n ---> setting UseMuon = true ";
0044 parset_.addParameter<bool>("UseMuon", true);
0045 }
0046 }
0047
0048 if (recoTracksLabel == "generalTracks" || recoTracksLabel == "probeTracks" || recoTracksLabel == "displacedTracks" ||
0049 recoTracksLabel == "extractGemMuons" || recoTracksLabel == "extractMe0Muons" ||
0050 recoTracksLabel == "ctfWithMaterialTracksP5LHCNavigation" || recoTracksLabel == "ctfWithMaterialTracksP5" ||
0051 recoTracksLabel == "hltIterL3OIMuonTrackSelectionHighPurity" || recoTracksLabel == "hltIterL3MuonMerged" ||
0052 recoTracksLabel == "hltIterL3MuonAndMuonFromL1Merged") {
0053 if (parset_.getParameter<bool>("UseMuon")) {
0054 edm::LogWarning("MuonAssociatorEDProducer")
0055 << "\n*** WARNING : inconsistent input tracksTag = " << tracksTag << "\n with UseMuon = true"
0056 << "\n ---> setting UseMuon = false ";
0057 parset_.addParameter<bool>("UseMuon", false);
0058 }
0059 if (!parset_.getParameter<bool>("UseTracker")) {
0060 edm::LogWarning("MuonAssociatorEDProducer")
0061 << "\n*** WARNING : inconsistent input tracksTag = " << tracksTag << "\n with UseTracker = false"
0062 << "\n ---> setting UseTracker = true ";
0063 parset_.addParameter<bool>("UseTracker", true);
0064 }
0065 }
0066
0067 LogTrace("MuonAssociatorEDProducer") << "MuonAssociatorEDProducer::beginJob "
0068 ": constructing MuonAssociatorByHits";
0069 associatorByHits = new MuonAssociatorByHits(parset_, consumesCollector());
0070 }
0071
0072 MuonAssociatorEDProducer::~MuonAssociatorEDProducer() {}
0073
0074 void MuonAssociatorEDProducer::beginJob() {}
0075
0076 void MuonAssociatorEDProducer::endJob() {}
0077
0078 void MuonAssociatorEDProducer::produce(edm::Event &event, const edm::EventSetup &setup) {
0079 using namespace edm;
0080
0081 TrackingParticleRefVector tmpTP;
0082 const TrackingParticleRefVector *tmpTPptr = nullptr;
0083 Handle<TrackingParticleCollection> TPCollection;
0084 Handle<TrackingParticleRefVector> TPCollectionRefVector;
0085
0086 if (tpRefVector) {
0087 event.getByToken(tpRefVectorToken_, TPCollectionRefVector);
0088 tmpTPptr = TPCollectionRefVector.product();
0089
0090 tmpTP = *tmpTPptr;
0091 } else {
0092 event.getByToken(tpToken_, TPCollection);
0093 size_t nTP = TPCollection->size();
0094 for (size_t i = 0; i < nTP; ++i) {
0095 tmpTP.push_back(TrackingParticleRef(TPCollection, i));
0096 }
0097 tmpTPptr = &tmpTP;
0098 }
0099
0100 LogTrace("MuonAssociatorEDProducer") << "getting TrackingParticle collection - " << tpTag;
0101 LogTrace("MuonAssociatorEDProducer") << "\t... size = " << tmpTPptr->size();
0102
0103 Handle<edm::View<reco::Track>> trackCollection;
0104 LogTrace("MuonAssociatorEDProducer") << "getting reco::Track collection - " << tracksTag;
0105 bool trackAvailable = event.getByToken(tracksToken_, trackCollection);
0106 if (trackAvailable)
0107 LogTrace("MuonAssociatorEDProducer") << "\t... size = " << trackCollection->size();
0108 else
0109 LogTrace("MuonAssociatorEDProducer") << "\t... NOT FOUND.";
0110
0111 std::unique_ptr<reco::RecoToSimCollection> rts;
0112 std::unique_ptr<reco::SimToRecoCollection> str;
0113
0114 if (ignoreMissingTrackCollection && !trackAvailable) {
0115
0116
0117
0118 LogTrace("MuonAssociatorEDProducer") << "\n ignoring missing track collection."
0119 << "\n";
0120 } else {
0121 edm::RefToBaseVector<reco::Track> tmpT;
0122 for (size_t i = 0; i < trackCollection->size(); ++i)
0123 tmpT.push_back(trackCollection->refAt(i));
0124
0125 edm::LogVerbatim("MuonAssociatorEDProducer")
0126 << "\n >>> RecoToSim association <<< \n"
0127 << " Track collection : " << tracksTag.label() << ":" << tracksTag.instance()
0128 << " (size = " << trackCollection->size() << ") \n"
0129 << " TrackingParticle collection : " << tpTag.label() << ":" << tpTag.instance()
0130 << " (size = " << tmpTPptr->size() << ")";
0131
0132 reco::RecoToSimCollection recSimColl = associatorByHits->associateRecoToSim(tmpT, tmpTP, &event, &setup);
0133
0134 edm::LogVerbatim("MuonAssociatorEDProducer")
0135 << "\n >>> SimToReco association <<< \n"
0136 << " TrackingParticle collection : " << tpTag.label() << ":" << tpTag.instance()
0137 << " (size = " << tmpTPptr->size() << ") \n"
0138 << " Track collection : " << tracksTag.label() << ":" << tracksTag.instance()
0139 << " (size = " << trackCollection->size() << ")";
0140
0141 reco::SimToRecoCollection simRecColl = associatorByHits->associateSimToReco(tmpT, tmpTP, &event, &setup);
0142
0143 rts = std::make_unique<reco::RecoToSimCollection>(recSimColl);
0144 str = std::make_unique<reco::SimToRecoCollection>(simRecColl);
0145
0146 event.put(std::move(rts));
0147 event.put(std::move(str));
0148 }
0149 }