Skip to content

Commit

Permalink
feat: update to ATLAS-based FTF seeding (#2726)
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
4 people authored Dec 5, 2023
1 parent ff4b5ea commit 07e829d
Show file tree
Hide file tree
Showing 12 changed files with 131 additions and 99 deletions.
8 changes: 0 additions & 8 deletions Core/include/Acts/Seeding/GNN_DataStorage.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<const
// InDet::PixelCluster*>(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 =
Expand All @@ -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<const
// InDet::PixelCluster*>(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;
Expand Down
11 changes: 5 additions & 6 deletions Core/include/Acts/Seeding/GNN_TrackingFilter.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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];

Expand All @@ -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];
Expand All @@ -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]};

Expand All @@ -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;
Expand All @@ -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<Acts::TrigInDetSiLayer>& m_geo;
Expand Down
24 changes: 9 additions & 15 deletions Core/include/Acts/Seeding/SeedFinderFTF.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,22 +63,16 @@ class SeedFinderFTF {
void loadSpacePoints(
const std::vector<FTF_SP<external_spacepoint_t>> &FTF_SP_vect);

// inner
template <typename output_container_t>
void createSeeds(
const Acts::RoiDescriptor &roi,
const Acts::TrigFTF_GNN_Geometry<external_spacepoint_t> &gnngeo);

// create seeeds function
template <typename input_container_t, typename output_container_t,
typename callable_t>
void createSeeds_old(const Acts::SeedFinderOptions &options,
const input_container_t &spacePoints,
output_container_t &out_cont,
callable_t &&extract_coordinates) const;

template <typename input_container_t, typename callable_t>
std::vector<seed_t> 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<external_spacepoint_t> & /*gnngeo*/,
output_container_t & /*out_cont*/);
// outer
std::vector<seed_t> createSeeds(
const Acts::RoiDescriptor & /*roi*/,
const Acts::TrigFTF_GNN_Geometry<external_spacepoint_t> & /*gnngeo*/);

private:
enum Dim { DimPhi = 0, DimR = 1, DimZ = 2 };
Expand Down
86 changes: 39 additions & 47 deletions Core/include/Acts/Seeding/SeedFinderFTF.ipp
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ void SeedFinderFTF<external_spacepoint_t>::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();
Expand All @@ -70,25 +69,13 @@ void SeedFinderFTF<external_spacepoint_t>::runGNN_TrackFinder(
std::vector<GNN_TrigTracklet<external_spacepoint_t>>& vTracks,
const Acts::RoiDescriptor& roi,
const Acts::TrigFTF_GNN_Geometry<external_spacepoint_t>& 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;

Expand All @@ -100,7 +87,7 @@ void SeedFinderFTF<external_spacepoint_t>::runGNN_TrackFinder(

std::vector<Acts::TrigFTF_GNN_Edge<external_spacepoint_t>> edgeStorage;

edgeStorage.reserve(MaxEdges);
edgeStorage.reserve(m_config.MaxEdges);

int nEdges = 0;

Expand Down Expand Up @@ -256,7 +243,7 @@ void SeedFinderFTF<external_spacepoint_t>::runGNN_TrackFinder(
continue;
}

float zouter = z0 + maxOuterRadius * tau;
float zouter = z0 + m_config.maxOuterRadius * tau;

if (zouter < cut_zMinU || zouter > cut_zMaxU) {
continue;
Expand Down Expand Up @@ -300,8 +287,9 @@ void SeedFinderFTF<external_spacepoint_t>::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
Expand All @@ -316,7 +304,7 @@ void SeedFinderFTF<external_spacepoint_t>::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);

Expand Down Expand Up @@ -395,11 +383,11 @@ void SeedFinderFTF<external_spacepoint_t>::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;
}

Expand All @@ -411,14 +399,14 @@ void SeedFinderFTF<external_spacepoint_t>::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;
}

Expand Down Expand Up @@ -497,7 +485,7 @@ void SeedFinderFTF<external_spacepoint_t>::runGNN_TrackFinder(

std::vector<Acts::TrigFTF_GNN_Edge<external_spacepoint_t>*> vSeeds;

vSeeds.reserve(MaxEdges / 2);
vSeeds.reserve(m_config.MaxEdges / 2);

for (int edgeIndex = 0; edgeIndex < nEdges; edgeIndex++) {
Acts::TrigFTF_GNN_Edge<external_spacepoint_t>* pS =
Expand Down Expand Up @@ -662,9 +650,11 @@ void SeedFinderFTF<external_spacepoint_t>::runGNN_TrackFinder(
}

template <typename external_spacepoint_t>
template <typename output_container_t>
void SeedFinderFTF<external_spacepoint_t>::createSeeds(
const Acts::RoiDescriptor& roi,
const Acts::TrigFTF_GNN_Geometry<external_spacepoint_t>& gnngeo) {
const Acts::TrigFTF_GNN_Geometry<external_spacepoint_t>& gnngeo,
output_container_t& out_cont) {
std::vector<GNN_TrigTracklet<external_spacepoint_t>>
vTracks; // make empty vector

Expand Down Expand Up @@ -705,27 +695,29 @@ void SeedFinderFTF<external_spacepoint_t>::createSeeds(
}
}
vTracks.clear();
}

// // still to be developed
template <typename external_spacepoint_t>
template <typename input_container_t, typename output_container_t,
typename callable_t>
void SeedFinderFTF<external_spacepoint_t>::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 <typename external_spacepoint_t>
template <typename input_container_t, typename callable_t>
std::vector<Seed<external_spacepoint_t>>
SeedFinderFTF<external_spacepoint_t>::createSeeds_old(
const Acts::SeedFinderOptions& options,
const input_container_t& spacePoints,
callable_t&& extract_coordinates) const {
SeedFinderFTF<external_spacepoint_t>::createSeeds(
const Acts::RoiDescriptor& roi,
const Acts::TrigFTF_GNN_Geometry<external_spacepoint_t>& gnngeo) {
std::vector<seed_t> r;
createSeeds_old(options, spacePoints, r,
std::forward<callable_t>(extract_coordinates));
createSeeds(roi, gnngeo, r);
return r;
}

Expand Down
36 changes: 23 additions & 13 deletions Core/include/Acts/Seeding/SeedFinderFTFConfig.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<TrigInDetSiLayer> 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() {
Expand Down
1 change: 0 additions & 1 deletion Core/src/TrackFinding/FasTrackConnector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -193,5 +193,4 @@ FasTrackConnector::~FasTrackConnector() {
}
}
}

} // namespace Acts
15 changes: 13 additions & 2 deletions Core/src/TrackFinding/RoiDescriptor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -50,6 +52,8 @@ class SeedingFTFAlgorithm final : public IAlgorithm {
std::map<std::pair<int, int>, std::pair<int, int>> ACTS_FTF_Map;

bool fill_module_csv = false;

std::string inputClusters;
};

// constructor:
Expand Down Expand Up @@ -87,6 +91,8 @@ class SeedingFTFAlgorithm final : public IAlgorithm {

ReadDataHandle<IndexSourceLinkContainer> m_inputSourceLinks{
this, "InputSourceLinks"};

ReadDataHandle<ClusterContainer> m_inputClusters{this, "InputClusters"};
};

} // namespace ActsExamples
Loading

0 comments on commit 07e829d

Please sign in to comment.