13 #include <EVENT/LCCollection.h>
14 #include <IMPL/MCParticleImpl.h>
15 #include <IMPL/TrackImpl.h>
17 #include <EVENT/LCRelation.h>
18 #include <UTIL/LCRelationNavigator.h>
21 #include "marlin/VerbosityLevels.h"
37 m_rootFileName(
""), m_trackColName(
""), m_linkColName(
""),
39 rootfile(NULL), tree(NULL),
40 nTracks(0), lastRunHeaderProcessed(-1)
44 _description =
"AnalyseSidEdxProcessor reads Si tracker dEdx data from the .slcio file"
45 " and stores them in a root file for analysis." ;
50 registerProcessorParameter(
"RootFilename" ,
51 "Name of output root file",
53 std::string(
"SiTracker_dEdx.root") ) ;
55 registerInputCollection( LCIO::TRACK,
56 "TrackCollectionName" ,
57 "Name of the input Track collection" ,
59 std::string(
"SiTracks")
62 registerInputCollection( LCIO::LCRELATION,
63 "LinkCollectionName" ,
64 "Name of the LCRelation collection" ,
66 std::string(
"TrackMCTruthLink")
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"));
77 registerProcessorParameter(
"TrkHitCollections" ,
78 "Tracker hit collections that will be analysed",
80 defaultTrkHitCollections ) ;
87 streamlog_out(DEBUG) <<
" init called " << std::endl ;
92 gROOT->ProcessLine(
"#include <vector>");
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);
102 tree->Branch(
"eEvt", &
eEvt);
103 tree->Branch(
"vxMag", &
vxMag);
104 tree->Branch(
"m", &
m);
105 tree->Branch(
"nTrkHits", &
nTrkHits);
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);
120 streamlog_out(DEBUG) <<
" init done " << std::endl ;
135 if(evt->getEventNumber()%1000 == 0) {
136 streamlog_out(MESSAGE) <<
" processing event: " << evt->getEventNumber()
137 <<
" in run: " << evt->getRunNumber() << std::endl ;
146 double eThisEvt = 0.;
150 LCCollection* hits = NULL;
152 hits = evt->getCollection(hitCollName);
154 catch(EVENT::DataNotAvailableException &dataex) {
155 streamlog_out(DEBUG) <<
"Collection " << hitCollName <<
" not found in event #" << evt->getEventNumber() <<
".\n";
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());
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();
181 LCCollection* tracks = NULL;
185 catch(EVENT::DataNotAvailableException &dataex) {
186 streamlog_out(MESSAGE) <<
"Collection " <<
m_trackColName <<
" not found. Skipping event #" << evt->getEventNumber() <<
".\n";
191 LCRelationNavigator *track2mcNav = NULL;
193 track2mcNav =
new LCRelationNavigator(evt->getCollection(
m_linkColName ));
195 catch(EVENT::DataNotAvailableException &dataex) {
196 streamlog_out(MESSAGE) <<
"Collection " <<
m_linkColName <<
" not found. Skipping event #" << evt->getEventNumber() <<
".\n";
201 nTracks = tracks->getNumberOfElements() ;
211 for (
int i = 0; i <
nTracks; i++)
214 TrackImpl * track =
dynamic_cast<TrackImpl*
>( tracks->getElementAt(i) );
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";
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";
229 streamlog_out(DEBUG) <<
" Number of weights of MCParticle connections " << mcpWeights.size() << std::endl;
231 if(mcParticles.size() != mcpWeights.size()) {
232 streamlog_out(ERROR) <<
"Different sizes of MCParticle and weight vectors! Aborting.\n";
242 MCParticleImpl *mcp = NULL;
243 for (
unsigned int iw = 0; iw < mcpWeights.size(); iw++)
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();
252 TVector3 p3(mcp->getMomentum());
254 pMC.push_back(
float(p3.Mag()));
255 thetaMC.push_back(
float(p3.Theta()));
256 vxMag.push_back(_vxMag);
259 dEdxError.push_back(track->getdEdxError());
263 EVENT::TrackerHitVec trackhits = track->getTrackerHits();
264 nTrkHits.push_back(trackhits.size());
268 for(
unsigned int ihit = 0; ihit < trackhits.size(); ihit++) {
271 TVector3 hitpos(trackhits[ihit]->getPosition());
274 eTrackHit.push_back(trackhits[ihit]->getEDep());
275 typeTrackHit.push_back(
double(trackhits[ihit]->getType()));
288 eDepHit += trackhits[ihit]->getEDep();
291 eTrack.push_back(eDepHit);
293 eEvt.push_back(eThisEvt);
std::string m_trackColName
std::string m_rootFileName
virtual void processRunHeader(LCRunHeader *run)
Called for every run.
AnalyseSidEdxProcessor for marlin.
AnalyseSidEdxProcessor aAnalyseSidEdxProcessor
StringVec m_trkHitCollNames
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.
std::string m_linkColName
virtual void end()
Called after data processing for clean up.
int lastRunHeaderProcessed
FloatVec nTrkRelatedParticles
std::vector< std::string > StringVec