29 #include "CLHEP/GenericFunctions/CumulativeChiSquare.hh"
51 m_trackSelection(
"InDet::InDetTrackSelectionTool/TrackSelectionTool", this)
98 ATH_MSG_DEBUG(
"No hit quality tool configured - not hit quality cuts will be imposed");
104 ATH_MSG_DEBUG(
"Hit quality tool setup - hit quality cuts will be applied to Si hits");
135 auto genericTrackGroup =
getGroup(
"IDA_Tracks");
145 ATH_MSG_DEBUG (
"IDAlignMonGenericTracksAlg::fillHistograms ** START ** call for track collection: " <<
m_tracksName.key());
150 if (not trks.isValid()) {
152 return StatusCode::RECOVERABLE;
154 ATH_MSG_DEBUG(
"IDAlignMonGenericTracksAlg: Track container " << trks.name() <<
" is found.");
162 if (!handle_vxContainer.isPresent()) {
164 return StatusCode::SUCCESS;
166 if (!handle_vxContainer.isValid()) {
168 return StatusCode::RECOVERABLE;
171 const auto *vertexContainer = handle_vxContainer.cptr();
172 for(
const auto & vtx : *vertexContainer) {
173 if ( !vtx )
continue;
174 if ( !vtx->vxTrackAtVertexAvailable() )
continue;
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];
187 if (xv==-999 || yv==-999 || zv==-999) {
193 std::map<const xAOD::TrackParticle*, const xAOD::Vertex*> trackVertexMapTP;
196 float beamSpotX = 0.;
197 float beamSpotY = 0.;
198 float beamSpotZ = 0.;
199 float beamTiltX = 0.;
200 float beamTiltY = 0.;
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);
230 fill(genericTrackGroup, beamSpotX_m, beamSpotY_m, beamSpotZ_m, lb_m);
233 fill(genericTrackGroup, mu_m);
240 if (!handle_vxContainer.isPresent()) {
242 return StatusCode::SUCCESS;
244 if (!handle_vxContainer.isValid()) {
246 return StatusCode::FAILURE;
249 const auto *vertexContainer = handle_vxContainer.cptr();
253 for (; vxI != vxE; ++vxI) {
254 if ((*vxI)->type() == 1) {
264 ATH_MSG_DEBUG (
"Start loop on tracks. Number of tracks " << trks->size());
268 if ( !trksItr || trksItr->perigeeParameters() ==
nullptr )
270 ATH_MSG_DEBUG(
"InDetAlignmentMonitoringRun3: NULL track pointer in collection" );
280 float chisquared = 0.;
282 float chi2oDoF = -999;
288 float Err_phi = -999;
289 float trktheta = -999;
290 float Err_theta = -999;
291 float Err_eta = -999;
294 float Err_qOverP = -999;
302 float d0bscorr = -999;
307 const Trk::Perigee* measPer = trksItr->perigeeParameters();
308 const AmgSymMatrix(5)* covariance = measPer ? measPer->covariance() :
nullptr;
310 std::unique_ptr<Trk::ImpactParametersAndSigma> myIPandSigma=
nullptr;
319 if (covariance ==
nullptr) {
320 ATH_MSG_WARNING(
"No measured perigee parameters assigned to the track");
323 AmgVector(5) perigeeParams = measPer->parameters();
324 trkd0 = perigeeParams[
Trk::d0];
325 trkz0 = perigeeParams[
Trk::z0];
328 trketa = measPer->eta();
331 trkpt = measPer->pT()/1000.;
336 Err_eta = Err_theta /
sin(trktheta);
344 trkd0c=trkd0-(yv*
cos(trkphi)-xv*
sin(trkphi));
348 beamX = beamSpotX +
tan(beamTiltX) * (trkz0-beamSpotZ);
349 beamY = beamSpotY +
tan(beamTiltY) * (trkz0-beamSpotZ);
350 d0bscorr = trkd0 - ( -
sin(trkphi)*beamX +
cos(trkphi)*beamY );
353 if (fitQual==
nullptr) {
357 chisquared = (fitQual) ? fitQual->
chiSquared() : -1.;
358 DoF = (fitQual) ? fitQual->
numberDoF() : -1;
359 if(DoF>0) chi2oDoF = chisquared/(
float)DoF;
361 if (trkphi<0) trkphi+=2*
M_PI;
368 fill(genericTrackGroup, lb_track_m);
370 int nhpixB=0, nhpixECA=0, nhpixECC=0, nhsctB=0, nhsctECA=0, nhsctECC=0, nhtrtB=0, nhtrtECA=0, nhtrtECC=0;
373 ATH_MSG_VERBOSE (
" starting to loop over TSOS: " << trksItr->trackStateOnSurfaces()->size());
376 if(!(tsos->trackParameters())) {
377 ATH_MSG_DEBUG(
" hit skipped because no associated track parameters");
381 Identifier surfaceID;
393 ATH_MSG_DEBUG(
"applying hit quality cuts to Silicon hit...");
396 if (hit ==
nullptr) {
426 if(barrel_ec == 1 || barrel_ec == -1 ) {
429 else if(barrel_ec == 2){
431 }
else if(barrel_ec == -2){
437 int nhpix= nhpixB +nhpixECA + nhpixECC;
438 int nhsct= nhsctB +nhsctECA + nhsctECC;
439 int nhtrt= nhtrtB +nhtrtECA + nhtrtECC;
440 int nhits= nhpix+ nhsct+ nhtrt;
443 fill(genericTrackGroup, nhits_per_track_m);
447 fill(genericTrackGroup, npixelhits_per_track_barrel_m);
449 fill(genericTrackGroup, npixelhits_per_track_eca_m);
451 fill(genericTrackGroup, npixelhits_per_track_ecc_m);
455 fill(genericTrackGroup, nscthits_per_track_barrel_m);
457 fill(genericTrackGroup, nscthits_per_track_eca_m);
459 fill(genericTrackGroup, nscthits_per_track_ecc_m);
463 fill(genericTrackGroup, ntrthits_per_track_barrel_m);
465 fill(genericTrackGroup, ntrthits_per_track_eca_m);
467 fill(genericTrackGroup, ntrthits_per_track_ecc_m);
470 fill(genericTrackGroup, chi2oDoF_m);
473 fill(genericTrackGroup, errEta_m);
483 float z0sintheta = trkz0*(
sin(trktheta));
485 fill(genericTrackGroup, z0_m, errZ0_m, z0_bscorr_m, z0sintheta_m);
489 fill(genericTrackGroup, d0_m);
491 fill(genericTrackGroup, errD0_m);
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);
513 fill(genericTrackGroup, p_m);
521 fill(genericTrackGroup, ngTracks_m);
523 ATH_MSG_DEBUG(
"Histogram filling completed for #good_tracks: " << ngTracks);
525 return StatusCode::SUCCESS;
531 std::map<const xAOD::TrackParticle*, const xAOD::Vertex* >::const_iterator tpVx = trackVertexMapTP.find(
track);
533 if (tpVx == trackVertexMapTP.end() ){
537 return (*tpVx).second;
548 if(
nullptr!= trkLink){
550 if(
nullptr!= linktrkPB){
570 ATH_MSG_DEBUG(
"Generic Tracks: fillVertexInformation(): Checking ");
571 trackVertexMapTP.clear();
576 if (!handle_vxContainer.isPresent()) {
580 if (!handle_vxContainer.isValid()) {
585 const auto *vertexContainer = handle_vxContainer.cptr();
587 for(
const auto & vtx : *vertexContainer) {
588 auto tpLinks = vtx->trackParticleLinks();
591 if (tpLinks.size() > 4 ) {
592 for(
const auto& link: tpLinks) {
595 trackVertexMapTP.insert( std::make_pair( TP, vtx ) );