All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups
IsoLepTrainingProcessor.cc
Go to the documentation of this file.
1 // *****************************************************
2 // Processor for training isolated leptons selection
3 // ----Junping
4 // *****************************************************
6 #include <iostream>
7 #include <sstream>
8 #include <iomanip>
9 
10 #include <EVENT/LCCollection.h>
11 #include <EVENT/MCParticle.h>
12 #include <IMPL/LCCollectionVec.h>
13 #include <EVENT/ReconstructedParticle.h>
14 #include <IMPL/ReconstructedParticleImpl.h>
15 #include <EVENT/Cluster.h>
16 #include <UTIL/LCTypedVector.h>
17 #include <EVENT/Track.h>
18 #include <UTIL/LCRelationNavigator.h>
19 #include <EVENT/ParticleID.h>
20 #include <marlin/Exceptions.h>
21 #include <EVENT/Vertex.h>
22 
23 // ----- include for verbosity dependend logging ---------
24 #include "marlin/VerbosityLevels.h"
25 
26 #include "TROOT.h"
27 #include "TFile.h"
28 #include "TH1D.h"
29 #include "TNtupleD.h"
30 #include "TVector3.h"
31 #include "TMath.h"
32 #include "TLorentzVector.h"
33 
34 #include "Utilities.h"
35 
36 //#define __SINGLEP__
37 
38 using namespace lcio ;
39 using namespace marlin ;
40 using namespace std;
41 
42 using namespace isolep;
43 
45 
46 
47 IsoLepTrainingProcessor::IsoLepTrainingProcessor() : Processor("IsoLepTrainingProcessor") {
48 
49  // modify processor description
50  _description = "IsoLepTrainingProcessor does whatever it does ..." ;
51 
52 
53  // register steering parameters: name, description, class-variable, default value
54 
55  registerInputCollection( LCIO::MCPARTICLE,
56  "InputMCParticlesCollection" ,
57  "Name of the MCParticle collection" ,
58  _colMCP ,
59  std::string("MCParticlesSkimmed") ) ;
60 
61  registerInputCollection( LCIO::LCRELATION,
62  "InputMCTruthLinkCollection" ,
63  "Name of the MCTruthLink collection" ,
64  _colMCTL ,
65  std::string("RecoMCTruthLink") ) ;
66 
67  registerInputCollection( LCIO::RECONSTRUCTEDPARTICLE,
68  "InputPandoraPFOsCollection" ,
69  "Name of the PandoraPFOs collection" ,
70  _colPFOs ,
71  std::string("PandoraPFOs") ) ;
72 
73  registerInputCollection( LCIO::VERTEX,
74  "InputPrimaryVertexCollection" ,
75  "Name of the Primary Vertex collection" ,
76  _colPVtx ,
77  std::string("PrimaryVertex") ) ;
78 
79  registerProcessorParameter("IsLepTune",
80  "Is lepton tune?" ,
81  _is_lep_tune ,
82  bool(true) ) ;
83 
84  registerProcessorParameter("MCDebugging" ,
85  "set true if you want to check generator information",
86  _mcdebug,
87  bool(false)
88  );
89 
90  registerProcessorParameter("IsForSignal",
91  "Is for signal?" ,
92  _is_for_sig ,
93  bool(true) ) ;
94 
95  registerProcessorParameter("IsoLepType",
96  "Isolated Lepton Type" ,
98  int(13) ) ;
99 }
100 
102 
103  streamlog_out(DEBUG) << " init called "
104  << std::endl ;
105 
106 
107  // usually a good idea to
108  printParameters() ;
109 
110  _nRun = 0 ;
111  _nEvt = 0 ;
112 
113 }
114 
116 
117  _nRun++ ;
118 }
119 
121 
122 
123  // this gets called for every event
124  // usually the working horse ...
125  _nEvt++;
126 
127 #if 1
128  Double_t fEtrackCut = -1.; // lower edge of each PFO energy
129 #else
130  Double_t fEtrackCut = 0.05; // lower edge of each PFO energy
131 #endif
132  Double_t fCosConeCut = 0.98; // the angle of cone around the direction of pfo
133  Double_t fCosLargeConeCut = 0.95; // angel of large cone around the pfo
134 
135  TDirectory *last = gDirectory;
136  gFile->cd("/");
137 
138  cerr << endl << "Hello, MVA Lepton Training! Event No. " << _nEvt << endl;
139 
140  static TNtupleD *hGen = 0;
141  if (!hGen) {
142  stringstream tupstr_gen;
143  tupstr_gen << "nhbb:pdg:npvt:zipmc:xipmc:yipmc:zipvf:xipvf:yipvf:nlepmc:ievt:seriallep:iov:xerrip:yerrip:zerrip:ntrksip" << ":"
144  << "cosmc:phimc:pmc"
145  << ends;
146  hGen = new TNtupleD("hGen","",tupstr_gen.str().data());
147  }
148  static TNtupleD *hLep = 0;
149  if (!hLep) {
150  stringstream tupstr_lep;
151  tupstr_lep << "pdg:nlepmc:ievt:seriallep:iov:orig"
152  << ends;
153  hLep = new TNtupleD("hLep","",tupstr_lep.str().data());
154  }
155 
156  // -- Get the MCTruth Linker --
157  LCCollection *colMCTL = evt->getCollection(_colMCTL);
158  LCRelationNavigator *navMCTL = new LCRelationNavigator(colMCTL);
159 
160 #ifndef __SINGLEP__
161  // -- Read out MC information --
162  LCCollection *colMC = evt->getCollection(_colMCP);
163  if (!colMC) {
164  std::cerr << "No MC Collection Found!" << std::endl;
165  throw marlin::SkipEventException(this);
166  }
167  // get the truth information
168  Int_t nMCP = colMC->getNumberOfElements();
169 #endif
170  Int_t pdgLepMC = -1,serialLepMC = -1,nMCLep=0,iOvlLepMC=-999;
171  Double_t z_IPMC=999.,x_IPMC=999.,y_IPMC=999.;
172  std::vector<Int_t> pdgLepMCv,serialLepMCv;
173  TLorentzVector lortzLepMC;
174  pdgLepMC = _iso_lep_type;
175 #ifndef __SINGLEP__
176  for (Int_t i=0;i<nMCP;i++) {
177  MCParticle *mcPart = dynamic_cast<MCParticle*>(colMC->getElementAt(i));
178  Int_t pdg = mcPart->getPDG();
179  Double_t energy = mcPart->getEnergy();
180  TVector3 pv = TVector3(mcPart->getMomentum());
181  TLorentzVector lortz = TLorentzVector(pv,energy);
182  // Int_t orig = getOriginalPDGForIsoLep(mcPart);
183  Int_t orig = getOriginalPDGForIsoLep(mcPart,colMC);
184  Int_t status = mcPart->getGeneratorStatus();
185  if (i>=6 && i<=11) {
186  if (TMath::Abs(pdg) == 11 || TMath::Abs(pdg) == 13 || TMath::Abs(pdg) == 15) {
187  pdgLepMC = pdg;
188  pdgLepMCv.push_back(pdgLepMC);
189  }
190  }
191  Int_t origw = pdgLepMC > 0? -24 : 24;
192  // if ((TMath::Abs(pdg)==pdgLepMC) && (orig==24||orig==pdgLepMC) && status==1) {
193  // if (pdg==pdgLepMC && (orig==origw||orig==pdgLepMC) && status==1 && TMath::Abs(pdg)==_iso_lep_type && !(mcPart->isOverlay())) {
194  // if (status == 1 && TMath::Abs(pdg)==_iso_lep_type && TMath::Abs(orig) == 13 && !(mcPart->isOverlay())) {
195  if (i==0) {
196  serialLepMC=i;
197  serialLepMCv.push_back(i);
198  nMCLep++;
199  iOvlLepMC = mcPart->isOverlay() ? 1 : 0;
200  lortzLepMC = lortz;
201  Double_t data_lep[20];
202  data_lep[ 0] = pdg;
203  data_lep[ 1] = nMCLep;
204  data_lep[ 2] = _nEvt;
205  data_lep[ 3] = serialLepMC;
206  data_lep[ 4] = iOvlLepMC;
207  data_lep[ 5] = orig;
208  hLep->Fill(data_lep);
209  }
210  if (i == 0) {
211  TVector3 vip = TVector3(mcPart->getVertex());
212  z_IPMC = vip[2];
213  x_IPMC = vip[0];
214  y_IPMC = vip[1];
215  }
216  }
217 
218  if (_mcdebug) {
219  mcDebug(colMC);
220  }
221 
222  // primary vertex from MCTruth: z_IPMC
223 
224  // primary vertex from VertexFinder (LCFIPlus)
225  LCCollection *colPVtx = evt->getCollection(_colPVtx);
226  Int_t npvtx = colPVtx->getNumberOfElements();
227  Vertex *pvtx = dynamic_cast<Vertex*>(colPVtx->getElementAt(0));
228  TVector3 v_pvtx = TVector3(pvtx->getPosition());
229  Double_t z_pvtx = v_pvtx[2];
230  Double_t x_pvtx = v_pvtx[0];
231  Double_t y_pvtx = v_pvtx[1];
232  Double_t xerr_pvtx = TMath::Sqrt(pvtx->getCovMatrix()[0]);
233  Double_t yerr_pvtx = TMath::Sqrt(pvtx->getCovMatrix()[2]);
234  Double_t zerr_pvtx = TMath::Sqrt(pvtx->getCovMatrix()[5]);
235 
236  ReconstructedParticle *pvtx_rp = pvtx->getAssociatedParticle();
237  Int_t ntrks_pvtx = pvtx_rp->getParticles().size();
238 
239  std::vector<Int_t> nHDecay;
240  nHDecay = getHiggsDecayModes(colMC);
241  Double_t nHbb = nHDecay[0]; // tag H---> b b
242  Double_t data_gen[20];
243  data_gen[ 0] = nHbb;
244  data_gen[ 1] = pdgLepMC;
245  data_gen[ 2] = npvtx;
246  data_gen[ 3] = z_IPMC;
247  data_gen[ 4] = x_IPMC;
248  data_gen[ 5] = y_IPMC;
249  data_gen[ 6] = z_pvtx;
250  data_gen[ 7] = x_pvtx;
251  data_gen[ 8] = y_pvtx;
252  data_gen[ 9] = nMCLep;
253  data_gen[10] = _nEvt;
254  data_gen[11] = serialLepMC;
255  data_gen[12] = iOvlLepMC;
256  data_gen[13] = xerr_pvtx;
257  data_gen[14] = yerr_pvtx;
258  data_gen[15] = zerr_pvtx;
259  data_gen[16] = ntrks_pvtx;
260  data_gen[17] = lortzLepMC.CosTheta();
261  data_gen[18] = lortzLepMC.Phi();
262  data_gen[19] = lortzLepMC.P();
263  hGen->Fill(data_gen);
264 #endif
265  // return;
266  if (_is_for_sig && nMCLep == 0) {
267  std::cerr << "This is not an signal event with isolated muon or electron" << std::endl;
268  throw marlin::SkipEventException(this);
269  }
270 
271 
272  // -- Read out PFO information --
273  LCCollection *colPFO = evt->getCollection(_colPFOs);
274  if (!colPFO) {
275  std::cerr << "No PFO Collection Found!" << std::endl;
276  throw marlin::SkipEventException(this);
277  }
278  Int_t nPFOs = colPFO->getNumberOfElements();
279 
280  static TNtupleD *hPfo = 0;
281  if (!hPfo) {
282  stringstream tupstr_pfo;
283  tupstr_pfo << "ntracks:charge:mcpdg:motherpdg:deltae:mmotherpdg:ndaughters" << ":"
284  << "mcoriginal:energy:type:pid" << ":"
285  << "totalcalenergy:momentum:ecalenergy:hcalenergy:coneenergy" << ":"
286  << "nmctl:mcwgt:ievt:irun" << ":"
287  << "nhits:ncones:nconechg:nconeneu:coneec:coneen:energylink" << ":"
288  << "costheta:yokeenergy:energycor:momentumcor" << ":"
289  << "d0:z0:r0:deltad0:deltaz0:nsigd0:nsigz0:nsigr0:iov" << ":"
290  << "coslarcon:energyratio:nphoton:ratioecal:ratiototcal" << ":"
291  << "isim:pdgmc:orig:isorig:zipvf:zipmc" << ":"
292  << "x0:y0:xipmc:yipmc:xipvf:yipvf:mcserial:serialLepMC" << ":"
293  << "cosmc:phimc:pmc"
294  << ends;
295  hPfo = new TNtupleD("hPfo","",tupstr_pfo.str().data());
296  }
297 
298  // loop all the PFOs
299  for (Int_t i=0;i<nPFOs;i++) {
300  ReconstructedParticle *recPart = dynamic_cast<ReconstructedParticle*>(colPFO->getElementAt(i));
301  LCObjectVec vecMCTL = navMCTL->getRelatedToObjects(recPart);
302  FloatVec vecWgtMCTL = navMCTL->getRelatedToWeights(recPart);
303  Int_t mcpdg,motherpdg,mmotherpdg;
304  Double_t mcwgt=0.;
305  mcpdg = 0;
306  motherpdg = -99999;
307  mmotherpdg = -99999;
308  Double_t deltaE = -99999.;
309  Double_t energyLink = -99999.;
310  Int_t mcoriginal = 0;
311  Int_t mcoriginalIsoLep = 0;
312  Int_t mcndaughters = 0;
313  Int_t nMCTL = vecMCTL.size();
314  Int_t iOverlay = 0;
315  Int_t iCreatedInSim = 0;
316  Int_t mcserial = -1;
317 #ifndef __SINGLEP__
318  if (vecMCTL.size() > 0) {
319  // MCParticle *mcPart = dynamic_cast<MCParticle *>(vecMCTL[0]);
320  MCParticle *mcPart = getMCParticle(recPart,colMCTL,mcwgt);
321  if (!mcPart) continue;
322  if (mcPart->isOverlay()) iOverlay = 1;
323  if (mcPart->isCreatedInSimulation()) iCreatedInSim = 1;
324  mcpdg = mcPart->getPDG();
325  // mcwgt = vecWgtMCTL[0];
326  deltaE = mcPart->getEnergy()-recPart->getEnergy();
327  energyLink = mcPart->getEnergy();
328  mcoriginal = getOriginalPDG(mcPart);
329  mcoriginalIsoLep = getOriginalPDGForIsoLep(mcPart);
330  // mcoriginalIsoLep = getOriginalPDGForIsoLep(mcPart,colMC);
331  motherpdg = 0;
332  mcndaughters = mcPart->getDaughters().size();
333  if (mcPart->getParents().size() != 0) {
334  MCParticle *motherPart = mcPart->getParents()[0];
335  motherpdg = motherPart->getPDG();
336  mmotherpdg = 0;
337  if (motherPart->getParents().size() != 0) {
338  MCParticle *mmotherPart = motherPart->getParents()[0];
339  mmotherpdg = mmotherPart->getPDG();
340  }
341  }
342  mcserial = getMCSerial(mcPart,colMC);
343  }
344  // Int_t mcserial = getMCSerial(recPart,colMCTL,colMC);
345  // Int_t isOrigLep = mcserial==serialLepMC? 1:0;
346  Int_t isOrigLep = 0;
347  for (size_t j=0;j<serialLepMCv.size();j++) {
348  if (mcserial == serialLepMCv[j]) {
349  isOrigLep = 1;
350  break;
351  }
352  }
353 #else
354  Int_t isOrigLep = 0;
355 #endif
356  Double_t energy = recPart->getEnergy();
357  Double_t charge = recPart->getCharge();
358  Int_t itype = recPart->getType();
359  Int_t pid = 0;
360  TrackVec tckvec = recPart->getTracks();
361  Int_t ntracks = tckvec.size();
362  Double_t d0=0.,z0=0.,deltad0=0.,deltaz0=0.,nsigd0=0.,nsigz0=0.;
363  Double_t phi0=0.,x0=0.,y0=0.;
364  if (ntracks > 0) {
365  d0 = tckvec[0]->getD0();
366  z0 = tckvec[0]->getZ0();
367  phi0 = tckvec[0]->getPhi();
368  x0 = -d0*TMath::Sin(phi0);
369  y0 = d0*TMath::Cos(phi0);
370 #ifndef __SINGLEP__
371  z0 -= z_pvtx;
372 #endif
373  deltad0 = TMath::Sqrt(tckvec[0]->getCovMatrix()[0]);
374  deltaz0 = TMath::Sqrt(tckvec[0]->getCovMatrix()[9]);
375  nsigd0 = d0/deltad0;
376  nsigz0 = z0/deltaz0;
377  }
378  Double_t r0 = TMath::Sqrt(d0*d0+z0*z0);
379  Double_t nsigr0 = TMath::Sqrt(nsigd0*nsigd0+nsigz0*nsigz0);
380  Double_t data[100];
381  data[0] = ntracks;
382  data[1] = charge;
383  data[2] = mcpdg;
384  data[3] = motherpdg;
385  data[4] = deltaE;
386  data[5] = mmotherpdg;
387  data[6] = mcndaughters;
388  data[7] = mcoriginal;
389  data[8] = energy;
390  data[9] = itype;
391  data[10]= pid;
392  if (energy > fEtrackCut) {
393  Double_t ecalEnergy = 0;
394  Double_t hcalEnergy = 0;
395  Double_t yokeEnergy = 0;
396  Double_t totalCalEnergy = 0;
397  Int_t nHits = 0;
398  std::vector<lcio::Cluster*> clusters = recPart->getClusters();
399  for (std::vector<lcio::Cluster*>::const_iterator iCluster=clusters.begin();iCluster!=clusters.end();++iCluster) {
400  ecalEnergy += (*iCluster)->getSubdetectorEnergies()[0];
401  hcalEnergy += (*iCluster)->getSubdetectorEnergies()[1];
402  yokeEnergy += (*iCluster)->getSubdetectorEnergies()[2];
403  ecalEnergy += (*iCluster)->getSubdetectorEnergies()[3];
404  hcalEnergy += (*iCluster)->getSubdetectorEnergies()[4];
405  CalorimeterHitVec calHits = (*iCluster)->getCalorimeterHits();
406  // nHits += (*iCluster)->getCalorimeterHits().size();
407  nHits = calHits.size();
408  }
409  totalCalEnergy = ecalEnergy + hcalEnergy;
410  TVector3 momentum = TVector3(recPart->getMomentum());
411  Double_t momentumMagnitude = momentum.Mag();
412  Double_t cosTheta = momentum.CosTheta();
413  //get cone information
414  // std::vector<lcio::ReconstructedParticle*> conePFOs;
415  // Double_t coneEnergy = getConeEnergy(recPart,colPFO,fCosConeCut,conePFOs);
416  Bool_t woFSR = kTRUE;
417  Double_t coneEnergy0[3] = {0.,0.,0.};
418  Double_t pFSR[4] = {0.,0.,0.,0.};
419  Double_t pLargeCone[4] = {0.,0.,0.,0.};
420  Int_t nConePhoton = 0;
421  // getConeEnergy(recPart,colPFO,fCosConeCut,woFSR,coneEnergy0,pFSR);
422  getConeEnergy(recPart,colPFO,fCosConeCut,woFSR,coneEnergy0,pFSR,fCosLargeConeCut,pLargeCone,nConePhoton);
423  Double_t coneEnergy = coneEnergy0[0];
424  Double_t coneEN = coneEnergy0[1];
425  Double_t coneEC = coneEnergy0[2];
426  TLorentzVector lortzFSR = TLorentzVector(pFSR[0],pFSR[1],pFSR[2],pFSR[3]);
427  TLorentzVector lortzLargeCone = TLorentzVector(pLargeCone[0],pLargeCone[1],pLargeCone[2],pLargeCone[3]);
428  TVector3 momentumLargeCone = lortzLargeCone.Vect();
429  Double_t cosThetaWithLargeCone = 1.;
430  if (momentumLargeCone.Mag() > 0.0000001) {
431  cosThetaWithLargeCone = momentum.Dot(momentumLargeCone)/momentumMagnitude/momentumLargeCone.Mag();
432  }
433  Double_t energyRatioWithLargeCone = energy/(energy+lortzLargeCone.E());
434  Double_t energyCorr = energy + lortzFSR.E();
435  TVector3 momentumCorr = momentum + TVector3(lortzFSR.Px(),lortzFSR.Py(),lortzFSR.Pz());
436  Double_t momentumMagCorr = momentumCorr.Mag();
437  Double_t ratioECal = 0., ratioTotalCal = 0.;
438  if (ecalEnergy > 0.) ratioECal = ecalEnergy/totalCalEnergy;
439  // ratioTotalCal = totalCalEnergy/momentumMagnitude;
440  ratioTotalCal = totalCalEnergy/(momentumMagnitude+0.00000001);
441  // Int_t nConePFOs = conePFOs.size();
442  Int_t nConePFOs = 0;
443  Int_t nConeCharged = 0;
444  Int_t nConeNeutral = 0;
445  // save the pfo information
446  data[11] = totalCalEnergy;
447  data[12] = momentumMagnitude;
448  data[13] = ecalEnergy;
449  data[14] = hcalEnergy;
450  data[15] = coneEnergy;
451  data[16] = nMCTL;
452  data[17] = mcwgt;
453  data[18] = _nEvt;
454  data[19] = _nRun;
455  data[20] = nHits;
456  data[21] = nConePFOs;
457  data[22] = nConeCharged;
458  data[23] = nConeNeutral;
459  data[24] = coneEC;
460  data[25] = coneEN;
461  data[26] = energyLink;
462  data[27] = cosTheta;
463  data[28] = yokeEnergy;
464  data[29] = energyCorr;
465  data[30] = momentumMagCorr;
466  data[31] = d0;
467  data[32] = z0;
468  data[33] = r0;
469  data[34] = deltad0;
470  data[35] = deltaz0;
471  data[36] = nsigd0;
472  data[37] = nsigz0;
473  data[38] = nsigr0;
474  data[39] = iOverlay;
475  data[40] = cosThetaWithLargeCone;
476  data[41] = energyRatioWithLargeCone;
477  data[42] = nConePhoton;
478  data[43] = ratioECal;
479  data[44] = ratioTotalCal;
480  data[45] = iCreatedInSim;
481  data[46] = pdgLepMC;
482  data[47] = mcoriginalIsoLep;
483  data[48] = isOrigLep;
484  data[49] = z_pvtx;
485  data[50] = z_IPMC;
486  data[51] = x0;
487  data[52] = y0;
488  data[53] = x_IPMC;
489  data[54] = y_IPMC;
490  data[55] = x_pvtx;
491  data[56] = y_pvtx;
492  data[57] = mcserial;
493  data[58] = serialLepMC;
494  data[59] = lortzLepMC.CosTheta();
495  data[60] = lortzLepMC.Phi();
496  data[61] = lortzLepMC.P();
497  if (_is_lep_tune) {
498  if(_is_for_sig) {
499  if (isOrigLep==1) hPfo->Fill(data);
500  }
501  else {
502  hPfo->Fill(data);
503  }
504  }
505  }
506  }
507 
508  //-- note: this will not be printed if compiled w/o MARLINDEBUG=1 !
509 
510  streamlog_out(DEBUG) << " processing event: " << evt->getEventNumber()
511  << " in run: " << evt->getRunNumber()
512  << std::endl ;
513 
514  // _nEvt ++ ;
515 
516  last->cd();
517 }
518 
519 
520 
521 void IsoLepTrainingProcessor::check( LCEvent * ) {
522  // nothing to check here - could be used to fill checkplots in reconstruction processor
523 }
524 
525 
527 
528  cerr << "IsoLepTrainingProcessor::end() " << name()
529  << " processed " << _nEvt << " events in " << _nRun << " runs "
530  << endl ;
531 
532 }
Int_t getOriginalPDGForIsoLep(MCParticle *mcPart, LCCollection *colMC)
Definition: Utilities.cc:150
void mcDebug(LCCollection *colMC)
Definition: Utilities.cc:1171
Example processor for marlin.
IsoLepTrainingProcessor aIsoLepTrainingProcessor
std::string _colMCP
Input collection name.
Double_t getConeEnergy(ReconstructedParticle *recPart, LCCollection *colPFO, Double_t cosCone)
Definition: Utilities.cc:361
virtual void processEvent(LCEvent *evt)
Called for every event - the working horse.
Int_t getOriginalPDG(MCParticle *mcPart, Bool_t iHiggs=0)
Definition: Utilities.cc:85
Int_t getMCSerial(MCParticle *mcPart, LCCollection *colMCP)
Definition: Utilities.cc:16
virtual void init()
Called at the begin of the job before anything is read.
MCParticle * getMCParticle(ReconstructedParticle *recPart, LCCollection *colMCTL)
Definition: Utilities.cc:30
virtual void check(LCEvent *evt)
virtual void end()
Called after data processing for clean up.
std::vector< Int_t > getHiggsDecayModes(LCCollection *colMC)
Definition: Utilities.cc:1073
virtual void processRunHeader(LCRunHeader *run)
Called for every run.