ATLAS Offline Software
Loading...
Searching...
No Matches
InDetAlignFillTrack.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3 */
4
6// ================================================
7// InDetAlignFillTrack
8// ================================================
9//
10// InDetAlignFillTrack.cxx
11// Source file for InDetAlignFillTrack
12//
13// Carlos Escobar, started 27/12/2007
14//
15// AlgTool to fill track information (including truth) in a ntuple
16
17
18#include "GaudiKernel/NTuple.h"
19#include "GaudiKernel/INTupleSvc.h"
20#include "GaudiKernel/SmartDataPtr.h"
21
23
24#include "TrkTrack/Track.h"
25
28
30
33
34
37#include "CLHEP/GenericFunctions/CumulativeChiSquare.hh"
38#include "CLHEP/Geometry/Point3D.h"
39#include "CLHEP/Units/SystemOfUnits.h"
40
41#include "InDetAlignFillTrack.h"
44
45#include <string>
46
47static const int maxTracks = 10000; // maximal number of tracks per event
48
49//=====================================================================
50// InDetAlignFillTrack()
51//=====================================================================
53 const std::string& name,
54 const IInterface* parent)
55 : base_class(type, name, parent)
56{
57}
58
59//=====================================================================
60// initialize()
61//=====================================================================
63 ATH_MSG_DEBUG("Initialize() of FillTrack");
64 // retrieve the NTuple Service
65 ATH_CHECK(m_ntupleSvc.retrieve());
66 // get TrackParticleCreatorTool
67 ATH_CHECK(m_particleCreator.retrieve());
68 // if Truth...
69 if (m_doTruth) {
70 // Get TruthToTrack
71 ATH_CHECK(m_truthToTrack.retrieve());
72 // Get Extrapolator Tool
73 ATH_CHECK(m_extrapolator.retrieve());
74 }
75 // Book Ntuple
76 bookNtuple();
77 if (!m_inputUpCol.empty()) bookUpNtuple();
78 if (!m_inputLowCol.empty()) bookLowNtuple();
79 if (m_doMatching && !m_inputUpCol.empty() && !m_inputLowCol.empty()) bookMatchingNtuple();
80 ATH_MSG_DEBUG("Initialize() of FillTrack successful");
81 return StatusCode::SUCCESS;
82}
83
84//=====================================================================
85// finalize()
86//=====================================================================
88 if (msgLvl(MSG::DEBUG)) {
89 msg(MSG::DEBUG) << "Finalize() of FillTrack" << endmsg;
90
91 msg(MSG::DEBUG) << "________________________________________________________" << endmsg;
92 msg(MSG::DEBUG) << endmsg;
93 msg(MSG::DEBUG) << " InDetAlignFillTrack Summary: " << endmsg;
94 msg(MSG::DEBUG) << " - " << m_events << " events" << endmsg;
95 msg(MSG::DEBUG) << " - " << m_totaltrks << " tracks" << endmsg;
96 msg(MSG::DEBUG) << " - " << m_totalhits << " hits" << endmsg;
97 msg(MSG::DEBUG) << " - " << m_totalPixhits << " Pixel hits" << endmsg;
98 msg(MSG::DEBUG) << " - " << m_totalSCThits << " SCT hits" << endmsg;
99 msg(MSG::DEBUG) << " - " << m_totalTRThits << " TRT hits" << endmsg;
100 msg(MSG::DEBUG) << "________________________________________________________" << endmsg;
101
102 if (m_inputUpCol != "") {
103 msg(MSG::DEBUG) << " Up Track Summary: " << endmsg;
104 msg(MSG::DEBUG) << " - " << m_totalUptrks << " tracks" << endmsg;
105 msg(MSG::DEBUG) << " - " << m_totalUphits << " hits" << endmsg;
106 msg(MSG::DEBUG) << " - " << m_totalUpPixhits << " Pixel hits" << endmsg;
107 msg(MSG::DEBUG) << " - " << m_totalUpSCThits << " SCT hits" << endmsg;
108 msg(MSG::DEBUG) << " - " << m_totalUpTRThits << " TRT hits" << endmsg;
109 msg(MSG::DEBUG) << "________________________________________________________" << endmsg;
110 }
111
112 if (m_inputLowCol != "") {
113 msg(MSG::DEBUG) << " Low Track Summary: " << endmsg;
114 msg(MSG::DEBUG) << " - " << m_totalLowtrks << " tracks" << endmsg;
115 msg(MSG::DEBUG) << " - " << m_totalLowhits << " hits" << endmsg;
116 msg(MSG::DEBUG) << " - " << m_totalLowPixhits << " Pixel hits" << endmsg;
117 msg(MSG::DEBUG) << " - " << m_totalLowSCThits << " SCT hits" << endmsg;
118 msg(MSG::DEBUG) << " - " << m_totalLowTRThits << " TRT hits" << endmsg;
119 msg(MSG::DEBUG) << "________________________________________________________" << endmsg;
120 }
121
122 msg(MSG::DEBUG) << endmsg;
123 }
124
125 return StatusCode::SUCCESS;
126}
127
128//=====================================================================
129// FillTrack()
130//=====================================================================
132 ATH_MSG_DEBUG("In FillTrack()");
133 ATH_MSG_DEBUG(" event " << m_events);
134 StatusCode sc;
135
136 const EventContext& ctx = Gaudi::Hive::currentContext();
137 const TrackCollection* tracks;// = new TrackCollection;
138 const TrackCollection* Uptracks;// = new TrackCollection;
139 const TrackCollection* Lowtracks;// = new TrackCollection;
140
141 // retrieve all tracks from TDS
142 ATH_CHECK(evtStore()->retrieve(tracks, m_inputCol));
143
144 // retrieve all Up tracks from TDS
145 if (m_inputUpCol != "") {
146 ATH_CHECK(evtStore()->retrieve(Uptracks, m_inputUpCol));
147 }
148
149 // retrieve all Low tracks from TDS
150 if (m_inputLowCol != "") {
151 ATH_CHECK(evtStore()->retrieve(Lowtracks, m_inputLowCol));
152 }
153
154 m_nt_ntracks = tracks->size();
155 ATH_MSG_DEBUG("Retrieved Track Collection size: " << tracks->size());
156
157 if (m_inputUpCol != "") {
158 m_nt_nUptracks = Uptracks->size();
159 ATH_MSG_DEBUG("Retrieved Up Track Collection size: " << Uptracks->size());
160 }
161
162 if (m_inputLowCol != "") {
163 m_nt_nLowtracks = Lowtracks->size();
164 ATH_MSG_DEBUG("Retrieved Low Track Collection size: " << Lowtracks->size());
165 }
166
167 ATH_MSG_DEBUG("Printing input track collection");
168 m_totaltrks += dumpTrackCol(ctx, tracks);
169 if (m_inputUpCol != "") m_totalUptrks += dumpTrackCol(ctx, Uptracks, "Up");
170 if (m_inputLowCol != "") m_totalLowtrks += dumpTrackCol(ctx, Lowtracks, "Low");
171
172 // matching
173 if (m_doMatching && m_inputUpCol != "" && m_inputLowCol != "")
174 if (StatusCode::SUCCESS != dumpMatching(Uptracks, Lowtracks)) {
175 ATH_MSG_ERROR("dumpMatching failure");
176 return StatusCode::FAILURE;
177 }
178
179
180 // if truth is available...
181 if (m_doTruth) {
182 int nTracks = 0;
183
184 const TrackTruthCollection* truthCol = nullptr;
185
186 // retrieve all track truth collection from TDS
187 if (StatusCode::SUCCESS != evtStore()->retrieve(truthCol, m_TruthTrkCol)) {
188 ATH_MSG_ERROR("Cannot find " << m_inputCol);
189 return StatusCode::FAILURE;
190 } else {
191 if (!truthCol) {
192 ATH_MSG_ERROR( "Failure retrieving " << m_TruthTrkCol );
193 return StatusCode::FAILURE;
194 }
195
196 if (msgLvl(MSG::DEBUG)) {
197 msg(MSG::DEBUG) << "Collection with name " << m_TruthTrkCol << " found in StoreGate" << endmsg;
198 msg(MSG::DEBUG) << "Retrieved " << truthCol->size() << " truth tracks from StoreGate" << endmsg;
199 }
200
201 m_nt_nmctracks = truthCol->size();
202
203 TrackCollection::const_iterator trackItr = tracks->begin();
204 TrackCollection::const_iterator trackItrE = tracks->end();
205
206 //looping over tracks
207 for (; trackItr != trackItrE && nTracks < maxTracks; ++trackItr) {
208 const Trk::Track* track = *trackItr;
209 if (track == nullptr) {
210 ATH_MSG_WARNING("No associated Trk::Track object found for track "
211 << nTracks);
212 continue;
213 }
214 //Coverity fix: 14309: useless check. Commented out
215 //if (truthCol) {
216
217 // the key for the truth std::map is an ElementLink<TrackCollection> object
218 // comprises a pointer to the track and reconstructed track collection
220 trackLink.setElement(const_cast<Trk::Track*>(track));
221 trackLink.setStorableObject(*tracks);
222 const ElementLink<TrackCollection> trackLink2 = trackLink;
223
224 // trying to find the std::map entry for this reconstructed track
225 TrackTruthCollection::const_iterator found = truthCol->find(trackLink2);
226
227 if (found != truthCol->end()) {
228 // getting the TrackTruth object - the map element
229 TrackTruth trkTruth = found->second;
230 ATH_MSG_DEBUG("got trkTruth");
231
232 // probability of the reco<->truth match
233 float trkTruthProb = trkTruth.probability();
234
235 const HepMcParticleLink& HMPL = trkTruth.particleLink();
236
237 if (HMPL.isValid()) {
238 HepMC::ConstGenParticlePtr genParticle = HMPL.scptr();
239
240 double charge = 1.0;
241 if (genParticle->pdg_id() < 0) charge = -charge;
242
243 Amg::Vector3D productionVertex(genParticle->production_vertex()->position().x(),
244 genParticle->production_vertex()->position().y(),
245 genParticle->production_vertex()->position().z());
246
247 if (msgLvl(MSG::DEBUG)) {
248 msg(MSG::DEBUG) << nTracks << ". Generated Particle " << genParticle << endmsg;
249 }
250
251 float genPt = std::sqrt((genParticle->momentum().x()) * (genParticle->momentum().x())
252 + (genParticle->momentum().y()) * (genParticle->momentum().y()));
253
254 ATH_MSG_DEBUG(" * pt " << genPt / CLHEP::GeV << " CLHEP::GeV/c"
255 << ", p " << genParticle->momentum().e() / CLHEP::GeV << " CLHEP::GeV/c"
256 << ", eta " << genParticle->momentum().eta()
257 << ", phi " << genParticle->momentum().phi() << " CLHEP::rad");
258
259 m_nt_mc_trkistruth[nTracks] = 1;
260 m_nt_mc_Trk_pdg[nTracks] = genParticle->pdg_id();
261 m_nt_mc_Trk_prob[nTracks] = trkTruthProb;
262 float pX = genParticle->momentum().px();
263 float pY = genParticle->momentum().py();
264 float genParticlePt = std::sqrt((pX * pX) + (pY * pY));
265 m_nt_mc_Trk_genParticlePt[nTracks] = genParticlePt;
266 m_nt_mc_Trk_genParticleEta[nTracks] = genParticle->momentum().eta();
267 m_nt_mc_Trk_genParticlePhi[nTracks] = genParticle->momentum().phi();
268
269 if (genParticle->pdg_id() == 0) ATH_MSG_WARNING("Particle with PDG 0!");
270 else if (!genParticle->production_vertex()) ATH_MSG_WARNING(
271 "No GenVertex (generator level) production vertex found!");
272 else {
273 // currently cannot configure the TruthToTrack tool properly
274
275 const Trk::TrackParameters* generatedTrackPerigee = nullptr;
276
277 //using a tool to produce perigee track parameters from generated parameters
278 generatedTrackPerigee = m_truthToTrack->makePerigeeParameters(genParticle);
279
280 if (!generatedTrackPerigee) {
281 if (msgLvl(MSG::DEBUG)) {
282 msg(MSG::DEBUG) << "Unable to extrapolate genParticle to perigee!" << endmsg;
283 msg(MSG::DEBUG) << "Trying to extrapolate directly to exclude material effects!" << endmsg;
284 }
285
286 const TrackRecordCollection* recordCollection = nullptr;
287
288 sc = evtStore()->retrieve(recordCollection, "CaloEntryLayer");
289 if (sc == StatusCode::FAILURE) {
290 ATH_MSG_ERROR("Could not get track record!");
291 return sc;
292 }
293 ATH_MSG_DEBUG("reading from track record, size = "
294 << recordCollection->size());
295
296 int nmctracks = 0;
297
298 for (TrackRecordCollection::const_iterator record = recordCollection->begin();
299 record != recordCollection->end(); ++record) {
300 if (std::abs((*record).GetPDGCode()) != 13) continue;
301 HepGeom::Point3D<double> productionVertex = (*record).GetPosition();
302 double charge = (*record).GetPDGCode() > 0 ? -1.0 : 1.0;
303
304
305 Amg::Vector3D direction((*record).GetMomentum().x(),
306 (*record).GetMomentum().y(),
307 (*record).GetMomentum().z());
308
309 double momentum = direction.mag();
310 if (momentum < 500) continue;
311 double genPar_qOverP = 1. / direction.mag();
312 direction *= genPar_qOverP;
313 if (charge < 0) genPar_qOverP = -genPar_qOverP;
314
315
316 double genPar_phi = direction.phi();
317 if (genPar_phi < 0.) genPar_phi = genPar_phi + 2.0*M_PI;
318
319 ATH_MSG_DEBUG("Production vertex (x,y,z): ("
320 << productionVertex.x() << ", "
321 << productionVertex.y() << ", "
322 << productionVertex.z() << ")");
323
324 double genPar_theta = direction.theta();
325
326 // Create a planar surface and transform the vertex information to a TrackParameters object
327 Amg::Transform3D globalSurfaceCentre;
328 globalSurfaceCentre.setIdentity();
329 globalSurfaceCentre *= Amg::Translation3D(productionVertex.x(),
330 productionVertex.y(), productionVertex.z());
331
332 Trk::PlaneSurface planeSurface(globalSurfaceCentre, 5., 5.);
333
334 const Amg::Vector3D productionVertexAsGlobalPosition(productionVertex.x(),
335 productionVertex.y(),
336 productionVertex.z());
337
338 const Trk::AtaPlane* productionVertexTrackParams
339 = new Trk::AtaPlane(productionVertexAsGlobalPosition,
340 genPar_phi, genPar_theta, genPar_qOverP,
341 planeSurface);
342
343 // Create a new perigee surface
344 Trk::PerigeeSurface perigeeSurface;
345
346 if (!tracks->empty()) perigeeSurface = ((**tracks->begin()).perigeeParameters()->associatedSurface());
347
348
349 const Amg::Vector3D& perigeeGlobalPosition = perigeeSurface.center();
350
351 ATH_MSG_DEBUG("Surface global centre (x,y,z): ("
352 << perigeeGlobalPosition.x() << ", "
353 << perigeeGlobalPosition.y() << ", "
354 << perigeeGlobalPosition.z() << ")");
355
356 // Extrapolate the TrackParameters object to the perigee
357
358 // ( Establish the distance between perigee and generated vertex.
359 // If less than tolerance don't bother with the propagation )
360 const Amg::Vector3D difference = productionVertexAsGlobalPosition - perigeeGlobalPosition;
361
362 double distance = std::sqrt(difference.x() * difference.x() + difference.y() * difference.y());
363 ATH_MSG_DEBUG("Distance between perigee point and generated vertex: "
364 << distance / CLHEP::m << " m");
365
366 const Trk::TrackParameters* generatedTrackPerigee = nullptr;
367
368 // Extrapolate directly to exclude material effects!
369 if (distance > 1.e-4) {
370 ATH_MSG_DEBUG("Distance between perigee and generated vertex exceeds tolerance ("
371 << 1.e-4 << " mm)... Extrapolating!");
372
373 generatedTrackPerigee = m_extrapolator->extrapolateDirectly(ctx,
374 *productionVertexTrackParams,
375 perigeeSurface,
377 false,
378 Trk::nonInteracting).release();
379 if (!generatedTrackPerigee) continue;
380 } else {
381 ATH_MSG_DEBUG("Distance between perigee and generated vertex is less than tolerance ("
382 << 1.e-4 << " CLHEP::mm)... " << "No propagation to perigee required");
383
384 // Clone the parameters from the AtaPlane object on to perigee
385 generatedTrackPerigee = new Trk::Perigee(0., 0.,
386 genPar_phi, genPar_theta, genPar_qOverP,
387 Trk::PerigeeSurface(productionVertexAsGlobalPosition));
388 }
389
390 dumpPerigee(generatedTrackPerigee, nmctracks);
391 m_nt_mc_Trk_vtxX[nmctracks] = productionVertex.x();
392 m_nt_mc_Trk_vtxY[nmctracks] = productionVertex.y();
393 m_nt_mc_Trk_vtxZ[nmctracks] = productionVertex.z();
394
395 delete productionVertexTrackParams;
396 delete generatedTrackPerigee;
397
398 nmctracks++;
399 }
400 }
401
402 if (generatedTrackPerigee) {
403 dumpPerigee(generatedTrackPerigee, nTracks);
404 m_nt_mc_Trk_vtxX[nTracks] = genParticle->production_vertex()->position().x();
405 m_nt_mc_Trk_vtxY[nTracks] = genParticle->production_vertex()->position().y();
406 m_nt_mc_Trk_vtxZ[nTracks] = genParticle->production_vertex()->position().z();
407
408 delete generatedTrackPerigee;
409 }
410 }
411 }
412 m_nt_mc_trkistruth[nTracks] = 0;
413 }
414 //} // if (truthCol) commented out for coverity 14309
415
416 nTracks++;
417 }
418 }
419 } // end if m_doTruth
420
421 // Store TrkTrack branch
422 std::string nt0id = m_ntupleName + "/TrkTrack";
423 sc = m_ntupleSvc->writeRecord(nt0id);
424 if (sc.isFailure()) ATH_MSG_ERROR("Could not write " << nt0id << "!");
425
426 if (m_inputUpCol != "") {
427 // Store TrkTrack_Up branch
428 std::string nt1id = m_ntupleName + "/TrkTrack_Up";
429 sc = m_ntupleSvc->writeRecord(nt1id);
430 if (sc.isFailure()) ATH_MSG_ERROR("Could not write " << nt1id << "!");
431 }
432
433 if (m_inputLowCol != "") {
434 // Store TrkTrack_Low branch
435 std::string nt2id = m_ntupleName + "/TrkTrack_Low";
436 sc = m_ntupleSvc->writeRecord(nt2id);
437 if (sc.isFailure()) ATH_MSG_ERROR("Could not write " << nt2id << "!");
438 }
439
440 if (m_doMatching && m_inputUpCol != "" && m_inputLowCol != "") {
441 // Store Matching Up/Low TrkTracks branch
442 std::string nt3id = m_ntupleName + "/TrkTrack_Matching";
443 sc = m_ntupleSvc->writeRecord(nt3id);
444 if (sc.isFailure()) ATH_MSG_ERROR("Could not write " << nt3id << "!");
445 }
446
447
448 m_events++;
449
450 // check for negative values
451 if (m_totaltrks < 0) m_totaltrks = 0;
452 if (m_totalhits < 0) m_totalhits = 0;
453 if (m_totalPixhits < 0) m_totalPixhits = 0;
454 if (m_totalSCThits < 0) m_totalSCThits = 0;
455 if (m_totalTRThits < 0) m_totalTRThits = 0;
456
457 if (m_inputUpCol != "") {
458 if (m_totalUptrks < 0) m_totalUptrks = 0;
459 if (m_totalUphits < 0) m_totalUphits = 0;
463 }
464
465 if (m_inputLowCol != "") {
466 if (m_totalLowtrks < 0) m_totalLowtrks = 0;
467 if (m_totalLowhits < 0) m_totalLowhits = 0;
471 }
472
473 if (m_events < 0) m_events = 0;
474 // no deletion because StoreGate owns these pointers.
475 //delete tracks;
476 //delete Uptracks;
477 //delete Lowtracks;
478 return StatusCode::SUCCESS;
479}
480
481//=====================================================================
482// bookNtuple()
483//=====================================================================
485 ATH_MSG_DEBUG("Booking Trk::Track Info...");
486
487 NTupleFilePtr file1(m_ntupleSvc.get(), m_ntupleName);
488 std::string nt0id = m_ntupleName + "/TrkTrack";
489 std::string comments = "Trk::Track Information";
490
491 NTuplePtr nt0(m_ntupleSvc.get(), nt0id);
492 if (nt0) {
493 ATH_MSG_DEBUG("Ntuple is already booked");
494 } else {
495 ATH_MSG_DEBUG("Attempting to book general ntuple");
496 nt0 = m_ntupleSvc->book(nt0id, CLID_ColumnWiseTuple, comments);
497
498 if (nt0) {
499 StatusCode sc;
500 // nt0->addItem("event", m_nt_event); // event number
501 sc = nt0->addItem("nTracks", m_nt_ntracks, 0, maxTracks); // number of tracks
502 if (m_doTruth) sc = nt0->addItem("mc_nTracks", m_nt_nmctracks, 0, maxTracks); // number of mc tracks
503
504 // ----------------------------------------------------------------------
505 // Trk::Track parameters
506 sc = nt0->addItem("Trk_d0", m_nt_ntracks, m_nt_Trk_d0);
507 sc = nt0->addItem("Trk_z0", m_nt_ntracks, m_nt_Trk_z0);
508 sc = nt0->addItem("Trk_phi0", m_nt_ntracks, m_nt_Trk_phi0);
509 sc = nt0->addItem("Trk_theta0", m_nt_ntracks, m_nt_Trk_theta0);
510 sc = nt0->addItem("Trk_qoverp", m_nt_ntracks, m_nt_Trk_qoverp);
511 sc = nt0->addItem("Trk_pt", m_nt_ntracks, m_nt_Trk_pt);
512 // ----------------------------------------------------------------------
513
514 // ----------------------------------------------------------------------
515 // Trk::Track hits...
516 sc = nt0->addItem("Trk_nHits", m_nt_ntracks, m_nt_Trk_nHits);
517 sc = nt0->addItem("Trk_nhitsPixels", m_nt_ntracks, m_nt_Trk_nhitspix);
518 sc = nt0->addItem("Trk_nhitsSCT", m_nt_ntracks, m_nt_Trk_nhitssct);
519 sc = nt0->addItem("Trk_nhitsTRT", m_nt_ntracks, m_nt_Trk_nhitstrt);
520
521 sc = nt0->addItem("Trk_nsharedPixels", m_nt_ntracks, m_nt_Trk_nsharedPixels);
522 sc = nt0->addItem("Trk_nsharedSCT", m_nt_ntracks, m_nt_Trk_nsharedSCT);
523 sc = nt0->addItem("Trk_nshared", m_nt_ntracks, m_nt_Trk_nshared);
524
525 sc = nt0->addItem("Trk_nholesPixels", m_nt_ntracks, m_nt_Trk_nholesPixels);
526 sc = nt0->addItem("Trk_nholesSCT", m_nt_ntracks, m_nt_Trk_nholesSCT);
527 sc = nt0->addItem("Trk_nholes", m_nt_ntracks, m_nt_Trk_nholes);
528
529 sc = nt0->addItem("Trk_chi2", m_nt_ntracks, m_nt_Trk_chi2);
530 sc = nt0->addItem("Trk_ndof", m_nt_ntracks, m_nt_Trk_ndof);
531 sc = nt0->addItem("Trk_chi2Prob", m_nt_ntracks, m_nt_Trk_chi2Prob);
532 // ----------------------------------------------------------------------
533
534 if (m_doTruth) {
535 // ----------------------------------------------------------------------
536 sc = nt0->addItem("mc_TrkIsTruth", m_nt_ntracks, m_nt_mc_trkistruth);
537
538 // generated particle parameters
539 sc = nt0->addItem("mc_Trk_genParticlePt", m_nt_ntracks, m_nt_mc_Trk_genParticlePt);
540 sc = nt0->addItem("mc_Trk_genParticleEta", m_nt_ntracks, m_nt_mc_Trk_genParticleEta);
541 sc = nt0->addItem("mc_Trk_genParticlePhi", m_nt_ntracks, m_nt_mc_Trk_genParticlePhi);
542
543 // MonteCarlo Track parameters
544 sc = nt0->addItem("mc_Trk_d0", m_nt_ntracks, m_nt_mc_Trk_d0);
545 sc = nt0->addItem("mc_Trk_z0", m_nt_ntracks, m_nt_mc_Trk_z0);
546 sc = nt0->addItem("mc_Trk_phi0", m_nt_ntracks, m_nt_mc_Trk_phi0);
547 sc = nt0->addItem("mc_Trk_theta", m_nt_ntracks, m_nt_mc_Trk_theta0);
548 sc = nt0->addItem("mc_Trk_eta", m_nt_ntracks, m_nt_mc_Trk_eta);
549 sc = nt0->addItem("mc_Trk_qoverp", m_nt_ntracks, m_nt_mc_Trk_qoverp);
550 sc = nt0->addItem("mc_Trk_qoverpt", m_nt_ntracks, m_nt_mc_Trk_qoverpt);
551 sc = nt0->addItem("mc_Trk_pt", m_nt_ntracks, m_nt_mc_Trk_pt);
552 sc = nt0->addItem("mc_Trk_charge", m_nt_ntracks, m_nt_mc_Trk_charge);
553 sc = nt0->addItem("mc_Trk_prob", m_nt_ntracks, m_nt_mc_Trk_prob);
554 sc = nt0->addItem("mc_Trk_pdg", m_nt_ntracks, m_nt_mc_Trk_pdg);
555
556 sc = nt0->addItem("mc_Trk_vtxX", m_nt_ntracks, m_nt_mc_Trk_vtxX);
557 sc = nt0->addItem("mc_Trk_vtxY", m_nt_ntracks, m_nt_mc_Trk_vtxY);
558 sc = nt0->addItem("mc_Trk_vtxZ", m_nt_ntracks, m_nt_mc_Trk_vtxZ);
559 // ----------------------------------------------------------------------
560 }
561
562 if (sc.isFailure()) ATH_MSG_FATAL("Failed ntupleSvc()");
563 else ATH_MSG_DEBUG("Ntuple " << nt0id << " has been booked successfully! ");
564 } else {
565 ATH_MSG_ERROR("Error booking ntuple");
566 }
567 }
568
569 // return;
570}
571
572//=====================================================================
573// bookUpNtuple()
574//=====================================================================
576 ATH_MSG_DEBUG("Booking Up Trk::Track Info...");
577
578 std::string nt1id = m_ntupleName + "/TrkTrack_Up";
579 std::string comments = "Trk::UpTrack Information";
580
581 NTuplePtr nt1(m_ntupleSvc.get(), nt1id);
582 if (nt1) {
583 ATH_MSG_DEBUG("Ntuple is already booked");
584 } else {
585 ATH_MSG_DEBUG("Attempting to book general ntuple");
586 nt1 = m_ntupleSvc->book(nt1id, CLID_ColumnWiseTuple, comments);
587
588 if (nt1) {
589 StatusCode sc;
590 // nt1->addItem("event", m_nt_event); // event number
591 sc = nt1->addItem("nTracks_Up", m_nt_nUptracks, 0, maxTracks); // number of tracks
592
593 // ----------------------------------------------------------------------
594 // Trk::Track parameters
595 sc = nt1->addItem("Trk_d0_Up", m_nt_nUptracks, m_nt_Trk_d0_Up);
596 sc = nt1->addItem("Trk_z0_Up", m_nt_nUptracks, m_nt_Trk_z0_Up);
597 sc = nt1->addItem("Trk_phi0_Up", m_nt_nUptracks, m_nt_Trk_phi0_Up);
598 sc = nt1->addItem("Trk_theta0_Up", m_nt_nUptracks, m_nt_Trk_theta0_Up);
599 sc = nt1->addItem("Trk_qoverp_Up", m_nt_nUptracks, m_nt_Trk_qoverp_Up);
600 sc = nt1->addItem("Trk_pt_Up", m_nt_nUptracks, m_nt_Trk_pt_Up);
601 // ----------------------------------------------------------------------
602
603 // ----------------------------------------------------------------------
604 // Trk::Track hits...
605 sc = nt1->addItem("Trk_nHits_Up", m_nt_nUptracks, m_nt_Trk_nHits_Up);
606 sc = nt1->addItem("Trk_nhitsPixels_Up", m_nt_nUptracks, m_nt_Trk_nhitspix_Up);
607 sc = nt1->addItem("Trk_nhitsSCT_Up", m_nt_nUptracks, m_nt_Trk_nhitssct_Up);
608 sc = nt1->addItem("Trk_nhitsTRT_Up", m_nt_nUptracks, m_nt_Trk_nhitstrt_Up);
609
610 sc = nt1->addItem("Trk_nsharedPixels_Up", m_nt_nUptracks, m_nt_Trk_nsharedPixels_Up);
611 sc = nt1->addItem("Trk_nsharedSCT_Up", m_nt_nUptracks, m_nt_Trk_nsharedSCT_Up);
612 sc = nt1->addItem("Trk_nshared_Up", m_nt_nUptracks, m_nt_Trk_nshared_Up);
613
614 sc = nt1->addItem("Trk_nholesPixels_Up", m_nt_nUptracks, m_nt_Trk_nholesPixels_Up);
615 sc = nt1->addItem("Trk_nholesSCT_Up", m_nt_nUptracks, m_nt_Trk_nholesSCT_Up);
616 sc = nt1->addItem("Trk_nholes_Up", m_nt_nUptracks, m_nt_Trk_nholes_Up);
617
618 sc = nt1->addItem("Trk_chi2_Up", m_nt_nUptracks, m_nt_Trk_chi2_Up);
619 sc = nt1->addItem("Trk_ndof_Up", m_nt_nUptracks, m_nt_Trk_ndof_Up);
620 sc = nt1->addItem("Trk_chi2Prob_Up", m_nt_nUptracks, m_nt_Trk_chi2Prob_Up);
621 // ----------------------------------------------------------------------
622
623 if (sc.isFailure()) ATH_MSG_FATAL("Failed ntupleSvc()");
624 else ATH_MSG_DEBUG("Ntuple " << nt1id << " has been booked successfully! ");
625 } else {
626 ATH_MSG_ERROR("Error booking ntuple");
627 }
628 }
629}
630
631//=====================================================================
632// bookLowNtuple()
633//=====================================================================
635 ATH_MSG_DEBUG("Booking Low Trk::Track Info...");
636
637 std::string nt2id = m_ntupleName + "/TrkTrack_Low";
638 std::string comments = "Trk::LowTrack Information";
639
640 NTuplePtr nt2(m_ntupleSvc.get(), nt2id);
641 if (nt2) {
642 ATH_MSG_DEBUG("Ntuple is already booked");
643 } else {
644 ATH_MSG_DEBUG("Attempting to book general ntuple");
645 nt2 = m_ntupleSvc->book(nt2id, CLID_ColumnWiseTuple, comments);
646
647 if (nt2) {
648 StatusCode sc;
649 // sc = nt2->addItem("event", m_nt_event); // event number
650 sc = nt2->addItem("nTracks_Low", m_nt_nLowtracks, 0, maxTracks); // number of tracks
651
652 // ----------------------------------------------------------------------
653 // Trk::Track parameters
654 sc = nt2->addItem("Trk_d0_Low", m_nt_nLowtracks, m_nt_Trk_d0_Low);
655 sc = nt2->addItem("Trk_z0_Low", m_nt_nLowtracks, m_nt_Trk_z0_Low);
656 sc = nt2->addItem("Trk_phi0_Low", m_nt_nLowtracks, m_nt_Trk_phi0_Low);
657 sc = nt2->addItem("Trk_theta0_Low", m_nt_nLowtracks, m_nt_Trk_theta0_Low);
658 sc = nt2->addItem("Trk_qoverp_Low", m_nt_nLowtracks, m_nt_Trk_qoverp_Low);
659 sc = nt2->addItem("Trk_pt_Low", m_nt_nLowtracks, m_nt_Trk_pt_Low);
660 // ----------------------------------------------------------------------
661
662 // ----------------------------------------------------------------------
663 // Trk::Track hits...
664 sc = nt2->addItem("Trk_nHits_Low", m_nt_nLowtracks, m_nt_Trk_nHits_Low);
665 sc = nt2->addItem("Trk_nhitsPixels_Low", m_nt_nLowtracks, m_nt_Trk_nhitspix_Low);
666 sc = nt2->addItem("Trk_nhitsSCT_Low", m_nt_nLowtracks, m_nt_Trk_nhitssct_Low);
667 sc = nt2->addItem("Trk_nhitsTRT_Low", m_nt_nLowtracks, m_nt_Trk_nhitstrt_Low);
668
669 sc = nt2->addItem("Trk_nsharedPixels_Low", m_nt_nLowtracks, m_nt_Trk_nsharedPixels_Low);
670 sc = nt2->addItem("Trk_nsharedSCT_Low", m_nt_nLowtracks, m_nt_Trk_nsharedSCT_Low);
671 sc = nt2->addItem("Trk_nshared_Low", m_nt_nLowtracks, m_nt_Trk_nshared_Low);
672
673 sc = nt2->addItem("Trk_nholesPixels_Low", m_nt_nLowtracks, m_nt_Trk_nholesPixels_Low);
674 sc = nt2->addItem("Trk_nholesSCT_Low", m_nt_nLowtracks, m_nt_Trk_nholesSCT_Low);
675 sc = nt2->addItem("Trk_nholes_Low", m_nt_nLowtracks, m_nt_Trk_nholes_Low);
676
677 sc = nt2->addItem("Trk_chi2_Low", m_nt_nLowtracks, m_nt_Trk_chi2_Low);
678 sc = nt2->addItem("Trk_ndof_Low", m_nt_nLowtracks, m_nt_Trk_ndof_Low);
679 sc = nt2->addItem("Trk_chi2Prob_Low", m_nt_nLowtracks, m_nt_Trk_chi2Prob_Low);
680 // ----------------------------------------------------------------------
681 if (sc.isFailure()) msg(MSG::FATAL) << "Failed ntupleSvc()" << endmsg;
682 else msg(MSG::DEBUG) << "Ntuple " << nt2id << " has been booked successfully! " << endmsg;
683 } else {
684 ATH_MSG_ERROR("Error booking ntuple");
685 }
686 }
687}
688
689//=====================================================================
690// bookMatchingNtuple()
691//=====================================================================
693 ATH_MSG_DEBUG("Booking Matching between Up and Low Trk::Track Collections...");
694
695 std::string nt3id = m_ntupleName + "/TrkTrack_Matching";
696 std::string comments = "Matching between Up and Low Trk::Track Collections";
697
698 NTuplePtr nt3(m_ntupleSvc.get(), nt3id);
699 if (nt3) {
700 ATH_MSG_DEBUG("Ntuple is already booked");
701 } else {
702 ATH_MSG_DEBUG("Attempting to book general ntuple");
703 m_ntupleSvc->book(nt3id, CLID_ColumnWiseTuple, comments);
704
705 if (nt3) {
706 StatusCode sc;
707 // sc = nt3->addItem("event", m_nt_event); // event number
708
709 sc = nt3->addItem("nTracks_Match", m_nt_matchingTrk, 0, maxTracks); // number of tracks
710
711 // ----------------------------------------------------------------------
712 // Matching for the usual Trk::Track parameters
713 sc = nt3->addItem("Trk_delta_d0", m_nt_matchingTrk, m_nt_Trk_delta_d0);
714 sc = nt3->addItem("Trk_delta_phi0", m_nt_matchingTrk, m_nt_Trk_delta_phi0);
715 sc = nt3->addItem("Trk_delta_theta0", m_nt_matchingTrk, m_nt_Trk_delta_theta0);
716 sc = nt3->addItem("Trk_delta_eta", m_nt_matchingTrk, m_nt_Trk_delta_eta);
717 sc = nt3->addItem("Trk_delta_z0", m_nt_matchingTrk, m_nt_Trk_delta_z0);
718 sc = nt3->addItem("Trk_delta_qoverpt", m_nt_matchingTrk, m_nt_Trk_delta_qoverpt);
719 sc = nt3->addItem("Trk_delta_pt", m_nt_matchingTrk, m_nt_Trk_delta_pt);
720 sc = nt3->addItem("Trk_delta_charge", m_nt_matchingTrk, m_nt_Trk_delta_charge);
721 // ----------------------------------------------------------------------
722
723 if (sc.isFailure()) msg(MSG::FATAL) << "Failed ntupleSvc()" << endmsg;
724 else msg(MSG::DEBUG) << "Ntuple " << nt3id << " has been booked successfully! " << endmsg;
725 } else {
726 if (msgLvl(MSG::ERROR)) msg(MSG::DEBUG) << "Error booking ntuple" << endmsg;
727 }
728 }
729
730 return;
731}
732
733//=====================================================================
734// InDetAlignFillTrack::dumpTrackCol()
735//=====================================================================
736int InDetAlignFillTrack::dumpTrackCol(const EventContext& ctx, const TrackCollection* tracks) {
737 return dumpTrackCol(ctx, tracks, "");
738}
739
740//=====================================================================
741// InDetAlignFillTrack::dumpTrackCol()
742//=====================================================================
743int InDetAlignFillTrack::dumpTrackCol(const EventContext& ctx,
744 const TrackCollection* tracks,
745 const std::string& TrkColName) {
746 ATH_MSG_DEBUG("In dump" << TrkColName << "TrackCol()");
747
748 int itrk = 0;
749
750 TrackCollection::const_iterator trackItr = tracks->begin();
751 TrackCollection::const_iterator trackItrE = tracks->end();
752
753 //looping over tracks
754 for (; trackItr != trackItrE && itrk < maxTracks; ++trackItr) {
755 if (*trackItr != nullptr) dumpTrack(ctx, itrk, (*trackItr), TrkColName);
756
757 itrk++;
758 }
759
760 return itrk;
761}
762
763//=====================================================================
764// InDetAlignFillTrack::dumpTrack()
765//=====================================================================
766void InDetAlignFillTrack::dumpTrack(const EventContext& ctx,
767 int itrk, const Trk::Track* trk,
768 const std::string& TrkColName) {
769 ATH_MSG_VERBOSE("In dump" << TrkColName << "Track()");
770
771 const Trk::Perigee* aMeasPer = trk->perigeeParameters();
772
773 if (aMeasPer == nullptr) {
774 ATH_MSG_ERROR("Could not get Trk::MeasuredPerigee");
775 } else {
776 double d0 = aMeasPer->parameters()[Trk::d0];
777 double z0 = aMeasPer->parameters()[Trk::z0];
778 double phi0 = aMeasPer->parameters()[Trk::phi0];
779 double theta = aMeasPer->parameters()[Trk::theta];
780 double qOverP = aMeasPer->parameters()[Trk::qOverP];
781
782 if (msgLvl(MSG::DEBUG)) {
783 msg(MSG::DEBUG) << itrk << ". " << TrkColName
784 << " Track Parameters (d0, z0, phi0, theta, q/p)" << endmsg;
785 msg(MSG::DEBUG) << " " << d0 << ", " << z0 << ", "
786 << phi0 << ", " << theta << ", " << qOverP << endmsg;
787 }
788
789 float transverseMomentum = std::sqrt((aMeasPer->momentum().x()) * (aMeasPer->momentum().x())
790 + (aMeasPer->momentum().y()) * (aMeasPer->momentum().y()));
791
792 ATH_MSG_DEBUG(" p = " << aMeasPer->momentum().mag() / CLHEP::GeV << " CLHEP::GeV/c, "
793 << " pT = " << transverseMomentum / CLHEP::GeV << " CLHEP::GeV/c");
794
795 // number of hits
796 int nHits = (*trk).measurementsOnTrack()->size();
797 ATH_MSG_DEBUG(" - number of hits : " << nHits);
798 if (nHits != 0) {
799 if (TrkColName == "Up") m_totalUphits += nHits;
800 else if (TrkColName == "Low") m_totalLowhits += nHits;
801 else m_totalhits += nHits;
802 }
803
804 // number of hits, shared hits and holes
805 int nhitspix = 0, nhitssct = 0, nhitstrt = 0;
806 int nshared = 0, nshpix = 0, nshsct = 0;
807 int nholes = 0, nhpix = 0, nhsct = 0;
808
809 xAOD::TrackParticle* trackPart = m_particleCreator->createParticle(ctx, *trk);
810 uint8_t iSummaryValue(0); // Dummy counter to retrieve summary values
811
812 if (not trackPart) ATH_MSG_ERROR("Could not get xAOD::TrackParticle");
813
814 else {
815 // hits
816 nhitspix = trackPart->summaryValue(iSummaryValue, xAOD::numberOfPixelHits) ? iSummaryValue : 0;
817 nhitssct = trackPart->summaryValue(iSummaryValue, xAOD::numberOfSCTHits) ? iSummaryValue : 0;
818 nhitstrt = trackPart->summaryValue(iSummaryValue, xAOD::numberOfTRTHits) ? iSummaryValue : 0;
819
820 if (msgLvl(MSG::DEBUG)) {
821 msg(MSG::DEBUG) << " -- number of Pixel hits : " << nhitspix << endmsg;
822 msg(MSG::DEBUG) << " -- number of SCT hits : " << nhitssct << endmsg;
823 msg(MSG::DEBUG) << " -- number of TRT hits : " << nhitstrt << endmsg;
824 }
825
826 if (nhitspix != 0) {
827 if (TrkColName == "Up") m_totalUpPixhits += nhitspix;
828 else if (TrkColName == "Low") m_totalLowPixhits += nhitspix;
829 else m_totalPixhits += nhitspix;
830 }
831 if (nhitssct != 0) {
832 if (TrkColName == "Up") m_totalUpSCThits += nhitssct;
833 else if (TrkColName == "Low") m_totalLowSCThits += nhitssct;
834 else m_totalSCThits += nhitssct;
835 }
836 if (nhitstrt != 0) {
837 if (TrkColName == "Up") m_totalUpTRThits += nhitstrt;
838 else if (TrkColName == "Low") m_totalLowTRThits += nhitstrt;
839 else m_totalTRThits += nhitstrt;
840 }
841
842 // shared hits
843 nshpix = trackPart->summaryValue(iSummaryValue, xAOD::numberOfPixelSharedHits) ? iSummaryValue : 0;
844 nshsct = trackPart->summaryValue(iSummaryValue, xAOD::numberOfSCTSharedHits) ? iSummaryValue : 0;
845 nshared = nshpix + nshsct;
846
847 if (nshpix < 0) nshpix = 0;
848 if (nshsct < 0) nshsct = 0;
849 if (nshared < 0) nshared = 0;
850
851 if (msgLvl(MSG::DEBUG)) {
852 msg(MSG::DEBUG) << " - number of shared hits : " << nshared << endmsg;
853 msg(MSG::DEBUG) << " -- number of Pixel shared hits : " << nshpix << endmsg;
854 msg(MSG::DEBUG) << " -- number of SCT shared hits : " << nshsct << endmsg;
855 }
856
857 // holes
858 nhpix = trackPart->summaryValue(iSummaryValue, xAOD::numberOfPixelHoles) ? iSummaryValue : 0;
859 nhsct = trackPart->summaryValue(iSummaryValue, xAOD::numberOfSCTHoles) ? iSummaryValue : 0;
860 nholes = nhpix + nhsct;
861
862 if (nhpix < 0) nhpix = 0;
863 if (nhsct < 0) nhsct = 0;
864 if (nholes < 0) nholes = 0;
865
866 if (msgLvl(MSG::DEBUG)) {
867 msg(MSG::DEBUG) << " - number of Pixel holes : " << nhpix << endmsg;
868 msg(MSG::DEBUG) << " -- number of SCT holes : " << nhsct << endmsg;
869 msg(MSG::DEBUG) << " -- number of holes : " << nholes << endmsg;
870 }
871 }
872
873 // get fit quality and chi2 probability of track
874 // chi2Prob = TMath::Prob(chi2,DoF) ROOT function
875 double chi2Prob = 0.;
876 const Trk::FitQuality* fitQual = (*trk).fitQuality();
877 if (fitQual == nullptr) {
878 ATH_MSG_ERROR("No fit quality assigned to the track");
879 chi2Prob = -1e12; // return big value
880 } else {
881 if (fitQual->chiSquared() > 0. && fitQual->numberDoF() > 0) {
882 Genfun::CumulativeChiSquare probabilityFunction(fitQual->numberDoF());
883 chi2Prob = 1 - probabilityFunction(fitQual->chiSquared());
884
885 if (msgLvl(MSG::DEBUG)) {
886 msg(MSG::DEBUG) << " - chi2 : " << fitQual->chiSquared() << endmsg;
887 msg(MSG::DEBUG) << " - ndof : " << fitQual->numberDoF() << endmsg;
888 msg(MSG::DEBUG) << " - chi2 propability : " << chi2Prob << endmsg;
889 }
890 }
891 }
892 // Fill ntuple
893 if (TrkColName == "Up") {
894 m_nt_Trk_d0_Up[itrk] = d0;
895 m_nt_Trk_z0_Up[itrk] = z0;
896 m_nt_Trk_phi0_Up[itrk] = phi0;
898 m_nt_Trk_qoverp_Up[itrk] = qOverP;
899 m_nt_Trk_pt_Up[itrk] = transverseMomentum;
900
901 m_nt_Trk_nHits_Up[itrk] = nHits;
902 m_nt_Trk_nhitspix_Up[itrk] = nhitspix;
903 m_nt_Trk_nhitssct_Up[itrk] = nhitssct;
904 m_nt_Trk_nhitstrt_Up[itrk] = nhitstrt;
905
906 m_nt_Trk_nsharedPixels_Up[itrk] = nshpix;
907 m_nt_Trk_nsharedSCT_Up[itrk] = nshsct;
908 m_nt_Trk_nshared_Up[itrk] = nshared;
909
910 m_nt_Trk_nholesPixels_Up[itrk] = nhpix;
911 m_nt_Trk_nholesSCT_Up[itrk] = nhsct;
912 m_nt_Trk_nholes_Up[itrk] = nholes;
913 if (fitQual) {
914 m_nt_Trk_chi2_Up[itrk] = fitQual->chiSquared();
915 m_nt_Trk_ndof_Up[itrk] = fitQual->numberDoF();
916 } else {
917 m_nt_Trk_chi2_Up[itrk] = 0;
918 m_nt_Trk_ndof_Up[itrk] = 0;
919 }
920 m_nt_Trk_chi2Prob_Up[itrk] = chi2Prob;
921 } else if (TrkColName == "Low") {
922 m_nt_Trk_d0_Low[itrk] = d0;
923 m_nt_Trk_z0_Low[itrk] = z0;
924 m_nt_Trk_phi0_Low[itrk] = phi0;
926 m_nt_Trk_qoverp_Low[itrk] = qOverP;
927 m_nt_Trk_pt_Low[itrk] = transverseMomentum;
928
930 m_nt_Trk_nhitspix_Low[itrk] = nhitspix;
931 m_nt_Trk_nhitssct_Low[itrk] = nhitssct;
932 m_nt_Trk_nhitstrt_Low[itrk] = nhitstrt;
933
934 m_nt_Trk_nsharedPixels_Low[itrk] = nshpix;
935 m_nt_Trk_nsharedSCT_Low[itrk] = nshsct;
936 m_nt_Trk_nshared_Low[itrk] = nshared;
937
938 m_nt_Trk_nholesPixels_Low[itrk] = nhpix;
939 m_nt_Trk_nholesSCT_Low[itrk] = nhsct;
940 m_nt_Trk_nholes_Low[itrk] = nholes;
941 if (fitQual) {
942 m_nt_Trk_chi2_Low[itrk] = fitQual->chiSquared();
943 m_nt_Trk_ndof_Low[itrk] = fitQual->numberDoF();
944 } else {
945 m_nt_Trk_chi2_Low[itrk] = 0;
946 m_nt_Trk_ndof_Low[itrk] = 0;
947 }
948 m_nt_Trk_chi2Prob_Low[itrk] = chi2Prob;
949 } else {
950 m_nt_Trk_d0[itrk] = d0;
951 m_nt_Trk_z0[itrk] = z0;
952 m_nt_Trk_phi0[itrk] = phi0;
953 m_nt_Trk_theta0[itrk] = theta;
954 m_nt_Trk_qoverp[itrk] = qOverP;
955 m_nt_Trk_pt[itrk] = transverseMomentum;
956
957 m_nt_Trk_nHits[itrk] = nHits;
958 m_nt_Trk_nhitspix[itrk] = nhitspix;
959 m_nt_Trk_nhitssct[itrk] = nhitssct;
960 m_nt_Trk_nhitstrt[itrk] = nhitstrt;
961
962 m_nt_Trk_nsharedPixels[itrk] = nshpix;
963 m_nt_Trk_nsharedSCT[itrk] = nshsct;
964 m_nt_Trk_nshared[itrk] = nshared;
965
966 m_nt_Trk_nholesPixels[itrk] = nhpix;
967 m_nt_Trk_nholesSCT[itrk] = nhsct;
968 m_nt_Trk_nholes[itrk] = nholes;
969 if (fitQual) {
970 m_nt_Trk_chi2[itrk] = fitQual->chiSquared();
971 m_nt_Trk_ndof[itrk] = fitQual->numberDoF();
972 } else {
973 m_nt_Trk_chi2[itrk] = 0;
974 m_nt_Trk_ndof[itrk] = 0;
975 }
976 m_nt_Trk_chi2Prob[itrk] = chi2Prob;
977 }
978 }
979
980 return;
981}
982
983//=====================================================================
984// InDetAlignFillTrack::dumpPerigee()
985//=====================================================================
987 int index) {
988 ATH_MSG_VERBOSE( "In dumpPerigee()" );
989
990 float d0 = generatedTrackPerigee->parameters()[Trk::d0];
991 float z0 = generatedTrackPerigee->parameters()[Trk::z0];
992 float phi0 = generatedTrackPerigee->parameters()[Trk::phi0];
993 float theta = generatedTrackPerigee->parameters()[Trk::theta];
994 float eta = generatedTrackPerigee->eta();
995 float charge = generatedTrackPerigee->charge();
996 float qoverp = generatedTrackPerigee->parameters()[Trk::qOverP];
997 float qoverpt = generatedTrackPerigee->parameters()[Trk::qOverP] / (std::sin(theta));
998 float pt = (1 / qoverpt) * (charge);
999 // int pdg = genParticle->pdg_id();
1000
1001 if (msgLvl(MSG::DEBUG)) {
1002 msg(MSG::DEBUG) << " - Extrapolated genParticle perigee parameters "
1003 << "(d0, z0, phi0, theta, q/p)" << endmsg;
1004 msg(MSG::DEBUG) << " " << d0 << ", " << z0 << ", "
1005 << phi0 << ", " << theta << ", " << qoverp << endmsg;
1006
1007 msg(MSG::DEBUG) << " p = " << std::abs(1.0 / qoverp) / CLHEP::GeV << " CLHEP::GeV/c, "
1008 << " pT = " << pt / CLHEP::GeV << " CLHEP::GeV/c" << endmsg;
1009 }
1010
1011 m_nt_mc_Trk_d0[index] = d0;
1012 m_nt_mc_Trk_z0[index] = z0;
1013 m_nt_mc_Trk_phi0[index] = phi0;
1016 m_nt_mc_Trk_qoverp[index] = qoverp;
1017 m_nt_mc_Trk_qoverpt[index] = qoverpt;
1018 m_nt_mc_Trk_pt[index] = pt;
1020
1021 return;
1022}
1023
1024//=====================================================================
1025// InDetAlignFillTrack::dumpMatching()
1026//=====================================================================
1028 const TrackCollection* tracksLower) {
1029 ATH_MSG_DEBUG("In dumpMatching()");
1030
1031 int nTracksUpper = 0;
1032
1033 // looping over the upper barrel tracks
1034 TrackCollection::const_iterator trackItrUpper = tracksUpper->begin();
1035 TrackCollection::const_iterator trackItrUpperE = tracksUpper->end();
1036 for (; trackItrUpper != trackItrUpperE; ++trackItrUpper) {
1037 const Trk::Track* trackUpper = *trackItrUpper;
1038 if (trackUpper == nullptr) {
1039 ATH_MSG_DEBUG("No associated Trk::Track object found for track " << nTracksUpper);
1040 continue;
1041 }
1042
1043 const Trk::Perigee* measUpperPer = trackUpper->perigeeParameters();
1044
1045 // Get the track parameters from the Upper Track
1046 float d0Up = measUpperPer->parameters()[Trk::d0];
1047 float phi0Up = measUpperPer->parameters()[Trk::phi0];
1048 float eta0Up = measUpperPer->eta();
1049 float z0Up = measUpperPer->parameters()[Trk::z0];
1050 float thetaUp = measUpperPer->parameters()[Trk::theta];
1051 float qOverPtUp = measUpperPer->parameters()[Trk::qOverP] * 1000 / std::sin(thetaUp);
1052 float chargeUp = measUpperPer->charge();
1053 float ptUp = measUpperPer->pT() / 1000.;
1054
1055 if (msgLvl(MSG::DEBUG)) {
1056 msg(MSG::DEBUG) << nTracksUpper << ". UpTrack -> Track Parameters:" << endmsg;
1057 msg(MSG::DEBUG) << " d0, z0, phi0, theta, q/p" << d0Up << ", " << z0Up << ", "
1058 << phi0Up << ", " << thetaUp << ", " << qOverPtUp << endmsg;
1059 }
1060
1061 int nTracksLower = 0;
1062
1063 bool matchFound = false;
1064 float Matched_Low_d0 = -999;
1065 float Matched_Low_phi0 = -999;
1066 //**
1067 float Matched_Low_theta = -999;
1068 float Matched_Low_eta0 = -999;
1069 float Matched_Low_z0 = -999;
1070 float Matched_Low_qOverPt = -999;
1071 float Matched_Low_charge = -999;
1072 float Matched_Low_pt = -999;
1073
1074 // looping over the lower barrel tracks
1075 DataVector<Trk::Track>::const_iterator trackItrLower = tracksLower->begin();
1076 DataVector<Trk::Track>::const_iterator trackItrLowerE = tracksLower->end();
1077 for (; trackItrLower != trackItrLowerE; ++trackItrLower) { //looping over Lower tracks
1078 const Trk::Track* trackLower = *trackItrLower;
1079 if (trackLower == nullptr) {
1080 ATH_MSG_DEBUG("No associated Trk::Track object found for track " << nTracksLower);
1081 continue;
1082 }
1083
1084 const Trk::Perigee* measLowerPer = trackLower->perigeeParameters();
1085
1086 float d0Low = measLowerPer->parameters()[Trk::d0];
1087 float phi0Low = measLowerPer->parameters()[Trk::phi0];
1088 float eta0Low = measLowerPer->eta();
1089 float z0Low = measLowerPer->parameters()[Trk::z0];
1090 float thetaLow = measLowerPer->parameters()[Trk::theta];
1091 float qOverPtLow = measLowerPer->parameters()[Trk::qOverP] * 1000 / std::sin(thetaLow);
1092 float chargeLow = measLowerPer->charge();
1093 float ptLow = measLowerPer->pT() / 1000.;
1094
1095 //selecting Lower track that is closest to Upper in eta-phi
1096 float dphi2 = (phi0Up - phi0Low) * (phi0Up - phi0Low);
1097
1098 //For TRT only tracks we will ignore the delta eta
1099 // and just require a delta phi match
1100 float deta2 = (eta0Up - eta0Low) * (eta0Up - eta0Low);
1101
1102 // look for a matching track within a cone
1103 float dR = std::sqrt(dphi2 + deta2);
1104 ATH_MSG_DEBUG("dR (sqrt(dphi+deta2): " << dR);
1105 ATH_MSG_DEBUG("minmdR (sqrt(dphi+deta2): " << m_mindR);
1106 if (dR < m_mindR) {
1107 // m_mindR = dR;
1108 Matched_Low_d0 = d0Low;
1109 Matched_Low_phi0 = phi0Low;
1110 //**
1111 Matched_Low_theta = thetaLow;
1112 Matched_Low_eta0 = eta0Low;
1113 Matched_Low_z0 = z0Low;
1114 Matched_Low_qOverPt = qOverPtLow;
1115 Matched_Low_charge = chargeLow;
1116 Matched_Low_pt = ptLow;
1117
1118 if (dR < m_matchedRcut) {
1119 if (msgLvl(MSG::DEBUG)) {
1120 msg(MSG::DEBUG) << nTracksLower << ". LowTrack -> Track Parameters:" << endmsg;
1121 msg(MSG::DEBUG) << " d0, z0, phi0, theta, q/p: " << d0Low << ", " << z0Low << ", "
1122 << phi0Low << ", " << thetaLow << ", " << qOverPtLow << endmsg;
1123 }
1124
1125 matchFound = true;
1126 }
1127 } else {
1128 ATH_MSG_DEBUG("No matching low track found!!");
1129 }
1130 nTracksLower++;
1131 } //looping over lower tracks
1132
1133 if (matchFound) {
1134 ATH_MSG_DEBUG("Match found!");
1135 m_nt_matchingTrk = 1;
1136 m_nt_Trk_delta_d0[nTracksUpper] = d0Up - Matched_Low_d0;
1137 m_nt_Trk_delta_phi0[nTracksUpper] = phi0Up - Matched_Low_phi0;
1138 //**
1139 m_nt_Trk_delta_theta0[nTracksUpper] = thetaUp - Matched_Low_theta;
1140 m_nt_Trk_delta_eta[nTracksUpper] = eta0Up - Matched_Low_eta0;
1141 m_nt_Trk_delta_z0[nTracksUpper] = z0Up - Matched_Low_z0;
1142 m_nt_Trk_delta_qoverpt[nTracksUpper] = qOverPtUp - Matched_Low_qOverPt;
1143 m_nt_Trk_delta_pt[nTracksUpper] = ptUp - Matched_Low_pt;
1144 m_nt_Trk_delta_charge[nTracksUpper] = chargeUp - Matched_Low_charge;
1145 } // end match found
1146
1147
1148 nTracksUpper++;
1149 } //looping over upper tracks
1150
1151 return StatusCode::SUCCESS;
1152}
#define M_PI
Scalar eta() const
pseudorapidity method
Scalar theta() const
theta method
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
double charge(const T &p)
Definition AtlasPID.h:997
An STL vector of pointers that by default owns its pointed-to elements.
static const int maxTracks
static Double_t sc
static const uint32_t nHits
DataVector< Trk::Track > TrackCollection
This typedef represents a collection of Trk::Track objects.
AtlasHitsVector< TrackRecord > TrackRecordCollection
CONT::const_iterator const_iterator
const_iterator begin() const
size_type size() const
const_iterator end() const
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
bool empty() const noexcept
Returns true if the collection is empty.
NTuple::Array< long > m_nt_Trk_nhitssct_Low
number of SCT hits (Low track)
NTuple::Array< long > m_nt_Trk_nsharedPixels_Up
number of Pixel shared hits (Up track)
NTuple::Array< long > m_nt_Trk_nholesSCT
number of SCT holes
BooleanProperty m_doTruth
switch on/off the truth information
NTuple::Item< long > m_nt_nmctracks
number of mc tracks
NTuple::Array< float > m_nt_Trk_delta_charge
charge parameter
virtual StatusCode FillTrack() override
ServiceHandle< INTupleSvc > m_ntupleSvc
NTuple::Array< float > m_nt_Trk_d0
d0 parameter
NTuple::Array< float > m_nt_Trk_chi2Prob_Up
number of chi2 probability (Up track)
NTuple::Array< long > m_nt_Trk_nsharedSCT_Low
number of SCT shared hits (Low track)
NTuple::Array< long > m_nt_Trk_nholes
number of holes
NTuple::Array< long > m_nt_Trk_nholesSCT_Up
number of SCT holes (Up track)
NTuple::Array< float > m_nt_mc_Trk_vtxY
MonteCarlo Vertex.Y parameter.
NTuple::Array< long > m_nt_Trk_nholes_Up
number of holes (Up track)
StringProperty m_ntupleName
NTuple::Array< float > m_nt_Trk_theta0_Up
theta0 parameter (Up track)
NTuple::Array< long > m_nt_Trk_ndof
number of ndof
NTuple::Array< float > m_nt_mc_Trk_genParticlePt
generated pt
NTuple::Array< float > m_nt_Trk_qoverp_Low
q/p parameter (Low track)
NTuple::Item< long > m_nt_matchingTrk
matching tracks
NTuple::Array< float > m_nt_mc_trkistruth
Has the Track an associated truth track?
NTuple::Array< float > m_nt_Trk_qoverp_Up
q/p parameter (Up track)
NTuple::Array< long > m_nt_Trk_nshared
number of shared hits
StringProperty m_inputLowCol
NTuple::Array< float > m_nt_mc_Trk_qoverpt
MonteCarlo q/pt parameter.
NTuple::Array< long > m_nt_Trk_nholesPixels_Up
number of Pixel holes (Up track)
NTuple::Array< float > m_nt_Trk_delta_qoverpt
q/pt parameter
NTuple::Array< float > m_nt_Trk_chi2_Low
number of chi2 (Low track)
NTuple::Array< float > m_nt_Trk_delta_pt
pt parameter
NTuple::Array< float > m_nt_Trk_d0_Up
d0 parameter (Up track)
NTuple::Array< long > m_nt_Trk_nHits_Up
number of hits (Up track)
NTuple::Array< long > m_nt_Trk_nshared_Low
number of shared hits (Low track)
NTuple::Array< long > m_nt_Trk_nhitstrt
number of TRT hits
NTuple::Array< float > m_nt_mc_Trk_genParticleEta
generated eta
NTuple::Array< float > m_nt_Trk_pt_Up
pt parameter (Up track)
NTuple::Array< long > m_nt_Trk_nholesPixels_Low
number of Pixel holes (Low track)
NTuple::Array< long > m_nt_Trk_nsharedPixels
number of Pixel shared hits
NTuple::Array< float > m_nt_Trk_pt_Low
pt parameter (Low track)
NTuple::Array< float > m_nt_mc_Trk_z0
MonteCarlo z0 parameter.
NTuple::Array< long > m_nt_Trk_nhitstrt_Low
number of TRT hits (Low track)
NTuple::Array< float > m_nt_mc_Trk_qoverp
MonteCarlo q/p parameter.
NTuple::Array< float > m_nt_mc_Trk_pdg
MonteCarlo pdg parameter.
NTuple::Array< float > m_nt_mc_Trk_eta
MonteCarlo eta parameter.
NTuple::Array< float > m_nt_Trk_z0_Low
z0 parameter (Low track)
NTuple::Array< float > m_nt_Trk_chi2
number of chi2
NTuple::Array< float > m_nt_mc_Trk_prob
MonteCarlo prob parameter.
void dumpTrack(const EventContext &ctx, int, const Trk::Track *, const std::string &)
virtual StatusCode finalize() override
NTuple::Array< long > m_nt_Trk_nhitssct
number of SCT hits
NTuple::Array< float > m_nt_mc_Trk_vtxZ
MonteCarlo Vertex.Z parameter.
NTuple::Array< long > m_nt_Trk_nshared_Up
number of shared hits (Up track)
NTuple::Array< float > m_nt_Trk_phi0
phi0 parameter
NTuple::Array< long > m_nt_Trk_nhitspix_Up
number of Pixel hits (Up track)
StringProperty m_inputUpCol
NTuple::Array< long > m_nt_Trk_nhitspix_Low
number of Pixel hits (Low track)
NTuple::Array< float > m_nt_Trk_delta_z0
z0 parameter
ToolHandle< Trk::ITrackParticleCreatorTool > m_particleCreator
NTuple::Array< float > m_nt_Trk_theta0
theta0 parameter
NTuple::Array< float > m_nt_Trk_qoverp
q/p parameter
NTuple::Array< float > m_nt_Trk_d0_Low
d0 parameter (Low track)
NTuple::Array< float > m_nt_Trk_delta_phi0
phi0 parameter
NTuple::Array< float > m_nt_mc_Trk_d0
MonteCarlo d0 parameter.
NTuple::Item< long > m_nt_ntracks
number of tracks
NTuple::Item< long > m_nt_nLowtracks
number of Low tracks
virtual StatusCode initialize() override
ToolHandle< Trk::ITruthToTrack > m_truthToTrack
NTuple::Array< long > m_nt_Trk_nhitspix
number of Pixel hits
void dumpPerigee(const Trk::TrackParameters *, int)
NTuple::Array< float > m_nt_Trk_delta_theta0
theta parameter
BooleanProperty m_doMatching
switch on/off the matching information
NTuple::Array< long > m_nt_Trk_ndof_Up
number of ndof (Up track)
NTuple::Array< long > m_nt_Trk_nholes_Low
number of holes (Low track)
NTuple::Array< float > m_nt_mc_Trk_genParticlePhi
generated phi
NTuple::Array< float > m_nt_Trk_z0
z0 parameter
NTuple::Array< float > m_nt_mc_Trk_phi0
MonteCarlo phi0 parameter.
NTuple::Array< float > m_nt_Trk_z0_Up
z0 parameter (Up track)
StringProperty m_TruthTrkCol
NTuple::Array< long > m_nt_Trk_nsharedPixels_Low
number of Pixel shared hits (Low track)
InDetAlignFillTrack(const std::string &type, const std::string &name, const IInterface *parent)
NTuple::Array< float > m_nt_Trk_chi2Prob_Low
number of chi2 probability (Low track)
NTuple::Array< long > m_nt_Trk_nsharedSCT_Up
number of SCT shared hits (Up track)
NTuple::Array< long > m_nt_Trk_nsharedSCT
number of SCT shared hits
NTuple::Array< long > m_nt_Trk_nhitstrt_Up
number of TRT hits (Up track)
NTuple::Array< long > m_nt_Trk_nHits
number of hits
NTuple::Array< float > m_nt_Trk_phi0_Low
phi0 parameter (Low track)
NTuple::Array< float > m_nt_mc_Trk_charge
MonteCarlo charge parameter.
NTuple::Array< float > m_nt_mc_Trk_pt
MonteCarlo pt parameter.
NTuple::Array< long > m_nt_Trk_nHits_Low
number of hits (Low track)
NTuple::Array< float > m_nt_Trk_chi2Prob
number of chi2 probability
NTuple::Array< long > m_nt_Trk_nhitssct_Up
number of SCT hits (Up track)
NTuple::Array< long > m_nt_Trk_nholesSCT_Low
number of SCT holes (Low track)
NTuple::Array< float > m_nt_Trk_phi0_Up
phi0 parameter (Up track)
StatusCode dumpMatching(const TrackCollection *, const TrackCollection *)
NTuple::Array< float > m_nt_Trk_theta0_Low
theta0 parameter (Low track)
NTuple::Array< float > m_nt_Trk_delta_eta
eta parameter
NTuple::Array< float > m_nt_Trk_pt
pt parameter
NTuple::Array< float > m_nt_mc_Trk_vtxX
MonteCarlo Vertex.X parameter.
NTuple::Array< float > m_nt_Trk_delta_d0
d0 parameter
int dumpTrackCol(const EventContext &ctx, const TrackCollection *)
NTuple::Array< float > m_nt_Trk_chi2_Up
number of chi2 (Up track)
NTuple::Array< long > m_nt_Trk_ndof_Low
number of ndof (Low track)
NTuple::Item< long > m_nt_nUptracks
number of Up tracks
ToolHandle< Trk::IExtrapolator > m_extrapolator
NTuple::Array< long > m_nt_Trk_nholesPixels
number of Pixel holes
NTuple::Array< float > m_nt_mc_Trk_theta0
MonteCarlo theta0 parameter.
MC particle associated with a reco track + the quality of match.
Definition TrackTruth.h:14
float probability() const
Definition TrackTruth.h:28
const HepMcParticleLink & particleLink() const
Definition TrackTruth.h:26
Class to represent and store fit qualities from track reconstruction in terms of and number of degre...
Definition FitQuality.h:97
int numberDoF() const
returns the number of degrees of freedom of the overall track or vertex fit as integer
Definition FitQuality.h:60
double chiSquared() const
returns the of the overall track fit
Definition FitQuality.h:56
double eta() const
Access method for pseudorapidity - from momentum.
const Amg::Vector3D & momentum() const
Access method for the momentum.
double charge() const
Returns the charge.
double pT() const
Access method for transverse momentum.
Class describing the Line to which the Perigee refers to.
Class for a planaer rectangular or trapezoidal surface in the ATLAS detector.
const Amg::Vector3D & center() const
Returns the center position of the Surface.
const Perigee * perigeeParameters() const
return Perigee.
bool summaryValue(uint8_t &value, const SummaryType &information) const
Accessor for TrackSummary values.
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 3, 1 > Vector3D
Eigen::Translation< double, 3 > Translation3D
HepMC3::ConstGenParticlePtr ConstGenParticlePtr
Definition GenParticle.h:20
@ anyDirection
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
@ phi0
Definition ParamDefs.h:65
@ theta
Definition ParamDefs.h:66
@ qOverP
perigee
Definition ParamDefs.h:67
@ d0
Definition ParamDefs.h:63
@ z0
Definition ParamDefs.h:64
ParametersBase< TrackParametersDim, Charged > TrackParameters
ParametersT< TrackParametersDim, Charged, PlaneSurface > AtaPlane
Definition index.py:1
TrackParticle_v1 TrackParticle
Reference the current persistent version:
@ numberOfPixelHoles
number of pixel layers on track with absence of hits [unit8_t].
@ numberOfTRTHits
number of TRT hits [unit8_t].
@ numberOfSCTHits
number of hits in SCT [unit8_t].
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
@ numberOfPixelSharedHits
number of Pixel all-layer hits shared by several tracks [unit8_t].
@ numberOfSCTSharedHits
number of SCT hits shared by several tracks [unit8_t].
@ numberOfSCTHoles
number of SCT holes [unit8_t].
MsgStream & msg
Definition testRead.cxx:32