From 07e829dcd0713d4e000f1c687f9006e4f33c4141 Mon Sep 17 00:00:00 2001 From: Rosie-Hasan <86960527+Rosie-Hasan@users.noreply.github.com> Date: Tue, 5 Dec 2023 09:34:20 +0000 Subject: [PATCH] feat: update to ATLAS-based FTF seeding (#2726) Update to FTF seeding files. Now creating seeds and efficiency able to be measured This code doesn't include updating the code to modern C++ and renaming classes, these will be in seperate PRs --------- Co-authored-by: Luis Falda Coelho <56648068+LuisFelipeCoelho@users.noreply.github.com> Co-authored-by: Alexander J. Pfleger <70842573+AJPfleger@users.noreply.github.com> Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- Core/include/Acts/Seeding/GNN_DataStorage.hpp | 8 -- .../Acts/Seeding/GNN_TrackingFilter.hpp | 11 ++- Core/include/Acts/Seeding/SeedFinderFTF.hpp | 24 ++---- Core/include/Acts/Seeding/SeedFinderFTF.ipp | 86 +++++++++---------- .../Acts/Seeding/SeedFinderFTFConfig.hpp | 36 +++++--- Core/src/TrackFinding/FasTrackConnector.cpp | 1 - Core/src/TrackFinding/RoiDescriptor.cpp | 15 +++- .../TrackFinding/SeedingFTFAlgorithm.hpp | 6 ++ .../TrackFinding/src/SeedingFTFAlgorithm.cpp | 27 ++++-- .../python/acts/examples/reconstruction.py | 1 + Examples/Python/src/TrackFinding.cpp | 2 +- Examples/Scripts/Python/full_chain_itk_FTF.py | 13 +++ 12 files changed, 131 insertions(+), 99 deletions(-) diff --git a/Core/include/Acts/Seeding/GNN_DataStorage.hpp b/Core/include/Acts/Seeding/GNN_DataStorage.hpp index fb630b43a3f..9b0ca47ba76 100644 --- a/Core/include/Acts/Seeding/GNN_DataStorage.hpp +++ b/Core/include/Acts/Seeding/GNN_DataStorage.hpp @@ -180,10 +180,6 @@ class TrigFTF_GNN_DataStorage { float max_tau = 100.0; // can't do this bit yet as dont have cluster width if (useClusterWidth) { - // const Trk::SpacePoint* osp = sp.offlineSpacePoint(); - // const InDet::PixelCluster* pCL = dynamic_cast(osp->clusterList().first); - // float cluster_width = pCL->width().widthPhiRZ().y(); float cluster_width = 1; // temporary while cluster width not available min_tau = 6.7 * (cluster_width - 0.2); max_tau = @@ -194,10 +190,6 @@ class TrigFTF_GNN_DataStorage { sp, min_tau, max_tau)); // adding ftf member to nodes } else { if (useClusterWidth) { - // const Trk::SpacePoint* osp = sp.offlineSpacePoint(); - // const InDet::PixelCluster* pCL = dynamic_cast(osp->clusterList().first); - // float cluster_width = pCL->width().widthPhiRZ().y(); float cluster_width = 1; // temporary while cluster width not available if (cluster_width > 0.2) { return -3; diff --git a/Core/include/Acts/Seeding/GNN_TrackingFilter.hpp b/Core/include/Acts/Seeding/GNN_TrackingFilter.hpp index 5c388c83504..a4a4fe52af2 100644 --- a/Core/include/Acts/Seeding/GNN_TrackingFilter.hpp +++ b/Core/include/Acts/Seeding/GNN_TrackingFilter.hpp @@ -229,8 +229,8 @@ class TrigFTF_GNN_TrackingFilter { const float weight_x = 0.5; const float weight_y = 0.5; - const float maxDChi2_x = 60.0; // 35.0; - const float maxDChi2_y = 60.0; // 31.0; + const float maxDChi2_x = 60.0; // was 35.0; + const float maxDChi2_y = 60.0; // was 31.0; const float add_hit = 14.0; @@ -306,7 +306,6 @@ class TrigFTF_GNN_TrackingFilter { Cy[1][1] = ts.m_Cy[1][1]; // chi2 test - float resid_x = mx - X[0]; float resid_y = my - Y[0]; @@ -317,7 +316,7 @@ class TrigFTF_GNN_TrackingFilter { int type = getLayerType(pS->m_n1->m_sp_FTF.combined_ID); - if (type == 0) { // barrel TO-DO: split into barrel Pixel and barrel SCT + if (type == 0) { // barrel TODO: split into barrel Pixel and barrel SCT sigma_rz = sigma_y * sigma_y; } else { sigma_rz = sigma_y * ts.m_Y[1]; @@ -338,7 +337,6 @@ class TrigFTF_GNN_TrackingFilter { ts.m_J += add_hit - dchi2_x * weight_x - dchi2_y * weight_y; // state update - float Kx[3] = {Dx * Cx[0][0], Dx * Cx[0][1], Dx * Cx[0][2]}; float Ky[2] = {Dy * Cy[0][0], Dy * Cy[0][1]}; @@ -360,6 +358,7 @@ class TrigFTF_GNN_TrackingFilter { ts.m_Cy[i][j] = Cy[i][j] - Ky[i] * CHy[j]; } } + ts.m_refX = refX; ts.m_refY = refY; return true; @@ -371,7 +370,7 @@ class TrigFTF_GNN_TrackingFilter { }); // iterator to vector member with this id int index = std::distance(m_geo.begin(), iterator); - return m_geo.at(index).m_type; + return m_geo.at(index).m_type; // needs to be 0, 2, or -2 } const std::vector& m_geo; diff --git a/Core/include/Acts/Seeding/SeedFinderFTF.hpp b/Core/include/Acts/Seeding/SeedFinderFTF.hpp index b03d7306082..5136e86614e 100644 --- a/Core/include/Acts/Seeding/SeedFinderFTF.hpp +++ b/Core/include/Acts/Seeding/SeedFinderFTF.hpp @@ -63,22 +63,16 @@ class SeedFinderFTF { void loadSpacePoints( const std::vector> &FTF_SP_vect); + // inner + template void createSeeds( - const Acts::RoiDescriptor &roi, - const Acts::TrigFTF_GNN_Geometry &gnngeo); - - // create seeeds function - template - void createSeeds_old(const Acts::SeedFinderOptions &options, - const input_container_t &spacePoints, - output_container_t &out_cont, - callable_t &&extract_coordinates) const; - - template - std::vector createSeeds_old(const Acts::SeedFinderOptions &options, - const input_container_t &spacePoints, - callable_t &&extract_coordinates) const; + const Acts::RoiDescriptor & /*roi*/, + const Acts::TrigFTF_GNN_Geometry & /*gnngeo*/, + output_container_t & /*out_cont*/); + // outer + std::vector createSeeds( + const Acts::RoiDescriptor & /*roi*/, + const Acts::TrigFTF_GNN_Geometry & /*gnngeo*/); private: enum Dim { DimPhi = 0, DimR = 1, DimZ = 2 }; diff --git a/Core/include/Acts/Seeding/SeedFinderFTF.ipp b/Core/include/Acts/Seeding/SeedFinderFTF.ipp index 38696c7ade1..002f3f8cc09 100644 --- a/Core/include/Acts/Seeding/SeedFinderFTF.ipp +++ b/Core/include/Acts/Seeding/SeedFinderFTF.ipp @@ -57,7 +57,6 @@ void SeedFinderFTF::loadSpacePoints( m_storage->addSpacePoint(FTF_sp, (m_config.m_useClusterWidth > 0)); } - m_config.m_nMaxPhiSlice = 1; m_config.m_phiSliceWidth = 2 * M_PI / m_config.m_nMaxPhiSlice; m_storage->sortByPhi(); @@ -70,25 +69,13 @@ void SeedFinderFTF::runGNN_TrackFinder( std::vector>& vTracks, const Acts::RoiDescriptor& roi, const Acts::TrigFTF_GNN_Geometry& gnngeo) { - // long term move these to ftf finder config, then m_config. to access them - const int MaxEdges = 2000000; - - const float cut_dphi_max = 0.012; - const float cut_dcurv_max = 0.001; - const float cut_tau_ratio_max = 0.007; - const float min_z0 = -2800; // roiDescriptor->zedMinus(); //blank for now, - // get from config eventually - const float max_z0 = 2800; // roiDescriptor->zedPlus(); - - const float maxOuterRadius = 550.0; - const float cut_zMinU = - min_z0 + - maxOuterRadius * roi.dzdrMinus(); // dzdr can only find =0 in athena - const float cut_zMaxU = max_z0 + maxOuterRadius * roi.dzdrPlus(); - - float m_minR_squ = 1; // set earlier - float m_maxCurv = 1; - + const float min_z0 = roi.zedMinus(); + const float max_z0 = roi.zedPlus(); + const float cut_zMinU = min_z0 + m_config.maxOuterRadius * roi.dzdrMinus(); + const float cut_zMaxU = max_z0 + m_config.maxOuterRadius * roi.dzdrPlus(); + float m_minR_squ = m_config.m_tripletPtMin * m_config.m_tripletPtMin / + std::pow(m_config.ptCoeff, 2); // from athena + float m_maxCurv = m_config.ptCoeff / m_config.m_tripletPtMin; const float maxKappa_high_eta = 0.8 / m_minR_squ; const float maxKappa_low_eta = 0.6 / m_minR_squ; @@ -100,7 +87,7 @@ void SeedFinderFTF::runGNN_TrackFinder( std::vector> edgeStorage; - edgeStorage.reserve(MaxEdges); + edgeStorage.reserve(m_config.MaxEdges); int nEdges = 0; @@ -256,7 +243,7 @@ void SeedFinderFTF::runGNN_TrackFinder( continue; } - float zouter = z0 + maxOuterRadius * tau; + float zouter = z0 + m_config.maxOuterRadius * tau; if (zouter < cut_zMinU || zouter > cut_zMaxU) { continue; @@ -300,8 +287,9 @@ void SeedFinderFTF::runGNN_TrackFinder( float tau2 = edgeStorage.at(n2_in_idx).m_p[0]; float tau_ratio = tau2 * uat_1 - 1.0f; - if (std::fabs(tau_ratio) > cut_tau_ratio_max) { // bad - // match + if (std::fabs(tau_ratio) > + m_config.cut_tau_ratio_max) { // bad + // match continue; } isGood = true; // good match found @@ -316,7 +304,7 @@ void SeedFinderFTF::runGNN_TrackFinder( float dPhi2 = std::asin(curv * r2); float dPhi1 = std::asin(curv * r1); - if (nEdges < MaxEdges) { + if (nEdges < m_config.MaxEdges) { edgeStorage.emplace_back(n1, n2, exp_eta, curv, phi1 + dPhi1, phi2 + dPhi2); @@ -395,11 +383,11 @@ void SeedFinderFTF::runGNN_TrackFinder( float tau2 = pNS->m_p[0]; float tau_ratio = tau2 * uat_1 - 1.0f; - if (tau_ratio < -cut_tau_ratio_max) { + if (tau_ratio < -m_config.cut_tau_ratio_max) { last_out = out_idx; continue; } - if (tau_ratio > cut_tau_ratio_max) { + if (tau_ratio > m_config.cut_tau_ratio_max) { break; } @@ -411,14 +399,14 @@ void SeedFinderFTF::runGNN_TrackFinder( dPhi -= 2 * M_PI; } - if (dPhi < -cut_dphi_max || dPhi > cut_dphi_max) { + if (dPhi < -m_config.cut_dphi_max || dPhi > m_config.cut_dphi_max) { continue; } float curv2 = pNS->m_p[1]; float dcurv = curv2 - curv1; - if (dcurv < -cut_dcurv_max || dcurv > cut_dcurv_max) { + if (dcurv < -m_config.cut_dcurv_max || dcurv > m_config.cut_dcurv_max) { continue; } @@ -497,7 +485,7 @@ void SeedFinderFTF::runGNN_TrackFinder( std::vector*> vSeeds; - vSeeds.reserve(MaxEdges / 2); + vSeeds.reserve(m_config.MaxEdges / 2); for (int edgeIndex = 0; edgeIndex < nEdges; edgeIndex++) { Acts::TrigFTF_GNN_Edge* pS = @@ -662,9 +650,11 @@ void SeedFinderFTF::runGNN_TrackFinder( } template +template void SeedFinderFTF::createSeeds( const Acts::RoiDescriptor& roi, - const Acts::TrigFTF_GNN_Geometry& gnngeo) { + const Acts::TrigFTF_GNN_Geometry& gnngeo, + output_container_t& out_cont) { std::vector> vTracks; // make empty vector @@ -705,27 +695,29 @@ void SeedFinderFTF::createSeeds( } } vTracks.clear(); -} -// // still to be developed -template -template -void SeedFinderFTF::createSeeds_old( - const Acts::SeedFinderOptions& /*options*/, - const input_container_t& /*spacePoints*/, output_container_t& /*out_cont*/, - callable_t&& /*extract_coordinates*/) const {} + for (auto& triplet : m_triplets) { + const external_spacepoint_t* S1 = + triplet.s1().SP; // triplet-> FTF_SP-> simspacepoint + const external_spacepoint_t* S2 = triplet.s2().SP; + const external_spacepoint_t* S3 = triplet.s3().SP; + + // input to seed + float Vertex = 0; + float Quality = triplet.Q(); + // make a new seed, add to vector of seeds + out_cont.emplace_back(*S1, *S2, *S3, Vertex, Quality); + } +} +// outer called in alg template -template std::vector> -SeedFinderFTF::createSeeds_old( - const Acts::SeedFinderOptions& options, - const input_container_t& spacePoints, - callable_t&& extract_coordinates) const { +SeedFinderFTF::createSeeds( + const Acts::RoiDescriptor& roi, + const Acts::TrigFTF_GNN_Geometry& gnngeo) { std::vector r; - createSeeds_old(options, spacePoints, r, - std::forward(extract_coordinates)); + createSeeds(roi, gnngeo, r); return r; } diff --git a/Core/include/Acts/Seeding/SeedFinderFTFConfig.hpp b/Core/include/Acts/Seeding/SeedFinderFTFConfig.hpp index 420935ecb82..7103a9a1a3d 100644 --- a/Core/include/Acts/Seeding/SeedFinderFTFConfig.hpp +++ b/Core/include/Acts/Seeding/SeedFinderFTFConfig.hpp @@ -46,22 +46,32 @@ struct SeedFinderFTFConfig { // helix. This is useful for e.g. misaligned seeding. float helixCutTolerance = 1.; - float m_phiSliceWidth{}; - float m_nMaxPhiSlice{}; - bool m_useClusterWidth = false; - std::string fastrack_input_file; + float m_phiSliceWidth{}; // initialised in loadSpacePoints function + float m_nMaxPhiSlice = 53; // used to calculate phi slices + bool m_useClusterWidth = + false; // bool for use of cluster width in loadSpacePoints function + std::string fastrack_input_file; // input file for fastrack object std::vector m_layerGeometry; - // for run function - // m_settings: + // for runGNN_TrackFinder bool m_LRTmode = true; // eventually want to set from full chain - bool m_useEtaBinning = true; - bool m_doubletFilterRZ = true; - float m_minDeltaRadius = 5.0; // eventually set in config or to equivalent - // acts 2.0 but increasing to test loops - // float m_maxDeltaRadius = 270.0 ; - float m_tripletD0Max = 4.0; // m_settings - unsigned int m_maxTripletBufferLength = 3; + bool m_useEtaBinning = + true; // bool to use eta binning from geometry structure + bool m_doubletFilterRZ = true; // bool applies new Z cuts on doublets + float m_minDeltaRadius = 2.0; // min dr for doublet + float m_tripletD0Max = 4.0; // D0 cut for triplets + unsigned int m_maxTripletBufferLength = + 3; // maximum number of space points per triplet + int MaxEdges = 2000000; // max number of GNN edges/doublets + float cut_dphi_max = 0.012; // phi cut for triplets + float cut_dcurv_max = 0.001; // curv cut for triplets + float cut_tau_ratio_max = 0.007; // tau cut for doublets and triplets + float maxOuterRadius = 550.0; // used to calculate Z cut on doublets + float m_PtMin = 1000.0; + float m_tripletPtMinFrac = 0.3; + float m_tripletPtMin = m_PtMin * m_tripletPtMinFrac; // Limit on triplet pt + double ptCoeff = + 0.29997 * 1.9972 / 2.0; // ~0.3*B/2 - assumes nominal field of 2*T // ROI: bool containsPhi() { diff --git a/Core/src/TrackFinding/FasTrackConnector.cpp b/Core/src/TrackFinding/FasTrackConnector.cpp index 4bde548f85a..0d4ad1bacd6 100644 --- a/Core/src/TrackFinding/FasTrackConnector.cpp +++ b/Core/src/TrackFinding/FasTrackConnector.cpp @@ -193,5 +193,4 @@ FasTrackConnector::~FasTrackConnector() { } } } - } // namespace Acts diff --git a/Core/src/TrackFinding/RoiDescriptor.cpp b/Core/src/TrackFinding/RoiDescriptor.cpp index 4ae7288a7af..c76df027082 100644 --- a/Core/src/TrackFinding/RoiDescriptor.cpp +++ b/Core/src/TrackFinding/RoiDescriptor.cpp @@ -22,10 +22,21 @@ Acts::RoiDescriptor::RoiDescriptor(double eta, double etaMinus, double etaPlus, m_zed(zed), m_phiMinus(phiMinus), m_phiPlus(phiPlus), - m_etaMinus(etaMinus), + m_etaMinus(etaMinus), //-4.5 m_etaPlus(etaPlus), m_zedMinus(zedMinus), - m_zedPlus(zedPlus) {} + m_zedPlus(zedPlus) { + // catch in the athena roi code + // if ( std::isnan(m_etaPlus) ) throw std::invalid_argument( "RoiDescriptor: + // etaPlus nan" ); if ( std::isnan(m_etaMinus) ) throw std::invalid_argument( + // "RoiDescriptor: etaMinus nan" ); + + m_drdzMinus = std::tan(2 * std::atan(std::exp(-m_etaMinus))); //-0.02 + m_drdzPlus = std::tan(2 * std::atan(std::exp(-m_etaPlus))); // 0.02 + + m_dzdrMinus = 1 / m_drdzMinus; //-45 + m_dzdrPlus = 1 / m_drdzPlus; // 45 +} Acts::RoiDescriptor::~RoiDescriptor() = default; diff --git a/Examples/Algorithms/TrackFinding/include/ActsExamples/TrackFinding/SeedingFTFAlgorithm.hpp b/Examples/Algorithms/TrackFinding/include/ActsExamples/TrackFinding/SeedingFTFAlgorithm.hpp index a1022d61566..c67999e573b 100644 --- a/Examples/Algorithms/TrackFinding/include/ActsExamples/TrackFinding/SeedingFTFAlgorithm.hpp +++ b/Examples/Algorithms/TrackFinding/include/ActsExamples/TrackFinding/SeedingFTFAlgorithm.hpp @@ -14,6 +14,8 @@ #include "Acts/Seeding/SeedFilterConfig.hpp" #include "Acts/Seeding/SeedFinderFTF.hpp" #include "Acts/Seeding/SeedFinderFTFConfig.hpp" +#include "ActsExamples/EventData/Cluster.hpp" + // in core #include "Acts/Geometry/TrackingGeometry.hpp" #include "Acts/Seeding/SeedFinderConfig.hpp" @@ -50,6 +52,8 @@ class SeedingFTFAlgorithm final : public IAlgorithm { std::map, std::pair> ACTS_FTF_Map; bool fill_module_csv = false; + + std::string inputClusters; }; // constructor: @@ -87,6 +91,8 @@ class SeedingFTFAlgorithm final : public IAlgorithm { ReadDataHandle m_inputSourceLinks{ this, "InputSourceLinks"}; + + ReadDataHandle m_inputClusters{this, "InputClusters"}; }; } // namespace ActsExamples diff --git a/Examples/Algorithms/TrackFinding/src/SeedingFTFAlgorithm.cpp b/Examples/Algorithms/TrackFinding/src/SeedingFTFAlgorithm.cpp index 4766127ad73..a092f75f4e6 100644 --- a/Examples/Algorithms/TrackFinding/src/SeedingFTFAlgorithm.cpp +++ b/Examples/Algorithms/TrackFinding/src/SeedingFTFAlgorithm.cpp @@ -64,6 +64,8 @@ ActsExamples::SeedingFTFAlgorithm::SeedingFTFAlgorithm( m_inputSourceLinks.initialize(m_cfg.inputSourceLinks); + m_inputClusters.initialize(m_cfg.inputClusters); + m_cfg.seedFinderConfig.seedFilter = std::make_unique>( Acts::SeedFilter(m_cfg.seedFilterConfig)); @@ -92,6 +94,17 @@ ActsExamples::ProcessCode ActsExamples::SeedingFTFAlgorithm::execute( std::vector> FTF_spacePoints = Make_FTF_spacePoints(ctx, m_cfg.ACTS_FTF_Map); + // cluster width + // const ClusterContainer* clusters = &m_inputClusters(ctx) ; + + // for (const auto& sp : FTF_spacePoints){ + // const auto& sl = sp.SP->sourceLinks().front().get() ; + // const auto& cluster = clusters->at(sl.index()) ; + // std::cout << "testing 0: " << cluster.sizeLoc0 << " 1: " << + // cluster.sizeLoc1 << std::endl ; + + // } + for (auto sp : FTF_spacePoints) { ACTS_DEBUG("FTF space points: " << " FTF_id: " << sp.FTF_ID << " z: " << sp.SP->z() @@ -119,14 +132,15 @@ ActsExamples::ProcessCode ActsExamples::SeedingFTFAlgorithm::execute( finder.loadSpacePoints(FTF_spacePoints); + // trigFTF file : Acts::RoiDescriptor internalRoi(0, -4.5, 4.5, 0, -M_PI, M_PI, 0, -150.0, 150.0); + // ROI file: + // Acts::RoiDescriptor internalRoi(0, -5, 5, 0, -M_PI, M_PI, 0, -225.0, + // 225.0); - finder.createSeeds(internalRoi, *mGNNgeo); - - // still to develop - SimSeedContainer seeds = finder.createSeeds_old( - m_cfg.seedFinderOptions, FTF_spacePoints, create_coordinates); + // new version returns seeds + SimSeedContainer seeds = finder.createSeeds(internalRoi, *mGNNgeo); m_outputSeeds(ctx, std::move(seeds)); @@ -286,7 +300,8 @@ ActsExamples::SeedingFTFAlgorithm::LayerNumbering() const { std::make_pair(ACTS_joint_id, 0); // here the key needs to be pair of(vol*100+lay, 0) auto Find = m_cfg.ACTS_FTF_Map.find(key); - int FTF_id = Find->second.first; // new map, item is pair want first + int FTF_id = 0; // initialise first to avoid FLTUND later + FTF_id = Find->second.first; // new map, item is pair want first if (Find == m_cfg.ACTS_FTF_Map .end()) { // if end then make new key of (vol*100+lay, modid) diff --git a/Examples/Python/python/acts/examples/reconstruction.py b/Examples/Python/python/acts/examples/reconstruction.py index f8a5788d0a0..661f63ea46c 100644 --- a/Examples/Python/python/acts/examples/reconstruction.py +++ b/Examples/Python/python/acts/examples/reconstruction.py @@ -885,6 +885,7 @@ def addFTFSeeding( inputSourceLinks="sourcelinks", trackingGeometry=trackingGeometry, fill_module_csv=False, + inputClusters="clusters", ) sequence.addAlgorithm(seedingAlg) diff --git a/Examples/Python/src/TrackFinding.cpp b/Examples/Python/src/TrackFinding.cpp index 43968c37fa2..3881a6b7e3e 100644 --- a/Examples/Python/src/TrackFinding.cpp +++ b/Examples/Python/src/TrackFinding.cpp @@ -276,7 +276,7 @@ void addTrackFinding(Context& ctx) { ActsExamples::SeedingFTFAlgorithm, mex, "SeedingFTFAlgorithm", inputSpacePoints, outputSeeds, seedFilterConfig, seedFinderConfig, seedFinderOptions, layerMappingFile, geometrySelection, inputSourceLinks, - trackingGeometry, ACTS_FTF_Map, fill_module_csv); + trackingGeometry, ACTS_FTF_Map, fill_module_csv, inputClusters); ACTS_PYTHON_DECLARE_ALGORITHM( ActsExamples::HoughTransformSeeder, mex, "HoughTransformSeeder", diff --git a/Examples/Scripts/Python/full_chain_itk_FTF.py b/Examples/Scripts/Python/full_chain_itk_FTF.py index 83f98a666a6..b4de671f5c7 100755 --- a/Examples/Scripts/Python/full_chain_itk_FTF.py +++ b/Examples/Scripts/Python/full_chain_itk_FTF.py @@ -99,4 +99,17 @@ outputDirRoot=outputDir, ) +addCKFTracks( + s, + trackingGeometry, + field, + TrackSelectorConfig( + pt=(1.0 * u.GeV if ttbar_pu200 else 0.0, None), + absEta=(None, 4.0), + nMeasurementsMin=6, + ), + outputDirRoot=outputDir, +) + + s.run()