ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerMCParticles.cc
Revision: 1.6
Committed: Mon Oct 6 13:35:56 2008 UTC (16 years, 7 months ago) by bendavid
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_006b, Mit_006a, Mit_006, Mit_005
Changes since 1.5: +8 -5 lines
Log Message:
Fixed problem with mother/daughters links in rare cases with neutrinos in long lived meson decays

File Contents

# Content
1 // $Id: FillerMCParticles.cc,v 1.5 2008/09/06 19:25:43 bendavid Exp $
2
3 #include "MitProd/TreeFiller/interface/FillerMCParticles.h"
4 #include "FWCore/MessageLogger/interface/MessageLogger.h"
5 #include "DataFormats/Common/interface/Handle.h"
6 #include "SimDataFormats/HepMCProduct/interface/HepMCProduct.h"
7 #include "SimDataFormats/Track/interface/SimTrack.h"
8 #include "SimDataFormats/Track/interface/SimTrackContainer.h"
9 #include "SimDataFormats/Vertex/interface/SimVertex.h"
10 #include "SimDataFormats/Vertex/interface/SimVertexContainer.h"
11 #include "SimDataFormats/TrackingAnalysis/interface/TrackingParticle.h"
12 #include "SimDataFormats/TrackingAnalysis/interface/TrackingParticleFwd.h"
13 #include "SimDataFormats/TrackingAnalysis/interface/TrackingVertex.h"
14 #include "SimDataFormats/TrackingAnalysis/interface/TrackingVertexContainer.h"
15 #include "MitAna/DataTree/interface/Names.h"
16
17 using namespace std;
18 using namespace edm;
19 using namespace mithep;
20
21 //--------------------------------------------------------------------------------------------------
22 FillerMCParticles::FillerMCParticles(const ParameterSet &cfg, const char *name, bool active) :
23 BaseFiller(cfg, name, active),
24 genActive_(Conf().getUntrackedParameter<bool>("genActive",true)),
25 simActive_(Conf().getUntrackedParameter<bool>("simActive",true)),
26 trackingActive_(Conf().getUntrackedParameter<bool>("trackingActive",false)),
27 genEdmName_(Conf().getUntrackedParameter<string>("genEdmName","source")),
28 simEdmName_(Conf().getUntrackedParameter<string>("simEdmName","g4SimHits")),
29 trackingEdmName_(Conf().getUntrackedParameter<string>("trackingEdmName","mergedtruth:MergedTrackTruth")),
30 genMapName_(Conf().getUntrackedParameter<string>("genMapName","GenMap")),
31 simMapName_(Conf().getUntrackedParameter<string>("simMapName","SimMap")),
32 trackingMapName_(Conf().getUntrackedParameter<string>("trackingMapName","TrackingMap")),
33 mitName_(Conf().getUntrackedParameter<string>("mitName",Names::gkMCPartBrn)),
34 mcParticles_(new mithep::MCParticleArr(250)),
35 genMap_(genActive_?new mithep::GenParticleMap:0),
36 simMap_(simActive_?new mithep::SimTrackMap:0),
37 trackingMap_(trackingActive_?new mithep::TrackingParticleMap:0)
38 {
39 // Constructor.
40 }
41
42 //--------------------------------------------------------------------------------------------------
43 FillerMCParticles::~FillerMCParticles()
44 {
45 // Destructor.
46
47 delete mcParticles_;
48 delete genMap_;
49 delete simMap_;
50 delete trackingMap_;
51 }
52
53 //--------------------------------------------------------------------------------------------------
54 void FillerMCParticles::BookDataBlock(TreeWriter &tws)
55 {
56 // Add branch to tree and publish our maps.
57
58 tws.AddBranch(mitName_.c_str(),&mcParticles_);
59
60 if (genActive_)
61 OS()->add(genMap_,genMapName_.c_str());
62 if (simActive_)
63 OS()->add(simMap_,simMapName_.c_str());
64 if (trackingActive_)
65 OS()->add(trackingMap_,trackingMapName_.c_str());
66 }
67
68 //--------------------------------------------------------------------------------------------------
69 void FillerMCParticles::FillDataBlock(const edm::Event &event,
70 const edm::EventSetup &setup)
71 {
72 // Loop over HepMC particle and fill their information.
73
74 mcParticles_->Reset();
75
76 if (genActive_) {
77 genMap_->Reset();
78
79 Handle<edm::HepMCProduct> hHepMCProduct;
80 GetProduct(genEdmName_, hHepMCProduct, event);
81
82 const HepMC::GenEvent &GenEvent = hHepMCProduct->getHepMCData();
83
84 //loop over all hepmc particles and copy their information
85 for (HepMC::GenEvent::particle_const_iterator pgen = GenEvent.particles_begin();
86 pgen != GenEvent.particles_end(); ++pgen) {
87
88 HepMC::GenParticle *mcPart = (*pgen);
89 if(!mcPart) continue;
90
91 mithep::MCParticle *genParticle = mcParticles_->Allocate();
92 new (genParticle) mithep::MCParticle(mcPart->momentum().x(),mcPart->momentum().y(),
93 mcPart->momentum().z(),mcPart->momentum().e(),
94 mcPart->pdg_id(),
95 mcPart->status());
96
97 genParticle->SetIsGenerated();
98
99 genMap_->Add(mcPart->barcode(), genParticle);
100 }
101
102 }
103
104 if (simActive_) {
105 simTidMap_.clear();
106 simMap_->Reset();
107
108 Handle<edm::SimTrackContainer> hSimTrackProduct;
109 GetProduct(simEdmName_, hSimTrackProduct, event);
110
111 const edm::SimTrackContainer simTracks = *(hSimTrackProduct.product());
112
113 // loop through all simParticles
114 for (SimTrackContainer::const_iterator iM = simTracks.begin();
115 iM != simTracks.end(); ++iM) {
116
117 SimTrackRef theRef(hSimTrackProduct, iM-simTracks.begin());
118 simTidMap_[iM->trackId()] = theRef;
119 mithep::MCParticle *outSimParticle;
120
121 if (genActive_ && (iM->genpartIndex() >= 0) ) {
122 outSimParticle = genMap_->GetMit(iM->genpartIndex());
123 //printf("Sim px,py,pz,e = %f,%f,%f,%f\nGen px,py,pz,e = %f,%f,%f,%f\n", iM->momentum().px(),iM->momentum().py(),iM->momentum().pz(),iM->momentum().e(),outSimParticle->Px(),outSimParticle->Py(),outSimParticle->Pz(),outSimParticle->E());
124 }
125 else {
126 outSimParticle = mcParticles_->Allocate();
127 new (outSimParticle) mithep::MCParticle(iM->momentum().px(),
128 iM->momentum().py(),
129 iM->momentum().pz(),
130 iM->momentum().e(),
131 iM->type(),
132 -99);
133 }
134
135 outSimParticle->SetIsSimulated();
136 simMap_->Add(theRef, outSimParticle);
137
138 }
139 }
140
141 //loop through TrackingParticles and build association map to OAK MCParticles
142 if (trackingActive_) {
143 trackingMap_->Reset();
144
145 Handle<TrackingParticleCollection> hTrackingParticleProduct;
146 GetProduct(trackingEdmName_, hTrackingParticleProduct, event);
147
148 const TrackingParticleCollection trackingParticles = *(hTrackingParticleProduct.product());
149
150 // loop through all TrackingParticles
151 for (TrackingParticleCollection::const_iterator iM = trackingParticles.begin();
152 iM != trackingParticles.end(); ++iM) {
153
154 if ( simActive_ && iM->g4Tracks().size() ) {
155 //printf("Tracking particle has %i SimTracks\n",iM->g4Tracks().size());
156 // if (iM->g4Tracks().size()>1) {
157 // for (std::vector<SimTrack>::const_iterator iST = iM->g4Tracks().begin();
158 // iST != iM->g4Tracks().end(); ++iST) {
159 // printf("g4 trackid = %i\n",iST->trackId());
160 // }
161 // }
162 TrackingParticleRef theRef(hTrackingParticleProduct, iM-trackingParticles.begin());
163 const SimTrack &theSimTrack = iM->g4Tracks().at(iM->g4Tracks().size()-1);
164 //printf("trackId = %i\n",theSimTrack.trackId());
165 SimTrackRef theSimTrackRef = simTidMap_[theSimTrack.trackId()];
166 mithep::MCParticle *outSimParticle = simMap_->GetMit(theSimTrackRef);
167 trackingMap_->Add(theRef, outSimParticle);
168 }
169
170 }
171 }
172
173 mcParticles_->Trim();
174 }
175
176 //--------------------------------------------------------------------------------------------------
177 void FillerMCParticles::ResolveLinks(const edm::Event &event,
178 const edm::EventSetup &setup)
179 {
180 // Loop over HepMC particle and resolve their links.
181
182 if (genActive_) {
183
184 Handle<edm::HepMCProduct> hHepMCProduct;
185 GetProduct(genEdmName_, hHepMCProduct, event);
186
187 const HepMC::GenEvent &GenEvent = hHepMCProduct->getHepMCData();
188
189 for (HepMC::GenEvent::particle_const_iterator pgen = GenEvent.particles_begin();
190 pgen != GenEvent.particles_end(); ++pgen) {
191
192 HepMC::GenParticle *mcPart = (*pgen);
193 if(!mcPart) continue;
194
195 //check if genpart has a decay vertex
196 HepMC::GenVertex *dVertex = mcPart->end_vertex();
197 if (!dVertex) continue;
198
199 //find corresponding mithep genparticle parent in association table
200 mithep::MCParticle *genParent = genMap_->GetMit(mcPart->barcode());
201
202 //set decay vertex
203 //division by 10.0 is needed due to HepMC use of mm instead of cm for distance units
204 genParent->SetVertex(dVertex->point3d().x()/10.0,
205 dVertex->point3d().y()/10.0,
206 dVertex->point3d().z()/10.0);
207
208 //loop through daugthers
209 for (HepMC::GenVertex::particles_out_const_iterator pgenD =
210 dVertex->particles_out_const_begin();
211 pgenD != dVertex->particles_out_const_end(); ++pgenD) {
212 HepMC::GenParticle *mcDaughter = (*pgenD);
213 mithep::MCParticle *genDaughter = genMap_->GetMit(mcDaughter->barcode());
214 genParent->AddDaughter(genDaughter);
215 if (!(genDaughter->HasMother()))
216 genDaughter->SetMother(genParent);
217 }
218 }
219 }
220
221 //loop over SimTracks and resolve links
222 if (simActive_) {
223 Handle<edm::SimTrackContainer> hSimTrackProduct;
224 GetProduct(simEdmName_, hSimTrackProduct, event);
225
226 const edm::SimTrackContainer simTracks = *(hSimTrackProduct.product());
227
228 Handle<std::vector<SimVertex> > hSimVertexProduct;
229 GetProduct(simEdmName_, hSimVertexProduct, event);
230
231 const edm::SimVertexContainer simVertexes = *(hSimVertexProduct.product());
232
233
234
235
236 // loop through all simParticles
237 for (SimTrackContainer::const_iterator iM = simTracks.begin();
238 iM != simTracks.end(); ++iM) {
239
240 if (iM->vertIndex()>=0) {
241 SimTrackRef theRef(hSimTrackProduct, iM-simTracks.begin());
242 mithep::MCParticle *simDaughter = simMap_->GetMit(theRef);
243 const SimVertex &theVertex = simVertexes.at(iM->vertIndex());
244 if (theVertex.parentIndex()>=0) {
245 mithep::MCParticle *simParent = simMap_->GetMit(simTidMap_[theVertex.parentIndex()]);
246 simParent->SetVertex(theVertex.position().x(),theVertex.position().y(),theVertex.position().z());
247 //make sure we don't double count the decay tree
248 if ( !simParent->HasDaughter(simDaughter) ) {
249 simParent->AddDaughter(simDaughter);
250 }
251 if ( !simDaughter->HasMother() ) {
252 simDaughter->SetMother(simParent);
253 }
254 }
255
256 }
257
258 }
259
260 }
261
262 //Debug output, will be uncommented and switchable later
263 // if (trackingActive_) {
264 //
265 // Handle<TrackingParticleCollection> hTrackingParticleProduct;
266 // GetProduct(trackingEdmName_, hTrackingParticleProduct, event);
267 //
268 // const TrackingParticleCollection trackingParticles = *(hTrackingParticleProduct.product());
269 //
270 // // loop through all simParticles
271 // for (TrackingParticleCollection::const_iterator iM = trackingParticles.begin();
272 // iM != trackingParticles.end(); ++iM) {
273 //
274 // TrackingParticleRef theRef(hTrackingParticleProduct, iM-trackingParticles.begin());
275 //
276 // mithep::MCParticle *simParent = trackingMap_->GetMit(theRef);
277 // printf("MCParticle pdg = %i, Daughter Pdgs: ", simParent->PdgId());
278 // for (UInt_t i=0; i<simParent->NDaughters(); ++i) {
279 // printf("%i, ", simParent->Daughter(i)->PdgId());
280 // }
281 // printf("\n");
282 //
283 // printf("TrackingParticle pdg = %i, Daughter Pdgs: ", iM->pdgId());
284 // for (TrackingVertexRefVector::iterator v= iM->decayVertices().begin();
285 // v != iM->decayVertices().end(); ++v) {
286 // for (TrackingParticleRefVector::iterator pd = v->get()->daughterTracks().begin();
287 // pd != v->get()->daughterTracks().end(); ++pd) {
288 // ;//printf("%i, ", pd->get()->pdgId());
289 // }
290 // }
291 // printf("\n");
292 // }
293 // }
294 }