CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
MuonToTrackingParticleAssociatorEDProducer.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: SimMuon/MCTruth
4 // Class: MuonToTrackingParticleAssociatorEDProducer
5 //
13 //
14 // Original Author: Christopher Jones
15 // Created: Wed, 07 Jan 2015 21:30:14 GMT
16 //
17 //
18 
19 
20 // system include files
21 #include <memory>
22 
23 // user include files
26 
29 
31 
37 
38 //
39 // class declaration
40 //
41 namespace {
43 
44  class InputDumper {
45  public:
46 
47  InputDumper(const edm::ParameterSet& conf, edm::ConsumesCollector && iC) :
48  simtracksTag(conf.getParameter<edm::InputTag>("simtracksTag")),
49  simtracksXFTag(conf.getParameter<edm::InputTag>("simtracksXFTag")),
50  crossingframe(conf.getParameter<bool>("crossingframe"))
51  {
52  if (crossingframe) {
53  simtracksXFToken_ = iC.consumes<CrossingFrame<SimTrack> >(simtracksXFTag);
54  simvertsXFToken_ = iC.consumes<CrossingFrame<SimVertex> >(simtracksXFTag);
55  }
56  else{
57  simtracksToken_ = iC.consumes<edm::SimTrackContainer>(simtracksTag);
58  simvertsToken_ = iC.consumes<edm::SimVertexContainer>(simtracksTag);
59  }
60  }
61 
62  void read(const edm::Event&);
63  void dump(const TrackHitsCollection&, const TrackingParticleCollection&) const;
64 
65  private:
66  edm::InputTag simtracksTag;
67  edm::InputTag simtracksXFTag;
68  edm::EDGetTokenT<CrossingFrame<SimTrack> > simtracksXFToken_;
72 
77  bool const crossingframe;
78  };
79 
80  void
82  if(crossingframe) {
83  iEvent.getByToken(simtracksXFToken_, simtracksXF_);
84  iEvent.getByToken(simvertsXFToken_, simvertsXF_);
85  }else {
86  iEvent.getByToken(simtracksToken_, simtracks_);
87  iEvent.getByToken(simvertsToken_, simverts_);
88  }
89  }
90 
91  void
93  using namespace std;
94  // reco::Track collection
95  edm::LogVerbatim("MuonToTrackingParticleAssociatorByHits")<<"\n"<<"reco::Track collection --- size = "<<tC.size();
96 
97 
98  // TrackingParticle collection
99  edm::LogVerbatim("MuonToTrackingParticleAssociatorByHits")<<"\n"<<"TrackingParticle collection --- size = "<<tPC.size();
100  int j = 0;
101  for(TrackingParticleCollection::const_iterator ITER=tPC.begin(); ITER!=tPC.end(); ITER++, j++) {
102  edm::LogVerbatim("MuonToTrackingParticleAssociatorByHits")
103  <<"TrackingParticle "<<j<<", q = "<<ITER->charge()<<", p = "<<ITER->p()
104  <<", pT = "<<ITER->pt()<<", eta = "<<ITER->eta()<<", phi = "<<ITER->phi();
105 
106  edm::LogVerbatim("MuonToTrackingParticleAssociatorByHits")
107  <<"\t pdg code = "<<ITER->pdgId()<<", made of "<<ITER->numberOfHits()<<" PSimHit"
108  <<" (in "<<ITER->numberOfTrackerLayers()<<" layers)"
109  <<" from "<<ITER->g4Tracks().size()<<" SimTrack:";
110  for (TrackingParticle::g4t_iterator g4T=ITER->g4Track_begin(); g4T!=ITER->g4Track_end(); g4T++) {
111  edm::LogVerbatim("MuonToTrackingParticleAssociatorByHits")
112  <<"\t\t Id:"<<g4T->trackId()<<"/Evt:("<<g4T->eventId().event()<<","<<g4T->eventId().bunchCrossing()<<")";
113  }
114  }
115 
116  if (crossingframe) {
117  std:: unique_ptr<MixCollection<SimTrack> > SimTk( new MixCollection<SimTrack>(simtracksXF_.product()) );
118  edm::LogVerbatim("MuonToTrackingParticleAssociatorByHits")<<"\n"<<"CrossingFrame<SimTrack> collection with InputTag = "<<simtracksXFTag
119  <<" has size = "<<SimTk->size();
120  int k = 0;
121  for (MixCollection<SimTrack>::MixItr ITER=SimTk->begin(); ITER!=SimTk->end(); ITER++, k++) {
122  edm::LogVerbatim("MuonToTrackingParticleAssociatorByHits")
123  <<"SimTrack "<<k
124  <<" - Id:"<<ITER->trackId()<<"/Evt:("<<ITER->eventId().event()<<","<<ITER->eventId().bunchCrossing()<<")"
125  <<" pdgId = "<<ITER->type()<<", q = "<<ITER->charge()<<", p = "<<ITER->momentum().P()
126  <<", pT = "<<ITER->momentum().Pt()<<", eta = "<<ITER->momentum().Eta()<<", phi = "<<ITER->momentum().Phi()
127  <<"\n * "<<*ITER <<endl;
128  }
129 
130  std::unique_ptr<MixCollection<SimVertex> > SimVtx( new MixCollection<SimVertex>(simvertsXF_.product()) );
131  edm::LogVerbatim("MuonToTrackingParticleAssociatorByHits")<<"\n"<<"CrossingFrame<SimVertex> collection with InputTag = "<<simtracksXFTag
132  <<" has size = "<<SimVtx->size();
133  int kv = 0;
134  for (MixCollection<SimVertex>::MixItr VITER=SimVtx->begin(); VITER!=SimVtx->end(); VITER++, kv++){
135  edm::LogVerbatim("MuonToTrackingParticleAssociatorByHits")
136  <<"SimVertex "<<kv
137  << " : "<< *VITER <<endl;
138  }
139  }
140  else {
141  const edm::SimTrackContainer simTC = *(simtracks_.product());
142  edm::LogVerbatim("MuonToTrackingParticleAssociatorByHits")<<"\n"<<"SimTrack collection with InputTag = "<<simtracksTag
143  <<" has size = "<<simTC.size()<<endl;
144  int k = 0;
145  for(edm::SimTrackContainer::const_iterator ITER=simTC.begin(); ITER!=simTC.end(); ITER++, k++){
146  edm::LogVerbatim("MuonToTrackingParticleAssociatorByHits")
147  <<"SimTrack "<<k
148  <<" - Id:"<<ITER->trackId()<<"/Evt:("<<ITER->eventId().event()<<","<<ITER->eventId().bunchCrossing()<<")"
149  <<" pdgId = "<<ITER->type()<<", q = "<<ITER->charge()<<", p = "<<ITER->momentum().P()
150  <<", pT = "<<ITER->momentum().Pt()<<", eta = "<<ITER->momentum().Eta()<<", phi = "<<ITER->momentum().Phi()
151  <<"\n * "<<*ITER <<endl;
152  }
153  const edm::SimVertexContainer simVC = *(simverts_.product());
154  edm::LogVerbatim("MuonToTrackingParticleAssociatorByHits")<<"\n"<<"SimVertex collection with InputTag = "<<"g4SimHits"
155  <<" has size = "<<simVC.size()<<endl;
156  int kv = 0;
157  for (edm::SimVertexContainer::const_iterator VITER=simVC.begin(); VITER!=simVC.end(); VITER++, kv++){
158  edm::LogVerbatim("MuonToTrackingParticleAssociatorByHits")
159  <<"SimVertex "<<kv
160  << " : "<< *VITER <<endl;
161  }
162  }
163 
164  }
165 
166 }
167 
168 
170 public:
173 
174  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
175 
176 private:
177  virtual void produce(edm::Event&, const edm::EventSetup&) override;
178 
179  // ----------member data ---------------------------
183 
184  std::unique_ptr<RPCHitAssociator> rpctruth_;
185  std::unique_ptr<DTHitAssociator> dttruth_;
186  std::unique_ptr<CSCHitAssociator> csctruth_;
187  std::unique_ptr<TrackerHitAssociator> trackertruth_;
188  std::unique_ptr<InputDumper> diagnostics_;
189 
190 };
191 
192 //
193 // constants, enums and typedefs
194 //
195 
196 
197 //
198 // static data member definitions
199 //
200 
201 //
202 // constructors and destructor
203 //
205  config_(iConfig),
206  helper_(iConfig),
207  hitExtractor_(iConfig,consumesCollector())
208 {
209  //register your products
210  produces<reco::MuonToTrackingParticleAssociator>();
211 
212  //hack for consumes
213  RPCHitAssociator rpctruth(iConfig,consumesCollector());
214  DTHitAssociator dttruth(iConfig,consumesCollector());
215  CSCHitAssociator cscruth(iConfig,consumesCollector());
216  TrackerHitAssociator trackertruth(iConfig,consumesCollector());
217 
218  if( iConfig.getUntrackedParameter<bool>("dumpInputCollections") ) {
219  diagnostics_.reset( new InputDumper(iConfig, consumesCollector()) );
220  }
221 }
222 
223 
225 {
226 
227  // do anything here that needs to be done at desctruction time
228  // (e.g. close files, deallocate resources etc.)
229 
230 }
231 
232 
233 //
234 // member functions
235 //
236 
237 // ------------ method called to produce the data ------------
238 void
240 {
241  using namespace edm;
242 
243  hitExtractor_.init(iEvent, iSetup);
244 
245  //Retrieve tracker topology from geometry
247  iSetup.get<IdealGeometryRecord>().get(tTopoHand);
248  const TrackerTopology *tTopo=tTopoHand.product();
249 
250  bool printRtS = true;
251 
252  //NOTE: This assumes that produce will not be called until the edm::Event used in the previous call
253  // has been deleted. This is true for now. In the future, we may have to have the resources own
254  // the memory.
255 
256  // Tracker hit association
257  trackertruth_.reset( new TrackerHitAssociator(iEvent, config_));
258  // CSC hit association
259  csctruth_.reset(new CSCHitAssociator(iEvent,iSetup,config_));;
260  // DT hit association
261  printRtS = false;
262  dttruth_.reset( new DTHitAssociator(iEvent,iSetup,config_,printRtS) );
263  // RPC hit association
264  rpctruth_.reset( new RPCHitAssociator(iEvent,iSetup,config_) );
265 
266  MuonAssociatorByHitsHelper::Resources resources = {tTopo, trackertruth_.get(), csctruth_.get(), dttruth_.get(), rpctruth_.get()};
267 
268  if(diagnostics_) {
269  diagnostics_->read(iEvent);
270  resources.diagnostics_ = [this](const TrackHitsCollection& hC, const TrackingParticleCollection& pC) {
271  diagnostics_->dump(hC,pC);
272  };
273  }
274 
275  std::unique_ptr<reco::MuonToTrackingParticleAssociatorBaseImpl> impl{
277  std::unique_ptr<reco::MuonToTrackingParticleAssociator> toPut( new reco::MuonToTrackingParticleAssociator(std::move(impl)));
278  iEvent.put(std::move(toPut));
279 }
280 
281 
282 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
283 void
285  //The following says we do not know what parameters are allowed so do no validation
286  // Please change this to state exactly what you do use, even if it is no parameters
288  desc.setUnknown();
289  descriptions.addDefault(desc);
290 }
291 
292 //define this as a plug-in
T getUntrackedParameter(std::string const &, T const &) const
std::vector< TrackingParticle > TrackingParticleCollection
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:449
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
std::vector< std::pair< trackingRecHit_iterator, trackingRecHit_iterator > > TrackHitsCollection
int iEvent
Definition: GenABIO.cc:230
void addDefault(ParameterSetDescription const &psetDescription)
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:113
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
int j
Definition: DBlmapReader.cc:9
MuonAssociatorByHitsHelper::TrackHitsCollection TrackHitsCollection
tuple conf
Definition: dbtoconf.py:185
void init(const edm::Event &, const edm::EventSetup &)
std::vector< SimTrack >::const_iterator g4t_iterator
const T & get() const
Definition: EventSetup.h:55
std::vector< SimVertex > SimVertexContainer
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
virtual void produce(edm::Event &, const edm::EventSetup &) override
std::vector< SimTrack > SimTrackContainer