ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerMCParticles.cc
Revision: 1.9
Committed: Sun Mar 15 11:20:41 2009 UTC (16 years, 1 month ago) by loizides
Content type: text/plain
Branch: MAIN
Changes since 1.8: +84 -83 lines
Log Message:
Introduced BranchTable plus general cleanup.

File Contents

# User Rev Content
1 loizides 1.9 // $Id: FillerMCParticles.cc,v 1.8 2009/03/06 14:40:11 bendavid Exp $
2 bendavid 1.1
3     #include "MitProd/TreeFiller/interface/FillerMCParticles.h"
4     #include "FWCore/MessageLogger/interface/MessageLogger.h"
5     #include "DataFormats/Common/interface/Handle.h"
6 bendavid 1.8 #include "DataFormats/Common/interface/RefToPtr.h"
7 bendavid 1.1 #include "SimDataFormats/HepMCProduct/interface/HepMCProduct.h"
8 bendavid 1.8 #include "DataFormats/HepMCCandidate/interface/GenParticleFwd.h"
9     #include "DataFormats/HepMCCandidate/interface/GenParticle.h"
10 bendavid 1.4 #include "SimDataFormats/Track/interface/SimTrack.h"
11     #include "SimDataFormats/Track/interface/SimTrackContainer.h"
12     #include "SimDataFormats/Vertex/interface/SimVertex.h"
13     #include "SimDataFormats/Vertex/interface/SimVertexContainer.h"
14 bendavid 1.1 #include "SimDataFormats/TrackingAnalysis/interface/TrackingParticle.h"
15     #include "SimDataFormats/TrackingAnalysis/interface/TrackingParticleFwd.h"
16     #include "SimDataFormats/TrackingAnalysis/interface/TrackingVertex.h"
17     #include "SimDataFormats/TrackingAnalysis/interface/TrackingVertexContainer.h"
18     #include "MitAna/DataTree/interface/Names.h"
19    
20     using namespace std;
21     using namespace edm;
22     using namespace mithep;
23    
24     //--------------------------------------------------------------------------------------------------
25     FillerMCParticles::FillerMCParticles(const ParameterSet &cfg, const char *name, bool active) :
26     BaseFiller(cfg, name, active),
27     genActive_(Conf().getUntrackedParameter<bool>("genActive",true)),
28 bendavid 1.8 useAodGen_(Conf().getUntrackedParameter<bool>("useAodGen",true)),
29 bendavid 1.1 simActive_(Conf().getUntrackedParameter<bool>("simActive",true)),
30 bendavid 1.4 trackingActive_(Conf().getUntrackedParameter<bool>("trackingActive",false)),
31 bendavid 1.1 genEdmName_(Conf().getUntrackedParameter<string>("genEdmName","source")),
32 bendavid 1.4 simEdmName_(Conf().getUntrackedParameter<string>("simEdmName","g4SimHits")),
33 loizides 1.9 trackingEdmName_(Conf().getUntrackedParameter<string>("trackingEdmName",
34     "mergedtruth:MergedTrackTruth")),
35 loizides 1.3 genMapName_(Conf().getUntrackedParameter<string>("genMapName","GenMap")),
36     simMapName_(Conf().getUntrackedParameter<string>("simMapName","SimMap")),
37 bendavid 1.4 trackingMapName_(Conf().getUntrackedParameter<string>("trackingMapName","TrackingMap")),
38 bendavid 1.1 mitName_(Conf().getUntrackedParameter<string>("mitName",Names::gkMCPartBrn)),
39     mcParticles_(new mithep::MCParticleArr(250)),
40 bendavid 1.8 genMap_(genActive_?new mithep::GenParticleBarcodeMap:0),
41     aodGenMap_((genActive_&&useAodGen_)?new mithep::AODGenParticleMap:0),
42     simMap_(simActive_?new mithep::SimTrackTidMap:0),
43 bendavid 1.4 trackingMap_(trackingActive_?new mithep::TrackingParticleMap:0)
44 bendavid 1.1 {
45     // Constructor.
46     }
47    
48     //--------------------------------------------------------------------------------------------------
49     FillerMCParticles::~FillerMCParticles()
50     {
51     // Destructor.
52    
53     delete mcParticles_;
54     delete genMap_;
55 bendavid 1.8 delete aodGenMap_;
56 bendavid 1.1 delete simMap_;
57 bendavid 1.4 delete trackingMap_;
58 bendavid 1.1 }
59    
60     //--------------------------------------------------------------------------------------------------
61     void FillerMCParticles::BookDataBlock(TreeWriter &tws)
62     {
63 loizides 1.3 // Add branch to tree and publish our maps.
64 bendavid 1.1
65 loizides 1.9 tws.AddBranch(mitName_,&mcParticles_);
66     OS()->add<mithep::MCParticleArr>(mcParticles_,mitName_);
67 loizides 1.2
68 loizides 1.9 if (genActive_ && !genMapName_.empty()) {
69     genMap_->SetBrName(mitName_);
70     if (genMap_)
71     OS()->add(genMap_,genMapName_);
72     }
73     if (simActive_ && !simMapName_.empty()) {
74     simMap_->SetBrName(mitName_);
75     if (simMap_)
76     OS()->add(simMap_,simMapName_);
77     }
78     if (trackingActive_ && !trackingMapName_.empty()) {
79     trackingMap_->SetBrName(mitName_);
80     if (trackingMap_)
81     OS()->add(trackingMap_,trackingMapName_);
82     }
83 bendavid 1.1 }
84    
85     //--------------------------------------------------------------------------------------------------
86     void FillerMCParticles::FillDataBlock(const edm::Event &event,
87 loizides 1.2 const edm::EventSetup &setup)
88 bendavid 1.1 {
89 loizides 1.9 // Loop over generated or simulated particles and fill their information.
90 bendavid 1.1
91 bendavid 1.7 mcParticles_->Delete();
92 bendavid 1.1
93 bendavid 1.8 if (genActive_)
94 loizides 1.3 genMap_->Reset();
95 bendavid 1.1
96 bendavid 1.8 if (genActive_ && !useAodGen_) {
97 bendavid 1.1 Handle<edm::HepMCProduct> hHepMCProduct;
98     GetProduct(genEdmName_, hHepMCProduct, event);
99    
100     const HepMC::GenEvent &GenEvent = hHepMCProduct->getHepMCData();
101    
102 loizides 1.9 // loop over all hepmc particles and copy their information
103 bendavid 1.1 for (HepMC::GenEvent::particle_const_iterator pgen = GenEvent.particles_begin();
104     pgen != GenEvent.particles_end(); ++pgen) {
105    
106     HepMC::GenParticle *mcPart = (*pgen);
107     if(!mcPart) continue;
108    
109     mithep::MCParticle *genParticle = mcParticles_->Allocate();
110     new (genParticle) mithep::MCParticle(mcPart->momentum().x(),mcPart->momentum().y(),
111     mcPart->momentum().z(),mcPart->momentum().e(),
112     mcPart->pdg_id(),
113     mcPart->status());
114    
115     genParticle->SetIsGenerated();
116     genMap_->Add(mcPart->barcode(), genParticle);
117     }
118     }
119    
120 bendavid 1.8 if (genActive_ && useAodGen_) {
121 loizides 1.9
122 bendavid 1.8 aodGenMap_->Reset();
123    
124     Handle<reco::GenParticleCollection> hGenPProduct;
125     GetProduct(genEdmName_, hGenPProduct, event);
126    
127 loizides 1.9 // element by element aligned collection of hepmc barcodes associated to
128     // the genparticles
129 bendavid 1.8 Handle<std::vector<int> > genBarcodes;
130     if (simActive_)
131     GetProduct(genEdmName_, genBarcodes, event);
132    
133     const reco::GenParticleCollection genParticles = *(hGenPProduct.product());
134    
135     //loop over all genparticles and copy their information
136     for (reco::GenParticleCollection::const_iterator pgen = genParticles.begin();
137     pgen != genParticles.end(); ++pgen) {
138    
139     mithep::MCParticle *mcPart = mcParticles_->Allocate();
140     new (mcPart) mithep::MCParticle(pgen->px(),pgen->py(),
141     pgen->pz(),pgen->energy(),
142     pgen->pdgId(),
143     pgen->status());
144    
145     mcPart->SetIsGenerated();
146    
147 loizides 1.9 // add hepmc barcode association, needed to merge in sim particles
148 bendavid 1.8 if (simActive_) {
149     int genBarcode = genBarcodes->at(pgen - genParticles.begin());
150     genMap_->Add(genBarcode, mcPart);
151     }
152    
153     edm::Ptr<reco::GenParticle> thePtr(hGenPProduct, pgen - genParticles.begin());
154     aodGenMap_->Add(thePtr, mcPart);
155     }
156     }
157    
158 bendavid 1.1 if (simActive_) {
159 loizides 1.3 simMap_->Reset();
160 bendavid 1.4
161     Handle<edm::SimTrackContainer> hSimTrackProduct;
162     GetProduct(simEdmName_, hSimTrackProduct, event);
163    
164     const edm::SimTrackContainer simTracks = *(hSimTrackProduct.product());
165    
166 bendavid 1.1 // loop through all simParticles
167 bendavid 1.4 for (SimTrackContainer::const_iterator iM = simTracks.begin();
168     iM != simTracks.end(); ++iM) {
169    
170 bendavid 1.8 mithep::MCParticle *outSimParticle = 0;
171 bendavid 1.1
172 bendavid 1.4 if (genActive_ && (iM->genpartIndex() >= 0) ) {
173     outSimParticle = genMap_->GetMit(iM->genpartIndex());
174 loizides 1.9 if (verbose_>1) {
175     printf("Sim px,py,pz,e = %f,%f,%f,%f\nGen px,py,pz,e = %f,%f,%f,%f\n",
176     iM->momentum().px(),iM->momentum().py(),
177     iM->momentum().pz(),iM->momentum().e(),
178     outSimParticle->Px(),outSimParticle->Py(),
179     outSimParticle->Pz(),outSimParticle->E());
180     }
181     } else {
182 bendavid 1.1 outSimParticle = mcParticles_->Allocate();
183 bendavid 1.4 new (outSimParticle) mithep::MCParticle(iM->momentum().px(),
184     iM->momentum().py(),
185     iM->momentum().pz(),
186     iM->momentum().e(),
187 loizides 1.9 iM->type(), -99);
188 bendavid 1.1 }
189    
190     outSimParticle->SetIsSimulated();
191 bendavid 1.8 simMap_->Add(iM->trackId(), outSimParticle);
192 bendavid 1.4 }
193     }
194    
195 loizides 1.9 // loop through TrackingParticles and build association map to OAK MCParticles
196 bendavid 1.4 if (trackingActive_) {
197     trackingMap_->Reset();
198    
199     Handle<TrackingParticleCollection> hTrackingParticleProduct;
200     GetProduct(trackingEdmName_, hTrackingParticleProduct, event);
201    
202 bendavid 1.5 const TrackingParticleCollection trackingParticles = *(hTrackingParticleProduct.product());
203 bendavid 1.4
204     // loop through all TrackingParticles
205 bendavid 1.5 for (TrackingParticleCollection::const_iterator iM = trackingParticles.begin();
206 bendavid 1.4 iM != trackingParticles.end(); ++iM) {
207    
208     if ( simActive_ && iM->g4Tracks().size() ) {
209 loizides 1.9 if (verbose_>1) {
210     printf("Tracking particle has %i SimTracks\n",iM->g4Tracks().size());
211     if (iM->g4Tracks().size()>1) {
212     for (std::vector<SimTrack>::const_iterator iST = iM->g4Tracks().begin();
213     iST != iM->g4Tracks().end(); ++iST) {
214     printf("g4 trackid = %i\n",iST->trackId());
215     }
216     }
217     TrackingParticleRef theRef(hTrackingParticleProduct, iM-trackingParticles.begin());
218     const SimTrack &theSimTrack = iM->g4Tracks().at(iM->g4Tracks().size()-1);
219     printf("trackId = %i\n",theSimTrack.trackId());
220     mithep::MCParticle *outSimParticle = simMap_->GetMit(theSimTrack.trackId());
221     trackingMap_->Add(theRef, outSimParticle);
222     }
223 bendavid 1.4 }
224 bendavid 1.1 }
225     }
226    
227     mcParticles_->Trim();
228     }
229    
230     //--------------------------------------------------------------------------------------------------
231     void FillerMCParticles::ResolveLinks(const edm::Event &event,
232 loizides 1.2 const edm::EventSetup &setup)
233 bendavid 1.1 {
234 loizides 1.9 // Loop over generated and simulated particles and resolve their links.
235 bendavid 1.1
236 bendavid 1.8 if (genActive_ && !useAodGen_) {
237 bendavid 1.1
238     Handle<edm::HepMCProduct> hHepMCProduct;
239     GetProduct(genEdmName_, hHepMCProduct, event);
240    
241     const HepMC::GenEvent &GenEvent = hHepMCProduct->getHepMCData();
242    
243     for (HepMC::GenEvent::particle_const_iterator pgen = GenEvent.particles_begin();
244     pgen != GenEvent.particles_end(); ++pgen) {
245    
246     HepMC::GenParticle *mcPart = (*pgen);
247     if(!mcPart) continue;
248    
249     //check if genpart has a decay vertex
250     HepMC::GenVertex *dVertex = mcPart->end_vertex();
251     if (!dVertex) continue;
252    
253     //find corresponding mithep genparticle parent in association table
254     mithep::MCParticle *genParent = genMap_->GetMit(mcPart->barcode());
255    
256     //set decay vertex
257     //division by 10.0 is needed due to HepMC use of mm instead of cm for distance units
258     genParent->SetVertex(dVertex->point3d().x()/10.0,
259     dVertex->point3d().y()/10.0,
260     dVertex->point3d().z()/10.0);
261    
262     //loop through daugthers
263 loizides 1.3 for (HepMC::GenVertex::particles_out_const_iterator pgenD =
264     dVertex->particles_out_const_begin();
265     pgenD != dVertex->particles_out_const_end(); ++pgenD) {
266 bendavid 1.1 HepMC::GenParticle *mcDaughter = (*pgenD);
267     mithep::MCParticle *genDaughter = genMap_->GetMit(mcDaughter->barcode());
268     genParent->AddDaughter(genDaughter);
269     if (!(genDaughter->HasMother()))
270     genDaughter->SetMother(genParent);
271     }
272     }
273     }
274    
275 bendavid 1.8 //loop over aod GenParticle candidates and resolve their links
276    
277     if (genActive_ && useAodGen_) {
278    
279     Handle<reco::GenParticleCollection> hGenPProduct;
280     GetProduct(genEdmName_, hGenPProduct, event);
281    
282     const reco::GenParticleCollection genParticles = *(hGenPProduct.product());
283    
284     //loop over all genparticles and copy their information
285     for (reco::GenParticleCollection::const_iterator pgen = genParticles.begin();
286     pgen != genParticles.end(); ++pgen) {
287    
288     int nDaughters = pgen->numberOfDaughters();
289    
290     if (nDaughters>0) {
291    
292     edm::Ptr<reco::GenParticle> thePtr(hGenPProduct, pgen - genParticles.begin());
293     MCParticle *mcMother = aodGenMap_->GetMit(thePtr);
294     for (int i=0; i<nDaughters; ++i) {
295     const reco::Candidate *genDaughter = pgen->daughter(i);
296     MCParticle *mcDaughter = aodGenMap_->GetMit(refToPtr(pgen->daughterRef(i)));
297     //set mother decay vertex
298     if (i==0)
299     mcMother->SetVertex(genDaughter->vx(),genDaughter->vy(),genDaughter->vz());
300    
301     //set mother-daughter links
302     mcMother->AddDaughter(mcDaughter);
303     if (!mcDaughter->HasMother())
304     mcDaughter->SetMother(mcMother);
305    
306     }
307     }
308     }
309    
310     }
311    
312 bendavid 1.4 //loop over SimTracks and resolve links
313 bendavid 1.1 if (simActive_) {
314 bendavid 1.4 Handle<edm::SimTrackContainer> hSimTrackProduct;
315     GetProduct(simEdmName_, hSimTrackProduct, event);
316    
317     const edm::SimTrackContainer simTracks = *(hSimTrackProduct.product());
318    
319     Handle<std::vector<SimVertex> > hSimVertexProduct;
320     GetProduct(simEdmName_, hSimVertexProduct, event);
321    
322     const edm::SimVertexContainer simVertexes = *(hSimVertexProduct.product());
323    
324 bendavid 1.1 // loop through all simParticles
325 bendavid 1.4 for (SimTrackContainer::const_iterator iM = simTracks.begin();
326     iM != simTracks.end(); ++iM) {
327    
328     if (iM->vertIndex()>=0) {
329 bendavid 1.8 mithep::MCParticle *simDaughter = simMap_->GetMit(iM->trackId());
330 bendavid 1.4 const SimVertex &theVertex = simVertexes.at(iM->vertIndex());
331     if (theVertex.parentIndex()>=0) {
332 bendavid 1.8 mithep::MCParticle *simParent = simMap_->GetMit(theVertex.parentIndex());
333 loizides 1.9 simParent->SetVertex(theVertex.position().x(),
334     theVertex.position().y(),
335     theVertex.position().z());
336 bendavid 1.6 //make sure we don't double count the decay tree
337     if ( !simParent->HasDaughter(simDaughter) ) {
338     simParent->AddDaughter(simDaughter);
339     }
340     if ( !simDaughter->HasMother() ) {
341     simDaughter->SetMother(simParent);
342     }
343 bendavid 1.1 }
344 loizides 1.9 }
345     }
346     }
347 bendavid 1.4
348 loizides 1.9 if (verbose_>1 && trackingActive_) {
349     Handle<TrackingParticleCollection> hTrackingParticleProduct;
350     GetProduct(trackingEdmName_, hTrackingParticleProduct, event);
351    
352     const TrackingParticleCollection trackingParticles = *(hTrackingParticleProduct.product());
353    
354     // loop through all simParticles
355     for (TrackingParticleCollection::const_iterator iM = trackingParticles.begin();
356     iM != trackingParticles.end(); ++iM) {
357    
358     TrackingParticleRef theRef(hTrackingParticleProduct, iM-trackingParticles.begin());
359    
360     mithep::MCParticle *simParent = trackingMap_->GetMit(theRef);
361     printf("MCParticle pdg = %i, Daughter Pdgs: ", simParent->PdgId());
362     for (UInt_t i=0; i<simParent->NDaughters(); ++i) {
363     printf("%i, ", simParent->Daughter(i)->PdgId());
364 bendavid 1.1 }
365 loizides 1.9 printf("\n");
366    
367     printf("TrackingParticle pdg = %i, Daughter Pdgs: ", iM->pdgId());
368     for (TrackingVertexRefVector::iterator v= iM->decayVertices().begin();
369     v != iM->decayVertices().end(); ++v) {
370     for (TrackingParticleRefVector::iterator pd = v->get()->daughterTracks().begin();
371     pd != v->get()->daughterTracks().end(); ++pd) {
372     printf("%i, ", pd->get()->pdgId());
373     }
374     }
375     printf("\n");
376 bendavid 1.1 }
377     }
378     }