57 m_trackMaker(
"InDet::SiTrackMaker_xk/InDetTrigSiTrackMaker"),
94 declareProperty(
"zVertexResolution",
m_tcs.m_zvError = 10.0,
" Half-width (mm) in z of z region used to filter seeds when doFastZVertexSeeding enabled" );
95 declareProperty(
"zVertexResolutionEndcap",
m_tcs.m_zvErrorEndcap = -1,
" Half-width (mm) in z of region used to filter seeds when doFastZVertexSeeding enabled, for endcap pixels; set to zVertexResolution value later if left negative" );
103 declareProperty(
"Doublet_FilterRZ",
m_tcs.m_doubletFilterRZ =
true,
"Enable check that doublet is consistent with the RoI in the RZ plane");
104 declareProperty(
"DoubletDR_Max",
m_tcs.m_doublet_dR_Max = 270.0,
"Maximum Radial distance between spacepoints forming Doublets");
109 declareProperty(
"Triplet_D0_PPS_Max",
m_tcs.m_tripletD0_PPS_Max = 1.7,
"Maximin d0 for PPS doublets");
110 declareProperty(
"Triplet_nMaxPhiSlice",
m_tcs.m_nMaxPhiSlice = 53,
"Number of phi-slices used for seeding");
111 declareProperty(
"Triplet_MaxBufferLength",
m_tcs.m_maxTripletBufferLength = 3,
"Maximum number of triplets sharing a common middle spacepoint");
114 declareProperty(
"TripletDoConfirm",
m_tcs.m_tripletDoConfirm =
false,
"Enable triplet confirmation");
115 declareProperty(
"DoubletDR_Max_Confirm",
m_tcs.m_doublet_dR_Max_Confirm = 150.0,
"doublet max DR when TripletDoConfirm enabled");
116 declareProperty(
"TripletMaxCurvatureDiff",
m_tcs.m_curv_delta = 0.001,
"Maximum curvature difference allowed in seed confirmation");
123 declareProperty(
"UseTrigSeedML",
m_tcs.m_useTrigSeedML = 0,
"set ML-based seed selection mode (0 disables)" );
125 declareProperty(
"maxEC_Pixel_cluster_length",
m_tcs.m_maxEC_len = 1.5,
"Maximum Endcap Pixel cluster length for ML-based seed selection" );
144 "TrackCollection name");
148 "TrackCollection name");
217 if (
m_tcs.m_zvErrorEndcap < 0)
m_tcs.m_zvErrorEndcap =
m_tcs.m_zvError;
249 ATH_MSG_INFO(
" FTF configures in Large Radius Tracking Mode");
255 if(
m_tcs.m_useTrigSeedML > 0) {
259 float lut_range[4] = {0.0,3.0,0.0,9.0};
263 if (lut_fileName.empty()) {
264 ATH_MSG_ERROR(
"Cannot find TrigSeedML LUT file " << lut_fileName);
265 return StatusCode::FAILURE;
269 std::ifstream ifs(lut_fileName.c_str());
272 ifs >> row >> col0 >> col1;
274 for(
int c=col0;c<=col1;c++) L.setBin(row, c);
278 m_tcs.m_vLUT.push_back(L);
308 ATH_MSG_DEBUG(
" m_tcs.m_doublet_dR_Max_Confirm : " <<
m_tcs.m_doublet_dR_Max_Confirm );
313 ATH_MSG_DEBUG(
" m_tcs.m_maxTripletBufferLength : " <<
m_tcs.m_maxTripletBufferLength );
356 return StatusCode::SUCCESS;
370 m_tcs.m_layerGeometry.clear();
373 const std::vector<TrigInDetSiLayer>* pVL =
m_numberingTool->layerGeometry();
374 std::copy(pVL->begin(),pVL->end(),std::back_inserter(
m_tcs.m_layerGeometry));
379 return StatusCode::SUCCESS;
387 outputTracks = std::make_unique<TrackCollection>();
394 inputTracks = inputTrackHandle.
ptr();
412 if ( roiCollection->size()>1 )
ATH_MSG_WARNING(
"More than one Roi in the collection: " <<
m_roiCollectionKey <<
", this is not supported - use a composite Roi: Using the first Roi ONLY" );
414 if ( roiCollection->size()==0) {
416 return StatusCode::FAILURE;
429 return StatusCode::SUCCESS;
438 const EventContext& ctx)
const {
442 std::vector<int> vec_seedSize;
458 auto monTime =
Monitored::Group(
m_monTool, mnt_roi_nTracks, mnt_roi_nSPs, mnt_timer_Total, mnt_timer_SpacePointConversion,
459 mnt_timer_PatternReco, mnt_timer_TripletMaking, mnt_timer_CombTracking, mnt_timer_TrackFitter,
460 mnt_timer_dEdxTrk, mnt_timer_disTrkZVertex, mnt_timer_disTrk);
465 mnt_timer_Total.start();
466 mnt_timer_SpacePointConversion.start();
469 mnt_roi_lastStageExecuted = 1;
471 std::vector<TrigSiSpacePointBase> convertedSpacePoints;
473 convertedSpacePoints.reserve(5000);
475 std::map<Identifier, std::vector<long int> > siClusterMap;
482 ATH_MSG_DEBUG(
"LRT Mode: Got input track collection with "<<inputTracks->
size()<<
"tracks");
483 long int trackIndex=0;
484 for (
auto t:*inputTracks) {
488 ATH_CHECK(
m_spacePointTool->getSpacePoints(roi, convertedSpacePoints, mnt_roi_nSPsPIX, mnt_roi_nSPsSCT, ctx, &siClusterMap));
496 mnt_timer_SpacePointConversion.stop();
497 mnt_roi_nSPs = mnt_roi_nSPsPIX + mnt_roi_nSPsSCT;
502 ATH_MSG_DEBUG(
"REGTEST / Found " << mnt_roi_nSPs <<
" space points.");
503 ATH_MSG_DEBUG(
"REGTEST / Found " << mnt_roi_nSPsPIX <<
" Pixel space points.");
504 ATH_MSG_DEBUG(
"REGTEST / Found " << mnt_roi_nSPsSCT <<
" SCT space points.");
505 ATH_MSG_DEBUG(
"REGTEST / converted space points size = " << convertedSpacePoints.size());
509 ATH_MSG_DEBUG(
"No tracks found - too few hits in ROI to run " << mnt_roi_nSPs);
511 return StatusCode::SUCCESS;
515 mnt_roi_lastStageExecuted = 2;
518 std::unique_ptr<TrigRoiDescriptor> tmpRoi = std::make_unique<TrigRoiDescriptor>(roi);
520 auto vertices = std::make_unique<TrigVertexCollection>();
521 std::vector<float> vZv;
526 mnt_timer_ZFinder.start();
529 tmpRoi = std::make_unique<TrigRoiDescriptor>(
true);
530 tmpRoi->setComposite(
true);
532 vertices = std::make_unique<TrigVertexCollection>(*
m_trigZFinder->findZ( convertedSpacePoints, roi));
538 vZv.reserve(vertices->size());
539 for (
const auto vertex : *vertices) {
541 float z = vertex->z();
542 float zMinus =
z - 7.0;
543 float zPlus =
z + 7.0;
546 tmpRoi->push_back(newRoi);
553 mnt_timer_ZFinder.stop();
561 return StatusCode::SUCCESS;
566 mnt_roi_lastStageExecuted = 3;
568 mnt_timer_PatternReco.start();
570 mnt_timer_TripletMaking.start();
572 std::vector<TrigInDetTriplet> triplets;
574 std::vector<TrigInDetTracklet> new_tracklets;
584 mnt_roi_nSPs = mnt_roi_nSPsPIX + mnt_roi_nSPsSCT;
587 ATH_MSG_DEBUG(
"REGTEST / Found " << mnt_roi_nSPs <<
" space points.");
588 ATH_MSG_DEBUG(
"REGTEST / Found " << mnt_roi_nSPsPIX <<
" Pixel space points.");
589 ATH_MSG_DEBUG(
"REGTEST / Found " << mnt_roi_nSPsSCT <<
" SCT space points.");
593 ATH_MSG_DEBUG(
"No tracks found - too few hits in ROI to run " << mnt_roi_nSPs);
595 return StatusCode::SUCCESS;
601 seedGen.loadSpacePoints(convertedSpacePoints);
604 seedGen.createSeeds(tmpRoi.get(), vZv);
607 seedGen.createSeeds(tmpRoi.get());
610 seedGen.getSeeds(triplets);
621 unsigned int nTrackSeeds =
m_useTracklets ? new_tracklets.size() : triplets.size();
625 mnt_timer_TripletMaking.stop();
626 mnt_roi_lastStageExecuted = 4;
628 mnt_timer_CombTracking.start();
632 std::vector<std::tuple<bool, double,Trk::Track*>> qualityTracks;
633 qualityTracks.reserve(nTrackSeeds);
638 long int trackIndex=0;
646 std::vector<Trk::Track*> disFailTrks;
647 std::vector<Trk::Track*> disCombTrks;
648 std::vector<std::tuple<bool, double, Trk::Track*>> qualityDisFailTrks;
649 std::vector<std::tuple<bool, double, Trk::Track*>> qualityDisCombTrks;
650 int disTrk_n_disCombTrks=0;
651 int disTrk_n_disCombTrks_cleaning=0;
652 int disTrk_n_disFailTrks=0;
653 int disTrk_n_disFailTrks_cleaning=0;
657 for(
unsigned int seedIdx=0;seedIdx!=nTrackSeeds;seedIdx++) {
659 std::vector<const Trk::SpacePoint*> spVec;
662 spVec = new_tracklets[seedIdx].seed();
671 spVec = {osp1, osp2, osp3};
674 vec_seedSize.push_back(spVec.size());
678 std::vector<Identifier> clusterIds;
688 std::list<Trk::Track*> tracks;
689 std::list<Trk::Track*> tracksFail;
690 std::list<Trk::Track*> tracksAll =
m_trackMaker->getTracks(ctx, trackEventData, spVec);
696 tracksFail = tracksAll;
700 ATH_MSG_VERBOSE(
"size of tracks=" << tracks.size() <<
", tracksFail=" << tracksFail.size() <<
": resultCode=" << resultCode);
702 for(std::list<Trk::Track*>::const_iterator t=tracks.begin(); t!=tracks.end(); ++t) {
703 if( ! (*t) )
continue;
705 disTrk_n_disCombTrks++;
708 disTrk_n_disCombTrks_cleaning++;
709 disCombTrks.push_back((*t));
710 qualityDisCombTrks.emplace_back(std::make_tuple(
true, -
disTrackQuality((*t)), (*t)));
713 for(std::list<Trk::Track*>::const_iterator t=tracksFail.begin(); t!=tracksFail.end(); ++t) {
714 if( ! (*t) )
continue;
716 disTrk_n_disFailTrks++;
719 disTrk_n_disFailTrks_cleaning++;
720 disFailTrks.push_back((*t));
721 qualityDisFailTrks.emplace_back(std::make_tuple(
true, -
disTrackQuality((*t)), (*t)));
729 for(std::list<Trk::Track*>::const_iterator t=tracks.begin(); t!=tracks.end(); ++t) {
731 float d0 = (*t)->perigeeParameters()==0 ? 10000.0 : (*t)->perigeeParameters()->parameters()[
Trk::d0];
734 qualityTracks.push_back(std::make_tuple(
false,0,(*t)));
742 qualityTracks.push_back(std::make_tuple(
true, -
trackQuality((*t)), (*t)));
745 qualityTracks.push_back(std::make_tuple(
true, 0, (*t)));
753 ATH_MSG_DEBUG(
"===> nr of disFailTrks=" << disTrk_n_disFailTrks <<
" -> cleaning pass=" << disTrk_n_disFailTrks_cleaning);
754 ATH_MSG_DEBUG(
"===> nr of disCombTrks=" << disTrk_n_disCombTrks <<
" -> cleaning pass=" << disTrk_n_disCombTrks_cleaning);
771 initialTracks.
reserve(qualityTracks.size());
777 std::vector<unsigned int> indexDisCombTrk;
778 for(
const auto& q : qualityTracks) {
779 bool needed_for_disCombTrk =
false;
782 for(
const auto& qdis : qualityDisCombTrks ) {
783 if( std::get<2>(qdis) == trk_q ) {
784 needed_for_disCombTrk = std::get<0>(qdis);
788 if( needed_for_disCombTrk)
ATH_MSG_VERBOSE(
"idx=" << idx <<
" ===> neded for disCombTrk");
790 if (std::get<0>(q)==
true) {
796 delete std::get<2>(q);
799 if( needed_for_disCombTrk ) {
801 extraDisCombTracks.
push_back(std::get<2>(q));
804 delete std::get<2>(q);
810 qualityTracks.clear();
815 mnt_timer_CombTracking.stop();
816 mnt_timer_PatternReco.stop();
818 mnt_roi_lastStageExecuted = 5;
820 mnt_timer_TrackFitter.start();
828 outputTracks = std::move(initialTracks);
837 mnt_timer_dEdxTrk.start();
845 if( outputTracks.
empty() ) {
850 bool do_recoverDisCombTrk =
true;
852 ATH_MSG_DEBUG(
"part of initialTracks fails in fitting. do not try to recover DisCombTracks");
853 do_recoverDisCombTrk =
false;
857 fittedExtraDisCombTracks.
reserve(extraDisCombTracks.
size());
861 if( extraDisCombTracks.
size() > 0 ) {
864 for (
auto fittedTrack = fittedExtraDisCombTracks.
begin(); fittedTrack!=fittedExtraDisCombTracks.
end(); ++fittedTrack) {
867 fittedDisCombTrks.
push_back(*fittedTrack);
874 for (
auto fittedTrack = outputTracks.
begin(); fittedTrack!=outputTracks.
end(); ) {
875 if ((*fittedTrack)->perigeeParameters()) {
876 float d0 = (*fittedTrack)->perigeeParameters()->parameters()[
Trk::d0];
877 float z0 = (*fittedTrack)->perigeeParameters()->parameters()[
Trk::z0];
880 ATH_MSG_DEBUG(
"REGTEST / Reject track after fit with d0 = " << d0 <<
" z0= " << z0
883 ATH_MSG_WARNING(
"REGTEST / Reject track after fit with d0 = " << d0 <<
" z0= " << z0
887 fittedTrack = outputTracks.
erase(fittedTrack);
896 fittedTrack = outputTracks.
erase(fittedTrack);
905 if(std::abs((*fittedTrack)->perigeeParameters()->parameters()[
Trk::qOverP]) >= 1e-9){
906 trkPt = std::sin((*fittedTrack)->perigeeParameters()->parameters()[
Trk::theta])/std::abs((*fittedTrack)->perigeeParameters()->parameters()[
Trk::qOverP]);
910 fittedTrack = outputTracks.
erase(fittedTrack);
920 mnt_timer_TrackFitter.stop();
927 for (
auto fittedTrack = outputTracks.
begin();fittedTrack!=outputTracks.
end();++fittedTrack) {
937 if( std::find(indexDisCombTrk.begin(),indexDisCombTrk.end(),idx)!=indexDisCombTrk.end() ) {
938 ATH_MSG_VERBOSE(
"fittedTrack idx=" << idx <<
": recovers also for DisCombTrack");
939 fittedDisCombTrks.
push_back(*fittedTrack);
947 if( outputTracks.
empty() ) {
950 mnt_roi_lastStageExecuted = 6;
952 mnt_roi_nTracks = outputTracks.
size();
955 std::vector<double> disTrk_v_xVtx;
956 std::vector<double> disTrk_v_yVtx;
957 std::vector<double> disTrk_v_zVtx;
959 mnt_timer_disTrkZVertex.start();
961 mnt_timer_disTrkZVertex.stop();
966 mnt_timer_disTrk.start();
967 ATH_CHECK(
findDisTracks(ctx,outputTracks,qualityDisFailTrks,qualityDisCombTrks,fittedDisCombTrks,disTrk_v_xVtx,disTrk_v_yVtx,disTrk_v_zVtx) );
968 mnt_timer_disTrk.stop();
974 if( !outputTracks.
empty() )
978 fillMon(outputTracks, *vertices, roi, ctx);
980 mnt_roi_lastStageExecuted = 7;
982 mnt_timer_Total.stop();
984 return StatusCode::SUCCESS;
993 double quality = 0. ;
994 const double W = 17.;
1002 if(fq.
numberDoF() == 2) q = (1.2*(W-x2*.5));
1012 std::set<const Trk::PrepRawData*> clusters;
1017 [](
const std::tuple<bool, double, Trk::Track*>& lhs,
const std::tuple<bool, double, Trk::Track*>& rhs) {
1018 return std::get<1>(lhs) < std::get<1>(rhs); } );
1020 for (
auto& q : QT) {
1022 m = std::get<2>(q)->measurementsOnTrack()->begin(),
1023 me = std::get<2>(q)->measurementsOnTrack()->end ();
1026 for(; m!=me; ++m ) {
1031 if(clusters.find(pr)==clusters.end()) {prd[nf++]=pr;
if(nf==100)
break;}
1035 for(
int n=0; n!=nf; ++n) clusters.insert(prd[n]);
1038 std::get<0>(q) =
false;
1048 ATH_MSG_INFO(
"=========================================================");
1049 ATH_MSG_INFO(
"TrigFastTrackFinder::finalize() - TrigFastTrackFinder Statistics: ");
1053 ATH_MSG_INFO(
"=========================================================");
1055 return StatusCode::SUCCESS;
1064 if (siCLOT==
nullptr)
continue;
1066 if (siCL==
nullptr)
continue;
1071 if(pixCL==
nullptr)
continue;
1075 clusterMap[id].push_back(trackIdx);
1081 if(pCL!=
nullptr) vIds.push_back(pCL->
identify());
1084 if(pCL!=
nullptr) vIds.push_back(pCL->
identify());
1089 std::vector<long int> xSection;
1091 std::map<Identifier, std::vector<long int> >
::iterator itm0 = clusterMap.find(*vIds.begin());
1092 if(itm0 == clusterMap.end())
return false;
1093 xSection.reserve((*itm0).second.size());
1094 std::copy((*itm0).second.begin(), (*itm0).second.end(), std::back_inserter(xSection));
1095 std::vector<Identifier>::const_iterator it = vIds.begin();++it;
1096 for(;it!=vIds.end();++it) {
1097 std::map<Identifier, std::vector<long int> >
::iterator itm1 = clusterMap.find(*it);
1098 if(itm1 == clusterMap.end())
return false;
1099 std::vector<long int> tmp;
1100 std::set_intersection(xSection.begin(), xSection.end(), (*itm1).second.begin(),(*itm1).second.end(), std::back_inserter(tmp));
1101 if(tmp.empty())
return false;
1104 xSection.reserve(tmp.size());
1105 std::copy(tmp.begin(), tmp.end(), std::back_inserter(xSection));
1107 return !xSection.empty();
1124 auto monRoI =
Monitored::Group(
m_monTool, mnt_roi_eta, mnt_roi_phi, mnt_roi_etaWidth, mnt_roi_phiWidth, mnt_roi_z, mnt_roi_zWidth);
1127 for(
unsigned int i=0; i<roi.
size(); i++) {
1130 mnt_roi_eta = subroi->
eta();
1131 mnt_roi_phi = subroi->
phi();
1134 mnt_roi_z = subroi->
zed();
1141 mnt_roi_eta = roi.
eta();
1142 mnt_roi_phi = roi.
phi();
1145 mnt_roi_z = roi.
zed();
1149 std::vector<float> mnt_trk_pt;
1150 std::vector<float> mnt_trk_a0;
1151 std::vector<float> mnt_trk_z0;
1152 std::vector<float> mnt_trk_phi0;
1153 std::vector<float> mnt_trk_eta;
1154 std::vector<float> mnt_trk_chi2dof;
1155 std::vector<float> mnt_trk_nSiHits;
1156 std::vector<float> mnt_trk_nPIXHits;
1157 std::vector<float> mnt_trk_nSCTHits;
1158 std::vector<float> mnt_trk_a0beam;
1159 std::vector<float> mnt_trk_z0beam;
1160 std::vector<float> mnt_trk_dPhi0;
1161 std::vector<float> mnt_trk_dEta;
1177 mon_nSiHits, mon_nPIXHits, mon_nSCTHits, mon_a0beam, mon_z0beam, mon_dPhi0, mon_dEta);
1179 std::vector<float> mnt_roi_zVertices;
1183 mon_roi_nZvertices = vertices.
size();
1184 for (
const auto vertex : vertices) {
1185 mnt_roi_zVertices.push_back(vertex->z());
1188 for (
auto track : tracks) {
1190 if(trackPars==
nullptr) {
1194 if(trackPars->covariance()==
nullptr) {
1198 float a0 = trackPars->parameters()[
Trk::d0];
1199 float z0 = trackPars->parameters()[
Trk::z0];
1200 float phi0 = trackPars->parameters()[
Trk::phi0];
1203 mnt_trk_a0.push_back(
a0);
1204 mnt_trk_z0.push_back(z0);
1205 mnt_trk_phi0.push_back(phi0);
1206 mnt_trk_a0beam.push_back(
a0+shift_x*std::sin(phi0)-shift_y*std::cos(phi0));
1207 mnt_trk_z0beam.push_back(z0+(shift_x*std::cos(phi0)+shift_y*std::sin(phi0))/std::tan(
theta));
1208 mnt_trk_eta.push_back(
eta);
1209 for(
unsigned int i=0; i<roi.
size(); i++) {
1211 mnt_trk_dEta.push_back(
eta - (roi.
at(i))->eta());
1214 float qOverP = trackPars->parameters()[
Trk::qOverP];
1219 float pT=sin(
theta)/qOverP;
1230 mnt_trk_pt.push_back(pT);
1231 mnt_trk_chi2dof.push_back(
chi2);
1235 for(
auto tSOS = track->trackStateOnSurfaces()->begin();
1236 tSOS!=track->trackStateOnSurfaces()->end(); ++tSOS) {
1245 mnt_trk_nPIXHits.push_back(nPix);
1246 mnt_trk_nSCTHits.push_back(nSct/2);
1247 mnt_trk_nSiHits.push_back(nPix + nSct/2);
1249 ATH_MSG_DEBUG(
"REGTEST / track npix/nsct/phi0/pt/eta/d0/z0/chi2: " <<
1259 bool goodTrack = std::fabs(pT)>1000. && (nPix + nSct/2) > 3 && nSct > 0;
1268 std::vector<float> mnt_layer_IBL;
1269 std::vector<float> mnt_layer_PixB;
1270 std::vector<float> mnt_layer_PixE;
1271 std::vector<float> mnt_layer_SCTB;
1272 std::vector<float> mnt_layer_SCTE;
1273 std::vector<float> mnt_hit_IBLPhiResidual;
1274 std::vector<float> mnt_hit_IBLEtaResidual;
1275 std::vector<float> mnt_hit_IBLPhiPull;
1276 std::vector<float> mnt_hit_IBLEtaPull;
1277 std::vector<float> mnt_hit_PIXBarrelPhiResidual;
1278 std::vector<float> mnt_hit_PIXBarrelEtaResidual;
1279 std::vector<float> mnt_hit_PIXBarrelPhiPull;
1280 std::vector<float> mnt_hit_PIXBarrelEtaPull;
1281 std::vector<float> mnt_hit_SCTBarrelResidual;
1282 std::vector<float> mnt_hit_SCTBarrelPull;
1283 std::vector<float> mnt_hit_PIXEndcapPhiResidual;
1284 std::vector<float> mnt_hit_PIXEndcapEtaResidual;
1285 std::vector<float> mnt_hit_PIXEndcapPhiPull;
1286 std::vector<float> mnt_hit_PIXEndcapEtaPull;
1287 std::vector<float> mnt_hit_SCTEndcapResidual;
1288 std::vector<float> mnt_hit_SCTEndcapPull;
1289 std::vector<float> mnt_hit_PIXBarrelL1PhiResidual;
1290 std::vector<float> mnt_hit_PIXBarrelL1EtaResidual;
1291 std::vector<float> mnt_hit_PIXBarrelL2PhiResidual;
1292 std::vector<float> mnt_hit_PIXBarrelL2EtaResidual;
1293 std::vector<float> mnt_hit_PIXBarrelL3PhiResidual;
1294 std::vector<float> mnt_hit_PIXBarrelL3EtaResidual;
1295 std::vector<float> mnt_hit_PIXEndcapL1PhiResidual;
1296 std::vector<float> mnt_hit_PIXEndcapL1EtaResidual;
1297 std::vector<float> mnt_hit_PIXEndcapL2PhiResidual;
1298 std::vector<float> mnt_hit_PIXEndcapL2EtaResidual;
1299 std::vector<float> mnt_hit_PIXEndcapL3PhiResidual;
1300 std::vector<float> mnt_hit_PIXEndcapL3EtaResidual;
1301 std::vector<float> mnt_hit_SCTBarrelL1PhiResidual;
1302 std::vector<float> mnt_hit_SCTBarrelL2PhiResidual;
1303 std::vector<float> mnt_hit_SCTBarrelL3PhiResidual;
1304 std::vector<float> mnt_hit_SCTBarrelL4PhiResidual;
1305 std::vector<float> mnt_hit_SCTEndcapL1PhiResidual;
1306 std::vector<float> mnt_hit_SCTEndcapL2PhiResidual;
1307 std::vector<float> mnt_hit_SCTEndcapL3PhiResidual;
1308 std::vector<float> mnt_hit_SCTEndcapL4PhiResidual;
1309 std::vector<float> mnt_hit_SCTEndcapL5PhiResidual;
1310 std::vector<float> mnt_hit_SCTEndcapL6PhiResidual;
1311 std::vector<float> mnt_hit_SCTEndcapL7PhiResidual;
1312 std::vector<float> mnt_hit_SCTEndcapL8PhiResidual;
1313 std::vector<float> mnt_hit_SCTEndcapL9PhiResidual;
1323 auto mon_hit_PIXBarrelPhiResidual =
Monitored::Collection(
"hit_PIXBarrelPhiResidual",mnt_hit_PIXBarrelPhiResidual);
1324 auto mon_hit_PIXBarrelEtaResidual =
Monitored::Collection(
"hit_PIXBarrelEtaResidual",mnt_hit_PIXBarrelEtaResidual);
1325 auto mon_hit_PIXBarrelPhiPull =
Monitored::Collection(
"hit_PIXBarrelPhiPull",mnt_hit_PIXBarrelPhiPull);
1326 auto mon_hit_PIXBarrelEtaPull =
Monitored::Collection(
"hit_PIXBarrelEtaPull",mnt_hit_PIXBarrelEtaPull);
1327 auto mon_hit_SCTBarrelResidual =
Monitored::Collection(
"hit_SCTBarrelResidual",mnt_hit_SCTBarrelResidual);
1329 auto mon_hit_PIXEndcapPhiResidual =
Monitored::Collection(
"hit_PIXEndcapPhiResidual",mnt_hit_PIXEndcapPhiResidual);
1330 auto mon_hit_PIXEndcapEtaResidual =
Monitored::Collection(
"hit_PIXEndcapEtaResidual",mnt_hit_PIXEndcapEtaResidual);
1331 auto mon_hit_PIXEndcapPhiPull =
Monitored::Collection(
"hit_PIXEndcapPhiPull",mnt_hit_PIXEndcapPhiPull);
1332 auto mon_hit_PIXEndcapEtaPull =
Monitored::Collection(
"hit_PIXEndcapEtaPull",mnt_hit_PIXEndcapEtaPull);
1333 auto mon_hit_SCTEndcapResidual =
Monitored::Collection(
"hit_SCTEndcapResidual",mnt_hit_SCTEndcapResidual);
1335 auto mon_hit_PIXBarrelL1PhiResidual =
Monitored::Collection(
"hit_PIXBarrelL1PhiResidual",mnt_hit_PIXBarrelL1PhiResidual);
1336 auto mon_hit_PIXBarrelL1EtaResidual =
Monitored::Collection(
"hit_PIXBarrelL1EtaResidual",mnt_hit_PIXBarrelL1EtaResidual);
1337 auto mon_hit_PIXBarrelL2PhiResidual =
Monitored::Collection(
"hit_PIXBarrelL2PhiResidual",mnt_hit_PIXBarrelL2PhiResidual);
1338 auto mon_hit_PIXBarrelL2EtaResidual =
Monitored::Collection(
"hit_PIXBarrelL2EtaResidual",mnt_hit_PIXBarrelL2EtaResidual);
1339 auto mon_hit_PIXBarrelL3PhiResidual =
Monitored::Collection(
"hit_PIXBarrelL3PhiResidual",mnt_hit_PIXBarrelL3PhiResidual);
1340 auto mon_hit_PIXBarrelL3EtaResidual =
Monitored::Collection(
"hit_PIXBarrelL3EtaResidual",mnt_hit_PIXBarrelL3EtaResidual);
1341 auto mon_hit_PIXEndcapL1PhiResidual =
Monitored::Collection(
"hit_PIXEndcapL1PhiResidual",mnt_hit_PIXEndcapL1PhiResidual);
1342 auto mon_hit_PIXEndcapL1EtaResidual =
Monitored::Collection(
"hit_PIXEndcapL1EtaResidual",mnt_hit_PIXEndcapL1EtaResidual);
1343 auto mon_hit_PIXEndcapL2PhiResidual =
Monitored::Collection(
"hit_PIXEndcapL2PhiResidual",mnt_hit_PIXEndcapL2PhiResidual);
1344 auto mon_hit_PIXEndcapL2EtaResidual =
Monitored::Collection(
"hit_PIXEndcapL2EtaResidual",mnt_hit_PIXEndcapL2EtaResidual);
1345 auto mon_hit_PIXEndcapL3PhiResidual =
Monitored::Collection(
"hit_PIXEndcapL3PhiResidual",mnt_hit_PIXEndcapL3PhiResidual);
1346 auto mon_hit_PIXEndcapL3EtaResidual =
Monitored::Collection(
"hit_PIXEndcapL3EtaResidual",mnt_hit_PIXEndcapL3EtaResidual);
1347 auto mon_hit_SCTBarrelL1PhiResidual =
Monitored::Collection(
"hit_SCTBarrelL1PhiResidual",mnt_hit_SCTBarrelL1PhiResidual);
1348 auto mon_hit_SCTBarrelL2PhiResidual =
Monitored::Collection(
"hit_SCTBarrelL2PhiResidual",mnt_hit_SCTBarrelL2PhiResidual);
1349 auto mon_hit_SCTBarrelL3PhiResidual =
Monitored::Collection(
"hit_SCTBarrelL3PhiResidual",mnt_hit_SCTBarrelL3PhiResidual);
1350 auto mon_hit_SCTBarrelL4PhiResidual =
Monitored::Collection(
"hit_SCTBarrelL4PhiResidual",mnt_hit_SCTBarrelL4PhiResidual);
1351 auto mon_hit_SCTEndcapL1PhiResidual =
Monitored::Collection(
"hit_SCTEndcapL1PhiResidual",mnt_hit_SCTEndcapL1PhiResidual);
1352 auto mon_hit_SCTEndcapL2PhiResidual =
Monitored::Collection(
"hit_SCTEndcapL2PhiResidual",mnt_hit_SCTEndcapL2PhiResidual);
1353 auto mon_hit_SCTEndcapL3PhiResidual =
Monitored::Collection(
"hit_SCTEndcapL3PhiResidual",mnt_hit_SCTEndcapL3PhiResidual);
1354 auto mon_hit_SCTEndcapL4PhiResidual =
Monitored::Collection(
"hit_SCTEndcapL4PhiResidual",mnt_hit_SCTEndcapL4PhiResidual);
1355 auto mon_hit_SCTEndcapL5PhiResidual =
Monitored::Collection(
"hit_SCTEndcapL5PhiResidual",mnt_hit_SCTEndcapL5PhiResidual);
1356 auto mon_hit_SCTEndcapL6PhiResidual =
Monitored::Collection(
"hit_SCTEndcapL6PhiResidual",mnt_hit_SCTEndcapL6PhiResidual);
1357 auto mon_hit_SCTEndcapL7PhiResidual =
Monitored::Collection(
"hit_SCTEndcapL7PhiResidual",mnt_hit_SCTEndcapL7PhiResidual);
1358 auto mon_hit_SCTEndcapL8PhiResidual =
Monitored::Collection(
"hit_SCTEndcapL8PhiResidual",mnt_hit_SCTEndcapL8PhiResidual);
1359 auto mon_hit_SCTEndcapL9PhiResidual =
Monitored::Collection(
"hit_SCTEndcapL9PhiResidual",mnt_hit_SCTEndcapL9PhiResidual);
1361 auto monRes =
Monitored::Group(
m_monTool, mon_layer_IBL, mon_layer_PixB, mon_layer_PixE, mon_layer_SCTB, mon_layer_SCTE, mon_hit_IBLPhiResidual, mon_hit_IBLEtaResidual, mon_hit_IBLPhiPull, mon_hit_IBLEtaPull, mon_hit_PIXBarrelPhiResidual, mon_hit_PIXBarrelEtaResidual, mon_hit_PIXBarrelPhiPull, mon_hit_PIXBarrelEtaPull, mon_hit_SCTBarrelResidual, mon_hit_SCTBarrelPull, mon_hit_PIXEndcapPhiResidual, mon_hit_PIXEndcapEtaResidual, mon_hit_PIXEndcapPhiPull, mon_hit_PIXEndcapEtaPull, mon_hit_SCTEndcapResidual, mon_hit_SCTEndcapPull, mon_hit_PIXBarrelL1PhiResidual, mon_hit_PIXBarrelL1EtaResidual, mon_hit_PIXBarrelL2PhiResidual, mon_hit_PIXBarrelL2EtaResidual, mon_hit_PIXBarrelL3PhiResidual, mon_hit_PIXBarrelL3EtaResidual, mon_hit_PIXEndcapL1PhiResidual, mon_hit_PIXEndcapL1EtaResidual, mon_hit_PIXEndcapL2PhiResidual, mon_hit_PIXEndcapL2EtaResidual, mon_hit_PIXEndcapL3PhiResidual, mon_hit_PIXEndcapL3EtaResidual, mon_hit_SCTBarrelL1PhiResidual, mon_hit_SCTBarrelL2PhiResidual, mon_hit_SCTBarrelL3PhiResidual, mon_hit_SCTBarrelL4PhiResidual, mon_hit_SCTEndcapL1PhiResidual, mon_hit_SCTEndcapL2PhiResidual, mon_hit_SCTEndcapL3PhiResidual, mon_hit_SCTEndcapL4PhiResidual, mon_hit_SCTEndcapL5PhiResidual, mon_hit_SCTEndcapL6PhiResidual, mon_hit_SCTEndcapL7PhiResidual, mon_hit_SCTEndcapL8PhiResidual, mon_hit_SCTEndcapL9PhiResidual);
1363 std::vector<TrigL2HitResidual> vResid;
1366 if(!scRes.isSuccess())
return;
1367 for(std::vector<TrigL2HitResidual>::iterator it=vResid.begin();it!=vResid.end();++it) {
1369 int pixlayer= (
m_pixelId->layer_disk(
id) );
1370 int sctlayer= (
m_sctId->layer_disk(
id) );
1372 switch(it->regionId()) {
1374 mnt_layer_PixB.push_back(pixlayer);
1375 mnt_hit_PIXBarrelPhiResidual.push_back(it->phiResidual());
1376 mnt_hit_PIXBarrelPhiPull.push_back(it->phiPull());
1377 mnt_hit_PIXBarrelEtaResidual.push_back(it->etaResidual());
1378 mnt_hit_PIXBarrelEtaPull.push_back(it->etaPull());
1379 if (pixlayer == 1) {
1380 mnt_hit_PIXBarrelL1PhiResidual.push_back(it->phiResidual());
1381 mnt_hit_PIXBarrelL1EtaResidual.push_back(it->etaResidual());
1383 if (pixlayer == 2) {
1384 mnt_hit_PIXBarrelL2PhiResidual.push_back(it->phiResidual());
1385 mnt_hit_PIXBarrelL2EtaResidual.push_back(it->etaResidual());
1387 if (pixlayer == 3) {
1388 mnt_hit_PIXBarrelL3PhiResidual.push_back(it->phiResidual());
1389 mnt_hit_PIXBarrelL3EtaResidual.push_back(it->etaResidual());
1394 mnt_layer_PixE.push_back(pixlayer);
1395 mnt_hit_PIXEndcapPhiResidual.push_back(it->phiResidual());
1396 mnt_hit_PIXEndcapPhiPull.push_back(it->phiPull());
1397 mnt_hit_PIXEndcapEtaResidual.push_back(it->etaResidual());
1398 mnt_hit_PIXEndcapEtaPull.push_back(it->etaPull());
1399 if (pixlayer == 0) {
1400 mnt_hit_PIXEndcapL1PhiResidual.push_back(it->phiResidual());
1401 mnt_hit_PIXEndcapL1EtaResidual.push_back(it->etaResidual());
1403 if (pixlayer == 1) {
1404 mnt_hit_PIXEndcapL2PhiResidual.push_back(it->phiResidual());
1405 mnt_hit_PIXEndcapL2EtaResidual.push_back(it->etaResidual());
1407 if (pixlayer == 2) {
1408 mnt_hit_PIXEndcapL3PhiResidual.push_back(it->phiResidual());
1409 mnt_hit_PIXEndcapL3EtaResidual.push_back(it->etaResidual());
1413 mnt_layer_SCTB.push_back(sctlayer);
1414 mnt_hit_SCTBarrelResidual.push_back(it->phiResidual());
1415 mnt_hit_SCTBarrelPull.push_back(it->phiPull());
1416 if (sctlayer == 0) {
1417 mnt_hit_SCTBarrelL1PhiResidual.push_back(it->phiResidual());
1419 if (sctlayer == 1) {
1420 mnt_hit_SCTBarrelL2PhiResidual.push_back(it->phiResidual());
1422 if (sctlayer == 2) {
1423 mnt_hit_SCTBarrelL3PhiResidual.push_back(it->phiResidual());
1425 if (sctlayer == 3) {
1426 mnt_hit_SCTBarrelL4PhiResidual.push_back(it->phiResidual());
1431 mnt_layer_SCTE.push_back(sctlayer);
1432 mnt_hit_SCTEndcapResidual.push_back(it->phiResidual());
1433 mnt_hit_SCTEndcapPull.push_back(it->phiPull());
1434 if (sctlayer == 0) {
1435 mnt_hit_SCTEndcapL1PhiResidual.push_back(it->phiResidual());
1437 if (sctlayer == 1) {
1438 mnt_hit_SCTEndcapL2PhiResidual.push_back(it->phiResidual());
1440 if (sctlayer == 2) {
1441 mnt_hit_SCTEndcapL3PhiResidual.push_back(it->phiResidual());
1443 if (sctlayer == 3) {
1444 mnt_hit_SCTEndcapL4PhiResidual.push_back(it->phiResidual());
1446 if (sctlayer == 4) {
1447 mnt_hit_SCTEndcapL5PhiResidual.push_back(it->phiResidual());
1449 if (sctlayer == 5) {
1450 mnt_hit_SCTEndcapL6PhiResidual.push_back(it->phiResidual());
1452 if (sctlayer == 6) {
1453 mnt_hit_SCTEndcapL7PhiResidual.push_back(it->phiResidual());
1455 if (sctlayer == 7) {
1456 mnt_hit_SCTEndcapL8PhiResidual.push_back(it->phiResidual());
1458 if (sctlayer == 8) {
1459 mnt_hit_SCTEndcapL9PhiResidual.push_back(it->phiResidual());
1463 mnt_layer_IBL.push_back(pixlayer);
1464 if (
m_tcs.m_maxSiliconLayer==32) {
1465 mnt_hit_IBLPhiResidual.push_back(it->phiResidual());
1466 mnt_hit_IBLPhiPull.push_back(it->phiPull());
1467 mnt_hit_IBLEtaResidual.push_back(it->etaResidual());
1468 mnt_hit_IBLEtaPull.push_back(it->etaPull());
1472 mnt_hit_PIXBarrelPhiResidual.push_back(it->phiResidual());
1473 mnt_hit_PIXBarrelPhiPull.push_back(it->phiPull());
1474 mnt_hit_PIXBarrelEtaResidual.push_back(it->etaResidual());
1475 mnt_hit_PIXBarrelEtaPull.push_back(it->etaPull());
1492 size_t actualSize =
m_accelTool->exportSeedMakingJob(tcs, roi, vsp, *dataBuffer);
1494 ATH_MSG_DEBUG(
"SeedMakingJob is ready, data size for transfer = " <<actualSize);
1496 std::shared_ptr<TrigAccel::OffloadBuffer> pBuff = std::make_shared<TrigAccel::OffloadBuffer>(dataBuffer);
1505 std::shared_ptr<TrigAccel::OffloadBuffer> pOB = pJob->
getOutput();
1507 int nTriplets =
m_accelTool->extractTripletsFromOutput(pOB,vsp, output);
1520 ATH_CHECK( dEdxTrkHandle.
record(std::make_unique<xAOD::TrigCompositeContainer>(), std::make_unique<xAOD::TrigCompositeAuxContainer>()) );
1523 ATH_CHECK( dEdxHitHandle.
record(std::make_unique<xAOD::TrigCompositeContainer>(), std::make_unique<xAOD::TrigCompositeAuxContainer>()) );
1527 ATH_CHECK( disTrkCandHandle.
record(std::make_unique<xAOD::TrigCompositeContainer>(), std::make_unique<xAOD::TrigCompositeAuxContainer>()) );
1529 return StatusCode::SUCCESS;
1535 float abseta = std::fabs(
eta);
1538 if( 0<=layer && layer <=7 ) {
1546 const float PixBR6limit = 1.29612;
1547 const float PixBR5limit = 1.45204;
1548 const float PixBR4limit = 1.64909;
1549 const float PixBR3limit = 1.90036;
1550 const float PixBR2limit = 2.2146;
1554 if( layer==
base || layer==(
base+12) ) {
1556 if( abseta > PixBR2limit )
return 2;
1562 if( layer==
base || layer==(
base+12) ) {
1564 if( abseta > PixBR2limit )
return 2;
1570 if( layer==
base || layer==(
base+12) ) {
1577 if( layer==
base || layer==(
base+12) ) {
1579 if( abseta < PixBR6limit )
return 7;
1580 else if( abseta < PixBR5limit )
return 6;
1586 if( layer==
base || layer==(
base+12) ) {
1588 if( abseta < PixBR5limit )
return 7;
1589 else if( abseta < PixBR4limit )
return 6;
1595 if( layer==
base || layer==(
base+12) ) {
1597 if( abseta < PixBR4limit )
return 7;
1603 if( layer==
base || layer==(
base+12) ) {
1605 if( abseta < PixBR4limit )
return 6;
1606 else if( abseta < PixBR3limit )
return 6;
1612 if( layer==
base || layer==(
base+12) ) {
1614 if( abseta < PixBR3limit )
return 7;
1620 if( layer==
base || layer==(
base+12) ) {
1622 if( abseta < PixBR3limit )
return 6;
1628 if( layer==
base || layer==(
base+12) ) {
1630 if( abseta < PixBR3limit )
return 7;
1636 if( layer==
base || layer==(
base+12) ) {
1638 if( abseta < PixBR3limit )
return 7;
1644 if( layer==
base || layer==(
base+12) ) {
1656 ATH_CHECK( dEdxTrkHandle.
record(std::make_unique<xAOD::TrigCompositeContainer>(), std::make_unique<xAOD::TrigCompositeAuxContainer>()) );
1657 auto dEdxTrkContainer = dEdxTrkHandle.
ptr();
1658 dEdxTrkContainer->reserve(outputTracks.
size());
1661 ATH_CHECK( dEdxHitHandle.
record(std::make_unique<xAOD::TrigCompositeContainer>(), std::make_unique<xAOD::TrigCompositeAuxContainer>()) );
1662 auto dEdxHitContainer = dEdxHitHandle.
ptr();
1664 std::vector<float> mnt_dedx;
1665 std::vector<int> mnt_dedx_nusedhits;
1675 static constexpr float TRKCUT_PTGEV_LOOSE = 3.0;
1676 static constexpr float TRKCUT_PTGEV_TIGHT = 10.0;
1677 static constexpr float TRKCUT_DEDX_LOOSE = 1.25;
1678 static constexpr float TRKCUT_DEDX_TIGHT = 1.55;
1680 for (
const auto track: outputTracks) {
1682 float shift_x = 0;
float shift_y = 0;
1692 bool igt =
FTF::isGoodTrackUTT(track, theTrackInfo, shift_x, shift_y, TRKCUT_PTGEV_LOOSE);
1693 if (not igt) {
continue;}
1696 int pixelhits=0;
int n_usedhits=0;
1697 std::vector<float> v_pixhit_dedx; std::vector<float> v_pixhit_tot; std::vector<float> v_pixhit_trkchi2; std::vector<float> v_pixhit_trkndof;
1698 std::vector<int> v_pixhit_iblovfl; std::vector<int> v_pixhit_loc; std::vector<int> v_pixhit_layer;
1699 float dedx =
dEdx(track,pixelhits,n_usedhits,v_pixhit_dedx,v_pixhit_tot,v_pixhit_trkchi2,v_pixhit_trkndof,
1700 v_pixhit_iblovfl,v_pixhit_loc,v_pixhit_layer);
1703 mnt_dedx.push_back(dedx);
1704 mnt_dedx_nusedhits.push_back(n_usedhits);
1706 bool hpt = (theTrackInfo.
ptGeV >= TRKCUT_PTGEV_TIGHT && dedx >= TRKCUT_DEDX_LOOSE);
1707 bool lpt = (theTrackInfo.
ptGeV >= TRKCUT_PTGEV_LOOSE && dedx >= TRKCUT_DEDX_TIGHT);
1708 if( ! hpt && ! lpt )
continue;
1711 dEdxTrkContainer->push_back(dEdxTrk);
1712 dEdxTrk->
setDetail<
int> (
"dEdxTrk_id", i_track);
1713 dEdxTrk->
setDetail<
float>(
"dEdxTrk_pt", theTrackInfo.
ptGeV*Gaudi::Units::GeV);
1714 dEdxTrk->
setDetail<
float>(
"dEdxTrk_eta", theTrackInfo.
eta);
1715 dEdxTrk->
setDetail<
float>(
"dEdxTrk_phi", theTrackInfo.
phi0);
1717 dEdxTrk->
setDetail<
float>(
"dEdxTrk_dedx", dedx);
1718 dEdxTrk->
setDetail<
int> (
"dEdxTrk_dedx_n_usedhits", n_usedhits);
1724 for(
unsigned int i=0; i<v_pixhit_dedx.size(); i++) {
1726 dEdxHitContainer->push_back(dEdxHit);
1727 dEdxHit->
setDetail<
int> (
"dEdxHit_trkid", i_track);
1728 dEdxHit->
setDetail<
float>(
"dEdxHit_dedx", v_pixhit_dedx[i]);
1729 dEdxHit->
setDetail<
float>(
"dEdxHit_tot", v_pixhit_tot[i]);
1730 dEdxHit->
setDetail<
float>(
"dEdxHit_trkchi2", v_pixhit_trkchi2[i]);
1731 dEdxHit->
setDetail<
float>(
"dEdxHit_trkndof", v_pixhit_trkndof[i]);
1732 dEdxHit->
setDetail<
int> (
"dEdxHit_iblovfl", v_pixhit_iblovfl[i]);
1733 dEdxHit->
setDetail<
int> (
"dEdxHit_loc", v_pixhit_loc[i]);
1734 dEdxHit->
setDetail<
int> (
"dEdxHit_layer", v_pixhit_layer[i]);
1737 return StatusCode::SUCCESS;
1743 std::vector<float>& v_pixhit_dedx, std::vector<float>& v_pixhit_tot,
1744 std::vector<float>& v_pixhit_trkchi2, std::vector<float>& v_pixhit_trkndof,
1745 std::vector<int>& v_pixhit_iblovfl, std::vector<int>& v_pixhit_loc, std::vector<int>& v_pixhit_layer)
const
1747 const float Pixel_sensorthickness=.025;
1748 const float IBL_3D_sensorthickness=.023;
1749 const float IBL_PLANAR_sensorthickness=.020;
1751 const float energyPair = 3.68e-6;
1752 const float sidensity = 2.329;
1754 float conversion_factor=energyPair/sidensity;
1761 v_pixhit_dedx.clear();
1762 v_pixhit_tot.clear();
1763 v_pixhit_trkchi2.clear();
1764 v_pixhit_trkndof.clear();
1765 v_pixhit_iblovfl.clear();
1766 v_pixhit_loc.clear();
1767 v_pixhit_layer.clear();
1769 const int PIXLOC_IBL_PL = 0;
1770 const int PIXLOC_IBL_3D = 1;
1771 const int PIXLOC_PIX_LY = 2;
1772 const int PIXLOC_PIX_EC = 3;
1773 const int PIXLOC_IBL_UNKNOWN = 4;
1774 const int PIXLOC_PIX_UNKNOWN = 5;
1776 std::multimap<float,int> dEdxMap;
1777 float dEdxValue = 0;
1781 if (recoTrackStates) {
1789 for ( ; tsosIter != tsosIterEnd; ++tsosIter) {
1794 if ( measurement ==
nullptr ) {
1799 if( tp ==
nullptr ) {
1804 if ( pixclus ==
nullptr ) {
1809 if( prd ==
nullptr ) {
1815 float cosalpha = std::abs(dotProd/tp->
momentum().mag());
1816 ATH_MSG_VERBOSE(
"dotProd / cosalpha = " << dotProd <<
" / " << cosalpha);
1817 if (std::abs(cosalpha)<.16)
continue;
1819 const std::vector<int>& v_tots = prd->
totList();
1843 if ( (bec==0) and (layer==0) ){
1844 const float overflowIBLToT = 16;
1845 for (
int pixToT : v_tots) {
1846 if (pixToT >= overflowIBLToT) {
1853 if(((eta_module>=-10 && eta_module<=-7)||(eta_module>=6 && eta_module<=9)) && (std::abs(locy)<10. && (locx>-8.33 && locx <8.3)) ){
1854 thickness = IBL_3D_sensorthickness;
1855 loc = PIXLOC_IBL_3D;
1857 else if((eta_module>=-6 && eta_module<=5) && (std::abs(locy)<20. &&( locx >-8.33 && locx <8.3 )) ){
1858 thickness = IBL_PLANAR_sensorthickness;
1859 loc = PIXLOC_IBL_PL;
1863 loc = PIXLOC_IBL_UNKNOWN;
1866 else if(bec==0 && std::abs(locy)<30. && (( locx > -8.20 && locx < -0.60 ) || ( locx > 0.50 && locx < 8.10 ) ) ){
1867 thickness = Pixel_sensorthickness;
1868 loc = PIXLOC_PIX_LY;
1870 else if(std::abs(bec) == 2 && std::abs(locy)<30. && ( ( locx > -8.15 && locx < -0.55 ) || ( locx > 0.55 && locx < 8.15 ) ) ) {
1871 thickness = Pixel_sensorthickness;
1872 loc = PIXLOC_PIX_EC;
1876 loc = PIXLOC_IBL_UNKNOWN;
1880 if( loc != PIXLOC_IBL_UNKNOWN && loc != PIXLOC_PIX_UNKNOWN ) {
1881 dEdxValue =
charge*conversion_factor/thickness;
1882 dEdxMap.insert(std::pair<float,int>(dEdxValue, iblOverflow));
1886 v_pixhit_dedx.push_back(dEdxValue); v_pixhit_tot.push_back(tot);
1887 v_pixhit_trkchi2.push_back(
chi2); v_pixhit_trkndof.push_back(ndof);
1888 v_pixhit_iblovfl.push_back(iblOverflow); v_pixhit_loc.push_back(loc); v_pixhit_layer.push_back(layer);
1895 float averagedEdx=0.;
1900 for (std::pair<float,int> itdEdx : dEdxMap) {
1902 if(itdEdx.second==0){
1904 averagedEdx += itdEdx.first;
1907 if(itdEdx.second > 0){
1912 if (((
int)pixelhits >= 5) and ((
int)n_usedhits >= (
int)pixelhits-2)) {
1918 if((
int)IBLOverflow>0 and ((
int)pixelhits==3) and (
int)n_usedhits==1) {
1922 if((
int)IBLOverflow>0 and ((
int)pixelhits==4) and (
int)n_usedhits==2) {
1927 if (((
int)pixelhits > 1) and ((
int)n_usedhits >=(
int)pixelhits-1)) {
1932 if((
int)IBLOverflow>0 and (
int)pixelhits==1){
1934 averagedEdx=itdEdx.first;
1939 if (n_usedhits > 0 or (n_usedhits==0 and(
int)IBLOverflow>0 and (
int)pixelhits==1)) {
1940 if(n_usedhits > 0) averagedEdx = averagedEdx / n_usedhits;
1942 ATH_MSG_DEBUG(
"=====> averaged dEdx = " << averagedEdx <<
" =====>");;
1943 ATH_MSG_DEBUG(
" +++ Used hits: " << n_usedhits <<
", IBL overflows: " << IBLOverflow );;
1944 ATH_MSG_DEBUG(
" +++ Original number of measurements = " << pixelhits <<
" (map size = " << dEdxMap.size() <<
") ");
1955 const float PT_CUT = 3.0;
1957 const double FAIL_CHI2_OV_NDOF_CUT = 20.0;
1959 const int COMB_N_HITS_IBL_OR_BL_CUT = 1;
1960 const int COMB_N_HITS_PIX_BR_CUT = 3;
1961 const double COMB_CHI2_OV_NDOF_PIX_BR_CUT = 3.0;
1962 const int COMB_N_GOOD_HITS_SCT_BR_CUT = 2;
1963 const int COMB_N_GOOD_DOUBLEHITS_SCT_BR_CUT = 0;
1966 if( trk==
nullptr )
return false;
1968 if( trk->
fitQuality()==
nullptr )
return false;
1971 if( !seed.s1().isPixel() || !seed.s2().isPixel() || !seed.s3().isPixel() )
return false;
1972 float s1_z = seed.s1().z();
1973 float s2_z = seed.s2().z();
1974 float s3_z = seed.s3().z();
1975 const float PIXEL_BARREL_Z = 410.0;
1976 if( std::abs(s1_z) > PIXEL_BARREL_Z || std::abs(s2_z) > PIXEL_BARREL_Z || std::abs(s3_z) > PIXEL_BARREL_Z )
return false;
1977 ATH_MSG_VERBOSE(
"FTF::isCleaningPassDisTrack> ... barrel cut passed");
1982 if ( qOverP < 1e-12 ) qOverP = 1e-12;
1983 double pt = sin(
theta)/qOverP;
1984 if( pt/1000.0 < PT_CUT )
return false;
1991 if( std::abs(ndof) < 1e-12 )
return false;
1992 if(
chi2/ndof > FAIL_CHI2_OV_NDOF_CUT )
return false;
1993 ATH_MSG_VERBOSE(
"FTF::isCleaningPassDisTrack> ... (failTrk) Chi2 cut passed");
1999 int n_hits_iblbl = barrelInfo[0].nHits + barrelInfo[1].nHits;
2000 if( n_hits_iblbl < COMB_N_HITS_IBL_OR_BL_CUT )
return false;
2003 int n_hits_pixbr = 0;
2004 double chi2_pixbr = 0;
2006 for(
unsigned int ily=0; ily<=3; ily++) {
2007 n_hits_pixbr += barrelInfo[ily].nHits;
2008 chi2_pixbr += barrelInfo[ily].chiSq;
2009 ndof_pixbr += barrelInfo[ily].nDof;
2011 if( n_hits_pixbr < COMB_N_HITS_PIX_BR_CUT )
return false;
2012 if( ndof_pixbr < 1 )
return false;
2013 double chi2_ov_ndof_pixbr = chi2_pixbr / ndof_pixbr;
2014 if( chi2_ov_ndof_pixbr > COMB_CHI2_OV_NDOF_PIX_BR_CUT )
return false;
2015 ATH_MSG_VERBOSE(
"FTF::isCleaningPassDisTrack> ... (combTrk) Pix cut passed");
2018 int n_hits_sctbr_good = 0;
2019 int n_doublehits_sctbr_good = 0;
2020 for(
unsigned int ily=4; ily<=7; ily++) {
2021 n_hits_sctbr_good += barrelInfo[ily].nGood;
2022 if( barrelInfo[ily].nGood >= 2 ) n_doublehits_sctbr_good++;
2024 if( n_hits_sctbr_good > COMB_N_GOOD_HITS_SCT_BR_CUT )
return false;
2025 if( n_doublehits_sctbr_good > COMB_N_GOOD_DOUBLEHITS_SCT_BR_CUT )
return false;
2026 ATH_MSG_VERBOSE(
"FTF::isCleaningPassDisTrack> ... (combTrk) SCT cut passed");
2033std::array<TrigFastTrackFinder::OneLayerInfo_t, TrigFastTrackFinder::N_BARREL_LAYERS>
2036 static constexpr double CHI2_GOOD_CUT = 3.0;
2038 std::array<TrigFastTrackFinder::OneLayerInfo_t, TrigFastTrackFinder::N_BARREL_LAYERS> result{};
2039 if (not t)
return result;
2042 if (recoTrackStates) {
2045 for ( ; tsosIter != tsosIterEnd; ++tsosIter) {
2053 bool chi2_good = (x2 <= CHI2_GOOD_CUT);
2056 if (pixclus!=
nullptr) {
2060 if( layer < 0 || 3 < layer ) {
2064 result[layer].nHits++;
2065 result[layer].chiSq += x2;
2066 result[layer].nDof += ndof;
2067 if(chi2_good) result[layer].nGood++;
2071 if (sctclus!=
nullptr) {
2075 if( layer < 0 || 3 < layer ) {
2080 result[layer].nHits++;
2081 result[layer].chiSq += x2;
2082 result[layer].nDof += ndof;
2083 if(chi2_good) result[layer].nGood++;
2097 double quality_pixel = 0. ;
2098 double quality_sct = 0. ;
2100 const double W = 17.;
2108 if(fq.
numberDoF() == 2) q = (1.2*(W-x2*.5));
2115 if( pixclus !=0 ) quality_pixel += q;
2116 else quality_sct += q;
2121 double quality = quality_pixel;
2122 quality -= quality_sct;
2123 if( quality < 0. ) quality = 0.;
2137 double xVTX = vertex.x();
2138 double yVTX = vertex.y();
2139 double tiltXZ = beamSpotHandle->beamTilt(0);
2140 double tiltYZ = beamSpotHandle->beamTilt(1);
2143 const double CLUSTCUT_DIST_SIGMA = 5.0;
2144 const double CLUSTCUT_DIST = 2.5;
2145 const double CLUSTCUT_SEED_PT = 3.0;
2147 const int VTXCUT_N_TRACKS = 3;
2148 const int VTXCUT_ALGO = 1;
2150 std::vector<std::tuple<int,double,double,Trk::Track*>> QT;
2151 QT.reserve(tracks.
size());
2153 for (
auto t=tracks.
begin(); t!=tracks.
end(); ++t) {
2157 double qOverP = std::abs((*t)->perigeeParameters()->parameters()[
Trk::qOverP]);
2158 if ( qOverP < 1e-12 ) qOverP = 1e-12;
2159 double pt = sin(
theta)/qOverP;
2161 QT.emplace_back(std::make_tuple(-1,pt,pt,(*t)));
2166 [](
const std::tuple<int,double,double,Trk::Track*>& lhs,
const std::tuple<int,double,double,Trk::Track*>& rhs) {
2167 return std::get<1>(lhs) > std::get<1>(rhs); } );
2170 std::vector<int> cluster_ntrk;
2171 std::vector<double> cluster_ptsum;
2172 std::vector<double> cluster_z;
2173 std::vector<double> cluster_wsum;
2174 std::vector<double> cluster_zerr;
2175 std::vector<double> cluster_w2sum;
2177 for(
unsigned int i=0; i<QT.size(); ++i) {
2179 double z = t->perigeeParameters()->parameters()[
Trk::z0];
2180 double zerr = sqrt((*(t->perigeeParameters()->covariance()))(
Trk::z0,
Trk::z0));
2181 double w = std::get<2>(QT[i]);
2182 double pt = std::get<1>(QT[i]);
2184 cluster_ntrk.push_back(1); cluster_ptsum.push_back(pt);
2185 cluster_z.push_back(w*
z); cluster_wsum.push_back(w);
2186 cluster_zerr.push_back(w*zerr*w*zerr); cluster_w2sum.push_back(w*w);
2190 const int IDX_INITIAL = 100;
2191 double dist_min = 100.0;
2192 int idx_min = IDX_INITIAL;
2193 for(
unsigned j=0; j<cluster_z.size(); ++j) {
2194 double dist = std::abs(
z - cluster_z[j]/cluster_wsum[j]);
2195 if( dist < dist_min ) {
2200 int match_idx = IDX_INITIAL;
2201 if( idx_min != IDX_INITIAL ) {
2202 double c_zerr_min = std::sqrt(cluster_zerr[idx_min]/cluster_w2sum[idx_min]);
2203 double err = std::sqrt(zerr*zerr+c_zerr_min*c_zerr_min);
2204 if( std::abs(err) < 1e-12 ) err = 1e-12;
2205 double dist = dist_min / err;
2206 if( dist < CLUSTCUT_DIST_SIGMA && dist_min < CLUSTCUT_DIST ) { match_idx = idx_min; }
2209 if( match_idx == IDX_INITIAL ) {
2210 if( pt > CLUSTCUT_SEED_PT && dist_min > CLUSTCUT_DIST ) {
2211 cluster_ntrk.push_back(1); cluster_ptsum.push_back(pt);
2212 cluster_z.push_back(w*
z); cluster_wsum.push_back(w);
2213 cluster_zerr.push_back(w*zerr*w*zerr); cluster_w2sum.push_back(w*w);
2217 int new_n = cluster_ntrk[match_idx] + 1;
2218 double new_ptsum = cluster_ptsum[match_idx] + pt;
2219 double new_z = cluster_z[match_idx] + w*
z;
2220 double new_wsum = cluster_wsum[match_idx] + w;
2221 double new_zerr = cluster_zerr[match_idx] + w*zerr*w*zerr;
2222 double new_w2sum = cluster_w2sum[match_idx] + w*w;
2223 cluster_ntrk[match_idx] = new_n;
2224 cluster_ptsum[match_idx] = new_ptsum;
2225 cluster_z[match_idx] = new_z;
2226 cluster_wsum[match_idx] = new_wsum;
2227 cluster_zerr[match_idx] = new_zerr;
2228 cluster_w2sum[match_idx] = new_w2sum;
2233 std::vector<std::tuple<double,double,double,int>> zVtx;
2234 zVtx.reserve(tracks.
size());
2235 for(
unsigned int i=0; i<cluster_z.size(); i++) {
2236 if( cluster_ntrk[i] < VTXCUT_N_TRACKS )
continue;
2237 double z = cluster_z[i] / cluster_wsum[i];
2238 double zerr = std::sqrt(cluster_zerr[i] / cluster_w2sum[i]);
2239 zVtx.push_back(std::make_tuple(cluster_ptsum[i],
z,zerr,cluster_ntrk[i]));
2242 if( VTXCUT_ALGO == 1 ) {
2244 [](
const std::tuple<double,double,double,int>& lhs,
const std::tuple<double,double,double,int>& rhs) {
2245 return std::get<0>(lhs) > std::get<0>(rhs); } );
2247 ATH_MSG_VERBOSE(
"disTrkZVtertex> ===== looping zVtx size: " << zVtx.size());
2248 for(
unsigned int i=0; i<zVtx.size(); i++) {
2249 double z = std::get<1>(zVtx[i]);
2250 double zerr = std::get<2>(zVtx[i]);
2251 double pt = std::get<0>(zVtx[i]);
2252 int n = std::get<3>(zVtx[i]);
2253 v_zvtx.push_back(
z);
2254 v_xvtx.push_back(xVTX - tiltXZ*
z);
2255 v_yvtx.push_back(yVTX - tiltYZ*
z);
2256 ATH_MSG_VERBOSE(
"disTrkZVtertex> Vertex cand i=" << i <<
": z = " <<
z <<
" +- " << zerr <<
", sum n / pt = " << n <<
" / " << pt);
2265 mnt_disTrk_nVtx = v_zvtx.size();
2266 if(v_zvtx.size()>0) {
2267 mnt_disTrk_xVtx = v_xvtx[0];
2268 mnt_disTrk_yVtx = v_yvtx[0];
2269 mnt_disTrk_zVtx = v_zvtx[0];
2275 const double TRKCUT_CHI2_OV_NDOF = 3.0;
2276 const double TRKCUT_PT = 1.0;
2277 const double TRKCUT_D0 = 2.0;
2278 const int TRKCUT_N_HITS_INNER = 1;
2279 const int TRKCUT_N_HITS_PIX = 3;
2280 const int TRKCUT_N_HITS = 7;
2283 if ( ! t->perigeeParameters() )
return false;
2284 if ( ! t->fitQuality() )
return false;
2285 if ( t->trackSummary()==0 ) {
2287 if ( t->trackSummary()==0 )
return false;
2291 double chi2 = t->fitQuality()->chiSquared();
2292 double ndof = t->fitQuality()->doubleNumberDoF();
2293 if( std::abs(ndof) < 1e-2 )
return false;
2294 double chi2_ov_ndof =
chi2/ndof;
2295 if( chi2_ov_ndof > TRKCUT_CHI2_OV_NDOF )
return false;
2299 double qOverP = std::abs(t->perigeeParameters()->parameters()[
Trk::qOverP]);
2300 if ( qOverP < 1e-12 ) qOverP = 1e-12;
2301 double pt = std::sin(
theta)/qOverP;
2303 if( pt < TRKCUT_PT )
return false;
2306 double d0 = t->perigeeParameters()->parameters()[
Trk::d0];
2307 if( std::abs(d0) > TRKCUT_D0 )
return false;
2312 int n_hits_inner = n_hits_innermost + n_hits_next_to_innermost;
2315 if( n_hits_inner < TRKCUT_N_HITS_INNER )
return false;
2316 if( n_hits_pix < TRKCUT_N_HITS_PIX )
return false;
2317 if( (n_hits_pix+n_hits_sct) < TRKCUT_N_HITS )
return false;
2325 const int N_FREE_PIX_HITS_CUT = 2;
2327 std::set<const Trk::PrepRawData*> clusters;
2332 [](
const std::tuple<bool, double, Trk::Track*>& lhs,
const std::tuple<bool, double, Trk::Track*>& rhs) {
2333 return std::get<1>(lhs) < std::get<1>(rhs); } );
2335 for (
auto& q : QT) {
2337 m = std::get<2>(q)->measurementsOnTrack()->begin(),
2338 me = std::get<2>(q)->measurementsOnTrack()->end ();
2341 for(; m!=me; ++m ) {
2347 if(clusters.find(pr)==clusters.end()) {prd[nf++]=pr;
if(nf==100)
break;}
2351 if((nf >= N_FREE_PIX_HITS_CUT) || (nf == nc) ) {
2352 for(
int n=0; n!=nf; ++n) clusters.insert(prd[n]);
2355 std::get<0>(q) =
false;
2362 std::vector<std::tuple<bool, double, Trk::Track*>>& qualityDisFailTrks,
2363 std::vector<std::tuple<bool, double, Trk::Track*>>& qualityDisCombTrks,
2365 const std::vector<double>& v_xvtx,
2366 const std::vector<double>& v_yvtx,
2367 const std::vector<double>& v_zvtx)
const
2370 ATH_CHECK( disTrkCandHandle.
record(std::make_unique<xAOD::TrigCompositeContainer>(), std::make_unique<xAOD::TrigCompositeAuxContainer>()) );
2371 auto disTrkCandContainer = disTrkCandHandle.
ptr();
2380 auto monDisTrk =
Monitored::Group(
m_monTool, mnt_disFailTrk_n, mnt_disFailTrk_nclone, mnt_disFailTrk_ncand, mnt_disCombTrk_n, mnt_disCombTrk_nclone, mnt_disCombTrk_ncand);
2383 std::vector<Trk::Track*> tracksForIso;
2384 for (
auto t=tracks.
begin(); t!=tracks.
end(); ++t) {
2389 const std::string prefix =
"disTrkCand";
2393 initialDisFailTrks.
reserve(qualityDisFailTrks.size());
2394 std::vector<int> resultCodes;
2395 for(
const auto& q : qualityDisFailTrks) {
2396 if (std::get<0>(q)==
true) {
2400 delete std::get<2>(q);
2403 ATH_MSG_VERBOSE(
"===> nr of disFailTrk=" << qualityDisFailTrks.size() <<
" -> clone removal=" << initialDisFailTrks.
size());
2407 int n_disFailTrkCands =
recoAndFillDisTrkCand(prefix, &fittedDisFailTrks, tracksForIso, disTrkCandContainer, v_xvtx, v_yvtx, v_zvtx,
true, ctx);
2410 mnt_disFailTrk_n = qualityDisFailTrks.size();
2411 mnt_disFailTrk_nclone = initialDisFailTrks.
size();
2412 mnt_disFailTrk_ncand = n_disFailTrkCands;
2415 ATH_MSG_VERBOSE(
"===> nr of disCombTrk=" << qualityDisCombTrks.size() <<
" -> clone removal=" << fittedDisCombTrks.
size());
2416 int n_disCombTrkCands =
recoAndFillDisTrkCand(prefix, &fittedDisCombTrks, tracksForIso, disTrkCandContainer, v_xvtx, v_yvtx, v_zvtx,
false, ctx);
2419 mnt_disCombTrk_n = qualityDisCombTrks.size();
2420 mnt_disCombTrk_nclone = fittedDisCombTrks.
size();
2421 mnt_disCombTrk_ncand = n_disCombTrkCands;
2423 return StatusCode::SUCCESS;
2428 const float PRESEL_PT_GEV = 5.0;
2429 const float PRESEL_REFIT_PT_GEV_P3S1 = 10.0;
2430 const double PRESEL_D0_WRTVTX = 5.0;
2431 const double PRESEL_Z0_WRTVTX = 50.0;
2434 if( trk ==
nullptr )
return false;
2440 if( std::abs(refit_d0_wrtVtx) > PRESEL_D0_WRTVTX )
return false;
2443 if( std::abs(refit_z0_wrtVtx) > PRESEL_Z0_WRTVTX )
return false;
2446 std::vector<float> v_ptGeV;
2447 std::vector<Trk::Track*> v_trk;
2448 v_trk.push_back(trk);
2449 if( refitTrk !=
nullptr ) v_trk.push_back(refitTrk);
2450 for(
auto t : v_trk) {
2452 float qOverP = std::abs(t->perigeeParameters()->parameters()[
Trk::qOverP]);
2453 if ( qOverP < 1e-12 ) qOverP = 1e-12;
2454 float ptGeV = sin(
theta)/qOverP/Gaudi::Units::GeV;
2455 v_ptGeV.push_back(ptGeV);
2457 bool isLowPt =
true;
2458 for(
auto pt : v_ptGeV) {
2459 if( pt > PRESEL_PT_GEV ) { isLowPt =
false;
break; }
2461 if( isLowPt )
return false;
2465 float refitPt = v_ptGeV[1];
2466 if( refitPt < PRESEL_REFIT_PT_GEV_P3S1 )
return false;
2475 const double PRESEL_D0_WRTVTX = 5.0;
2476 const double PRESEL_Z0_WRTVTX = 50.0;
2477 const int PRESEL_N_GOOD_BR_LAYERS_PIX = 3;
2478 const double PRESEL_CHI2_OV_NDOF_PIX_BR_CUT = 5.0;
2481 if( trk ==
nullptr )
return false;
2488 double chi2_pixbr = 0.0;
2490 int n_good_brlayers_pix = 0;
2491 for(
unsigned int ily=0; ily<=3; ily++) {
2492 if( barrelLayerInfo[ily].nGood >= 1 ) n_good_brlayers_pix++;
2493 chi2_pixbr += barrelLayerInfo[ily].chiSq;
2494 ndof_pixbr += barrelLayerInfo[ily].nDof;
2496 if( n_good_brlayers_pix < PRESEL_N_GOOD_BR_LAYERS_PIX )
return false;
2498 if( ndof_pixbr < 1 )
return false;
2499 double chi2_ov_ndof_pixbr = chi2_pixbr / ndof_pixbr;
2500 if( chi2_ov_ndof_pixbr > PRESEL_CHI2_OV_NDOF_PIX_BR_CUT )
return false;
2503 if( std::abs(d0_wrtVtx) > PRESEL_D0_WRTVTX )
return false;
2506 if( std::abs(z0_wrtVtx) > PRESEL_Z0_WRTVTX )
return false;
2513 Trk::Track* t,
const std::vector<double>& v_xvtx,
const std::vector<double>& v_yvtx,
const std::vector<double>& v_zvtx,
const EventContext& ctx)
const
2518 float trk_z0 = t->perigeeParameters()->parameters()[
Trk::z0];
2519 float z0_min = 9999;
2520 for(
unsigned int i_vtx=0; i_vtx<v_zvtx.size(); i_vtx++) {
2521 float z = v_zvtx[i_vtx];
2522 if( std::abs(trk_z0-
z) < z0_min ) {
2523 z0_min = std::abs(trk_z0-
z);
2525 vtx_x = v_xvtx[i_vtx];
2526 vtx_y = v_yvtx[i_vtx];
2532 std::unique_ptr<const Trk::TrackParameters> tmp =
2533 m_extrapolator->extrapolateDirectly(ctx, (*(t->perigeeParameters())), persf);
2544 int n_good_brlayers_pix = 0;
2546 for(
unsigned int ily=0; ily<8; ily++) {
2547 if( ily<=3 && result[ily].nGood >= 1 ) n_good_brlayers_pix++;
2549 n_hits_sct += result[ily].nHits;
2556 if( n_good_brlayers_pix == 4 ) {
2560 else if( n_good_brlayers_pix == 3 ) {
2569 std::vector<Trk::Track*> vtmp;
2574 bool fillIso, std::vector<Trk::Track*>& tracksForIso)
const
2578 if( prefix.find(
"refit") == std::string::npos ) comp->setDetail<int16_t>(prefix+
"_category",(int16_t)category);
2581 float theta=0;
float eta=0;
float pt=0;
float d0=0;
float z0=0;
float phi=0;
float chi2=0;
float ndof=0;
2582 int n_hits_innermost=-1;
int n_hits_next_to_innermost=-1;
int n_hits_inner=-1;
int n_hits_pix=-1;
int n_hits_sct=-1;
2583 if( trk !=
nullptr ) {
2585 eta = -std::log(std::tan(0.5*
theta));
2587 if ( qOverP < 1e-12 ) qOverP = 1e-12;
2588 pt = sin(
theta)/qOverP;
2599 n_hits_inner = n_hits_innermost + n_hits_next_to_innermost;
2602 comp->setDetail<
float>(prefix+
"_pt", pt);
2603 comp->setDetail<
float>(prefix+
"_eta",
eta);
2604 comp->setDetail<
float>(prefix+
"_phi",
phi);
2605 comp->setDetail<
float>(prefix+
"_d0", d0);
2606 comp->setDetail<
float>(prefix+
"_z0", z0);
2607 comp->setDetail<
float>(prefix+
"_chi2",
chi2);
2608 comp->setDetail<
float>(prefix+
"_ndof", ndof);
2609 comp->setDetail<int16_t>(prefix+
"_n_hits_innermost", (int16_t)n_hits_innermost);
2610 comp->setDetail<int16_t>(prefix+
"_n_hits_inner", (int16_t)n_hits_inner);
2611 comp->setDetail<int16_t>(prefix+
"_n_hits_pix", (int16_t)n_hits_pix);
2612 comp->setDetail<int16_t>(prefix+
"_n_hits_sct", (int16_t)n_hits_sct);
2615 float theta_wrtVtx=0;
float eta_wrtVtx=0;
float pt_wrtVtx=0;
float d0_wrtVtx=0;
float z0_wrtVtx=0;
float phi_wrtVtx=0;
2616 if( vertexPerigee !=
nullptr ) {
2617 theta_wrtVtx = vertexPerigee->parameters()[
Trk::theta];
2618 eta_wrtVtx = -std::log(std::tan(0.5*theta_wrtVtx));
2619 float qOverP_wrtVtx = std::abs(vertexPerigee->parameters()[
Trk::qOverP]);
2620 if ( qOverP_wrtVtx < 1e-12 ) qOverP_wrtVtx = 1e-12;
2621 pt_wrtVtx = std::sin(theta_wrtVtx)/qOverP_wrtVtx;
2622 d0_wrtVtx = vertexPerigee->parameters()[
Trk::d0];
2623 z0_wrtVtx = vertexPerigee->parameters()[
Trk::z0];
2624 phi_wrtVtx = vertexPerigee->parameters()[
Trk::phi];
2626 comp->setDetail<
float>(prefix+
"_pt_wrtVtx", pt_wrtVtx);
2627 comp->setDetail<
float>(prefix+
"_eta_wrtVtx", eta_wrtVtx);
2628 comp->setDetail<
float>(prefix+
"_phi_wrtVtx", phi_wrtVtx);
2629 comp->setDetail<
float>(prefix+
"_d0_wrtVtx", d0_wrtVtx);
2630 comp->setDetail<
float>(prefix+
"_z0_wrtVtx", z0_wrtVtx);
2633 std::array<OneLayerInfo_t, N_BARREL_LAYERS> barrelInfo{};
2635 comp->setDetail<
float>(prefix+
"_chi2sum_br_ibl", barrelInfo[0].chiSq);
2636 comp->setDetail<
float>(prefix+
"_chi2sum_br_pix1", barrelInfo[1].chiSq);
2637 comp->setDetail<
float>(prefix+
"_chi2sum_br_pix2", barrelInfo[2].chiSq);
2638 comp->setDetail<
float>(prefix+
"_chi2sum_br_pix3", barrelInfo[3].chiSq);
2639 comp->setDetail<
float>(prefix+
"_chi2sum_br_sct1", barrelInfo[4].chiSq);
2640 comp->setDetail<
float>(prefix+
"_chi2sum_br_sct2", barrelInfo[5].chiSq);
2641 comp->setDetail<
float>(prefix+
"_chi2sum_br_sct3", barrelInfo[6].chiSq);
2642 comp->setDetail<
float>(prefix+
"_chi2sum_br_sct4", barrelInfo[7].chiSq);
2643 comp->setDetail<
float>(prefix+
"_ndofsum_br_ibl", barrelInfo[0].nDof);
2644 comp->setDetail<
float>(prefix+
"_ndofsum_br_pix1", barrelInfo[1].nDof);
2645 comp->setDetail<
float>(prefix+
"_ndofsum_br_pix2", barrelInfo[2].nDof);
2646 comp->setDetail<
float>(prefix+
"_ndofsum_br_pix3", barrelInfo[3].nDof);
2647 comp->setDetail<
float>(prefix+
"_ndofsum_br_sct1", barrelInfo[4].nDof);
2648 comp->setDetail<
float>(prefix+
"_ndofsum_br_sct2", barrelInfo[5].nDof);
2649 comp->setDetail<
float>(prefix+
"_ndofsum_br_sct3", barrelInfo[6].nDof);
2650 comp->setDetail<
float>(prefix+
"_ndofsum_br_sct4", barrelInfo[7].nDof);
2654 const float ISOL_CALC_Z0_DIFF_CUT = 2.5;
2655 const float ISOL_CALC_DR_CUT_TO_AVOID_ZERO = 0.015;
2656 float iso1_dr01=0;
float iso1_dr02=0;
2657 float iso2_dr01=0;
float iso2_dr02=0;
2658 float iso3_dr01=0;
float iso3_dr02=0;
2659 for(
auto t=tracksForIso.begin(); t!=tracksForIso.end(); t++) {
2660 float z0_t = (*t)->perigeeParameters()->parameters()[
Trk::z0];
2661 if( std::abs(z0_t - z0) <= ISOL_CALC_Z0_DIFF_CUT ) {
2662 float theta_t = (*t)->perigeeParameters()->parameters()[
Trk::theta];
2663 float qOverP_t= std::abs((*t)->perigeeParameters()->parameters()[
Trk::qOverP]);
2664 if ( qOverP_t < 1e-12 ) qOverP_t = 1e-12;
2665 float pt_t = std::sin(theta_t)/qOverP_t;
2666 float phi_t = (*t)->perigeeParameters()->parameters()[
Trk::phi];
2667 float eta_t = -std::log(std::tan(theta_t/2.0));
2668 float deta = eta_t -
eta;
2669 float dphi = std::abs(phi_t -
phi);
2670 if( dphi > CLHEP::pi ) dphi = CLHEP::pi*2 - dphi;
2671 float dr = std::sqrt(deta*deta + dphi*dphi);
2672 if( dr > ISOL_CALC_DR_CUT_TO_AVOID_ZERO && dr<0.1 && pt_t > 1.0*Gaudi::Units::GeV ) iso1_dr01 += pt_t;
2673 if( dr > ISOL_CALC_DR_CUT_TO_AVOID_ZERO && dr<0.2 && pt_t > 1.0*Gaudi::Units::GeV ) iso1_dr02 += pt_t;
2675 if( dr > ISOL_CALC_DR_CUT_TO_AVOID_ZERO && dr<0.1 && pt_t > 2.0*Gaudi::Units::GeV ) iso2_dr01 += pt_t;
2676 if( dr > ISOL_CALC_DR_CUT_TO_AVOID_ZERO && dr<0.2 && pt_t > 2.0*Gaudi::Units::GeV ) iso2_dr02 += pt_t;
2678 if( dr > ISOL_CALC_DR_CUT_TO_AVOID_ZERO && dr<0.1 && pt_t > 3.0*Gaudi::Units::GeV ) iso3_dr01 += pt_t;
2679 if( dr > ISOL_CALC_DR_CUT_TO_AVOID_ZERO && dr<0.2 && pt_t > 3.0*Gaudi::Units::GeV ) iso3_dr02 += pt_t;
2682 comp->setDetail<
float>(prefix+
"_iso1_dr01", iso1_dr01);
2683 comp->setDetail<
float>(prefix+
"_iso1_dr02", iso1_dr02);
2684 comp->setDetail<
float>(prefix+
"_iso2_dr01", iso2_dr01);
2685 comp->setDetail<
float>(prefix+
"_iso2_dr02", iso2_dr02);
2686 comp->setDetail<
float>(prefix+
"_iso3_dr01", iso3_dr01);
2687 comp->setDetail<
float>(prefix+
"_iso3_dr02", iso3_dr02);
2694 const std::vector<double>& v_xvtx,
2695 const std::vector<double>& v_yvtx,
2696 const std::vector<double>& v_zvtx,
2698 const EventContext& ctx)
const
2702 int n_stored_tracks = 0;
2704 for (
auto trk = tracks->
begin(); trk!=tracks->
end(); ++trk) {
2708 if( ptrk ==
nullptr )
continue;
2712 std::unique_ptr<const Trk::TrackParameters> vertexPerigee =
extrapolateDisTrackToBS(ptrk,v_xvtx,v_yvtx,v_zvtx, ctx);
2715 double d0_wrtVtx = 0;
2716 double z0_wrtVtx = 0;
2717 if( vertexPerigee !=
nullptr ) {
2718 d0_wrtVtx = vertexPerigee->parameters()[
Trk::d0];
2719 z0_wrtVtx = vertexPerigee->parameters()[
Trk::z0];
2730 std::unique_ptr<Trk::Track> refit_trk =
disTrk_refit(ptrk, ctx);
2734 double refit_d0 = 0;
2735 double refit_z0 = 0;
2736 double refit_d0_wrtVtx = 0;
2737 double refit_z0_wrtVtx = 0;
2738 std::unique_ptr<const Trk::TrackParameters> refitVertexPerigee =
nullptr;
2739 if( refit_trk !=
nullptr ) {
2741 if( refitVertexPerigee ==
nullptr ) {
2745 refit_d0 = refit_trk.get()->perigeeParameters()->parameters()[
Trk::d0];
2746 refit_z0 = refit_trk.get()->perigeeParameters()->parameters()[
Trk::z0];
2747 refit_d0_wrtVtx = refitVertexPerigee->parameters()[
Trk::d0];
2748 refit_z0_wrtVtx = refitVertexPerigee->parameters()[
Trk::z0];
2749 ATH_MSG_VERBOSE(
"refit trk d0 : " << refit_d0 <<
" -> extrapolate -> " << refit_d0_wrtVtx);
2750 ATH_MSG_VERBOSE(
"refit trk z0 : " << refit_z0 <<
" -> extrapolate -> " << refit_z0_wrtVtx);
2761 comp->makePrivateStore();
2762 trigCompositeContainer->
push_back(comp);
2765 int is_fail = isFail ? 1 : 0;
2766 comp->setDetail<int16_t>(base_prefix+
"_is_fail",(int16_t)is_fail);
2769 prefix = base_prefix;
2770 fillDisTrkCand(comp,prefix,ptrk,vertexPerigee,
true,tracksForIso);
2773 prefix = base_prefix +
"_refit";
2774 if( refit_trk !=
nullptr ) {
2783 ATH_MSG_VERBOSE(
"========> filling trigcomposite for " << prefix <<
" end");
2784 ATH_MSG_VERBOSE(
"nr of " << prefix <<
" tracks / stored = " << tracks->
size() <<
" / " << n_stored_tracks);
2787 return n_stored_tracks;
2792 std::unique_ptr<Trk::Track> newtrack =
nullptr;
2794 if( t ==
nullptr )
return newtrack;
2800 const Trk::Perigee* origPerigee = t->perigeeParameters();
2801 if( origPerigee ==
nullptr )
return newtrack;
2805 std::vector<const Trk::MeasurementBase*>
vec;
2806 int n_measurements = 0;
2807 int n_measurements_refit = 0;
2809 if (recoTrackStates) {
2812 for ( ; tsosIter != tsosIterEnd; ++tsosIter) {
2819 if ( !pixclus && sctclus ) to_add =
false;
2821 vec.push_back(measurement);
2822 n_measurements_refit++;
2827 ATH_MSG_VERBOSE(
"... Nr of measurments / refit = " << n_measurements <<
" / " << n_measurements_refit);
2832 if( newtrack!=0 && newtrack.get() ) {
2845 float chi2=0;
float ndof=0;
float d0=0;
float z0=0;
float phi=0;
float theta=0;
float pt=0;
2847 chi2 = t->fitQuality()->chiSquared();
2848 ndof = t->fitQuality()->doubleNumberDoF();
2849 d0 = t->perigeeParameters()->parameters()[
Trk::d0];
2850 z0 = t->perigeeParameters()->parameters()[
Trk::z0];
2851 phi = t->perigeeParameters()->parameters()[
Trk::phi];
2853 float qOverP = std::abs(t->perigeeParameters()->parameters()[
Trk::qOverP]);
2854 if ( qOverP < 1e-12 ) qOverP = 1e-12;
2855 pt = sin(
theta)/qOverP;
2856 pt /= Gaudi::Units::GeV;
2858 ATH_MSG_DEBUG(
"... pt / theta / phi / d0 / z0 = " << pt <<
" / " <<
theta <<
" / " <<
phi <<
" / " << d0 <<
" / " << z0);
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
Scalar theta() const
theta method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
double charge(const T &p)
std::vector< size_t > vec
Header file to be included by clients of the Monitored infrastructure.
This is an Identifier helper class for the Pixel subdetector.
This is an Identifier helper class for the SCT subdetector.
DataVector< Trk::Track > TrackCollection
This typedef represents a collection of Trk::Track objects.
Athena::TPCnvVers::Current TrigRoiDescriptor
class TrigTrackSeedGenerator TRIG_TRACK_SEED_GENERATOR
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
const ServiceHandle< StoreGateSvc > & detStore() const
An algorithm that can be simultaneously executed in multiple threads.
DataModel_detail::const_iterator< DataVector > const_iterator
void reserve(size_type n)
Attempt to preallocate enough memory for a specified number of elements.
value_type emplace_back(value_type pElem)
Add an element to the end of the collection.
value_type push_back(value_type pElem)
Add an element to the end of the collection.
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
iterator erase(iterator position)
Remove element at a given position.
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.
Describes the API of the Region of Ineterest geometry.
virtual double eta() const =0
virtual double phiPlus() const =0
extreme phi values
virtual double zedPlus() const =0
the zed and eta values at the most forward and most rear ends of the RoI
virtual double phiMinus() const =0
virtual double phi() const =0
Methods to retrieve data members.
virtual double zedMinus() const =0
virtual double zed() const =0
virtual double etaMinus() const =0
virtual double etaPlus() const =0
Specific class to represent the pixel measurements.
virtual const PixelCluster * prepRawData() const override final
returns the PrepRawData - is a SiCluster in this scope
const std::vector< int > & totList() const
float totalCharge() const
Specific class to represent the SCT measurements.
RIO_OnTrack base class for Silicon detector in the InnerDetector.
SiCombinatorialTrackFinderData_xk::ResultCode resultCode() const
void setFlagToReturnFailedTrack(const bool)
Setter for flagToReturnFailedTrack (for disappearing track trigger).
InDet::SiTrackMakerEventData_xk holds event dependent data used by ISiTrackMaker.
SiCombinatorialTrackFinderData_xk & combinatorialData()
Group of local monitoring quantities and retain correlation when filling histograms
Declare a monitored scalar variable.
static std::string find_file(const std::string &logical_file_name, const std::string &search_path)
virtual double etaMinus() const override final
gets eta at zMinus
virtual double etaPlus() const override final
gets eta at zedPlus
virtual double zed() const override final
virtual double phi() const override final
Methods to retrieve data members.
virtual double phiMinus() const override final
gets phiMinus
virtual double zedPlus() const override final
z at the most forward end of the RoI
virtual double zedMinus() const override final
z at the most backward end of the RoI
virtual const IRoiDescriptor * at(int i) const override final
find an RoiDescriptor constituent
virtual unsigned size() const override final
number of constituents
virtual double eta() const override final
virtual bool composite() const override final
SuperRoI compatability methods.
virtual double phiPlus() const override final
gets phiPlus
const_pointer_type ptr()
Dereference the pointer.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
pointer_type ptr()
Dereference the pointer.
virtual std::shared_ptr< OffloadBuffer > getOutput()=0
void updateClusterMap(long int, const Trk::Track *, std::map< Identifier, std::vector< long int > > &) const
ToolHandle< ITrigInDetTrackFitter > m_trigInDetTrackFitter
ToolHandle< ITrigSpacePointConversionTool > m_spacePointTool
virtual StatusCode execute(const EventContext &ctx) const override
void runResidualMonitoring(const Trk::Track &track, const EventContext &) const
bool isGoodForDisTrackVertex(Trk::Track *, const EventContext &) const
TrigFastTrackFinder::DisTrkCategory getDisTrkCategory(Trk::Track *trk) const
std::unique_ptr< const Trk::TrackParameters > extrapolateDisTrackToBS(Trk::Track *, const std::vector< double > &, const std::vector< double > &, const std::vector< double > &, const EventContext &) const
virtual ~TrigFastTrackFinder()
SG::WriteHandleKey< xAOD::TrigCompositeContainer > m_dEdxHitKey
void filterSharedDisTracks(std::vector< std::tuple< bool, double, Trk::Track * > > &) const
ToolHandle< ITrigL2LayerNumberTool > m_numberingTool
ToolHandle< ITrigInDetTrackSeedingTool > m_seedingTool
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
bool m_checkSeedRedundancy
virtual StatusCode start() override
SG::ReadHandleKey< Trk::PRDtoTrackMap > m_prdToTrackMap
ToolHandle< ITrigInDetAccelerationTool > m_accelTool
Gaudi::Property< bool > m_useTracklets
Gaudi::Property< bool > m_doCloneRemoval
void fillMon(const TrackCollection &tracks, const TrigVertexCollection &vertices, const TrigRoiDescriptor &roi, const EventContext &ctx) const
bool isPreselPassDisTrackBeforeRefit(Trk::Track *, double, double) const
int recoAndFillDisTrkCand(const std::string &, TrackCollection *, std::vector< Trk::Track * > &, xAOD::TrigCompositeContainer *, const std::vector< double > &, const std::vector< double > &, const std::vector< double > &, bool, const EventContext &) const
SG::ReadHandleKey< TrackCollection > m_inputTracksKey
StatusCode findTracks(InDet::SiTrackMakerEventData_xk &event_data, const TrigRoiDescriptor &roi, const TrackCollection *inputTracks, TrackCollection &outputTracks, const EventContext &ctx) const
Trk::ParticleHypothesis m_particleHypothesis
void extractClusterIds(const Trk::SpacePoint *, std::vector< Identifier > &) const
Gaudi::Property< bool > m_doTrackRefit
const AtlasDetectorID * m_idHelper
bool m_useNewLayerNumberScheme
SG::ReadHandleKey< TrigRoiDescriptorCollection > m_roiCollectionKey
double trackQuality(const Trk::Track *Tr) const
void fillDisTrkCand(xAOD::TrigComposite *, const std::string &, Trk::Track *, const std::unique_ptr< const Trk::TrackParameters > &) const
ToolHandle< Trk::ITrackSummaryTool > m_trackSummaryTool
double disTrackQuality(const Trk::Track *) const
virtual StatusCode initialize() override
std::array< OneLayerInfo_t, N_BARREL_LAYERS > getTrkBarrelLayerInfo(Trk::Track *aTrack) const
void recoVertexForDisTrack(const EventContext &, TrackCollection &, std::vector< double > &, std::vector< double > &, std::vector< double > &) const
void print_disTrk(const Trk::Track *t) const
const PixelID * m_pixelId
SG::WriteHandleKey< xAOD::TrigCompositeContainer > m_dEdxTrkKey
SG::WriteHandleKey< TrackCollection > m_outputTracksKey
std::atomic< unsigned int > m_countRoIwithEnoughHits
bool isPreselPassDisTrackAfterRefit(Trk::Track *, Trk::Track *, double, double) const
std::atomic< unsigned int > m_countRoIwithTracks
std::unique_ptr< Trk::Track > disTrk_refit(Trk::Track *t, const EventContext &ctx) const
StatusCode finddEdxTrk(const EventContext &, const TrackCollection &) const
std::atomic< unsigned int > m_countTotalRoI
ToolHandle< ITrigZFinder > m_trigZFinder
SG::WriteHandleKey< xAOD::TrigCompositeContainer > m_disTrkCandKey
int getSPLayer(int, float) const
void filterSharedTracks(std::vector< std::tuple< bool, double, Trk::Track * > > &QT) const
ToolHandle< InDet::ISiTrackMaker > m_trackMaker
TrigCombinatorialSettings m_tcs
ToolHandle< Trk::ITrackFitter > m_disTrkFitter
ToolHandle< Trk::IExtrapolator > m_extrapolator
bool m_storeZFinderVertices
virtual StatusCode finalize() override
ServiceHandle< ITrigInDetAccelerationSvc > m_accelSvc
ToolHandle< GenericMonitoringTool > m_monTool
StatusCode createEmptyUTTEDMs(const EventContext &) const
StatusCode findDisTracks(const EventContext &, TrackCollection &, std::vector< std::tuple< bool, double, Trk::Track * > > &, std::vector< std::tuple< bool, double, Trk::Track * > > &, TrackCollection &, const std::vector< double > &, const std::vector< double > &, const std::vector< double > &) const
bool usedByAnyTrack(const std::vector< Identifier > &, std::map< Identifier, std::vector< long int > > &) const
void makeSeedsOnGPU(const TrigCombinatorialSettings &, const IRoiDescriptor *, const std::vector< TrigSiSpacePointBase > &, std::vector< TrigInDetTriplet > &) const
bool isCleaningPassDisTrack(const TrigInDetTriplet &, Trk::Track *, bool) const
float dEdx(const Trk::Track *, int &, int &, std::vector< float > &, std::vector< float > &, std::vector< float > &, std::vector< float > &, std::vector< int > &, std::vector< int > &, std::vector< int > &) const
std::string m_trigseedML_LUT
TrigFastTrackFinder(const std::string &name, ISvcLocator *pSvcLocator)
nope - should be used for standalone also, perhaps need to protect the class def bits ifndef XAOD_ANA...
int numberDoF() const
returns the number of degrees of freedom of the overall track or vertex fit as integer
double chiSquared() const
returns the of the overall track fit
double doubleNumberDoF() const
returns the number of degrees of freedom of the overall track or vertex fit as double
Class to represent and store fit qualities from track reconstruction in terms of and number of degre...
int numberDoF() const
returns the number of degrees of freedom of the overall track or vertex fit as integer
double chiSquared() const
returns the of the overall track fit
double doubleNumberDoF() const
returns the number of degrees of freedom of the overall track or vertex fit as double
This class is the pure abstract base class for all fittable tracking measurements.
const LocalParameters & localParameters() const
Interface method to get the LocalParameters.
const Amg::Vector3D & momentum() const
Access method for the momentum.
virtual const Surface & associatedSurface() const override=0
Access to the Surface associated to the Parameters.
Class describing the Line to which the Perigee refers to.
Identifier identify() const
return the identifier
Class to handle RIO On Tracks ROT) for InDet and Muons, it inherits from the common MeasurementBase.
virtual const Trk::PrepRawData * prepRawData() const =0
returns the PrepRawData (also known as RIO) object to which this RIO_OnTrack is associated.
Identifier identify() const
return the identifier -extends MeasurementBase
const std::pair< const PrepRawData *, const PrepRawData * > & clusterList() const
return the pair of cluster pointers by reference
virtual const Amg::Vector3D & normal() const
Returns the normal vector of the Surface (i.e.
@ FastTrackFinderSeed
for tracks seeded by the FastTrackFinder
@ Perigee
This represents a perigee, and so will contain a Perigee object only.
int get(const SummaryType &type) const
returns the summary information for the passed SummaryType.
const Trk::TrackStates * trackStateOnSurfaces() const
return a pointer to a const DataVector of const TrackStateOnSurfaces.
const DataVector< const MeasurementBase > * measurementsOnTrack() const
return a pointer to a vector of MeasurementBase (NOT including any that come from outliers).
const Perigee * perigeeParameters() const
return Perigee.
const Trk::TrackSummary * trackSummary() const
Returns a pointer to the const Trk::TrackSummary owned by this const track (could be nullptr).
const FitQuality * fitQuality() const
return a pointer to the fit quality const-overload
bool setDetail(const std::string &name, const TYPE &value)
Set an TYPE detail on the object.
double chi2(TH1 *h0, TH1 *h1)
Eigen::Matrix< double, 3, 1 > Vector3D
T wrapToPi(T phi)
Wrap angle in radians to [-pi, pi].
void getBeamSpotShift(float &shift_x, float &shift_y, const InDet::BeamSpotData &beamSpotHandle)
bool isGoodTrackUTT(const Trk::Track *track, trackInfo &theTrackInfo, const float shift_x, const float shift_y, float trkcut_ptgev)
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
@ VIEW_ELEMENTS
this data object is a view, it does not own its elmts
struct TrigAccel::DataExportBuffer DATA_EXPORT_BUFFER
Ensure that the ATLAS eigen extensions are properly loaded.
DataVector< const Trk::TrackStateOnSurface > TrackStates
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
ParametersBase< TrackParametersDim, Charged > TrackParameters
@ numberOfSCTHits
number of SCT holes
@ numberOfPixelHits
number of pixel layers on track with absence of hits
@ numberOfNextToInnermostPixelLayerHits
these are the pixel hits, including the b-layer
@ numberOfInnermostPixelLayerHits
these are the hits in the 1st pixel layer
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
TrigCompositeContainer_v1 TrigCompositeContainer
Declare the latest version of the container.
TrigComposite_v1 TrigComposite
Declare the latest version of the class.
Helper for azimuthal angle calculations.