ATLAS Offline Software
IDAlignMonGenericTracksAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 // **********************************************************************
6 // AlignmentMonAlg.cxx
7 // AUTHORS: Beate Heinemann, Tobias Golling
8 // Adapted to AthenaMT by Per Johansson 2021
9 // **********************************************************************
10 
11 //main header
13 
16 #include "InDetIdentifier/SCT_ID.h"
17 #include "InDetIdentifier/TRT_ID.h"
18 
22 
23 #include "Particle/TrackParticle.h"
25 
28 
29 #include "CLHEP/GenericFunctions/CumulativeChiSquare.hh"
30 
32 
33 #include <cmath>
34 
35 // *********************************************************************
36 // Public Methods
37 // *********************************************************************
38 
39 IDAlignMonGenericTracksAlg::IDAlignMonGenericTracksAlg( const std::string & name, ISvcLocator* pSvcLocator ) :
40  AthMonitorAlgorithm(name, pSvcLocator),
41  m_idHelper(nullptr),
42  m_pixelID(nullptr),
43  m_sctID(nullptr),
44  m_trtID(nullptr),
45  m_d0Range(2.0),
46  m_d0BsRange(0.5),
47  m_z0Range(250.0),
48  m_etaRange(3.0),
49  m_NTracksRange(200),
50  m_barrelEta(0.8), //Tracks between -0.8 & 0.8 are considered as Barrel Tracks, otherwise are End-Caps
51  m_trackSelection( "InDet::InDetTrackSelectionTool/TrackSelectionTool", this)
52 {
53  m_hitQualityTool = ToolHandle<IInDetAlignHitQualSelTool>("");
54  declareProperty("Pixel_Manager" , m_Pixel_Manager);
55  declareProperty("SCT_Manager" , m_SCT_Manager);
56  declareProperty("TRT_Manager" , m_TRT_Manager);
57  declareProperty("TrackSelectionTool" , m_trackSelection);
58  declareProperty("HitQualityTool" , m_hitQualityTool);
59  declareProperty("useExtendedPlots" , m_extendedPlots = false);
60  declareProperty("d0Range" , m_d0Range);
61  declareProperty("d0BsRange" , m_d0BsRange);
62  declareProperty("z0Range" , m_z0Range);
63  declareProperty("etaRange" , m_etaRange);
64  declareProperty("pTRange" , m_pTRange);
65  declareProperty("NTracksRange" , m_NTracksRange);
66  declareProperty("doIP" , m_doIP = false);
67  declareProperty("ApplyTrackSelection" , m_applyTrkSel = true);
68 }
69 
70 
72 
73 
75 {
76  StatusCode sc;
77 
78  ATH_MSG_DEBUG("Initialize -- START --");
79  //ID Helper
80  ATH_CHECK(detStore()->retrieve(m_idHelper, "AtlasID"));
81 
82  m_pixelID = nullptr;
83  ATH_CHECK(detStore()->retrieve(m_pixelID, "PixelID"));
84  ATH_MSG_DEBUG("Initialized PixelIDHelper");
85 
86  m_sctID = nullptr;
87  ATH_CHECK(detStore()->retrieve(m_sctID, "SCT_ID"));
88  ATH_MSG_DEBUG("Initialized SCTIDHelper");
89 
90  m_trtID = nullptr;
91  ATH_CHECK(detStore()->retrieve(m_trtID, "TRT_ID"));
92  ATH_MSG_DEBUG("Initialized TRTIDHelper");
93 
94  ATH_CHECK(m_trackSelection.retrieve());
95  ATH_MSG_DEBUG("Retrieved tool " << m_trackSelection);
96 
97  if (m_hitQualityTool.empty()) {
98  ATH_MSG_DEBUG("No hit quality tool configured - not hit quality cuts will be imposed");
99  m_doHitQuality = false;
100  } else if (m_hitQualityTool.retrieve().isFailure()) {
101  ATH_MSG_WARNING("Could not retrieve " << m_hitQualityTool << " (to apply hit quality cuts to Si hits) ");
102  m_doHitQuality = false;
103  } else {
104  ATH_MSG_DEBUG("Hit quality tool setup - hit quality cuts will be applied to Si hits");
105  m_doHitQuality = true;
106  }
107 
108  if (m_doIP) {
110  }else {
111  m_trackToVertexIPEstimator.disable();
112  }
113 
114  if ( m_beamSpotKey.initialize().isFailure() ) {
115  ATH_MSG_WARNING("Failed to retrieve beamspot service " << m_beamSpotKey << " - will use nominal beamspot at (0,0,0)");
116  m_hasBeamCondSvc = false;
117  }
118  else {
119  m_hasBeamCondSvc = true;
120  ATH_MSG_DEBUG("Retrieved service " << m_beamSpotKey);
121  }
122 
123  ATH_CHECK(m_VxPrimContainerName.initialize(not m_VxPrimContainerName.key().empty()));
124  ATH_CHECK(m_tracksName.initialize());
125  ATH_CHECK(m_tracksKey.initialize());
126 
127  ATH_MSG_DEBUG("Initialize -- completed --");
129 }
130 
131 StatusCode IDAlignMonGenericTracksAlg::fillHistograms( const EventContext& ctx ) const {
132  using namespace Monitored;
133 
134  // For histogram naming
135  auto genericTrackGroup = getGroup("IDA_Tracks");
136 
137  //counters
138  int ntrkMax=0;
139  float xv=-999;
140  float yv=-999;
141  float zv=-999;
142  int nTracks=0;
143  int ngTracks=0;
144 
145  ATH_MSG_DEBUG ("IDAlignMonGenericTracksAlg::fillHistograms ** START ** call for track collection: " << m_tracksName.key());
146 
147  //get tracks
148  auto trks = SG::makeHandle(m_tracksName, ctx);
149  // check for tracks
150  if (not trks.isValid()) {
151  ATH_MSG_DEBUG ("IDAlignMonGenericTracksAlg::fillHistograms() --" << m_tracksName.key() << " could not be retrieved");
152  return StatusCode::RECOVERABLE;
153  }else {
154  ATH_MSG_DEBUG("IDAlignMonGenericTracksAlg: Track container " << trks.name() <<" is found.");
155  }
156 
157  //retrieving vertices
158  auto handle_vxContainer = SG::makeHandle(m_VxPrimContainerName, ctx);
159  // if m_doIP
160  const xAOD::Vertex* pvtx = nullptr;
161 
162  if (!handle_vxContainer.isPresent()) {
163  ATH_MSG_DEBUG ("InDetGlobalPrimaryVertexMonAlg: StoreGate doesn't contain primary vertex container with key "+m_VxPrimContainerName.key());
164  return StatusCode::SUCCESS;
165  }
166  if (!handle_vxContainer.isValid()) {
167  ATH_MSG_ERROR ("InDetGlobalPrimaryVertexMonAlg: Could not retrieve primary vertex container with key "+m_VxPrimContainerName.key());
168  return StatusCode::RECOVERABLE;
169  }
170 
171  const auto *vertexContainer = handle_vxContainer.cptr();
172  for(const auto & vtx : *vertexContainer) {
173  if ( !vtx ) continue;
174  if ( !vtx->vxTrackAtVertexAvailable() ) continue;
175 
176  const std::vector< Trk::VxTrackAtVertex >& theTrackAtVertex = vtx->vxTrackAtVertex();
177  int numTracksPerVertex = theTrackAtVertex.size();
178  ATH_MSG_DEBUG("Size of TrackAtVertex: " << numTracksPerVertex);
179  if (numTracksPerVertex>ntrkMax) {
180  ntrkMax=numTracksPerVertex;
181  xv=vtx->position()[0];
182  yv=vtx->position()[1];
183  zv=vtx->position()[2];
184  }
185  }
186 
187  if (xv==-999 || yv==-999 || zv==-999) {
188  ATH_MSG_DEBUG("No vertex found => setting it to 0");
189  xv=0;yv=0;zv=0;
190  }
191 
192 
193  std::map<const xAOD::TrackParticle*, const xAOD::Vertex*> trackVertexMapTP;
194  if (m_doIP) fillVertexInformation(trackVertexMapTP, ctx);
195 
196  float beamSpotX = 0.;
197  float beamSpotY = 0.;
198  float beamSpotZ = 0.;
199  float beamTiltX = 0.;
200  float beamTiltY = 0.;
201 
202  if (m_hasBeamCondSvc) {
203  auto beamSpotHandle = SG::ReadCondHandle(m_beamSpotKey, ctx);
204  Amg::Vector3D bpos = beamSpotHandle->beamPos();
205  beamSpotX = bpos.x();
206  beamSpotY = bpos.y();
207  beamSpotZ = bpos.z();
208  beamTiltX = beamSpotHandle->beamTilt(0);
209  beamTiltY = beamSpotHandle->beamTilt(1);
210  ATH_MSG_DEBUG ("Beamspot: x0 = " << beamSpotX << ", y0 = " << beamSpotY << ", z0 = " << beamSpotZ << ", tiltX = " << beamTiltX << ", tiltY = " << beamTiltY);
211  }
212 
213  // Get EventInfo
214  int lb = GetEventInfo(ctx)->lumiBlock();
215  auto lb_m = Monitored::Scalar<int>( "m_lb", lb );
216  int run = GetEventInfo(ctx)->runNumber();
217  auto run_m = Monitored::Scalar<int>( "m_run", run );
218  int event = GetEventInfo(ctx)->eventNumber();
219  auto event_m = Monitored::Scalar<int>( "m_event", event );
221  auto mu_m = Monitored::Scalar<float>("m_mu", mu);
222 
223  if (m_extendedPlots) {
224  //Fill BeamSpot Position histos
225  auto beamSpotX_m = Monitored::Scalar<float>( "m_beamSpotX", beamSpotX );
226  auto beamSpotY_m = Monitored::Scalar<float>( "m_beamSpotY", beamSpotY );
227  auto beamSpotZ_m = Monitored::Scalar<float>( "m_beamSpotZ", beamSpotZ );
228  auto beamTiltX_m = Monitored::Scalar<float>( "m_beamTiltX", beamTiltX );
229  auto beamTiltY_m = Monitored::Scalar<float>( "m_beamTiltY", beamTiltY );
230  fill(genericTrackGroup, beamSpotX_m, beamSpotY_m, beamSpotZ_m, lb_m);
231 
232  // interactions per beam crossing
233  fill(genericTrackGroup, mu_m);
234  }
235 
236 
237  if (m_doIP) {
238  auto handle_vxContainer = SG::makeHandle(m_VxPrimContainerName, ctx);
239 
240  if (!handle_vxContainer.isPresent()) {
241  ATH_MSG_DEBUG ("InDetGlobalPrimaryVertexMonAlg: StoreGate doesn't contain primary vertex container with key "+m_VxPrimContainerName.key());
242  return StatusCode::SUCCESS;
243  }
244  if (!handle_vxContainer.isValid()) {
245  ATH_MSG_ERROR ("InDetGlobalPrimaryVertexMonAlg: Could not retrieve primary vertex container with key "+m_VxPrimContainerName.key());
246  return StatusCode::FAILURE;
247  }
248 
249  const auto *vertexContainer = handle_vxContainer.cptr();
250 
251  xAOD::VertexContainer::const_iterator vxI = vertexContainer->begin();
252  xAOD::VertexContainer::const_iterator vxE = vertexContainer->end();
253  for (; vxI != vxE; ++vxI) {
254  if ((*vxI)->type() == 1) {
255  pvtx = (*vxI);
256  }
257  }
258  }
259 
260  //
261  // Start loop on tracks
262  //
263 
264  ATH_MSG_DEBUG ("Start loop on tracks. Number of tracks " << trks->size());
265  for (const Trk::Track* trksItr: *trks) {
266 
267  // Found track?!
268  if ( !trksItr || trksItr->perigeeParameters() == nullptr )
269  {
270  ATH_MSG_DEBUG( "InDetAlignmentMonitoringRun3: NULL track pointer in collection" );
271  continue;
272  }
273 
274  // Select tracks
275  if ( m_applyTrkSel and !m_trackSelection->accept( *trksItr) )
276  continue; // track selection applied and failed
277 
278  nTracks++;
279 
280  float chisquared = 0.;
281  int DoF = 0;
282  float chi2oDoF = -999;
283  float trkd0 = -999;
284  float Err_d0 = -999;
285  float trkz0 = -999;
286  float Err_z0 = -999;
287  float trkphi = -999;
288  float Err_phi = -999;
289  float trktheta = -999;
290  float Err_theta = -999;
291  float Err_eta = -999;
292  float trketa = -999;
293  float qOverP = -999;
294  float Err_qOverP = -999;
295  float Err_Pt = -999;
296  float trkpt = -999;
297  float trkP = -999;
298  float charge = 0;
299  float trkd0c = -999;
300  float beamX = 0;
301  float beamY = 0;
302  float d0bscorr = -999;
303 
304  // get fit quality and chi2 probability of track
305  const Trk::FitQuality* fitQual = trksItr->fitQuality();
306 
307  const Trk::Perigee* measPer = trksItr->perigeeParameters();
308  const AmgSymMatrix(5)* covariance = measPer ? measPer->covariance() : nullptr;
309 
310  std::unique_ptr<Trk::ImpactParametersAndSigma> myIPandSigma=nullptr;
311 
312 
313  if (m_doIP){
314 
315  //Get unbiased impact parameter
316  if (pvtx) myIPandSigma = m_trackToVertexIPEstimator->estimate(trksItr->perigeeParameters(), pvtx, true);
317  }
318 
319  if (covariance == nullptr) {
320  ATH_MSG_WARNING("No measured perigee parameters assigned to the track");
321  }
322  else{
323  AmgVector(5) perigeeParams = measPer->parameters();
324  trkd0 = perigeeParams[Trk::d0];
325  trkz0 = perigeeParams[Trk::z0];
326  trkphi = perigeeParams[Trk::phi0];
327  trktheta = perigeeParams[Trk::theta];
328  trketa = measPer->eta();
329  qOverP = perigeeParams[Trk::qOverP]*1000.;
330  if(qOverP) trkP = 1/qOverP;
331  trkpt = measPer->pT()/1000.;
332  Err_d0 = Amg::error(*measPer->covariance(), Trk::d0);
333  Err_z0 = Amg::error(*measPer->covariance(), Trk::z0);
334  Err_phi = Amg::error(*measPer->covariance(), Trk::phi0);
335  Err_theta = Amg::error(*measPer->covariance(), Trk::theta);
336  Err_eta = Err_theta / sin(trktheta);
337  Err_qOverP = Amg::error(*measPer->covariance(), Trk::qOverP) * 1000;
338  Err_Pt = sin(trktheta) * Err_qOverP / pow(qOverP, 2);
339  if (qOverP < 0) charge = -1;
340  else charge=+1;
341 
342  // correct the track d0 for the vertex position
343  // would rather corrected for the beamline but could not find beamline
344  trkd0c=trkd0-(yv*cos(trkphi)-xv*sin(trkphi));
345  ATH_MSG_DEBUG("trkd0, trkd0c: " << trkd0 << ", " << trkd0c);
346 
347  // correct the track parameters for the beamspot position
348  beamX = beamSpotX + tan(beamTiltX) * (trkz0-beamSpotZ);
349  beamY = beamSpotY + tan(beamTiltY) * (trkz0-beamSpotZ);
350  d0bscorr = trkd0 - ( -sin(trkphi)*beamX + cos(trkphi)*beamY );
351  }
352 
353  if (fitQual==nullptr) {
354  ATH_MSG_WARNING("No fit quality assigned to the track");
355  }
356 
357  chisquared = (fitQual) ? fitQual->chiSquared() : -1.;
358  DoF = (fitQual) ? fitQual->numberDoF() : -1;
359  if(DoF>0) chi2oDoF = chisquared/(float)DoF;
360 
361  if (trkphi<0) trkphi+=2*M_PI;
362 
363  ngTracks++;
364  ATH_MSG_DEBUG(nTracks << " is a good track!");
365 
366  // fill lb histogram for each accepted track
367  auto lb_track_m = Monitored::Scalar<int>( "m_lb_track", lb );
368  fill(genericTrackGroup, lb_track_m);
369 
370  int nhpixB=0, nhpixECA=0, nhpixECC=0, nhsctB=0, nhsctECA=0, nhsctECC=0, nhtrtB=0, nhtrtECA=0, nhtrtECC=0;
371 
372  // loop over all hits on track
373  ATH_MSG_VERBOSE (" starting to loop over TSOS: " << trksItr->trackStateOnSurfaces()->size());
374  for (const Trk::TrackStateOnSurface* tsos : *trksItr->trackStateOnSurfaces()) {
375  //check that we have track parameters defined for the surface (pointer is not null)
376  if(!(tsos->trackParameters())) {
377  ATH_MSG_DEBUG(" hit skipped because no associated track parameters");
378  continue;
379  }
380 
381  Identifier surfaceID;
382  const Trk::MeasurementBase* mesb=tsos->measurementOnTrack();
383  // hits, outliers
384  if (mesb != nullptr && mesb->associatedSurface().associatedDetectorElement()!=nullptr) surfaceID = mesb->associatedSurface().associatedDetectorElement()->identify();
385 
386  // holes, perigee
387  else continue;
388 
389  if ( tsos->type(Trk::TrackStateOnSurface::Measurement) ){
390  //hit quality cuts for Si hits if tool is configured - default is NO CUTS
391  if (m_idHelper->is_pixel(surfaceID) || m_idHelper->is_sct(surfaceID)) {
392  if (m_doHitQuality) {
393  ATH_MSG_DEBUG("applying hit quality cuts to Silicon hit...");
394 
395  const Trk::RIO_OnTrack* hit = m_hitQualityTool->getGoodHit(tsos);
396  if (hit == nullptr) {
397  ATH_MSG_DEBUG("hit failed quality cuts and is rejected.");
398  continue;
399  } else {
400  ATH_MSG_DEBUG("hit passed quality cuts");
401  }
402  } else {
403  ATH_MSG_VERBOSE("hit quality cuts NOT APPLIED to Silicon hit.");
404  }
405  } // hit is Pixel or SCT
406 
407  // --- pixel
408  if (m_idHelper->is_pixel(surfaceID)){
409  if(m_pixelID->barrel_ec(surfaceID) == 0){
410  nhpixB++;
411  }
412  else if(m_pixelID->barrel_ec(surfaceID) == 2) nhpixECA++;
413  else if(m_pixelID->barrel_ec(surfaceID) == -2) nhpixECC++;
414  }
415  // --- sct
416  else if (m_idHelper->is_sct(surfaceID)){
417  if(m_sctID->barrel_ec(surfaceID) == 0){
418  nhsctB++;
419  }
420  else if(m_sctID->barrel_ec(surfaceID) == 2) nhsctECA++;
421  else if(m_sctID->barrel_ec(surfaceID) == -2) nhsctECC++;
422  }
423  // --- trt
424  if (m_idHelper->is_trt(surfaceID)){
425  int barrel_ec = m_trtID->barrel_ec(surfaceID);
426  if(barrel_ec == 1 || barrel_ec == -1 ) {
427  nhtrtB++;
428  }
429  else if(barrel_ec == 2){
430  nhtrtECA++;
431  }else if(barrel_ec == -2){
432  nhtrtECC++;
433  }
434  }
435  }
436  }
437  int nhpix= nhpixB +nhpixECA + nhpixECC;
438  int nhsct= nhsctB +nhsctECA + nhsctECC;
439  int nhtrt= nhtrtB +nhtrtECA + nhtrtECC;
440  int nhits= nhpix+ nhsct+ nhtrt;
441 
442  auto nhits_per_track_m = Monitored::Scalar<float>( "m_nhits_per_track", nhits );
443  fill(genericTrackGroup, nhits_per_track_m);
444  //Pixel hits
445  auto npixelhits_per_track_m = Monitored::Scalar<float>( "m_npixelhits_per_track", nhpix );
446  auto npixelhits_per_track_barrel_m = Monitored::Scalar<float>( "m_npixelhits_per_track_barrel", nhpixB );
447  fill(genericTrackGroup, npixelhits_per_track_barrel_m);
448  auto npixelhits_per_track_eca_m = Monitored::Scalar<float>( "m_npixelhits_per_track_eca", nhpixECA );
449  fill(genericTrackGroup, npixelhits_per_track_eca_m);
450  auto npixelhits_per_track_ecc_m = Monitored::Scalar<float>( "m_npixelhits_per_track_ecc", nhpixECC );
451  fill(genericTrackGroup, npixelhits_per_track_ecc_m);
452  //SCT hits
453  auto nscthits_per_track_m = Monitored::Scalar<float>( "m_nscthits_per_track", nhsct );
454  auto nscthits_per_track_barrel_m = Monitored::Scalar<float>( "m_nscthits_per_track_barrel", nhsctB );
455  fill(genericTrackGroup, nscthits_per_track_barrel_m);
456  auto nscthits_per_track_eca_m = Monitored::Scalar<float>( "m_nscthits_per_track_eca", nhsctECA );
457  fill(genericTrackGroup, nscthits_per_track_eca_m);
458  auto nscthits_per_track_ecc_m = Monitored::Scalar<float>( "m_nscthits_per_track_ecc", nhsctECC );
459  fill(genericTrackGroup, nscthits_per_track_ecc_m);
460  //TRT hits
461  auto ntrthits_per_track_m = Monitored::Scalar<float>( "m_ntrthits_per_track", nhtrt );
462  auto ntrthits_per_track_barrel_m = Monitored::Scalar<float>( "m_ntrthits_per_track_barrel", nhtrtB );
463  fill(genericTrackGroup, ntrthits_per_track_barrel_m);
464  auto ntrthits_per_track_eca_m = Monitored::Scalar<float>( "m_ntrthits_per_track_eca", nhtrtECA );
465  fill(genericTrackGroup, ntrthits_per_track_eca_m);
466  auto ntrthits_per_track_ecc_m = Monitored::Scalar<float>( "m_ntrthits_per_track_ecc", nhtrtECC );
467  fill(genericTrackGroup, ntrthits_per_track_ecc_m);
468 
469  auto chi2oDoF_m = Monitored::Scalar<float>( "m_chi2oDoF", chi2oDoF );
470  fill(genericTrackGroup, chi2oDoF_m);
471  auto eta_m = Monitored::Scalar<float>( "m_eta", trketa );
472  auto errEta_m = Monitored::Scalar<float>( "m_errEta", Err_eta );
473  fill(genericTrackGroup, errEta_m);
474 
475  // Eta for positive and negative tracks
476  auto isTrkPositive = Monitored::Scalar<float>( "isTrkPositive", charge > 0 ? 1 : 0 );
477  auto isTrkNegative = Monitored::Scalar<float>( "isTrkNegative", charge > 0 ? 0 : 1 );
478 
479  // z0
480  auto z0_m = Monitored::Scalar<float>( "m_z0", trkz0 );
481  auto errZ0_m = Monitored::Scalar<float>( "m_errZ0", Err_z0 );
482  auto z0_bscorr_m = Monitored::Scalar<float>( "m_z0_bscorr", trkz0-beamSpotZ );
483  float z0sintheta = trkz0*(sin(trktheta));
484  auto z0sintheta_m = Monitored::Scalar<float>( "m_z0sintheta", z0sintheta );
485  fill(genericTrackGroup, z0_m, errZ0_m, z0_bscorr_m, z0sintheta_m);
486 
487  //d0
488  auto d0_m = Monitored::Scalar<float>( "m_d0", trkd0 );
489  fill(genericTrackGroup, d0_m);
490  auto errD0_m = Monitored::Scalar<float>( "m_errD0", Err_d0 );
491  fill(genericTrackGroup, errD0_m);
492  auto d0_bscorr_m = Monitored::Scalar<float>( "m_d0_bscorr", d0bscorr );
493 
494  // Phi
495  auto phi_m = Monitored::Scalar<float>( "m_phi", trkphi );
496  auto errPhi_m = Monitored::Scalar<float>( "m_errPhi", Err_phi );
497 
498  //d0 vs phi in barrel, End-Cap A, End-cap C
499  auto isTrackBarrel = Monitored::Scalar<float>( "isTrackBarrel", fabs(trketa) < m_barrelEta ? 1 : 0 );
500  auto isTrackECA = Monitored::Scalar<float>( "isTrackECA", trketa > m_barrelEta ? 1 : 0 );
501  auto isTrackECC = Monitored::Scalar<float>( "isTrackECC", trketa < - m_barrelEta ? 1 : 0 );
502 
503  //pT and p
504  float pT = charge*trkpt;
505  auto pT_m = Monitored::Scalar<float>( "m_pT", pT );
506  auto errPt_m = Monitored::Scalar<float>( "m_errPt", Err_Pt );
507  auto pTRes_m = Monitored::Scalar<float>( "m_pTRes", std::fabs(Err_qOverP / qOverP) );
508 
509  //d0 (BS) vs Eta, vs Phi (Phi, Barrel, EndCap A, EndCap C), vs pT // Eta vs Npixhits_per_track, SCT, TRT // Eta for positive and negative tracks
510  fill(genericTrackGroup, npixelhits_per_track_m, nscthits_per_track_m, ntrthits_per_track_m, eta_m, isTrkPositive, isTrkNegative, d0_bscorr_m, phi_m, isTrackBarrel, isTrackECA, isTrackECC, errPhi_m, pT_m, errPt_m, pTRes_m);
511 
512  auto p_m = Monitored::Scalar<float>( "m_p", trkP );
513  fill(genericTrackGroup, p_m);
514 
515  } //
516  // end of loop on trks
517  //
518 
519  // histo with the count of used(good) tracks
520  auto ngTracks_m = Monitored::Scalar<float>( "m_ngTracks", ngTracks );
521  fill(genericTrackGroup, ngTracks_m);
522 
523  ATH_MSG_DEBUG("Histogram filling completed for #good_tracks: " << ngTracks);
524 
525  return StatusCode::SUCCESS;
526 }
527 
528 const xAOD::Vertex* IDAlignMonGenericTracksAlg::findAssociatedVertexTP(const std::map<const xAOD::TrackParticle*, const xAOD::Vertex*>& trackVertexMapTP, const xAOD::TrackParticle *track) const
529 {
530 
531  std::map<const xAOD::TrackParticle*, const xAOD::Vertex* >::const_iterator tpVx = trackVertexMapTP.find( track);
532 
533  if (tpVx == trackVertexMapTP.end() ){
534  ATH_MSG_VERBOSE("Did not find the vertex. Returning 0");
535  return nullptr;
536  }
537  return (*tpVx).second;
538 
539 }
540 
541 
543 {
544 
545  //find the link to the TrackParticleBase
546  const Trk::ITrackLink* trkLink = trkAtVx->trackOrParticleLink();
547  const Trk::TrackParticleBase* trkPB(nullptr);
548  if(nullptr!= trkLink){
549  const Trk::LinkToTrackParticleBase* linktrkPB = dynamic_cast<const Trk::LinkToTrackParticleBase *>(trkLink);
550  if(nullptr!= linktrkPB){
551  if(linktrkPB->isValid()) trkPB = linktrkPB->cachedElement();
552  }//end of dynamic_cast check
553  }//end of ITrackLink existance check
554 
555  //cast to TrackParticle
556  if(trkPB){
557  if ( trkPB->trackElementLink()->isValid() ) {
558  // retrieve and refit original track
559  const Trk::Track* trktrk = trkPB->originalTrack();
560  return trktrk;
561  }
562  }
563  return nullptr;
564 }
565 
566 
567 
568 bool IDAlignMonGenericTracksAlg::fillVertexInformation(std::map<const xAOD::TrackParticle*, const xAOD::Vertex*>& trackVertexMapTP, const EventContext& ctx ) const
569 {
570  ATH_MSG_DEBUG("Generic Tracks: fillVertexInformation(): Checking ");
571  trackVertexMapTP.clear();
572 
573  // retrieving vertices
574  auto handle_vxContainer = SG::makeHandle(m_VxPrimContainerName, ctx);
575 
576  if (!handle_vxContainer.isPresent()) {
577  ATH_MSG_DEBUG ("InDetGlobalPrimaryVertexMonAlg: StoreGate doesn't contain primary vertex container with key "+m_VxPrimContainerName.key());
578  return false;
579  }
580  if (!handle_vxContainer.isValid()) {
581  ATH_MSG_ERROR ("InDetGlobalPrimaryVertexMonAlg: Could not retrieve primary vertex container with key "+m_VxPrimContainerName.key());
582  return false;
583  }
584 
585  const auto *vertexContainer = handle_vxContainer.cptr();
586 
587  for(const auto & vtx : *vertexContainer) {
588  auto tpLinks = vtx->trackParticleLinks();
589  ATH_MSG_DEBUG("tpLinks size " << tpLinks.size());
590 
591  if (tpLinks.size() > 4 ) {
592  for(const auto& link: tpLinks) {
593  const xAOD::TrackParticle *TP = *link;
594  if(TP) {
595  trackVertexMapTP.insert( std::make_pair( TP, vtx ) );
596  }
597  }
598  }
599  }
600 
601  return true;
602 }
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
PixelID.h
This is an Identifier helper class for the Pixel subdetector. This class is a factory for creating co...
AtlasDetectorID::is_pixel
bool is_pixel(Identifier id) const
Definition: AtlasDetectorID.h:760
IDAlignMonGenericTracksAlg::m_hitQualityTool
ToolHandle< IInDetAlignHitQualSelTool > m_hitQualityTool
Definition: IDAlignMonGenericTracksAlg.h:97
CalculateHighPtTerm.pT
pT
Definition: ICHEP2016/CalculateHighPtTerm.py:57
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
SCT_ID.h
This is an Identifier helper class for the SCT subdetector. This class is a factory for creating comp...
Trk::Surface::associatedDetectorElement
const TrkDetElementBase * associatedDetectorElement() const
return associated Detector Element
IDAlignMonGenericTracksAlg::findAssociatedVertexTP
const xAOD::Vertex * findAssociatedVertexTP(const std::map< const xAOD::TrackParticle *, const xAOD::Vertex * > &trackVertexMapTP, const xAOD::TrackParticle *) const
Definition: IDAlignMonGenericTracksAlg.cxx:528
Trk::VxTrackAtVertex
The VxTrackAtVertex is a common class for all present TrkVertexFitters The VxTrackAtVertex is designe...
Definition: VxTrackAtVertex.h:77
TrackParticle.h
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
Trk::Track
The ATLAS Track class.
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h:73
IDAlignMonGenericTracksAlg::m_doIP
bool m_doIP
Definition: IDAlignMonGenericTracksAlg.h:87
AtlasDetectorID::is_sct
bool is_sct(Identifier id) const
Definition: AtlasDetectorID.h:770
PixelID::barrel_ec
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition: PixelID.h:619
IDAlignMonGenericTracksAlg::m_pixelID
const PixelID * m_pixelID
Definition: IDAlignMonGenericTracksAlg.h:75
AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
Trk::ParametersT
Dummy class used to allow special convertors to be called for surfaces owned by a detector element.
Definition: EMErrorDetail.h:25
IDAlignMonGenericTracksAlg::m_trackSelection
ToolHandle< InDet::IInDetTrackSelectionTool > m_trackSelection
Definition: IDAlignMonGenericTracksAlg.h:96
conifer::pow
constexpr int pow(int x)
Definition: conifer.h:20
TRT_ID.h
This is an Identifier helper class for the TRT subdetector. This class is a factory for creating comp...
M_PI
#define M_PI
Definition: ActiveFraction.h:11
IDAlignMonGenericTracksAlg::m_SCT_Manager
std::string m_SCT_Manager
Definition: IDAlignMonGenericTracksAlg.h:102
Trk::z0
@ z0
Definition: ParamDefs.h:70
Trk::RIO_OnTrack
Definition: RIO_OnTrack.h:70
SiClusterOnTrack.h
SCT_ID::barrel_ec
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition: SCT_ID.h:728
Trk::VxTrackAtVertex::trackOrParticleLink
const ITrackLink * trackOrParticleLink(void) const
AtlasDetectorID::is_trt
bool is_trt(Identifier id) const
Definition: AtlasDetectorID.h:782
drawFromPickle.cos
cos
Definition: drawFromPickle.py:36
IDAlignMonGenericTracksAlg::m_hasBeamCondSvc
bool m_hasBeamCondSvc
Definition: IDAlignMonGenericTracksAlg.h:66
Trk::TrkDetElementBase::identify
virtual Identifier identify() const =0
Identifier.
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
InDetAccessor::qOverP
@ qOverP
perigee
Definition: InDetAccessor.h:35
IDAlignMonGenericTracksAlg::m_sctID
const SCT_ID * m_sctID
Definition: IDAlignMonGenericTracksAlg.h:76
AmgSymMatrix
#define AmgSymMatrix(dim)
Definition: EventPrimitives.h:52
IDAlignMonGenericTracksAlg::m_VxPrimContainerName
SG::ReadHandleKey< xAOD::VertexContainer > m_VxPrimContainerName
Definition: IDAlignMonGenericTracksAlg.h:91
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
IDAlignMonGenericTracksAlg::m_trackToVertexIPEstimator
ToolHandle< Trk::ITrackToVertexIPEstimator > m_trackToVertexIPEstimator
Definition: IDAlignMonGenericTracksAlg.h:99
AthMonitorAlgorithm
Base class for Athena Monitoring Algorithms.
Definition: AthMonitorAlgorithm.h:36
SG::makeHandle
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Definition: ReadCondHandle.h:269
Trk::TrackParticleBase
Definition: TrackParticleBase.h:41
AtlasDetectorID.h
This class provides an interface to generate or decode an identifier for the upper levels of the dete...
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
python.BunchSpacingUtils.lb
lb
Definition: BunchSpacingUtils.py:88
IDAlignMonGenericTracksAlg.h
event
POOL::TEvent event(POOL::TEvent::kClassAccess)
IDAlignMonGenericTracksAlg::~IDAlignMonGenericTracksAlg
virtual ~IDAlignMonGenericTracksAlg()
Definition: IDAlignMonGenericTracksAlg.cxx:71
Monitored
Generic monitoring tool for athena components.
Definition: GenericMonitoringTool.h:30
IInDetAlignHitQualSelTool.h
Trk::TrackParticleBase::trackElementLink
const ElementLink< TrackCollection > * trackElementLink() const
Return the ElementLink to the Track.
Definition: TrackParticleBase.h:230
Trk::theta
@ theta
Definition: ParamDefs.h:72
IDAlignMonGenericTracksAlg::fillVertexInformation
bool fillVertexInformation(std::map< const xAOD::TrackParticle *, const xAOD::Vertex * > &trackVertexMapTP, const EventContext &ctx) const
Definition: IDAlignMonGenericTracksAlg.cxx:568
IDAlignMonGenericTracksAlg::m_z0Range
float m_z0Range
Definition: IDAlignMonGenericTracksAlg.h:83
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
AmgVector
AmgVector(4) T2BSTrackFilterTool
Definition: T2BSTrackFilterTool.cxx:114
IDAlignMonGenericTracksAlg::m_d0Range
float m_d0Range
Definition: IDAlignMonGenericTracksAlg.h:80
TrackCollection.h
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
IDAlignMonGenericTracksAlg::m_trtID
const TRT_ID * m_trtID
Definition: IDAlignMonGenericTracksAlg.h:77
IDAlignMonGenericTracksAlg::m_Pixel_Manager
std::string m_Pixel_Manager
Definition: IDAlignMonGenericTracksAlg.h:101
run
Definition: run.py:1
drawFromPickle.tan
tan
Definition: drawFromPickle.py:36
Trk::FitQuality
Class to represent and store fit qualities from track reconstruction in terms of and number of degre...
Definition: FitQuality.h:97
AthMonitorAlgorithm::fill
void fill(const ToolHandle< GenericMonitoringTool > &groupHandle, std::vector< std::reference_wrapper< Monitored::IMonitoredVariable >> &&variables) const
Fills a vector of variables to a group by reference.
TRT_ID::barrel_ec
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition: TRT_ID.h:866
IDAlignMonGenericTracksAlg::fillHistograms
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
Definition: IDAlignMonGenericTracksAlg.cxx:131
AthMonitorAlgorithm::GetEventInfo
SG::ReadHandle< xAOD::EventInfo > GetEventInfo(const EventContext &) const
Return a ReadHandle for an EventInfo object (get run/event numbers, etc.)
Definition: AthMonitorAlgorithm.cxx:107
IDAlignMonGenericTracksAlg::getTrkTrack
static const Trk::Track * getTrkTrack(const Trk::VxTrackAtVertex *)
Definition: IDAlignMonGenericTracksAlg.cxx:542
IDAlignMonGenericTracksAlg::m_tracksName
SG::ReadHandleKey< TrackCollection > m_tracksName
Definition: IDAlignMonGenericTracksAlg.h:93
LinkToTrackParticleBase.h
IDAlignMonGenericTracksAlg::m_extendedPlots
bool m_extendedPlots
Definition: IDAlignMonGenericTracksAlg.h:79
Trk::LinkToTrackParticleBase
Definition: LinkToTrackParticleBase.h:17
Trk::MeasurementBase
Definition: MeasurementBase.h:58
IDAlignMonGenericTracksAlg::m_beamSpotKey
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
Definition: IDAlignMonGenericTracksAlg.h:94
Trk::TrackStateOnSurface
represents the track state (measurement, material, fit parameters and quality) at a surface.
Definition: TrackStateOnSurface.h:71
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
Trk::MeasurementBase::associatedSurface
virtual const Surface & associatedSurface() const =0
Interface method to get the associated Surface.
Trk::d0
@ d0
Definition: ParamDefs.h:69
Amg::error
double error(const Amg::MatrixX &mat, int index)
return diagonal error of the matrix caller should ensure the matrix is symmetric and the index is in ...
Definition: EventPrimitivesHelpers.h:40
charge
double charge(const T &p)
Definition: AtlasPID.h:494
SiCluster.h
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
IDAlignMonGenericTracksAlg::m_NTracksRange
int m_NTracksRange
Definition: IDAlignMonGenericTracksAlg.h:85
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
LocalParameters.h
AthMonitorAlgorithm::lbAverageInteractionsPerCrossing
virtual float lbAverageInteractionsPerCrossing(const EventContext &ctx=Gaudi::Hive::currentContext()) const
Calculate the average mu, i.e.
Definition: AthMonitorAlgorithm.cxx:222
AthMonitorAlgorithm::initialize
virtual StatusCode initialize() override
initialize
Definition: AthMonitorAlgorithm.cxx:18
IDAlignMonGenericTracksAlg::m_d0BsRange
float m_d0BsRange
Definition: IDAlignMonGenericTracksAlg.h:81
IDAlignMonGenericTracksAlg::m_etaRange
float m_etaRange
Definition: IDAlignMonGenericTracksAlg.h:84
IDAlignMonGenericTracksAlg::m_idHelper
const AtlasDetectorID * m_idHelper
Definition: IDAlignMonGenericTracksAlg.h:74
xAOD::Vertex_v1
Class describing a Vertex.
Definition: Vertex_v1.h:42
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
IDAlignMonGenericTracksAlg::m_doHitQuality
bool m_doHitQuality
Definition: IDAlignMonGenericTracksAlg.h:88
Trk::qOverP
@ qOverP
perigee
Definition: ParamDefs.h:73
IDAlignMonGenericTracksAlg::m_tracksKey
SG::ReadHandleKey< TrackCollection > m_tracksKey
Definition: IDAlignMonGenericTracksAlg.h:92
Trk::FitQuality::chiSquared
double chiSquared() const
returns the of the overall track fit
Definition: FitQuality.h:56
IDAlignMonGenericTracksAlg::m_TRT_Manager
std::string m_TRT_Manager
Definition: IDAlignMonGenericTracksAlg.h:103
Trk::FitQuality::numberDoF
int numberDoF() const
returns the number of degrees of freedom of the overall track or vertex fit as integer
Definition: FitQuality.h:60
IDAlignMonGenericTracksAlg::m_barrelEta
float m_barrelEta
Definition: IDAlignMonGenericTracksAlg.h:86
xAOD::track
@ track
Definition: TrackingPrimitives.h:512
xAOD::TrackParticle_v1
Class describing a TrackParticle.
Definition: TrackParticle_v1.h:43
IDAlignMonGenericTracksAlg::IDAlignMonGenericTracksAlg
IDAlignMonGenericTracksAlg(const std::string &name, ISvcLocator *pSvcLocator)
Definition: IDAlignMonGenericTracksAlg.cxx:39
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
Monitored::Scalar
Declare a monitored scalar variable.
Definition: MonitoredScalar.h:34
IDAlignMonGenericTracksAlg::initialize
virtual StatusCode initialize() override
initialize
Definition: IDAlignMonGenericTracksAlg.cxx:74
FitQuality.h
IDAlignMonGenericTracksAlg::m_applyTrkSel
bool m_applyTrkSel
Definition: IDAlignMonGenericTracksAlg.h:89
CaloNoise_fillDB.mu
mu
Definition: CaloNoise_fillDB.py:53
Trk::TrackParticleBase::originalTrack
const Track * originalTrack() const
Return pointer to associated track.
Definition: TrackParticleBase.h:205
readCCLHist.float
float
Definition: readCCLHist.py:83
Trk::phi0
@ phi0
Definition: ParamDefs.h:71
AthMonitorAlgorithm::getGroup
const ToolHandle< GenericMonitoringTool > & getGroup(const std::string &name) const
Get a specific monitoring tool from the tool handle array.
Definition: AthMonitorAlgorithm.cxx:164
Trk::TrackStateOnSurface::Measurement
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
Definition: TrackStateOnSurface.h:101
IDAlignMonGenericTracksAlg::m_pTRange
float m_pTRange
Definition: IDAlignMonGenericTracksAlg.h:82