23 #include "CLHEP/GenericFunctions/CumulativeChiSquare.hh"
24 #include "CLHEP/Units/SystemOfUnits.h"
39 , m_trackSumTool(
"Trk::TrackSummaryTool", this)
40 , m_particleCreator(
"", this)
41 , m_extrapolator(
"Trk::Extrapolator", this)
42 , m_trtDCTool(
"InDet::InDetTrtDriftCircleCutTool", this)
43 , m_inDetTestPixelLayerTool(
"", this)
44 , m_trackSumToolAvailable(true)
45 , m_partCreatorToolAvailable(false)
46 , m_usePtDependentCuts(false)
47 , m_useEventInfoBs(false)
51 declareInterface<ITrackSelectorTool>(
this);
128 evt->beamPosSigmaX(),
evt->beamPosSigmaY(),
evt->beamPosSigmaZ(),
129 evt->beamTiltXZ(),
evt->beamTiltYZ(),
evt->beamPosSigmaXY());
132 ATH_MSG_WARNING(
" Cannot get beamSpot center from xAOD::EventInfo. Using (0,0,0)... " );
137 if (beamSpotHandle.isValid()) {
140 ATH_MSG_WARNING(
" Cannot get beamSpot center from BeamSpotData. Using (0,0,0)... " );
154 ATH_MSG_DEBUG(
"No TrackSummaryTool set. OK if running on AOD.");
160 ATH_MSG_DEBUG(
"No TrackParticleCreatorTool set but shared hit selection used. OK if running on AOD.");
170 ATH_MSG_ERROR(
" Eta dependent cut on number of TRT hits requested but TrtDCCutTool not specified. ");
171 return StatusCode::FAILURE;
174 return StatusCode::FAILURE;
178 ATH_MSG_DEBUG(
"Using eta dependent cut on number of TRT hits.");
181 ATH_MSG_DEBUG(
"Using eta dependent cut on number of TRT hits + outliers.");
194 ATH_MSG_ERROR(
"Number of cuts DOES NOT match the number of intervals to apply. Please check jobOptions. ");
195 return StatusCode::FAILURE;
197 ATH_MSG_ERROR(
"Zero vectors for number of cuts and pt intervals. Please check jobOptions. ");
198 return StatusCode::FAILURE;
201 return StatusCode::SUCCESS;
208 return StatusCode::SUCCESS;
219 if (!preselectionDecision) {
220 ATH_MSG_DEBUG(
"Track rejected because of preselection decision!");
224 ATH_MSG_DEBUG(
" Preselection was requested but cannot be made since no Perigee in Track is available. This is not an error." );
228 if (myVertex==
nullptr) {
229 myVertex =
getBeamSpot(Gaudi::Hive::currentContext());
233 for (
const auto *
i : *
track.trackParameters()){
242 firstmeaspar=
track.perigeeParameters();
244 ATH_MSG_WARNING(
" First measurment on track is missing. Using perigee Parameters, but they are missing: 0 pointer! Track selection failed " );
258 track.info().particleHypothesis() ).release();
259 const Trk::Perigee* extrapolatedPerigee = extrapolatedParameters ?
dynamic_cast<const Trk::Perigee*
>(extrapolatedParameters) :
nullptr;
260 if (!extrapolatedPerigee || !extrapolatedPerigee->covariance() ) {
262 if (extrapolatedParameters) {
263 ATH_MSG_WARNING(
"The return object of the extrapolator was not a perigee even if a perigeeSurface was used!" );
264 delete extrapolatedParameters;
265 extrapolatedParameters=
nullptr;
271 bool dec =
decision(extrapolatedPerigee, recVertex ? &recVertex->covariancePosition() :
nullptr );
276 bool isInTrtAcceptance=
true;
277 if (!extrapolatedPerigee || std::fabs(extrapolatedPerigee->momentum().eta())>
m_TrtMaxEtaAcceptance) {
278 isInTrtAcceptance=
false;
280 if (extrapolatedPerigee!=
track.perigeeParameters()) {
281 delete extrapolatedPerigee;
282 extrapolatedPerigee=
nullptr;
285 ATH_MSG_DEBUG(
"Track rejected because of perigee parameters!");
290 if (TrkQuality==
nullptr) {
291 ATH_MSG_WARNING(
"Requested cut on track quality was not possible. Track has no FitQuality object attached. Selection failed." );
301 std::unique_ptr<Trk::TrackSummary> summaryUniquePtr;
305 summary = summaryUniquePtr.get();
308 ATH_MSG_FATAL(
"Track preselection: cannot create a track summary (but useTrackSummary is true). Selection failed." );
315 ATH_MSG_FATAL(
"Track preselection: cannot create a track particle (but useSharedHitInfo is true). Selection failed." );
331 nHitTrtPlusOutliers =
m_trtDCTool->minNumberDCs( (*
track.trackParameters())[0] );
340 nHitTrt, nHitTrtPlusOutliers)) {
356 if (!preselectionDecision) {
357 ATH_MSG_DEBUG(
"Track rejected because of preselection decision!");
361 ATH_MSG_WARNING(
" Preselection was requested but cannot be made since the Perigee is not the defining Parameter of the TrackParticle. This is not an error." );
363 bool isInTrtAcceptance=
true;
364 if (!perigeeBeforeExtrapolation || std::fabs(perigeeBeforeExtrapolation->momentum().eta())>
m_TrtMaxEtaAcceptance) {
365 isInTrtAcceptance=
false;
369 if (TrkQuality==
nullptr) {
370 ATH_MSG_WARNING(
"Requested cut on track quality was not possible. TrackParticleBase has no FitQuality object attached. Selection failed." );
381 ATH_MSG_WARNING(
"Track preselection: cannot create a track summary (but useTrackSummary is true). Selection failed." );
387 ATH_MSG_ERROR(
"Use of InDetDetailedTrackSelectorTool with Trk::TrackParticleBase and useSharedHitInfo is not supported");
402 nHitTrtPlusOutliers =
m_trtDCTool->minNumberDCs( (
track.trackParameters())[0] );
410 if ((!perigeeBeforeExtrapolation) or
412 nHitTrt, nHitTrtPlusOutliers))) {
419 myVertex =
getBeamSpot(Gaudi::Hive::currentContext());
423 for (
const auto *
i :
track.trackParameters()) {
424 if (
i->covariance() &&
431 if (!extrapolatedPerigee || !extrapolatedPerigee->covariance() ) {
432 ATH_MSG_DEBUG(
" Track Paraemters at first measurement not found. Perigee not found. Cannot do TrackSelection..." );
440 firstmeaspar=&(
track.definingParameters());
452 extrapolatedPerigee = extrapolatedParameters ?
dynamic_cast<const Trk::Perigee*
>(extrapolatedParameters) :
nullptr;
453 if (extrapolatedPerigee==
nullptr || !extrapolatedPerigee->covariance()) {
455 if (extrapolatedParameters) {
456 ATH_MSG_WARNING(
"The return object of the extrapolator was not a perigee even if a perigeeSurface was used!" );
457 delete extrapolatedParameters;
458 extrapolatedParameters =
nullptr;
461 if (extrapolatedParameters)
ATH_MSG_VERBOSE (
"Result: " << *extrapolatedParameters);
463 bool dec =
decision(extrapolatedPerigee, recVertex ? &recVertex->covariancePosition() :
nullptr );
468 if (extrapolatedPerigee!=&(
track.definingParameters())) {
469 delete extrapolatedPerigee;
470 extrapolatedPerigee=
nullptr;
473 ATH_MSG_DEBUG(
"Track rejected because of perigee parameters!");
486 evt->beamPosSigmaX(),
evt->beamPosSigmaY(),
evt->beamPosSigmaZ(),
487 evt->beamTiltXZ(),
evt->beamTiltYZ(),
evt->beamPosSigmaXY());
490 ATH_MSG_WARNING(
" Cannot get beamSpot center from xAOD::EventInfo. Using (0,0,0)... " );
495 if (beamSpotHandle.isValid()) {
496 return beamSpotHandle->beamVtx().position();
498 ATH_MSG_WARNING(
" Cannot get beamSpot center from BeamSpotData. Using (0,0,0)... " );
513 ATH_MSG_DEBUG(
"Track rejected because of preselection decision!");
534 nHitTrtPlusOutliers =
m_trtDCTool->minNumberDCs( &perigee );
556 ATH_MSG_DEBUG(
"Track rejected because of Pt-Dependent SCT Hit cut (CAREFUL! Excludes dead modules)") ;
563 ATH_MSG_DEBUG(
"Track rejected because of Pt-Dependent SCT Hit cut (CAREFUL! Excludes dead modules)") ;
575 ATH_MSG_DEBUG(
"and track rejected because at least one hit is expected in the innermost pixel layer") ;
577 }
else ATH_MSG_DEBUG(
"recovered track as no b-layer expected") ;
635 ATH_MSG_DEBUG(
"Track rejected because of nHitTrt "<<nh<<
" < "<<nHitTrt);
640 if (nhh<nHitTrtPlusOutliers) {
641 ATH_MSG_DEBUG(
"Track rejected because of nHitTrtPlusOutliers "<<nhh<<
" < "<<nHitTrtPlusOutliers);
670 if (nheh>1.) nheh=1.;
707 Gaudi::Hive::currentContext(),
708 perigee,perigeeSurface,
710 const Trk::Perigee* extrapolatedPerigee = extrapolatedParameters ?
dynamic_cast<const Trk::Perigee*
>(extrapolatedParameters) :
nullptr;
711 if (extrapolatedPerigee==
nullptr) {
712 ATH_MSG_WARNING(
"Extrapolation to the vertex failed: " << perigeeSurface << std::endl << perigee );
713 if (extrapolatedParameters!=
nullptr) {
714 ATH_MSG_WARNING(
"The return object of the extrapolator was not a perigee even if a perigeeSurface was used!" );
715 delete extrapolatedParameters;
716 extrapolatedParameters=
nullptr;
724 dec =
decision(extrapolatedPerigee,&vertexError);
726 dec =
decision(extrapolatedPerigee,
nullptr);
729 delete extrapolatedPerigee;
732 ATH_MSG_DEBUG(
"Track rejected because of perigee parameters!");
745 ATH_MSG_WARNING(
"Decision on measured perigee: Zero pointer to measured perigee passed. Selection failed." );
752 const EventContext& ctx = Gaudi::Hive::currentContext();
755 if (fieldCondObj ==
nullptr) {
760 fieldCondObj->getInitializedCache (fieldCache);
808 double d0wrtPriVtx = perigeeParms[
Trk::d0];
810 double z0wrtPriVtx =
deltaZ*sinTheta;
818 double DD0 = testtrackSigD0*testtrackSigD0;
820 if (covariancePosition) {
821 double DXX = dIPdx*dIPdx* (*covariancePosition)(0,0);
822 double DYY = dIPdy*dIPdy* (*covariancePosition)(1,1);
823 double DXY = 2.*dIPdx*dIPdy* (*covariancePosition)(0,1);
824 newD0Err = DD0 + DXX + DYY + DXY;
829 double d0ErrwrtPriVtx = (newD0Err>0 ? sqrt(newD0Err) : -10
e-9);
831 if (d0ErrwrtPriVtx<0) {
832 ATH_MSG_WARNING(
" error on d0 is negative: numeric error... (not expected. please report!)" );
845 double dZIPdTheta =
deltaZ*cosTheta;
846 double dZIPdz0 = sinTheta;
847 double dZIPdzV = -sinTheta;
848 double DTheta2 = dZIPdTheta*dZIPdTheta*testtrackSigTh*testtrackSigTh;
849 double DZ02 = dZIPdz0*dZIPdz0*testtrackSigZ0*testtrackSigZ0;
852 if (covariancePosition) {
853 double DZV2 = dZIPdzV*dZIPdzV* (*covariancePosition)(2,2);
854 newZ0Err = DTheta2 + DZ02 + DZV2 + DThetaZ0;
856 newZ0Err = DTheta2 + DZ02 + DThetaZ0;
859 double z0ErrwrtPriVtx = (newZ0Err>0 ? sqrt(newZ0Err) : -10
e-9);
861 if (z0ErrwrtPriVtx<0) {
862 ATH_MSG_WARNING(
" error on z0 is negative: numeric error... (not expected. please report!)" );
884 if(
nullptr == trkQuality) {
885 ATH_MSG_WARNING(
"Null FitQuality pointer passed. No track Quality cut possible. Selection failed." );
896 Genfun::CumulativeChiSquare myCumulativeChiSquare(
ndf);
897 proba = 1.-myCumulativeChiSquare(
chi2);
925 bool useSharedHitInfo,
929 const int nHitTrtPlusOutliers)
const
932 ATH_MSG_WARNING(
"Null TrackSummary pointer passed. Selection failed." );
950 if (nhp < 0) nhp = 0;
953 if (nhs < 0) nhs = 0;
956 if (ndhs < 0) ndhs = 0;
971 ATH_MSG_DEBUG(
"Track rejected because of Pt-Dependent SCT Hit cut (CAREFUL! Excludes dead modules)") ;
978 ATH_MSG_DEBUG(
"Track rejected because of Pt-Dependent SCT Hit cut (CAREFUL! Excludes dead modules)") ;
991 ATH_MSG_DEBUG(
"and no blayer tool configured, so will not try to recover track");
994 ATH_MSG_DEBUG(
"and track rejected because at least one hit is expected in the innermost pixel layer") ;
996 }
else ATH_MSG_DEBUG(
"recovered track as no b-layer expected") ;
1063 if (useTrtHitInfo) {
1068 ATH_MSG_DEBUG(
"Track rejected because of nHitTrt "<<nh<<
" < "<<nHitTrt);
1074 if (nhh<nHitTrtPlusOutliers) {
1075 ATH_MSG_DEBUG(
"Track rejected because of nHitTrtPlusOutliers "<<nhh<<
" < "<<nHitTrtPlusOutliers);
1080 if (nhthits<0) nhthits=0;
1087 if (nhthitsWithOutliers<0) nhthitsWithOutliers=0;
1105 if(nheh<0.) nheh=0.;
1106 if (nheh>1.) nheh=1.;
1114 if (useSharedHitInfo) {
1116 ATH_MSG_DEBUG(
"Track rejected because xAOD::TrackParticle not available");
1121 if(nbs < 0) nbs = 0;
1129 if(nps < 0) nps = 0;
1136 if(nss < 0) nss = 0;
1142 int nst = nps + nss;
1156 const AmgVector(5)& perigeeParms = myPerigee.parameters();
1159 const EventContext& ctx = Gaudi::Hive::currentContext();
1162 if (fieldCondObj ==
nullptr) {
1167 fieldCondObj->getInitializedCache (fieldCache);
1171 ATH_MSG_DEBUG(
"Track rejected because of perigee qOverP == 0.");