ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerMCParticles.cc
Revision: 1.4
Committed: Fri Sep 5 23:46:14 2008 UTC (16 years, 8 months ago) by bendavid
Content type: text/plain
Branch: MAIN
Changes since 1.3: +127 -46 lines
Log Message:
Fixed filling of simulation info, added config for simultaneous RAW-RECO reading

File Contents

# User Rev Content
1 bendavid 1.4 // $Id: FillerMCParticles.cc,v 1.3 2008/07/31 12:34:04 loizides 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     #include "SimDataFormats/HepMCProduct/interface/HepMCProduct.h"
7 bendavid 1.4 #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 bendavid 1.1 #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 bendavid 1.4 trackingActive_(Conf().getUntrackedParameter<bool>("trackingActive",false)),
27 bendavid 1.1 genEdmName_(Conf().getUntrackedParameter<string>("genEdmName","source")),
28 bendavid 1.4 simEdmName_(Conf().getUntrackedParameter<string>("simEdmName","g4SimHits")),
29     trackingEdmName_(Conf().getUntrackedParameter<string>("trackingEdmName","mergedtruth:MergedTrackTruth")),
30 loizides 1.3 genMapName_(Conf().getUntrackedParameter<string>("genMapName","GenMap")),
31     simMapName_(Conf().getUntrackedParameter<string>("simMapName","SimMap")),
32 bendavid 1.4 trackingMapName_(Conf().getUntrackedParameter<string>("trackingMapName","TrackingMap")),
33 bendavid 1.1 mitName_(Conf().getUntrackedParameter<string>("mitName",Names::gkMCPartBrn)),
34     mcParticles_(new mithep::MCParticleArr(250)),
35 loizides 1.3 genMap_(genActive_?new mithep::GenParticleMap:0),
36 bendavid 1.4 simMap_(simActive_?new mithep::SimTrackMap:0),
37     trackingMap_(trackingActive_?new mithep::TrackingParticleMap:0)
38 bendavid 1.1 {
39     // Constructor.
40     }
41    
42     //--------------------------------------------------------------------------------------------------
43     FillerMCParticles::~FillerMCParticles()
44     {
45     // Destructor.
46    
47     delete mcParticles_;
48     delete genMap_;
49     delete simMap_;
50 bendavid 1.4 delete trackingMap_;
51 bendavid 1.1 }
52    
53     //--------------------------------------------------------------------------------------------------
54     void FillerMCParticles::BookDataBlock(TreeWriter &tws)
55     {
56 loizides 1.3 // Add branch to tree and publish our maps.
57 bendavid 1.1
58     tws.AddBranch(mitName_.c_str(),&mcParticles_);
59 loizides 1.2
60 loizides 1.3 if (genActive_)
61     OS()->add(genMap_,genMapName_.c_str());
62     if (simActive_)
63     OS()->add(simMap_,simMapName_.c_str());
64 bendavid 1.4 if (trackingActive_)
65     OS()->add(trackingMap_,trackingMapName_.c_str());
66 bendavid 1.1 }
67    
68     //--------------------------------------------------------------------------------------------------
69     void FillerMCParticles::FillDataBlock(const edm::Event &event,
70 loizides 1.2 const edm::EventSetup &setup)
71 bendavid 1.1 {
72     // Loop over HepMC particle and fill their information.
73    
74     mcParticles_->Reset();
75    
76     if (genActive_) {
77 loizides 1.3 genMap_->Reset();
78 bendavid 1.1
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 bendavid 1.4 simTidMap_.clear();
106 loizides 1.3 simMap_->Reset();
107 bendavid 1.4
108     Handle<edm::SimTrackContainer> hSimTrackProduct;
109     GetProduct(simEdmName_, hSimTrackProduct, event);
110    
111     const edm::SimTrackContainer simTracks = *(hSimTrackProduct.product());
112    
113 bendavid 1.1 // loop through all simParticles
114 bendavid 1.4 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 bendavid 1.1 mithep::MCParticle *outSimParticle;
120    
121 bendavid 1.4 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 bendavid 1.1 }
125     else {
126     outSimParticle = mcParticles_->Allocate();
127 bendavid 1.4 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 bendavid 1.1 }
134    
135     outSimParticle->SetIsSimulated();
136     simMap_->Add(theRef, outSimParticle);
137 bendavid 1.4
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 bendavid 1.1 }
171     }
172    
173     mcParticles_->Trim();
174     }
175    
176     //--------------------------------------------------------------------------------------------------
177     void FillerMCParticles::ResolveLinks(const edm::Event &event,
178 loizides 1.2 const edm::EventSetup &setup)
179 bendavid 1.1 {
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 loizides 1.3
202 bendavid 1.1 if (genParent->IsSimulated()) continue;
203    
204     //set decay vertex
205     //division by 10.0 is needed due to HepMC use of mm instead of cm for distance units
206     genParent->SetVertex(dVertex->point3d().x()/10.0,
207     dVertex->point3d().y()/10.0,
208     dVertex->point3d().z()/10.0);
209    
210     //loop through daugthers
211 loizides 1.3 for (HepMC::GenVertex::particles_out_const_iterator pgenD =
212     dVertex->particles_out_const_begin();
213     pgenD != dVertex->particles_out_const_end(); ++pgenD) {
214 bendavid 1.1 HepMC::GenParticle *mcDaughter = (*pgenD);
215     mithep::MCParticle *genDaughter = genMap_->GetMit(mcDaughter->barcode());
216     genParent->AddDaughter(genDaughter);
217     if (!(genDaughter->HasMother()))
218     genDaughter->SetMother(genParent);
219     }
220     }
221     }
222    
223 bendavid 1.4 //loop over SimTracks and resolve links
224 bendavid 1.1 if (simActive_) {
225 bendavid 1.4 Handle<edm::SimTrackContainer> hSimTrackProduct;
226     GetProduct(simEdmName_, hSimTrackProduct, event);
227    
228     const edm::SimTrackContainer simTracks = *(hSimTrackProduct.product());
229    
230     Handle<std::vector<SimVertex> > hSimVertexProduct;
231     GetProduct(simEdmName_, hSimVertexProduct, event);
232    
233     const edm::SimVertexContainer simVertexes = *(hSimVertexProduct.product());
234    
235    
236    
237 loizides 1.2
238 bendavid 1.1 // loop through all simParticles
239 bendavid 1.4 for (SimTrackContainer::const_iterator iM = simTracks.begin();
240     iM != simTracks.end(); ++iM) {
241    
242     if (iM->vertIndex()>=0) {
243     SimTrackRef theRef(hSimTrackProduct, iM-simTracks.begin());
244     mithep::MCParticle *simDaughter = simMap_->GetMit(theRef);
245     const SimVertex &theVertex = simVertexes.at(iM->vertIndex());
246     if (theVertex.parentIndex()>=0) {
247     mithep::MCParticle *simParent = simMap_->GetMit(simTidMap_[theVertex.parentIndex()]);
248     simParent->SetVertex(theVertex.position().x(),theVertex.position().y(),theVertex.position().z());
249 bendavid 1.1 simParent->AddDaughter(simDaughter);
250     simDaughter->SetMother(simParent);
251     }
252 bendavid 1.4
253 bendavid 1.1 }
254 bendavid 1.4
255 bendavid 1.1 }
256 bendavid 1.4
257 bendavid 1.1 }
258 bendavid 1.4
259     //Debug output, will be uncommented and switchable later
260     // if (trackingActive_) {
261     //
262     // Handle<TrackingParticleCollection> hTrackingParticleProduct;
263     // GetProduct(trackingEdmName_, hTrackingParticleProduct, event);
264     //
265     // const TrackingParticleCollection trackingParticles = *(hTrackingParticleProduct.product());
266     //
267     // // loop through all simParticles
268     // for (TrackingParticleCollection::const_iterator iM = trackingParticles.begin();
269     // iM != trackingParticles.end(); ++iM) {
270     //
271     // TrackingParticleRef theRef(hTrackingParticleProduct, iM-trackingParticles.begin());
272     //
273     // mithep::MCParticle *simParent = trackingMap_->GetMit(theRef);
274     // printf("MCParticle pdg = %i, Daughter Pdgs: ", simParent->PdgId());
275     // for (UInt_t i=0; i<simParent->NDaughters(); ++i) {
276     // printf("%i, ", simParent->Daughter(i)->PdgId());
277     // }
278     // printf("\n");
279     //
280     // printf("TrackingParticle pdg = %i, Daughter Pdgs: ", iM->pdgId());
281     // for (TrackingVertexRefVector::iterator v= iM->decayVertices().begin();
282     // v != iM->decayVertices().end(); ++v) {
283     // for (TrackingParticleRefVector::iterator pd = v->get()->daughterTracks().begin();
284     // pd != v->get()->daughterTracks().end(); ++pd) {
285     // ;//printf("%i, ", pd->get()->pdgId());
286     // }
287     // }
288     // printf("\n");
289     // }
290     // }
291 bendavid 1.1 }