All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups
AnalyseSidEdxProcessor.cc
Go to the documentation of this file.
1 /*
2  * AnalyseSidEdxProcessor.cc
3  *
4  * Created on: Dec 15, 2016
5  * Author: S. Lukic, Vinca Belgrade
6  */
7 
8 
9 
10 
11 #include "AnalyseSidEdxProcessor.h"
12 
13 #include <EVENT/LCCollection.h>
14 #include <IMPL/MCParticleImpl.h>
15 #include <IMPL/TrackImpl.h>
16 //#include <EVENT/Track.h>
17 #include <EVENT/LCRelation.h>
18 #include <UTIL/LCRelationNavigator.h>
19 
20 // ----- include for verbosity dependent logging ---------
21 #include "marlin/VerbosityLevels.h"
22 
23 //#include "marlin/Global.h"
24 //#include <MarlinTrk/IMarlinTrack.h>
25 //#include <MarlinTrk/IMarlinTrkSystem.h>
26 //#include "MarlinTrk/MarlinTrkUtils.h"
27 
28 #include <TVector3.h>
29 #include <TROOT.h>
30 
31 
32 
34 
35 
36 AnalyseSidEdxProcessor::AnalyseSidEdxProcessor() : Processor("AnalyseSidEdxProcessor"),
37  m_rootFileName(""), m_trackColName(""), m_linkColName(""),
38  m_trkHitCollNames(),
39  rootfile(NULL), tree(NULL),
40  nTracks(0), lastRunHeaderProcessed(-1)
41  {
42 
43  // modify processor description
44  _description = "AnalyseSidEdxProcessor reads Si tracker dEdx data from the .slcio file"
45  " and stores them in a root file for analysis." ;
46 
47 
48  // register steering parameters: name, description, class-variable, default value
49 
50  registerProcessorParameter("RootFilename" ,
51  "Name of output root file",
53  std::string("SiTracker_dEdx.root") ) ;
54 
55  registerInputCollection( LCIO::TRACK,
56  "TrackCollectionName" ,
57  "Name of the input Track collection" ,
59  std::string("SiTracks")
60  );
61 
62  registerInputCollection( LCIO::LCRELATION,
63  "LinkCollectionName" ,
64  "Name of the LCRelation collection" ,
66  std::string("TrackMCTruthLink")
67  );
68 
69  StringVec defaultTrkHitCollections;
70  defaultTrkHitCollections.push_back(std::string("ITrackerHits"));
71  defaultTrkHitCollections.push_back(std::string("ITrackerEndcapHits"));
72  defaultTrkHitCollections.push_back(std::string("OTrackerHits"));
73  defaultTrkHitCollections.push_back(std::string("OTrackerEndcapHits"));
74  defaultTrkHitCollections.push_back(std::string("VXDTrackerHits"));
75  defaultTrkHitCollections.push_back(std::string("VXDEndcapTrackerHits"));
76 
77  registerProcessorParameter("TrkHitCollections" ,
78  "Tracker hit collections that will be analysed",
80  defaultTrkHitCollections ) ;
81 
82 }
83 
84 
86 
87  streamlog_out(DEBUG) << " init called " << std::endl ;
88 
89  // usually a good idea to
90  printParameters() ;
91 
92  gROOT->ProcessLine("#include <vector>");
93 
94  rootfile = new TFile(m_rootFileName.c_str(), "RECREATE");
95  tree = new TTree ("SiTracks", "SiTracks");
96  tree->Branch("nTracks", &nTracks, "nTracks/I");
97  tree->Branch("pMC", &pMC);
98  tree->Branch("thetaMC", &thetaMC);
99  tree->Branch("eTrack", &eTrack);
100  tree->Branch("dEdxTrack", &dEdxTrack);
101  tree->Branch("dEdxError", &dEdxError);
102  tree->Branch("eEvt", &eEvt);
103  tree->Branch("vxMag", &vxMag);
104  tree->Branch("m", &m);
105  tree->Branch("nTrkHits", &nTrkHits);
106  tree->Branch("nTrkRelatedParticles", &nTrkRelatedParticles);
107  tree->Branch("zHit", &zHit);
108  tree->Branch("xHit", &xHit);
109  tree->Branch("yHit", &yHit);
110  tree->Branch("eHit", &eHit);
111  tree->Branch("typeHit", &typeHit);
112  tree->Branch("zTrackHit", &zTrackHit);
113  tree->Branch("xTrackHit", &xTrackHit);
114  tree->Branch("yTrackHit", &yTrackHit);
115  tree->Branch("eTrackHit", &eTrackHit);
116  tree->Branch("typeTrackHit", &typeTrackHit);
117 
119 
120  streamlog_out(DEBUG) << " init done " << std::endl ;
121 
122 }
123 
124 
126 
127  lastRunHeaderProcessed = run->getRunNumber();
128 
129 }
130 
131 
132 
134 
135  if(evt->getEventNumber()%1000 == 0) {
136  streamlog_out(MESSAGE) << " processing event: " << evt->getEventNumber()
137  << " in run: " << evt->getRunNumber() << std::endl ;
138  }
139 
140 
141  /******************************************/
142  /*** Collections of all tracker hits ***/
143  /******************************************/
144 
145  zHit.clear(); xHit.clear(); yHit.clear(); eHit.clear(); typeHit.clear();
146  double eThisEvt = 0.;
147 
148  for( auto hitCollName : m_trkHitCollNames) {
149 
150  LCCollection* hits = NULL;
151  try {
152  hits = evt->getCollection(hitCollName);
153  }
154  catch(EVENT::DataNotAvailableException &dataex) {
155  streamlog_out(DEBUG) << "Collection " << hitCollName << " not found in event #" << evt->getEventNumber() << ".\n";
156  hits = NULL;
157  continue;
158  }
159 
160  int nHits = hits->getNumberOfElements();
161  for(int ihit=0; ihit<nHits; ihit++) {
162  TrackerHit *hit = dynamic_cast<TrackerHit*>(hits->getElementAt(ihit));
163  TVector3 hitpos(hit->getPosition());
164 
165  xHit.push_back(hitpos.X());
166  yHit.push_back(hitpos.Y());
167  zHit.push_back(hitpos.Z());
168  eHit.push_back(hit->getEDep());
169  typeHit.push_back(hit->getType());
170  eThisEvt += hit->getEDep();
171  } // Loop over hits in collection
172 
173  } // Loop over hit collections
174 
175 
176 
177  /************************************/
178  /*** Get track collections ***/
179  /************************************/
180 
181  LCCollection* tracks = NULL;
182  try {
183  tracks = evt->getCollection(m_trackColName);
184  }
185  catch(EVENT::DataNotAvailableException &dataex) {
186  streamlog_out(MESSAGE) << "Collection " << m_trackColName << " not found. Skipping event #" << evt->getEventNumber() << ".\n";
187  tracks = NULL;
188  return;
189  }
190 
191  LCRelationNavigator *track2mcNav = NULL;
192  try {
193  track2mcNav = new LCRelationNavigator(evt->getCollection( m_linkColName ));
194  }
195  catch(EVENT::DataNotAvailableException &dataex) {
196  streamlog_out(MESSAGE) << "Collection " << m_linkColName << " not found. Skipping event #" << evt->getEventNumber() << ".\n";
197  track2mcNav = NULL;
198  return;
199  }
200 
201  nTracks = tracks->getNumberOfElements() ;
202 
203  /*** Reset variables ***/
204  pMC.clear(); thetaMC.clear();
205  eTrack.clear(); dEdxTrack.clear(); dEdxError.clear(); eEvt.clear();
206  nTrkHits.clear();
207  nTrkRelatedParticles.clear();
208  zTrackHit.clear(); xTrackHit.clear(); yTrackHit.clear(); eTrackHit.clear(); typeTrackHit.clear();
209  vxMag.clear(); m.clear();
210 
211  for (int i = 0; i < nTracks; i++)
212  {
213 
214  TrackImpl * track = dynamic_cast<TrackImpl*>( tracks->getElementAt(i) );
215 
216  /*** Find the associated MC particle ***/
217 
218  const LCObjectVec& mcParticles = track2mcNav->getRelatedToObjects(track);
219  if (mcParticles.size() == 0) {
220  streamlog_out(WARNING) << " No MCParticles connected to this track! Skipping track.\n";
221  continue;
222  }
223  streamlog_out(DEBUG) << " Number of MCParticles connected to this track " << mcParticles.size() << std::endl;
224  const FloatVec& mcpWeights = track2mcNav->getRelatedToWeights(track);
225  if (mcpWeights.size() == 0) {
226  streamlog_out(WARNING) << " Set of MC particle weights for this track is empty! Skipping track.\n";
227  continue;
228  }
229  streamlog_out(DEBUG) << " Number of weights of MCParticle connections " << mcpWeights.size() << std::endl;
230 
231  if(mcParticles.size() != mcpWeights.size()) {
232  streamlog_out(ERROR) << "Different sizes of MCParticle and weight vectors! Aborting.\n";
233  exit(0);
234  }
235 
236  nTrkRelatedParticles.push_back(mcpWeights.size());
237 
238  double maxw = 0.;
239  double _vxMag, mass;
240  _vxMag = -1.;
241  mass = -1.;
242  MCParticleImpl *mcp = NULL;
243  for (unsigned int iw = 0; iw < mcpWeights.size(); iw++)
244  {
245  if (mcpWeights[iw] > maxw) {
246  mcp = dynamic_cast<MCParticleImpl*>(mcParticles[iw]);
247  maxw = mcpWeights[iw];
248  _vxMag = (TVector3(mcp->getVertex())).Mag();
249  mass = mcp->getMass();
250  }
251  }
252  TVector3 p3(mcp->getMomentum());
253 
254  pMC.push_back(float(p3.Mag()));
255  thetaMC.push_back(float(p3.Theta()));
256  vxMag.push_back(_vxMag);/**/
257  m.push_back(mass);/**/
258  dEdxTrack.push_back(track->getdEdx());
259  dEdxError.push_back(track->getdEdxError());
260 
261  /*** Individual hits belonging to this track ***/
262 
263  EVENT::TrackerHitVec trackhits = track->getTrackerHits();
264  nTrkHits.push_back(trackhits.size());
265 
266  float eDepHit = 0.;
267 
268  for(unsigned int ihit = 0; ihit < trackhits.size(); ihit++) {
269 
270  // Hit position
271  TVector3 hitpos(trackhits[ihit]->getPosition());
272 
273  zTrackHit.push_back(hitpos.z()); xTrackHit.push_back(hitpos.x()); yTrackHit.push_back(hitpos.y());
274  eTrackHit.push_back(trackhits[ihit]->getEDep());
275  typeTrackHit.push_back(double(trackhits[ihit]->getType()));
276 
277  /****************
278  // Repeatedly store track-related variables with each hit
279  // for easier analysis in ROOT
280  pMC.push_back(float(p3.Mag()));
281  thetaMC.push_back(float(p3.Theta()));
282  d0.push_back(d_0);
283  m.push_back(mass);
284 
285  nTrkHits.push_back(trackhits.size());
286  **********************/
287 
288  eDepHit += trackhits[ihit]->getEDep();
289  }
290 
291  eTrack.push_back(eDepHit);
292  // Repeatedly store total energy in event for easier analysis in ROOT
293  eEvt.push_back(eThisEvt);
294  }
295 
296  tree->Fill();
297 
298 }
299 
300 
301 
302 
303 
304 void AnalyseSidEdxProcessor::check( LCEvent * /*evt*/ ) {
305  // nothing to check here - could be used to fill checkplots in reconstruction processor
306 }
307 
308 
310 
311  // std::cout << "AnalyseSidEdxProcessor::end() " << name()
312  // << " processed " << _nEvt << " events in " << _nRun << " runs "
313  // << std::endl ;
314  rootfile->Write();
315  rootfile->Close();
316 }
317 
virtual void processRunHeader(LCRunHeader *run)
Called for every run.
AnalyseSidEdxProcessor for marlin.
AnalyseSidEdxProcessor aAnalyseSidEdxProcessor
FloatVec pMC
ROOT output.
virtual void init()
Called at the begin of the job before anything is read.
virtual void check(LCEvent *evt)
virtual void processEvent(LCEvent *evt)
Called for every event - the working horse.
virtual void end()
Called after data processing for clean up.
std::vector< std::string > StringVec
Definition: SiStripClus.h:56