hpstr
The Heavy Photon Search Toolkit for Reconstruction (hpstr) provides an interface to physics data from the HPS experiment saved in the LCIO format and converts it into an ROOT based format.
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
RefittedTracksProcessor.cxx
Go to the documentation of this file.
2#include <iomanip>
3#include "utilities.h"
4
5
7 : Processor(name, process) {
8
10 _RefitTrkHistos = new TrackHistos("refit");
11 _RefitTrkHistos_z0cut = new TrackHistos("refit_z0");
12 _RefitTrkHistos_chi2cut = new TrackHistos("refit_chi2");
13}
14
17
18
20 histoCfg_ = parameters.getString("histoCfg");
21
22}
23
25
26 tree->Branch("GBLRefittedTracks", &tracks_);
27 tree->Branch("V0Vertices", &vertices_);
28 tree->Branch("V0Vertices_refit", &vertices_refit_);
29
30
31 //Original hists
35
36
37 //Refit hists
42
43
44 //Refit hists with z0 closer to 0
49
50
51 //Refit hists with z0 closer to 0
56
57
58
59}
60
62
63 tracks_.clear();
64 refit_tracks_.clear();
65 vertices_.clear();
66 vertices_refit_.clear();
67
68 Event* event = static_cast<Event*> (ievent);
69 //Get all the tracks
70 EVENT::LCCollection* tracks = event->getLCCollection(Collections::GBL_TRACKS);
71
72 //Get all the 3D hits
73 EVENT::LCCollection* trackerHits = event->getLCCollection(Collections::TRACKER_HITS);
74
75 //Get all the rawHits fits
76 EVENT::LCCollection* raw_svt_hit_fits = event->getLCCollection(Collections::RAW_SVT_HIT_FITS);
77
78 //Grab the vertices and the vtx candidates
79 EVENT::LCCollection* u_vtx_candidates = nullptr;
80 EVENT::LCCollection* u_vtxs = nullptr;
81 if (utils::hasCollection(event->getLCEvent(),Collections::UC_V0CANDIDATES)) {
82 //Get the vertex candidates
83 u_vtx_candidates = event->getLCCollection(Collections::UC_V0CANDIDATES);
84 //Get the vertices
85 u_vtxs = event->getLCCollection(Collections::UC_V0VERTICES);
86
87
88 for (int ivtx = 0 ; ivtx < u_vtxs->getNumberOfElements(); ++ivtx) {
89 Vertex* vtx = utils::buildVertex(static_cast<EVENT::Vertex*>(u_vtxs->getElementAt(ivtx)));
90 vertices_.push_back(vtx);
92 }
93 _OriginalTrkHistos->Fill1DHisto("n_vertices_h",u_vtxs->getNumberOfElements());
94 }
95
96 //Grab the vertices and the vtx candidates
97 EVENT::LCCollection* u_vtx_candidates_r = nullptr;
98 EVENT::LCCollection* u_vtxs_r = nullptr;
99 if (utils::hasCollection(event->getLCEvent(),"UnconstrainedV0Candidates_refit")) {
100 //Get the vertex candidates
101 u_vtx_candidates_r = event->getLCCollection("UnconstrainedV0Candidates_refit");
102 //Get the vertices
103 u_vtxs_r = event->getLCCollection("UnconstrainedV0Vertices_refit");
104
105 for (int ivtx = 0 ; ivtx < u_vtxs_r->getNumberOfElements(); ++ivtx) {
106 Vertex* vtx_r = utils::buildVertex(static_cast<EVENT::Vertex*>(u_vtxs_r->getElementAt(ivtx)));
107 vertices_refit_.push_back(vtx_r);
108 _RefitTrkHistos->Fill1DHistograms(nullptr,vtx_r);
109 }
110 _RefitTrkHistos->Fill1DHisto("n_vertices_h",u_vtxs_r->getNumberOfElements());
111 }
112
113
114 //Initialize map of shared hits
115 std::map <int, std::vector<int> > SharedHits;
116 //TODO: can we do better? (innermost)
117 std::map <int, bool> SharedHitsLy0;
118 std::map <int, bool> SharedHitsLy1;
119
120 for (int itrack = 0; itrack < tracks->getNumberOfElements();++itrack) {
121 SharedHits[itrack] = {};
122 SharedHitsLy0[itrack] = false;
123 SharedHitsLy1[itrack] = false;
124 }
125
126
127 _OriginalTrkHistos->Fill1DHisto("n_tracks_h",tracks->getNumberOfElements());
128 // Loop over all the LCIO Tracks and add them to the HPS event.
129 for (int itrack = 0; itrack < tracks->getNumberOfElements(); ++itrack) {
130
131 // Get a LCIO Track from the LCIO event
132 EVENT::Track* lc_track = static_cast<EVENT::Track*>(tracks->getElementAt(itrack));
133
134 // Get the GBL kink data
135 EVENT::LCCollection* gbl_kink_data =
136 static_cast<EVENT::LCCollection*>(event->getLCCollection(Collections::KINK_DATA_REL));
137
138 // Get the track data
139 EVENT::LCCollection* track_data = static_cast<EVENT::LCCollection*>(event->getLCCollection(Collections::TRACK_DATA_REL));
140
141 // Add a track to the event
142 Track* track = utils::buildTrack(lc_track,"", gbl_kink_data, track_data);
143
144
145 //Get the refitted tracks relations
146
147 EVENT::LCCollection* refitted_tracks_rel =
148 static_cast<EVENT::LCCollection*>(event->getLCCollection("GBLTrackToGBLTrackRefitRelations"));
149
150 //Build the navigator
151 UTIL::LCRelationNavigator* refitted_tracks_nav = new UTIL::LCRelationNavigator(refitted_tracks_rel);
152
153
154 //Get the list of data
155 EVENT::LCObjectVec refitted_tracks_list = refitted_tracks_nav -> getRelatedToObjects(lc_track);
156
157 //std::cout<<"========================================="<<std::endl;
158 //std::cout<<"========================================="<<std::endl;
159 //std::cout<<"Track params: "<<std::endl;
160 //track->Print();
161
162 //Get the tracker hits
163 EVENT::TrackerHitVec lc_tracker_hits = lc_track->getTrackerHits();
164
165
166 //Build the vector of Tracker Hits on track, get the info and attach them to the track.
167 for (int ith = 0; ith<lc_tracker_hits.size();ith++) {
168 IMPL::TrackerHitImpl* lc_th = static_cast<IMPL::TrackerHitImpl*>(lc_tracker_hits.at(ith));
170 //TODO should check the status of this return
171 utils::addRawInfoTo3dHit(th,lc_th,raw_svt_hit_fits);
172 //TODO this should be under some sort of saving flag
173 track->addHit(th);
174 hits_.push_back(th);
175
176 //Get shared Hits information
177 for (int jtrack = itrack+1; jtrack < tracks->getNumberOfElements(); ++jtrack) {
178
179 EVENT::Track* j_lc_track = static_cast<EVENT::Track*>(tracks->getElementAt(jtrack));
180 if (utils::isUsedByTrack(th,j_lc_track)) {
181 //The hit is not already in the shared list
182 if (std::find(SharedHits[itrack].begin(), SharedHits[itrack].end(),th->getID()) == SharedHits[itrack].end()) {
183 SharedHits[itrack].push_back(th->getID());
184 if (th->getLayer() == 0 )
185 SharedHitsLy0[itrack] = true;
186 if (th->getLayer() == 1 )
187 SharedHitsLy1[itrack] = true;
188 }
189 if (std::find(SharedHits[jtrack].begin(), SharedHits[jtrack].end(),th->getID()) == SharedHits[jtrack].end()) {
190 SharedHits[jtrack].push_back(th->getID());
191 if (th->getLayer() == 0 )
192 SharedHitsLy0[jtrack] = true;
193 if (th->getLayer() == 1 )
194 SharedHitsLy1[jtrack] = true;
195 }
196 } // found shared hit
197 } // loop on j>i tracks
198 } // loop on hits on track i
199
200 //TODO:: bug prone?
201 track->setNShared(SharedHits[itrack].size());
202 track->setSharedLy0(SharedHitsLy0[itrack]);
203 track->setSharedLy1(SharedHitsLy1[itrack]);
204
205 //std::cout<<"Tracker hits time:";
206 //for (auto lc_tracker_hit : lc_tracker_hits) {
207 //std::cout<<" "<<lc_tracker_hit->getTime();
208 //}
209 //std::cout<<std::endl;
210
211 if (refitted_tracks_list.size() < 1)
212 return false;
213
214
215 //Get only best X2 refit track
216 int bestX2index = -999;
217 float bestX2 = -999;
218 for (int irtrk = 0; irtrk<refitted_tracks_list.size(); irtrk++) {
219 EVENT::Track* lc_rfit_track = static_cast<EVENT::Track*>(refitted_tracks_list.at(irtrk));
220 if (irtrk == 0) {
221 bestX2 = (lc_rfit_track->getChi2() / lc_rfit_track->getNdf());
222 bestX2index = 0;
223 }
224 else
225 if ((lc_rfit_track->getChi2() / lc_rfit_track->getNdf()) < bestX2) {
226 bestX2 = (lc_rfit_track->getChi2() / lc_rfit_track->getNdf());
227 bestX2index = irtrk;
228 }
229 }
230
232
233 _RefitTrkHistos->Fill1DHisto("n_tracks_h",refitted_tracks_list.size());
234
235 for (int irtrk = 0; irtrk < refitted_tracks_list.size(); irtrk++) {
236
237 if (irtrk != bestX2index)
238 continue;
239
240 EVENT::Track* lc_rfit_track = static_cast<EVENT::Track*>(refitted_tracks_list.at(irtrk));
241
242 //Useless to get it every track
243 // Get the GBL kink data
244 EVENT::LCCollection* rfit_gbl_kink_data =
245 static_cast<EVENT::LCCollection*>(event->getLCCollection("GBLKinkDataRelations_refit"));
246 // Get the track data
247 EVENT::LCCollection* rfit_track_data = nullptr;
248 Track* rfit_track = utils::buildTrack(lc_rfit_track,"",rfit_gbl_kink_data,rfit_track_data);
249 EVENT::TrackerHitVec lc_rf_tracker_hits = lc_rfit_track->getTrackerHits();
250
251 //TODO::move to utilities
252 //recompute time if missing information
253 float mean = 0.0;
254 for (auto lc_rf_tracker_hit : lc_rf_tracker_hits) {
255 mean += lc_rf_tracker_hit->getTime();
256 }
257 rfit_track->setTrackTime(mean / lc_rf_tracker_hits.size());
258
259 //std::cout<<"Refitted tracks params: "<<std::endl;
260 //rfit_track->Print();
261
262 //std::cout<<"Tracker hits time:";
263 //for (auto lc_rf_tracker_hit : lc_rf_tracker_hits) {
264 //std::cout<<" "<<lc_rf_tracker_hit->getTime();
265 //}
266 //std::cout<<std::endl;
267
270
271 if (fabs(rfit_track->getZ0()) < fabs(track->getZ0())) {
274 }
275
276 if (rfit_track->getChi2Ndf() < track->getChi2Ndf()) {
279 }
280 }//loop on refit tracks
281 }//Loop on tracks
282
283
284
285 return true;
286}
287
296
#define DECLARE_PROCESSOR(CLASS)
Macro which allows the framework to construct a producer given its name during configuration.
Definition Processor.h:139
Definition Event.h:35
virtual void DefineHistos()
Definition of histograms from json config.
void Fill1DHisto(const std::string &histoName, float value, float weight=1.)
description
virtual void loadHistoConfig(const std::string histoConfigFile)
load histogram config
virtual void saveHistos(TFile *outF=nullptr, std::string folder="")
save histograms
Definition IEvent.h:7
description
Base class for all event processing components.
Definition Processor.h:34
virtual bool process()
Process the histograms and generate analysis output.
Definition Processor.h:95
Insert description here. more details.
std::string histoCfg_
description
std::vector< Vertex * > vertices_
std::vector< Vertex * > vertices_refit_
virtual void configure(const ParameterSet &parameters)
description
std::vector< Track * > refit_tracks_
virtual void finalize()
Callback for the Processor to take any necessary action when the processing of events finishes.
std::vector< Track * > tracks_
virtual void initialize(TTree *tree)
Callback for the Processor to take any necessary action when the processing of events starts.
TrackHistos * _OriginalTrkHistos
description
TrackHistos * _RefitTrkHistos
description
std::vector< TrackerHit * > hits_
TrackHistos * _RefitTrkHistos_z0cut
description
RefittedTracksProcessor(const std::string &name, Process &process)
Class constructor.
TrackHistos * _RefitTrkHistos_chi2cut
description
description
Definition TrackHistos.h:17
void FillTrackComparisonHistograms(Track *track_x, Track *track_y, float weight=1.)
description
void Fill1DHistograms(Track *track=nullptr, Vertex *vtx=nullptr, float weight=1.)
Fill 1D histograms.
void doTrackComparisonPlots(bool doplots)
Compare tracks.
virtual void Define2DHistos()
description
Definition Track.h:32
double getChi2Ndf() const
Definition Track.h:126
void setTrackTime(const double track_time)
Definition Track.h:153
double getZ0() const
Definition Track.h:92
int getLayer() const
Definition TrackerHit.h:109
int getID() const
Definition TrackerHit.h:124
constexpr const char * UC_V0CANDIDATES
Definition Collections.h:97
constexpr const char * GBL_TRACKS
Definition Collections.h:14
constexpr const char * RAW_SVT_HIT_FITS
Definition Collections.h:23
constexpr const char * UC_V0VERTICES
constexpr const char * TRACK_DATA_REL
Definition Collections.h:44
constexpr const char * KINK_DATA_REL
Definition Collections.h:38
constexpr const char * TRACKER_HITS
Definition Collections.h:29
bool addRawInfoTo3dHit(TrackerHit *tracker_hit, IMPL::TrackerHitImpl *lc_tracker_hit, EVENT::LCCollection *raw_svt_fits, std::vector< RawSvtHit * > *rawHits=nullptr, int type=0, bool storeRawHit=true)
description
Track * buildTrack(EVENT::Track *lc_track, std::string trackstate_location, EVENT::LCCollection *gbl_kink_data, EVENT::LCCollection *track_data)
description
Vertex * buildVertex(EVENT::Vertex *lc_vertex)
description
Definition utilities.cxx:31
bool hasCollection(EVENT::LCEvent *lc_event, const std::string &collection)
description
Definition utilities.cxx:18
bool isUsedByTrack(IMPL::TrackerHitImpl *lc_tracker_hit, EVENT::Track *lc_track)
description
TrackerHit * buildTrackerHit(IMPL::TrackerHitImpl *lc_trackerHit, bool rotate=true, int type=0)
description