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#ifdef HEPMC3
239 HepMC::ConstGenParticlePtr genParticle = HMPL.scptr();
240#else
241 const HepMC::GenParticle* genParticle = HMPL.cptr();
242#endif
243
244 double charge = 1.0;
245 if (genParticle->pdg_id() < 0) charge = -charge;
246
247 Amg::Vector3D productionVertex(genParticle->production_vertex()->position().x(),
248 genParticle->production_vertex()->position().y(),
249 genParticle->production_vertex()->position().z());
250
251 if (msgLvl(MSG::DEBUG)) {
252 msg(MSG::DEBUG) << nTracks << ". Generated Particle " << genParticle << endmsg;
253 }
254
255 float genPt = std::sqrt((genParticle->momentum().x()) * (genParticle->momentum().x())
256 + (genParticle->momentum().y()) * (genParticle->momentum().y()));
257
258 ATH_MSG_DEBUG(" * pt " << genPt / CLHEP::GeV << " CLHEP::GeV/c"
259 << ", p " << genParticle->momentum().e() / CLHEP::GeV << " CLHEP::GeV/c"
260 << ", eta " << genParticle->momentum().eta()
261 << ", phi " << genParticle->momentum().phi() << " CLHEP::rad");
262
263 m_nt_mc_trkistruth[nTracks] = 1;
264 m_nt_mc_Trk_pdg[nTracks] = genParticle->pdg_id();
265 m_nt_mc_Trk_prob[nTracks] = trkTruthProb;
266 float pX = genParticle->momentum().px();
267 float pY = genParticle->momentum().py();
268 float genParticlePt = std::sqrt((pX * pX) + (pY * pY));
269 m_nt_mc_Trk_genParticlePt[nTracks] = genParticlePt;
270 m_nt_mc_Trk_genParticleEta[nTracks] = genParticle->momentum().eta();
271 m_nt_mc_Trk_genParticlePhi[nTracks] = genParticle->momentum().phi();
272
273 if (genParticle->pdg_id() == 0) ATH_MSG_WARNING("Particle with PDG 0!");
274 else if (!genParticle->production_vertex()) ATH_MSG_WARNING(
275 "No GenVertex (generator level) production vertex found!");
276 else {
277 // currently cannot configure the TruthToTrack tool properly
278
279 const Trk::TrackParameters* generatedTrackPerigee = nullptr;
280
281 //using a tool to produce perigee track parameters from generated parameters
282 generatedTrackPerigee = m_truthToTrack->makePerigeeParameters(genParticle);
283
284 if (!generatedTrackPerigee) {
285 if (msgLvl(MSG::DEBUG)) {
286 msg(MSG::DEBUG) << "Unable to extrapolate genParticle to perigee!" << endmsg;
287 msg(MSG::DEBUG) << "Trying to extrapolate directly to exclude material effects!" << endmsg;
288 }
289
290 const TrackRecordCollection* recordCollection = nullptr;
291
292 sc = evtStore()->retrieve(recordCollection, "CaloEntryLayer");
293 if (sc == StatusCode::FAILURE) {
294 ATH_MSG_ERROR("Could not get track record!");
295 return sc;
296 }
297 ATH_MSG_DEBUG("reading from track record, size = "
298 << recordCollection->size());
299
300 int nmctracks = 0;
301
302 for (TrackRecordCollection::const_iterator record = recordCollection->begin();
303 record != recordCollection->end(); ++record) {
304 if (std::abs((*record).GetPDGCode()) != 13) continue;
305 HepGeom::Point3D<double> productionVertex = (*record).GetPosition();
306 double charge = (*record).GetPDGCode() > 0 ? -1.0 : 1.0;
307
308
309 Amg::Vector3D direction((*record).GetMomentum().x(),
310 (*record).GetMomentum().y(),
311 (*record).GetMomentum().z());
312
313 double momentum = direction.mag();
314 if (momentum < 500) continue;
315 double genPar_qOverP = 1. / direction.mag();
316 direction *= genPar_qOverP;
317 if (charge < 0) genPar_qOverP = -genPar_qOverP;
318
319
320 double genPar_phi = direction.phi();
321 if (genPar_phi < 0.) genPar_phi = genPar_phi + 2.0*M_PI;
322
323 ATH_MSG_DEBUG("Production vertex (x,y,z): ("
324 << productionVertex.x() << ", "
325 << productionVertex.y() << ", "
326 << productionVertex.z() << ")");
327
328 double genPar_theta = direction.theta();
329
330 // Create a planar surface and transform the vertex information to a TrackParameters object
331 Amg::Transform3D globalSurfaceCentre;
332 globalSurfaceCentre.setIdentity();
333 globalSurfaceCentre *= Amg::Translation3D(productionVertex.x(),
334 productionVertex.y(), productionVertex.z());
335
336 Trk::PlaneSurface planeSurface(globalSurfaceCentre, 5., 5.);
337
338 const Amg::Vector3D productionVertexAsGlobalPosition(productionVertex.x(),
339 productionVertex.y(),
340 productionVertex.z());
341
342 const Trk::AtaPlane* productionVertexTrackParams
343 = new Trk::AtaPlane(productionVertexAsGlobalPosition,
344 genPar_phi, genPar_theta, genPar_qOverP,
345 planeSurface);
346
347 // Create a new perigee surface
348 Trk::PerigeeSurface perigeeSurface;
349
350 if (!tracks->empty()) perigeeSurface = ((**tracks->begin()).perigeeParameters()->associatedSurface());
351
352
353 const Amg::Vector3D& perigeeGlobalPosition = perigeeSurface.center();
354
355 ATH_MSG_DEBUG("Surface global centre (x,y,z): ("
356 << perigeeGlobalPosition.x() << ", "
357 << perigeeGlobalPosition.y() << ", "
358 << perigeeGlobalPosition.z() << ")");
359
360 // Extrapolate the TrackParameters object to the perigee
361
362 // ( Establish the distance between perigee and generated vertex.
363 // If less than tolerance don't bother with the propagation )
364 const Amg::Vector3D difference = productionVertexAsGlobalPosition - perigeeGlobalPosition;
365
366 double distance = std::sqrt(difference.x() * difference.x() + difference.y() * difference.y());
367 ATH_MSG_DEBUG("Distance between perigee point and generated vertex: "
368 << distance / CLHEP::m << " m");
369
370 const Trk::TrackParameters* generatedTrackPerigee = nullptr;
371
372 // Extrapolate directly to exclude material effects!
373 if (distance > 1.e-4) {
374 ATH_MSG_DEBUG("Distance between perigee and generated vertex exceeds tolerance ("
375 << 1.e-4 << " mm)... Extrapolating!");
376
377 generatedTrackPerigee = m_extrapolator->extrapolateDirectly(ctx,
378 *productionVertexTrackParams,
379 perigeeSurface,
381 false,
382 Trk::nonInteracting).release();
383 if (!generatedTrackPerigee) continue;
384 } else {
385 ATH_MSG_DEBUG("Distance between perigee and generated vertex is less than tolerance ("
386 << 1.e-4 << " CLHEP::mm)... " << "No propagation to perigee required");
387
388 // Clone the parameters from the AtaPlane object on to perigee
389 generatedTrackPerigee = new Trk::Perigee(0., 0.,
390 genPar_phi, genPar_theta, genPar_qOverP,
391 Trk::PerigeeSurface(productionVertexAsGlobalPosition));
392 }
393
394 dumpPerigee(generatedTrackPerigee, nmctracks);
395 m_nt_mc_Trk_vtxX[nmctracks] = productionVertex.x();
396 m_nt_mc_Trk_vtxY[nmctracks] = productionVertex.y();
397 m_nt_mc_Trk_vtxZ[nmctracks] = productionVertex.z();
398
399 delete productionVertexTrackParams;
400 delete generatedTrackPerigee;
401
402 nmctracks++;
403 }
404 }
405
406 if (generatedTrackPerigee) {
407 dumpPerigee(generatedTrackPerigee, nTracks);
408 m_nt_mc_Trk_vtxX[nTracks] = genParticle->production_vertex()->position().x();
409 m_nt_mc_Trk_vtxY[nTracks] = genParticle->production_vertex()->position().y();
410 m_nt_mc_Trk_vtxZ[nTracks] = genParticle->production_vertex()->position().z();
411
412 delete generatedTrackPerigee;
413 }
414 }
415 }
416 m_nt_mc_trkistruth[nTracks] = 0;
417 }
418 //} // if (truthCol) commented out for coverity 14309
419
420 nTracks++;
421 }
422 }
423 } // end if m_doTruth
424
425 // Store TrkTrack branch
426 std::string nt0id = m_ntupleName + "/TrkTrack";
427 sc = m_ntupleSvc->writeRecord(nt0id);
428 if (sc.isFailure()) ATH_MSG_ERROR("Could not write " << nt0id << "!");
429
430 if (m_inputUpCol != "") {
431 // Store TrkTrack_Up branch
432 std::string nt1id = m_ntupleName + "/TrkTrack_Up";
433 sc = m_ntupleSvc->writeRecord(nt1id);
434 if (sc.isFailure()) ATH_MSG_ERROR("Could not write " << nt1id << "!");
435 }
436
437 if (m_inputLowCol != "") {
438 // Store TrkTrack_Low branch
439 std::string nt2id = m_ntupleName + "/TrkTrack_Low";
440 sc = m_ntupleSvc->writeRecord(nt2id);
441 if (sc.isFailure()) ATH_MSG_ERROR("Could not write " << nt2id << "!");
442 }
443
444 if (m_doMatching && m_inputUpCol != "" && m_inputLowCol != "") {
445 // Store Matching Up/Low TrkTracks branch
446 std::string nt3id = m_ntupleName + "/TrkTrack_Matching";
447 sc = m_ntupleSvc->writeRecord(nt3id);
448 if (sc.isFailure()) ATH_MSG_ERROR("Could not write " << nt3id << "!");
449 }
450
451
452 m_events++;
453
454 // check for negative values
455 if (m_totaltrks < 0) m_totaltrks = 0;
456 if (m_totalhits < 0) m_totalhits = 0;
457 if (m_totalPixhits < 0) m_totalPixhits = 0;
458 if (m_totalSCThits < 0) m_totalSCThits = 0;
459 if (m_totalTRThits < 0) m_totalTRThits = 0;
460
461 if (m_inputUpCol != "") {
462 if (m_totalUptrks < 0) m_totalUptrks = 0;
463 if (m_totalUphits < 0) m_totalUphits = 0;
467 }
468
469 if (m_inputLowCol != "") {
470 if (m_totalLowtrks < 0) m_totalLowtrks = 0;
471 if (m_totalLowhits < 0) m_totalLowhits = 0;
475 }
476
477 if (m_events < 0) m_events = 0;
478 // no deletion because StoreGate owns these pointers.
479 //delete tracks;
480 //delete Uptracks;
481 //delete Lowtracks;
482 return StatusCode::SUCCESS;
483}
484
485//=====================================================================
486// bookNtuple()
487//=====================================================================
489 ATH_MSG_DEBUG("Booking Trk::Track Info...");
490
491 NTupleFilePtr file1(m_ntupleSvc.get(), m_ntupleName);
492 std::string nt0id = m_ntupleName + "/TrkTrack";
493 std::string comments = "Trk::Track Information";
494
495 NTuplePtr nt0(m_ntupleSvc.get(), nt0id);
496 if (nt0) {
497 ATH_MSG_DEBUG("Ntuple is already booked");
498 } else {
499 ATH_MSG_DEBUG("Attempting to book general ntuple");
500 nt0 = m_ntupleSvc->book(nt0id, CLID_ColumnWiseTuple, comments);
501
502 if (nt0) {
503 StatusCode sc;
504 // nt0->addItem("event", m_nt_event); // event number
505 sc = nt0->addItem("nTracks", m_nt_ntracks, 0, maxTracks); // number of tracks
506 if (m_doTruth) sc = nt0->addItem("mc_nTracks", m_nt_nmctracks, 0, maxTracks); // number of mc tracks
507
508 // ----------------------------------------------------------------------
509 // Trk::Track parameters
510 sc = nt0->addItem("Trk_d0", m_nt_ntracks, m_nt_Trk_d0);
511 sc = nt0->addItem("Trk_z0", m_nt_ntracks, m_nt_Trk_z0);
512 sc = nt0->addItem("Trk_phi0", m_nt_ntracks, m_nt_Trk_phi0);
513 sc = nt0->addItem("Trk_theta0", m_nt_ntracks, m_nt_Trk_theta0);
514 sc = nt0->addItem("Trk_qoverp", m_nt_ntracks, m_nt_Trk_qoverp);
515 sc = nt0->addItem("Trk_pt", m_nt_ntracks, m_nt_Trk_pt);
516 // ----------------------------------------------------------------------
517
518 // ----------------------------------------------------------------------
519 // Trk::Track hits...
520 sc = nt0->addItem("Trk_nHits", m_nt_ntracks, m_nt_Trk_nHits);
521 sc = nt0->addItem("Trk_nhitsPixels", m_nt_ntracks, m_nt_Trk_nhitspix);
522 sc = nt0->addItem("Trk_nhitsSCT", m_nt_ntracks, m_nt_Trk_nhitssct);
523 sc = nt0->addItem("Trk_nhitsTRT", m_nt_ntracks, m_nt_Trk_nhitstrt);
524
525 sc = nt0->addItem("Trk_nsharedPixels", m_nt_ntracks, m_nt_Trk_nsharedPixels);
526 sc = nt0->addItem("Trk_nsharedSCT", m_nt_ntracks, m_nt_Trk_nsharedSCT);
527 sc = nt0->addItem("Trk_nshared", m_nt_ntracks, m_nt_Trk_nshared);
528
529 sc = nt0->addItem("Trk_nholesPixels", m_nt_ntracks, m_nt_Trk_nholesPixels);
530 sc = nt0->addItem("Trk_nholesSCT", m_nt_ntracks, m_nt_Trk_nholesSCT);
531 sc = nt0->addItem("Trk_nholes", m_nt_ntracks, m_nt_Trk_nholes);
532
533 sc = nt0->addItem("Trk_chi2", m_nt_ntracks, m_nt_Trk_chi2);
534 sc = nt0->addItem("Trk_ndof", m_nt_ntracks, m_nt_Trk_ndof);
535 sc = nt0->addItem("Trk_chi2Prob", m_nt_ntracks, m_nt_Trk_chi2Prob);
536 // ----------------------------------------------------------------------
537
538 if (m_doTruth) {
539 // ----------------------------------------------------------------------
540 sc = nt0->addItem("mc_TrkIsTruth", m_nt_ntracks, m_nt_mc_trkistruth);
541
542 // generated particle parameters
543 sc = nt0->addItem("mc_Trk_genParticlePt", m_nt_ntracks, m_nt_mc_Trk_genParticlePt);
544 sc = nt0->addItem("mc_Trk_genParticleEta", m_nt_ntracks, m_nt_mc_Trk_genParticleEta);
545 sc = nt0->addItem("mc_Trk_genParticlePhi", m_nt_ntracks, m_nt_mc_Trk_genParticlePhi);
546
547 // MonteCarlo Track parameters
548 sc = nt0->addItem("mc_Trk_d0", m_nt_ntracks, m_nt_mc_Trk_d0);
549 sc = nt0->addItem("mc_Trk_z0", m_nt_ntracks, m_nt_mc_Trk_z0);
550 sc = nt0->addItem("mc_Trk_phi0", m_nt_ntracks, m_nt_mc_Trk_phi0);
551 sc = nt0->addItem("mc_Trk_theta", m_nt_ntracks, m_nt_mc_Trk_theta0);
552 sc = nt0->addItem("mc_Trk_eta", m_nt_ntracks, m_nt_mc_Trk_eta);
553 sc = nt0->addItem("mc_Trk_qoverp", m_nt_ntracks, m_nt_mc_Trk_qoverp);
554 sc = nt0->addItem("mc_Trk_qoverpt", m_nt_ntracks, m_nt_mc_Trk_qoverpt);
555 sc = nt0->addItem("mc_Trk_pt", m_nt_ntracks, m_nt_mc_Trk_pt);
556 sc = nt0->addItem("mc_Trk_charge", m_nt_ntracks, m_nt_mc_Trk_charge);
557 sc = nt0->addItem("mc_Trk_prob", m_nt_ntracks, m_nt_mc_Trk_prob);
558 sc = nt0->addItem("mc_Trk_pdg", m_nt_ntracks, m_nt_mc_Trk_pdg);
559
560 sc = nt0->addItem("mc_Trk_vtxX", m_nt_ntracks, m_nt_mc_Trk_vtxX);
561 sc = nt0->addItem("mc_Trk_vtxY", m_nt_ntracks, m_nt_mc_Trk_vtxY);
562 sc = nt0->addItem("mc_Trk_vtxZ", m_nt_ntracks, m_nt_mc_Trk_vtxZ);
563 // ----------------------------------------------------------------------
564 }
565
566 if (sc.isFailure()) ATH_MSG_FATAL("Failed ntupleSvc()");
567 else ATH_MSG_DEBUG("Ntuple " << nt0id << " has been booked successfully! ");
568 } else {
569 ATH_MSG_ERROR("Error booking ntuple");
570 }
571 }
572
573 // return;
574}
575
576//=====================================================================
577// bookUpNtuple()
578//=====================================================================
580 ATH_MSG_DEBUG("Booking Up Trk::Track Info...");
581
582 std::string nt1id = m_ntupleName + "/TrkTrack_Up";
583 std::string comments = "Trk::UpTrack Information";
584
585 NTuplePtr nt1(m_ntupleSvc.get(), nt1id);
586 if (nt1) {
587 ATH_MSG_DEBUG("Ntuple is already booked");
588 } else {
589 ATH_MSG_DEBUG("Attempting to book general ntuple");
590 nt1 = m_ntupleSvc->book(nt1id, CLID_ColumnWiseTuple, comments);
591
592 if (nt1) {
593 StatusCode sc;
594 // nt1->addItem("event", m_nt_event); // event number
595 sc = nt1->addItem("nTracks_Up", m_nt_nUptracks, 0, maxTracks); // number of tracks
596
597 // ----------------------------------------------------------------------
598 // Trk::Track parameters
599 sc = nt1->addItem("Trk_d0_Up", m_nt_nUptracks, m_nt_Trk_d0_Up);
600 sc = nt1->addItem("Trk_z0_Up", m_nt_nUptracks, m_nt_Trk_z0_Up);
601 sc = nt1->addItem("Trk_phi0_Up", m_nt_nUptracks, m_nt_Trk_phi0_Up);
602 sc = nt1->addItem("Trk_theta0_Up", m_nt_nUptracks, m_nt_Trk_theta0_Up);
603 sc = nt1->addItem("Trk_qoverp_Up", m_nt_nUptracks, m_nt_Trk_qoverp_Up);
604 sc = nt1->addItem("Trk_pt_Up", m_nt_nUptracks, m_nt_Trk_pt_Up);
605 // ----------------------------------------------------------------------
606
607 // ----------------------------------------------------------------------
608 // Trk::Track hits...
609 sc = nt1->addItem("Trk_nHits_Up", m_nt_nUptracks, m_nt_Trk_nHits_Up);
610 sc = nt1->addItem("Trk_nhitsPixels_Up", m_nt_nUptracks, m_nt_Trk_nhitspix_Up);
611 sc = nt1->addItem("Trk_nhitsSCT_Up", m_nt_nUptracks, m_nt_Trk_nhitssct_Up);
612 sc = nt1->addItem("Trk_nhitsTRT_Up", m_nt_nUptracks, m_nt_Trk_nhitstrt_Up);
613
614 sc = nt1->addItem("Trk_nsharedPixels_Up", m_nt_nUptracks, m_nt_Trk_nsharedPixels_Up);
615 sc = nt1->addItem("Trk_nsharedSCT_Up", m_nt_nUptracks, m_nt_Trk_nsharedSCT_Up);
616 sc = nt1->addItem("Trk_nshared_Up", m_nt_nUptracks, m_nt_Trk_nshared_Up);
617
618 sc = nt1->addItem("Trk_nholesPixels_Up", m_nt_nUptracks, m_nt_Trk_nholesPixels_Up);
619 sc = nt1->addItem("Trk_nholesSCT_Up", m_nt_nUptracks, m_nt_Trk_nholesSCT_Up);
620 sc = nt1->addItem("Trk_nholes_Up", m_nt_nUptracks, m_nt_Trk_nholes_Up);
621
622 sc = nt1->addItem("Trk_chi2_Up", m_nt_nUptracks, m_nt_Trk_chi2_Up);
623 sc = nt1->addItem("Trk_ndof_Up", m_nt_nUptracks, m_nt_Trk_ndof_Up);
624 sc = nt1->addItem("Trk_chi2Prob_Up", m_nt_nUptracks, m_nt_Trk_chi2Prob_Up);
625 // ----------------------------------------------------------------------
626
627 if (sc.isFailure()) ATH_MSG_FATAL("Failed ntupleSvc()");
628 else ATH_MSG_DEBUG("Ntuple " << nt1id << " has been booked successfully! ");
629 } else {
630 ATH_MSG_ERROR("Error booking ntuple");
631 }
632 }
633}
634
635//=====================================================================
636// bookLowNtuple()
637//=====================================================================
639 ATH_MSG_DEBUG("Booking Low Trk::Track Info...");
640
641 std::string nt2id = m_ntupleName + "/TrkTrack_Low";
642 std::string comments = "Trk::LowTrack Information";
643
644 NTuplePtr nt2(m_ntupleSvc.get(), nt2id);
645 if (nt2) {
646 ATH_MSG_DEBUG("Ntuple is already booked");
647 } else {
648 ATH_MSG_DEBUG("Attempting to book general ntuple");
649 nt2 = m_ntupleSvc->book(nt2id, CLID_ColumnWiseTuple, comments);
650
651 if (nt2) {
652 StatusCode sc;
653 // sc = nt2->addItem("event", m_nt_event); // event number
654 sc = nt2->addItem("nTracks_Low", m_nt_nLowtracks, 0, maxTracks); // number of tracks
655
656 // ----------------------------------------------------------------------
657 // Trk::Track parameters
658 sc = nt2->addItem("Trk_d0_Low", m_nt_nLowtracks, m_nt_Trk_d0_Low);
659 sc = nt2->addItem("Trk_z0_Low", m_nt_nLowtracks, m_nt_Trk_z0_Low);
660 sc = nt2->addItem("Trk_phi0_Low", m_nt_nLowtracks, m_nt_Trk_phi0_Low);
661 sc = nt2->addItem("Trk_theta0_Low", m_nt_nLowtracks, m_nt_Trk_theta0_Low);
662 sc = nt2->addItem("Trk_qoverp_Low", m_nt_nLowtracks, m_nt_Trk_qoverp_Low);
663 sc = nt2->addItem("Trk_pt_Low", m_nt_nLowtracks, m_nt_Trk_pt_Low);
664 // ----------------------------------------------------------------------
665
666 // ----------------------------------------------------------------------
667 // Trk::Track hits...
668 sc = nt2->addItem("Trk_nHits_Low", m_nt_nLowtracks, m_nt_Trk_nHits_Low);
669 sc = nt2->addItem("Trk_nhitsPixels_Low", m_nt_nLowtracks, m_nt_Trk_nhitspix_Low);
670 sc = nt2->addItem("Trk_nhitsSCT_Low", m_nt_nLowtracks, m_nt_Trk_nhitssct_Low);
671 sc = nt2->addItem("Trk_nhitsTRT_Low", m_nt_nLowtracks, m_nt_Trk_nhitstrt_Low);
672
673 sc = nt2->addItem("Trk_nsharedPixels_Low", m_nt_nLowtracks, m_nt_Trk_nsharedPixels_Low);
674 sc = nt2->addItem("Trk_nsharedSCT_Low", m_nt_nLowtracks, m_nt_Trk_nsharedSCT_Low);
675 sc = nt2->addItem("Trk_nshared_Low", m_nt_nLowtracks, m_nt_Trk_nshared_Low);
676
677 sc = nt2->addItem("Trk_nholesPixels_Low", m_nt_nLowtracks, m_nt_Trk_nholesPixels_Low);
678 sc = nt2->addItem("Trk_nholesSCT_Low", m_nt_nLowtracks, m_nt_Trk_nholesSCT_Low);
679 sc = nt2->addItem("Trk_nholes_Low", m_nt_nLowtracks, m_nt_Trk_nholes_Low);
680
681 sc = nt2->addItem("Trk_chi2_Low", m_nt_nLowtracks, m_nt_Trk_chi2_Low);
682 sc = nt2->addItem("Trk_ndof_Low", m_nt_nLowtracks, m_nt_Trk_ndof_Low);
683 sc = nt2->addItem("Trk_chi2Prob_Low", m_nt_nLowtracks, m_nt_Trk_chi2Prob_Low);
684 // ----------------------------------------------------------------------
685 if (sc.isFailure()) msg(MSG::FATAL) << "Failed ntupleSvc()" << endmsg;
686 else msg(MSG::DEBUG) << "Ntuple " << nt2id << " has been booked successfully! " << endmsg;
687 } else {
688 ATH_MSG_ERROR("Error booking ntuple");
689 }
690 }
691}
692
693//=====================================================================
694// bookMatchingNtuple()
695//=====================================================================
697 ATH_MSG_DEBUG("Booking Matching between Up and Low Trk::Track Collections...");
698
699 std::string nt3id = m_ntupleName + "/TrkTrack_Matching";
700 std::string comments = "Matching between Up and Low Trk::Track Collections";
701
702 NTuplePtr nt3(m_ntupleSvc.get(), nt3id);
703 if (nt3) {
704 ATH_MSG_DEBUG("Ntuple is already booked");
705 } else {
706 ATH_MSG_DEBUG("Attempting to book general ntuple");
707 m_ntupleSvc->book(nt3id, CLID_ColumnWiseTuple, comments);
708
709 if (nt3) {
710 StatusCode sc;
711 // sc = nt3->addItem("event", m_nt_event); // event number
712
713 sc = nt3->addItem("nTracks_Match", m_nt_matchingTrk, 0, maxTracks); // number of tracks
714
715 // ----------------------------------------------------------------------
716 // Matching for the usual Trk::Track parameters
717 sc = nt3->addItem("Trk_delta_d0", m_nt_matchingTrk, m_nt_Trk_delta_d0);
718 sc = nt3->addItem("Trk_delta_phi0", m_nt_matchingTrk, m_nt_Trk_delta_phi0);
719 sc = nt3->addItem("Trk_delta_theta0", m_nt_matchingTrk, m_nt_Trk_delta_theta0);
720 sc = nt3->addItem("Trk_delta_eta", m_nt_matchingTrk, m_nt_Trk_delta_eta);
721 sc = nt3->addItem("Trk_delta_z0", m_nt_matchingTrk, m_nt_Trk_delta_z0);
722 sc = nt3->addItem("Trk_delta_qoverpt", m_nt_matchingTrk, m_nt_Trk_delta_qoverpt);
723 sc = nt3->addItem("Trk_delta_pt", m_nt_matchingTrk, m_nt_Trk_delta_pt);
724 sc = nt3->addItem("Trk_delta_charge", m_nt_matchingTrk, m_nt_Trk_delta_charge);
725 // ----------------------------------------------------------------------
726
727 if (sc.isFailure()) msg(MSG::FATAL) << "Failed ntupleSvc()" << endmsg;
728 else msg(MSG::DEBUG) << "Ntuple " << nt3id << " has been booked successfully! " << endmsg;
729 } else {
730 if (msgLvl(MSG::ERROR)) msg(MSG::DEBUG) << "Error booking ntuple" << endmsg;
731 }
732 }
733
734 return;
735}
736
737//=====================================================================
738// InDetAlignFillTrack::dumpTrackCol()
739//=====================================================================
740int InDetAlignFillTrack::dumpTrackCol(const EventContext& ctx, const TrackCollection* tracks) {
741 return dumpTrackCol(ctx, tracks, "");
742}
743
744//=====================================================================
745// InDetAlignFillTrack::dumpTrackCol()
746//=====================================================================
747int InDetAlignFillTrack::dumpTrackCol(const EventContext& ctx,
748 const TrackCollection* tracks,
749 const std::string& TrkColName) {
750 ATH_MSG_DEBUG("In dump" << TrkColName << "TrackCol()");
751
752 int itrk = 0;
753
754 TrackCollection::const_iterator trackItr = tracks->begin();
755 TrackCollection::const_iterator trackItrE = tracks->end();
756
757 //looping over tracks
758 for (; trackItr != trackItrE && itrk < maxTracks; ++trackItr) {
759 if (*trackItr != nullptr) dumpTrack(ctx, itrk, (*trackItr), TrkColName);
760
761 itrk++;
762 }
763
764 return itrk;
765}
766
767//=====================================================================
768// InDetAlignFillTrack::dumpTrack()
769//=====================================================================
770void InDetAlignFillTrack::dumpTrack(const EventContext& ctx,
771 int itrk, const Trk::Track* trk,
772 const std::string& TrkColName) {
773 ATH_MSG_VERBOSE("In dump" << TrkColName << "Track()");
774
775 const Trk::Perigee* aMeasPer = trk->perigeeParameters();
776
777 if (aMeasPer == nullptr) {
778 ATH_MSG_ERROR("Could not get Trk::MeasuredPerigee");
779 } else {
780 double d0 = aMeasPer->parameters()[Trk::d0];
781 double z0 = aMeasPer->parameters()[Trk::z0];
782 double phi0 = aMeasPer->parameters()[Trk::phi0];
783 double theta = aMeasPer->parameters()[Trk::theta];
784 double qOverP = aMeasPer->parameters()[Trk::qOverP];
785
786 if (msgLvl(MSG::DEBUG)) {
787 msg(MSG::DEBUG) << itrk << ". " << TrkColName
788 << " Track Parameters (d0, z0, phi0, theta, q/p)" << endmsg;
789 msg(MSG::DEBUG) << " " << d0 << ", " << z0 << ", "
790 << phi0 << ", " << theta << ", " << qOverP << endmsg;
791 }
792
793 float transverseMomentum = std::sqrt((aMeasPer->momentum().x()) * (aMeasPer->momentum().x())
794 + (aMeasPer->momentum().y()) * (aMeasPer->momentum().y()));
795
796 ATH_MSG_DEBUG(" p = " << aMeasPer->momentum().mag() / CLHEP::GeV << " CLHEP::GeV/c, "
797 << " pT = " << transverseMomentum / CLHEP::GeV << " CLHEP::GeV/c");
798
799 // number of hits
800 int nHits = (*trk).measurementsOnTrack()->size();
801 ATH_MSG_DEBUG(" - number of hits : " << nHits);
802 if (nHits != 0) {
803 if (TrkColName == "Up") m_totalUphits += nHits;
804 else if (TrkColName == "Low") m_totalLowhits += nHits;
805 else m_totalhits += nHits;
806 }
807
808 // number of hits, shared hits and holes
809 int nhitspix = 0, nhitssct = 0, nhitstrt = 0;
810 int nshared = 0, nshpix = 0, nshsct = 0;
811 int nholes = 0, nhpix = 0, nhsct = 0;
812
813 xAOD::TrackParticle* trackPart = m_particleCreator->createParticle(ctx, *trk);
814 uint8_t iSummaryValue(0); // Dummy counter to retrieve summary values
815
816 if (not trackPart) ATH_MSG_ERROR("Could not get xAOD::TrackParticle");
817
818 else {
819 // hits
820 nhitspix = trackPart->summaryValue(iSummaryValue, xAOD::numberOfPixelHits) ? iSummaryValue : 0;
821 nhitssct = trackPart->summaryValue(iSummaryValue, xAOD::numberOfSCTHits) ? iSummaryValue : 0;
822 nhitstrt = trackPart->summaryValue(iSummaryValue, xAOD::numberOfTRTHits) ? iSummaryValue : 0;
823
824 if (msgLvl(MSG::DEBUG)) {
825 msg(MSG::DEBUG) << " -- number of Pixel hits : " << nhitspix << endmsg;
826 msg(MSG::DEBUG) << " -- number of SCT hits : " << nhitssct << endmsg;
827 msg(MSG::DEBUG) << " -- number of TRT hits : " << nhitstrt << endmsg;
828 }
829
830 if (nhitspix != 0) {
831 if (TrkColName == "Up") m_totalUpPixhits += nhitspix;
832 else if (TrkColName == "Low") m_totalLowPixhits += nhitspix;
833 else m_totalPixhits += nhitspix;
834 }
835 if (nhitssct != 0) {
836 if (TrkColName == "Up") m_totalUpSCThits += nhitssct;
837 else if (TrkColName == "Low") m_totalLowSCThits += nhitssct;
838 else m_totalSCThits += nhitssct;
839 }
840 if (nhitstrt != 0) {
841 if (TrkColName == "Up") m_totalUpTRThits += nhitstrt;
842 else if (TrkColName == "Low") m_totalLowTRThits += nhitstrt;
843 else m_totalTRThits += nhitstrt;
844 }
845
846 // shared hits
847 nshpix = trackPart->summaryValue(iSummaryValue, xAOD::numberOfPixelSharedHits) ? iSummaryValue : 0;
848 nshsct = trackPart->summaryValue(iSummaryValue, xAOD::numberOfSCTSharedHits) ? iSummaryValue : 0;
849 nshared = nshpix + nshsct;
850
851 if (nshpix < 0) nshpix = 0;
852 if (nshsct < 0) nshsct = 0;
853 if (nshared < 0) nshared = 0;
854
855 if (msgLvl(MSG::DEBUG)) {
856 msg(MSG::DEBUG) << " - number of shared hits : " << nshared << endmsg;
857 msg(MSG::DEBUG) << " -- number of Pixel shared hits : " << nshpix << endmsg;
858 msg(MSG::DEBUG) << " -- number of SCT shared hits : " << nshsct << endmsg;
859 }
860
861 // holes
862 nhpix = trackPart->summaryValue(iSummaryValue, xAOD::numberOfPixelHoles) ? iSummaryValue : 0;
863 nhsct = trackPart->summaryValue(iSummaryValue, xAOD::numberOfSCTHoles) ? iSummaryValue : 0;
864 nholes = nhpix + nhsct;
865
866 if (nhpix < 0) nhpix = 0;
867 if (nhsct < 0) nhsct = 0;
868 if (nholes < 0) nholes = 0;
869
870 if (msgLvl(MSG::DEBUG)) {
871 msg(MSG::DEBUG) << " - number of Pixel holes : " << nhpix << endmsg;
872 msg(MSG::DEBUG) << " -- number of SCT holes : " << nhsct << endmsg;
873 msg(MSG::DEBUG) << " -- number of holes : " << nholes << endmsg;
874 }
875 }
876
877 // get fit quality and chi2 probability of track
878 // chi2Prob = TMath::Prob(chi2,DoF) ROOT function
879 double chi2Prob = 0.;
880 const Trk::FitQuality* fitQual = (*trk).fitQuality();
881 if (fitQual == nullptr) {
882 ATH_MSG_ERROR("No fit quality assigned to the track");
883 chi2Prob = -1e12; // return big value
884 } else {
885 if (fitQual->chiSquared() > 0. && fitQual->numberDoF() > 0) {
886 Genfun::CumulativeChiSquare probabilityFunction(fitQual->numberDoF());
887 chi2Prob = 1 - probabilityFunction(fitQual->chiSquared());
888
889 if (msgLvl(MSG::DEBUG)) {
890 msg(MSG::DEBUG) << " - chi2 : " << fitQual->chiSquared() << endmsg;
891 msg(MSG::DEBUG) << " - ndof : " << fitQual->numberDoF() << endmsg;
892 msg(MSG::DEBUG) << " - chi2 propability : " << chi2Prob << endmsg;
893 }
894 }
895 }
896 // Fill ntuple
897 if (TrkColName == "Up") {
898 m_nt_Trk_d0_Up[itrk] = d0;
899 m_nt_Trk_z0_Up[itrk] = z0;
900 m_nt_Trk_phi0_Up[itrk] = phi0;
902 m_nt_Trk_qoverp_Up[itrk] = qOverP;
903 m_nt_Trk_pt_Up[itrk] = transverseMomentum;
904
905 m_nt_Trk_nHits_Up[itrk] = nHits;
906 m_nt_Trk_nhitspix_Up[itrk] = nhitspix;
907 m_nt_Trk_nhitssct_Up[itrk] = nhitssct;
908 m_nt_Trk_nhitstrt_Up[itrk] = nhitstrt;
909
910 m_nt_Trk_nsharedPixels_Up[itrk] = nshpix;
911 m_nt_Trk_nsharedSCT_Up[itrk] = nshsct;
912 m_nt_Trk_nshared_Up[itrk] = nshared;
913
914 m_nt_Trk_nholesPixels_Up[itrk] = nhpix;
915 m_nt_Trk_nholesSCT_Up[itrk] = nhsct;
916 m_nt_Trk_nholes_Up[itrk] = nholes;
917 if (fitQual) {
918 m_nt_Trk_chi2_Up[itrk] = fitQual->chiSquared();
919 m_nt_Trk_ndof_Up[itrk] = fitQual->numberDoF();
920 } else {
921 m_nt_Trk_chi2_Up[itrk] = 0;
922 m_nt_Trk_ndof_Up[itrk] = 0;
923 }
924 m_nt_Trk_chi2Prob_Up[itrk] = chi2Prob;
925 } else if (TrkColName == "Low") {
926 m_nt_Trk_d0_Low[itrk] = d0;
927 m_nt_Trk_z0_Low[itrk] = z0;
928 m_nt_Trk_phi0_Low[itrk] = phi0;
930 m_nt_Trk_qoverp_Low[itrk] = qOverP;
931 m_nt_Trk_pt_Low[itrk] = transverseMomentum;
932
934 m_nt_Trk_nhitspix_Low[itrk] = nhitspix;
935 m_nt_Trk_nhitssct_Low[itrk] = nhitssct;
936 m_nt_Trk_nhitstrt_Low[itrk] = nhitstrt;
937
938 m_nt_Trk_nsharedPixels_Low[itrk] = nshpix;
939 m_nt_Trk_nsharedSCT_Low[itrk] = nshsct;
940 m_nt_Trk_nshared_Low[itrk] = nshared;
941
942 m_nt_Trk_nholesPixels_Low[itrk] = nhpix;
943 m_nt_Trk_nholesSCT_Low[itrk] = nhsct;
944 m_nt_Trk_nholes_Low[itrk] = nholes;
945 if (fitQual) {
946 m_nt_Trk_chi2_Low[itrk] = fitQual->chiSquared();
947 m_nt_Trk_ndof_Low[itrk] = fitQual->numberDoF();
948 } else {
949 m_nt_Trk_chi2_Low[itrk] = 0;
950 m_nt_Trk_ndof_Low[itrk] = 0;
951 }
952 m_nt_Trk_chi2Prob_Low[itrk] = chi2Prob;
953 } else {
954 m_nt_Trk_d0[itrk] = d0;
955 m_nt_Trk_z0[itrk] = z0;
956 m_nt_Trk_phi0[itrk] = phi0;
957 m_nt_Trk_theta0[itrk] = theta;
958 m_nt_Trk_qoverp[itrk] = qOverP;
959 m_nt_Trk_pt[itrk] = transverseMomentum;
960
961 m_nt_Trk_nHits[itrk] = nHits;
962 m_nt_Trk_nhitspix[itrk] = nhitspix;
963 m_nt_Trk_nhitssct[itrk] = nhitssct;
964 m_nt_Trk_nhitstrt[itrk] = nhitstrt;
965
966 m_nt_Trk_nsharedPixels[itrk] = nshpix;
967 m_nt_Trk_nsharedSCT[itrk] = nshsct;
968 m_nt_Trk_nshared[itrk] = nshared;
969
970 m_nt_Trk_nholesPixels[itrk] = nhpix;
971 m_nt_Trk_nholesSCT[itrk] = nhsct;
972 m_nt_Trk_nholes[itrk] = nholes;
973 if (fitQual) {
974 m_nt_Trk_chi2[itrk] = fitQual->chiSquared();
975 m_nt_Trk_ndof[itrk] = fitQual->numberDoF();
976 } else {
977 m_nt_Trk_chi2[itrk] = 0;
978 m_nt_Trk_ndof[itrk] = 0;
979 }
980 m_nt_Trk_chi2Prob[itrk] = chi2Prob;
981 }
982 }
983
984 return;
985}
986
987//=====================================================================
988// InDetAlignFillTrack::dumpPerigee()
989//=====================================================================
991 int index) {
992 ATH_MSG_VERBOSE( "In dumpPerigee()" );
993
994 float d0 = generatedTrackPerigee->parameters()[Trk::d0];
995 float z0 = generatedTrackPerigee->parameters()[Trk::z0];
996 float phi0 = generatedTrackPerigee->parameters()[Trk::phi0];
997 float theta = generatedTrackPerigee->parameters()[Trk::theta];
998 float eta = generatedTrackPerigee->eta();
999 float charge = generatedTrackPerigee->charge();
1000 float qoverp = generatedTrackPerigee->parameters()[Trk::qOverP];
1001 float qoverpt = generatedTrackPerigee->parameters()[Trk::qOverP] / (std::sin(theta));
1002 float pt = (1 / qoverpt) * (charge);
1003 // int pdg = genParticle->pdg_id();
1004
1005 if (msgLvl(MSG::DEBUG)) {
1006 msg(MSG::DEBUG) << " - Extrapolated genParticle perigee parameters "
1007 << "(d0, z0, phi0, theta, q/p)" << endmsg;
1008 msg(MSG::DEBUG) << " " << d0 << ", " << z0 << ", "
1009 << phi0 << ", " << theta << ", " << qoverp << endmsg;
1010
1011 msg(MSG::DEBUG) << " p = " << std::abs(1.0 / qoverp) / CLHEP::GeV << " CLHEP::GeV/c, "
1012 << " pT = " << pt / CLHEP::GeV << " CLHEP::GeV/c" << endmsg;
1013 }
1014
1015 m_nt_mc_Trk_d0[index] = d0;
1016 m_nt_mc_Trk_z0[index] = z0;
1017 m_nt_mc_Trk_phi0[index] = phi0;
1020 m_nt_mc_Trk_qoverp[index] = qoverp;
1021 m_nt_mc_Trk_qoverpt[index] = qoverpt;
1022 m_nt_mc_Trk_pt[index] = pt;
1024
1025 return;
1026}
1027
1028//=====================================================================
1029// InDetAlignFillTrack::dumpMatching()
1030//=====================================================================
1032 const TrackCollection* tracksLower) {
1033 ATH_MSG_DEBUG("In dumpMatching()");
1034
1035 int nTracksUpper = 0;
1036
1037 // looping over the upper barrel tracks
1038 TrackCollection::const_iterator trackItrUpper = tracksUpper->begin();
1039 TrackCollection::const_iterator trackItrUpperE = tracksUpper->end();
1040 for (; trackItrUpper != trackItrUpperE; ++trackItrUpper) {
1041 const Trk::Track* trackUpper = *trackItrUpper;
1042 if (trackUpper == nullptr) {
1043 ATH_MSG_DEBUG("No associated Trk::Track object found for track " << nTracksUpper);
1044 continue;
1045 }
1046
1047 const Trk::Perigee* measUpperPer = trackUpper->perigeeParameters();
1048
1049 // Get the track parameters from the Upper Track
1050 float d0Up = measUpperPer->parameters()[Trk::d0];
1051 float phi0Up = measUpperPer->parameters()[Trk::phi0];
1052 float eta0Up = measUpperPer->eta();
1053 float z0Up = measUpperPer->parameters()[Trk::z0];
1054 float thetaUp = measUpperPer->parameters()[Trk::theta];
1055 float qOverPtUp = measUpperPer->parameters()[Trk::qOverP] * 1000 / std::sin(thetaUp);
1056 float chargeUp = measUpperPer->charge();
1057 float ptUp = measUpperPer->pT() / 1000.;
1058
1059 if (msgLvl(MSG::DEBUG)) {
1060 msg(MSG::DEBUG) << nTracksUpper << ". UpTrack -> Track Parameters:" << endmsg;
1061 msg(MSG::DEBUG) << " d0, z0, phi0, theta, q/p" << d0Up << ", " << z0Up << ", "
1062 << phi0Up << ", " << thetaUp << ", " << qOverPtUp << endmsg;
1063 }
1064
1065 int nTracksLower = 0;
1066
1067 bool matchFound = false;
1068 float Matched_Low_d0 = -999;
1069 float Matched_Low_phi0 = -999;
1070 //**
1071 float Matched_Low_theta = -999;
1072 float Matched_Low_eta0 = -999;
1073 float Matched_Low_z0 = -999;
1074 float Matched_Low_qOverPt = -999;
1075 float Matched_Low_charge = -999;
1076 float Matched_Low_pt = -999;
1077
1078 // looping over the lower barrel tracks
1079 DataVector<Trk::Track>::const_iterator trackItrLower = tracksLower->begin();
1080 DataVector<Trk::Track>::const_iterator trackItrLowerE = tracksLower->end();
1081 for (; trackItrLower != trackItrLowerE; ++trackItrLower) { //looping over Lower tracks
1082 const Trk::Track* trackLower = *trackItrLower;
1083 if (trackLower == nullptr) {
1084 ATH_MSG_DEBUG("No associated Trk::Track object found for track " << nTracksLower);
1085 continue;
1086 }
1087
1088 const Trk::Perigee* measLowerPer = trackLower->perigeeParameters();
1089
1090 float d0Low = measLowerPer->parameters()[Trk::d0];
1091 float phi0Low = measLowerPer->parameters()[Trk::phi0];
1092 float eta0Low = measLowerPer->eta();
1093 float z0Low = measLowerPer->parameters()[Trk::z0];
1094 float thetaLow = measLowerPer->parameters()[Trk::theta];
1095 float qOverPtLow = measLowerPer->parameters()[Trk::qOverP] * 1000 / std::sin(thetaLow);
1096 float chargeLow = measLowerPer->charge();
1097 float ptLow = measLowerPer->pT() / 1000.;
1098
1099 //selecting Lower track that is closest to Upper in eta-phi
1100 float dphi2 = (phi0Up - phi0Low) * (phi0Up - phi0Low);
1101
1102 //For TRT only tracks we will ignore the delta eta
1103 // and just require a delta phi match
1104 float deta2 = (eta0Up - eta0Low) * (eta0Up - eta0Low);
1105
1106 // look for a matching track within a cone
1107 float dR = std::sqrt(dphi2 + deta2);
1108 ATH_MSG_DEBUG("dR (sqrt(dphi+deta2): " << dR);
1109 ATH_MSG_DEBUG("minmdR (sqrt(dphi+deta2): " << m_mindR);
1110 if (dR < m_mindR) {
1111 // m_mindR = dR;
1112 Matched_Low_d0 = d0Low;
1113 Matched_Low_phi0 = phi0Low;
1114 //**
1115 Matched_Low_theta = thetaLow;
1116 Matched_Low_eta0 = eta0Low;
1117 Matched_Low_z0 = z0Low;
1118 Matched_Low_qOverPt = qOverPtLow;
1119 Matched_Low_charge = chargeLow;
1120 Matched_Low_pt = ptLow;
1121
1122 if (dR < m_matchedRcut) {
1123 if (msgLvl(MSG::DEBUG)) {
1124 msg(MSG::DEBUG) << nTracksLower << ". LowTrack -> Track Parameters:" << endmsg;
1125 msg(MSG::DEBUG) << " d0, z0, phi0, theta, q/p: " << d0Low << ", " << z0Low << ", "
1126 << phi0Low << ", " << thetaLow << ", " << qOverPtLow << endmsg;
1127 }
1128
1129 matchFound = true;
1130 }
1131 } else {
1132 ATH_MSG_DEBUG("No matching low track found!!");
1133 }
1134 nTracksLower++;
1135 } //looping over lower tracks
1136
1137 if (matchFound) {
1138 ATH_MSG_DEBUG("Match found!");
1139 m_nt_matchingTrk = 1;
1140 m_nt_Trk_delta_d0[nTracksUpper] = d0Up - Matched_Low_d0;
1141 m_nt_Trk_delta_phi0[nTracksUpper] = phi0Up - Matched_Low_phi0;
1142 //**
1143 m_nt_Trk_delta_theta0[nTracksUpper] = thetaUp - Matched_Low_theta;
1144 m_nt_Trk_delta_eta[nTracksUpper] = eta0Up - Matched_Low_eta0;
1145 m_nt_Trk_delta_z0[nTracksUpper] = z0Up - Matched_Low_z0;
1146 m_nt_Trk_delta_qoverpt[nTracksUpper] = qOverPtUp - Matched_Low_qOverPt;
1147 m_nt_Trk_delta_pt[nTracksUpper] = ptUp - Matched_Low_pt;
1148 m_nt_Trk_delta_charge[nTracksUpper] = chargeUp - Matched_Low_charge;
1149 } // end match found
1150
1151
1152 nTracksUpper++;
1153 } //looping over upper tracks
1154
1155 return StatusCode::SUCCESS;
1156}
#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
const GenParticle * ConstGenParticlePtr
Definition GenParticle.h:38
@ 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