diff --git a/Trigger/EFTracking/EFTrackingEmulation/CMakeLists.txt b/Trigger/EFTracking/EFTrackingEmulation/CMakeLists.txt index 027be34fa6506ad95750c5390c6ec8c2969d61b9..97ded7a560c9ee0433a7ff6d73e905d6c859fa2f 100644 --- a/Trigger/EFTracking/EFTrackingEmulation/CMakeLists.txt +++ b/Trigger/EFTracking/EFTrackingEmulation/CMakeLists.txt @@ -3,7 +3,7 @@ atlas_subdir ( EFTrackingEmulation ) atlas_add_library (EFTrackingEmulationLib - EFTrackingEmulation/*.h src/*.cxx src/FitFunctions/L1TT/* + EFTrackingEmulation/*.h src/*.cxx src/FitFunctions/* NO_PUBLIC_HEADERS LINK_LIBRARIES AnaAlgorithmLib xAODTracking TrkEventTPCnv TrkEventPrimitives) diff --git a/Trigger/EFTracking/EFTrackingEmulation/README b/Trigger/EFTracking/EFTrackingEmulation/README index 291316ab79c26f897d0d0a0ebb0f804edccac0d3..3ff669acc8a89da0595b3c0f19440268553a96a9 100644 --- a/Trigger/EFTracking/EFTrackingEmulation/README +++ b/Trigger/EFTracking/EFTrackingEmulation/README @@ -11,4 +11,27 @@ EFTrackingSmearingAlg: EFTrackingSmearingConfig: - - contains the configuraiton of EFTrackingSmearingAlg and an example of how to implement in a job (as unit test) \ No newline at end of file + - contains the configuraiton of EFTrackingSmearingAlg and an example of how to implement in a job (as unit test) + + +python/EFTrackingSmearingConfig.py + - contains the configuration of the Smearing Algorithm, and a test that runs in CI, to be used as an example to include it in your analisys + +FitFunctions: + - contain the fit functions obtained by fitting the track resoltuion functions + + - FitFunctions/HTT: functions used for the L1Track note TL-COM-DAQ-2020-116 + + 2D-function to describe the efficiency versus pT and eta + obtained from XXX + (original code from A.Cerri and P. Calfayan, used for the L1Track task-force, 2020) + https://twiki.cern.ch/twiki/bin/viewauth/Atlas/HTTPerfWithEmulation + + + - FitFunctions/URD: functions to be used for the EFTracking URD. + + They are extracted from the IDPVM files: https://codimd.web.cern.ch/Rcmq5nrER1moq_IMHcf63Q + with ATLAS-P2-RUN4-01-00-00 and a postProcessing code in a user repository + https://gitlab.cern.ch/fpastore/in-det-phys-val-monitoring-pp + + diff --git a/Trigger/EFTracking/EFTrackingEmulation/python/EFTrackingSmearingConfig.py b/Trigger/EFTracking/EFTrackingEmulation/python/EFTrackingSmearingConfig.py index 29f1ec30a02d5e1c2643b70bb7953f575ddd47fb..773c3753016962cab82837f0881050d16791b833 100644 --- a/Trigger/EFTracking/EFTrackingEmulation/python/EFTrackingSmearingConfig.py +++ b/Trigger/EFTracking/EFTrackingEmulation/python/EFTrackingSmearingConfig.py @@ -51,7 +51,7 @@ if __name__ == "__main__": from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg acc.merge(PoolReadCfg(flags)) - smearer = EFTrackingSmearingCfg("test", trkpTCut=1, smearFactor=1, InputTrackParticle="InDetTrackParticles", + smearer = EFTrackingSmearingCfg("test", trkpTCut=1, smearFactor=2, InputTrackParticle="InDetTrackParticles", trackEfficiency=1., parameterizeEfficiency=True, EnableMonitoring=True) acc.merge(smearer) diff --git a/Trigger/EFTracking/EFTrackingEmulation/src/EFTrackingSmearingAlg.h b/Trigger/EFTracking/EFTrackingEmulation/src/EFTrackingSmearingAlg.h index b49ba2993c32baafe9a71322ef4563835e9a0976..0e9fc484f2d82bb4bbc7ddc2a82f99059010d7e1 100644 --- a/Trigger/EFTracking/EFTrackingEmulation/src/EFTrackingSmearingAlg.h +++ b/Trigger/EFTracking/EFTrackingEmulation/src/EFTrackingSmearingAlg.h @@ -28,7 +28,7 @@ class EFTrackingSmearingAlg: public ::AthHistogramAlgorithm { "key for retrieval of output TrackParticles" }; - IntegerProperty m_SigmaScaleFactor {this, "SmearingScaleFactor", 1, "Set the smearing SF value for the sigmas"}; + DoubleProperty m_SigmaScaleFactor {this, "SmearingScaleFactor", 1, "Set the smearing SF value for the sigmas"}; BooleanProperty m_UseResolutionPtCutOff {this, "UseResolutionPtCutOff", false, "Apply ptCutoff on smearing"}; DoubleProperty m_SetResolutionPtCutOff {this, "SetResolutionPtCutOff", 0., "Set ptCutoff off for semaring"}; DoubleProperty m_inputTracksPtCut {this, "InputTracksPtCutGeV", 4.0, "Set input track pT cut"}; diff --git a/Trigger/EFTracking/EFTrackingEmulation/src/FakeTrackSmearer.h b/Trigger/EFTracking/EFTrackingEmulation/src/FakeTrackSmearer.h index 336c4f95b3429e712c3cf9fc4ba676e1d96d5958..1d9c458308ce89e35bf1434a5c2abcaab420865d 100644 --- a/Trigger/EFTracking/EFTrackingEmulation/src/FakeTrackSmearer.h +++ b/Trigger/EFTracking/EFTrackingEmulation/src/FakeTrackSmearer.h @@ -17,10 +17,10 @@ #include "FTS_Track.h" #include <cmath> namespace FitFunctions { - #include "FitFunctions/L1TT/d0Fitparam_N.C" - #include "FitFunctions/L1TT/z0Fitparam_N.C" - #include "FitFunctions/L1TT/MoreFitParam_N.C" - #include "FitFunctions/L1TT/effFitparam_N.C" + #include "FitFunctions/URD/d0Fitparam_N.C" + #include "FitFunctions/URD/z0Fitparam_N.C" + #include "FitFunctions/URD/effFitparam_N.C" + #include "FitFunctions/URD/ptqoptFitparam_N.C" } @@ -75,13 +75,13 @@ class FakeTrackSmearer double d0ResFunc(double eta,double pt,int verbose) { // add here other d0 res functions - return FitFunctions::getD0ResParam_N(eta,pt,verbose)/1000.0; + return FitFunctions::getd0ResParam_N(eta,pt,verbose)/1000.0;// convert to mm } - double z0ResFunc(double eta,double pt,int verbose) + double z0ResFunc(double eta,double pt,int verbose) { // add here other z0 res functions - return FitFunctions::getZ0ResParam_N(eta,pt,verbose)/1000.0; + return FitFunctions::getz0ResParam_N(eta,pt,verbose)/1000.0; // convert to mm } double etaResFunc(double eta __attribute__((unused)),double pt __attribute__((unused)),int verbose __attribute__((unused))) @@ -99,7 +99,7 @@ class FakeTrackSmearer double curvResFunc(double eta __attribute__((unused)),double pt __attribute__((unused)),int verbose __attribute__((unused))) { // add here other curv res functions - return 0.; + return FitFunctions::getptqoptResParam_N(eta,pt,verbose)/pt; } // Reference functions, in case needed //// @@ -347,7 +347,7 @@ double effFunc(double eta,double pt,int verbose) double m_FMatches = 1.; // NMatch/NOffline i.e. k double m_FakeFraction = 0.; - double m_SigmaScaleFactor = 1.0;//Note: This is an *integer property* in EFTrackingSmearingAlg.h + double m_SigmaScaleFactor = 1.0; double m_nominalEfficiency = 0.95; bool m_parameterizedEfficiency = false; diff --git a/Trigger/EFTracking/EFTrackingEmulation/src/FitFunctions/URD/d0Fitparam_N.C b/Trigger/EFTracking/EFTrackingEmulation/src/FitFunctions/URD/d0Fitparam_N.C new file mode 100644 index 0000000000000000000000000000000000000000..207cab1677e4467f5033908ec1ff284c6f685c4a --- /dev/null +++ b/Trigger/EFTracking/EFTrackingEmulation/src/FitFunctions/URD/d0Fitparam_N.C @@ -0,0 +1,79 @@ +// Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration +// 2D-function to describe the d0 resolution versus pT and eta. See README + +#include <iostream> +double getd0ResParam_N(float abstrketa, float trkpt, bool debug=false) { + + double d0Res = 0; + if (trkpt>=1.0 && trkpt<1.5) { + if (abstrketa<3.9) { + d0Res += 48.72407280*std::pow(abstrketa, 0); + d0Res += 11.70076933*std::pow(abstrketa, 1); + d0Res += -35.38275844*std::pow(abstrketa, 2); + d0Res += 70.21769320*std::pow(abstrketa, 3); + d0Res += -43.85424708*std::pow(abstrketa, 4); + d0Res += 11.73304174*std::pow(abstrketa, 5); + d0Res += -1.13186654*std::pow(abstrketa, 6); + d0Res += 21.84052455*exp(-0.5*std::pow((abstrketa-2.27356257)/0.22488828,2)); + } + } + + if (trkpt>=1.5 && trkpt<2.5) { + if (abstrketa<3.9) { + d0Res += 32.55725363*std::pow(abstrketa, 0); + d0Res += 0.09893172*std::pow(abstrketa, 1); + d0Res += 6.75310046*std::pow(abstrketa, 2); + d0Res += 1.34062131*std::pow(abstrketa, 3); + d0Res += -0.40280069*std::pow(abstrketa, 4); + d0Res += 7.64425495*exp(-0.5*std::pow((abstrketa-2.22125941)/0.15911675,2)); + } + } + + if (trkpt>=2.5 && trkpt<5.0) { + if (abstrketa<3.9) { + d0Res += 19.10784492*std::pow(abstrketa, 0); + d0Res += 0.63985912*std::pow(abstrketa, 1); + d0Res += 3.49699665*std::pow(abstrketa, 2); + d0Res += 7.64124327*exp(-0.5*std::pow((abstrketa-2.72410726)/0.55861409,2)); + } + } + + if (trkpt>=5.0 && trkpt<10.0) { + if (abstrketa<3.9) { + d0Res += 11.38970015*std::pow(abstrketa, 0); + d0Res += -2.13066894*std::pow(abstrketa, 1); + d0Res += 10.72056708*std::pow(abstrketa, 2); + d0Res += -13.07596283*std::pow(abstrketa, 3); + d0Res += 8.31592265*std::pow(abstrketa, 4); + d0Res += -2.25703331*std::pow(abstrketa, 5); + d0Res += 0.21876101*std::pow(abstrketa, 6); + } + } + + if (trkpt>=10.0 && trkpt<20.0) { + if (abstrketa<3.9) { + d0Res += 7.27429507*std::pow(abstrketa, 0); + d0Res += -0.24379687*std::pow(abstrketa, 1); + d0Res += 3.60091383*std::pow(abstrketa, 2); + d0Res += -5.43632881*std::pow(abstrketa, 3); + d0Res += 3.91527620*std::pow(abstrketa, 4); + d0Res += -1.13992206*std::pow(abstrketa, 5); + d0Res += 0.11873396*std::pow(abstrketa, 6); + } + } + + if (trkpt>=20.0) { + if (abstrketa<3.9) { + d0Res += 4.36631419*std::pow(abstrketa, 0); + d0Res += 1.27017785*std::pow(abstrketa, 1); + d0Res += -2.15589494*std::pow(abstrketa, 2); + d0Res += 0.79568803*std::pow(abstrketa, 3); + d0Res += 0.43200853*std::pow(abstrketa, 4); + d0Res += -0.28839985*std::pow(abstrketa, 5); + d0Res += 0.04554335*std::pow(abstrketa, 6); + } + } + + if (debug) std::cout<<"d0Res = " << d0Res << std::endl; + return d0Res; +} diff --git a/Trigger/EFTracking/EFTrackingEmulation/src/FitFunctions/URD/effFitparam_N.C b/Trigger/EFTracking/EFTrackingEmulation/src/FitFunctions/URD/effFitparam_N.C new file mode 100644 index 0000000000000000000000000000000000000000..b07867ae198255d8d4815a91f48926016d08b6f6 --- /dev/null +++ b/Trigger/EFTracking/EFTrackingEmulation/src/FitFunctions/URD/effFitparam_N.C @@ -0,0 +1,35 @@ +// Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration +// 2D-function to describe the tracking efficiency versus pT and eta. See README + +#include <cmath> +#include <iostream> +double getEffParam_N(float abstrketa, float trkpt, bool debug=false) { + + double eff = 1; + + if (abstrketa<0.5) { + if (trkpt<2.) + eff = 0.89; + else if (trkpt<3.) + eff = 0.91; + else + eff = 0.92; + } else if (abstrketa<1.5) { + if (trkpt<2.) + eff = 0.87; + else if (trkpt<3.) + eff = 0.90; + else + eff = 0.91; + } else { + if (trkpt<2.) + eff = 0.77; + else if (trkpt<3.) + eff = 0.80; + else + eff = 0.80; + } + + if (debug) printf("eff = %f\n", eff); + return eff; +} diff --git a/Trigger/EFTracking/EFTrackingEmulation/src/FitFunctions/URD/ptqoptFitparam_N.C b/Trigger/EFTracking/EFTrackingEmulation/src/FitFunctions/URD/ptqoptFitparam_N.C new file mode 100644 index 0000000000000000000000000000000000000000..65fc5f122556d0005a06e97a119bdc9af8bc4af0 --- /dev/null +++ b/Trigger/EFTracking/EFTrackingEmulation/src/FitFunctions/URD/ptqoptFitparam_N.C @@ -0,0 +1,81 @@ +// Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration +// 2D-function to describe the ptqopt resolution versus pT and eta. See README + +#include <iostream> +double getptqoptResParam_N(float abstrketa, float trkpt, bool debug=false) { + + double ptqoptRes = 0; + if (trkpt>=1.0 && trkpt<1.5) { + if (abstrketa<3.9) { + ptqoptRes += 0.01093407*std::pow(abstrketa, 0); + ptqoptRes += -0.00431876*std::pow(abstrketa, 1); + ptqoptRes += 0.01111538*std::pow(abstrketa, 2); + ptqoptRes += -0.00442307*std::pow(abstrketa, 3); + ptqoptRes += 0.00173122*std::pow(abstrketa, 4); + ptqoptRes += 0.01098564*exp(-0.5*std::pow((abstrketa-2.77940862)/0.15000000,2)); + } + } + + if (trkpt>=1.5 && trkpt<2.5) { + if (abstrketa<3.9) { + ptqoptRes += 0.01101489*std::pow(abstrketa, 0); + ptqoptRes += -0.00448591*std::pow(abstrketa, 1); + ptqoptRes += 0.01165447*std::pow(abstrketa, 2); + ptqoptRes += -0.00493889*std::pow(abstrketa, 3); + ptqoptRes += 0.00188055*std::pow(abstrketa, 4); + ptqoptRes += 0.01124036*exp(-0.5*std::pow((abstrketa-2.79870700)/0.15000000,2)); + } + } + + if (trkpt>=2.5 && trkpt<5.0) { + if (abstrketa<3.9) { + ptqoptRes += 0.01020762*std::pow(abstrketa, 0); + ptqoptRes += 0.00001977*std::pow(abstrketa, 1); + ptqoptRes += -0.00163216*std::pow(abstrketa, 2); + ptqoptRes += -0.00010910*std::pow(abstrketa, 3); + ptqoptRes += 0.00033767*std::pow(abstrketa, 4); + ptqoptRes += 0.00030012*std::pow(abstrketa, 5); + ptqoptRes += 0.00513584*exp(-0.5*std::pow((abstrketa-1.19486674)/0.07530451,2)); + ptqoptRes += 0.03498376*exp(-0.5*std::pow((abstrketa-2.92659416)/0.9870140614351902152989737260,2)); + } + } + + if (trkpt>=5.0 && trkpt<10.0) { + if (abstrketa<3.9) { + ptqoptRes += 0.01081659*std::pow(abstrketa, 0); + ptqoptRes += 0.00122081*std::pow(abstrketa, 1); + ptqoptRes += 0.00217843*std::pow(abstrketa, 2); + ptqoptRes += -0.00092976*std::pow(abstrketa, 3); + ptqoptRes += 0.00159232*std::pow(abstrketa, 4); + ptqoptRes += 0.00390577*exp(-0.5*std::pow((abstrketa-1.20254029)/0.08392621,2)); + ptqoptRes += 0.00089119*exp(-0.5*std::pow((abstrketa-2.92315389)/0.9530567193602196285340255599,2)); + } + } + + if (trkpt>=10.0 && trkpt<20.0) { + if (abstrketa<3.9) { + ptqoptRes += 0.01168864*std::pow(abstrketa, 0); + ptqoptRes += 0.00362780*std::pow(abstrketa, 1); + ptqoptRes += -0.01770760*std::pow(abstrketa, 2); + ptqoptRes += 0.03796665*std::pow(abstrketa, 3); + ptqoptRes += -0.02638396*std::pow(abstrketa, 4); + ptqoptRes += 0.00819620*std::pow(abstrketa, 5); + ptqoptRes += -0.00080399*std::pow(abstrketa, 6); + ptqoptRes += 0.04035099*exp(-0.5*std::pow((abstrketa-3.00000000)/0.15138388,2)); + } + } + + if (trkpt>=20.0) { + if (abstrketa<3.9) { + ptqoptRes += -0.01411704*std::pow(abstrketa, 0); + ptqoptRes += -0.05067335*std::pow(abstrketa, 1); + ptqoptRes += -0.09047611*std::pow(abstrketa, 2); + ptqoptRes += 0.04366047*std::pow(abstrketa, 3); + ptqoptRes += 0.17898237*exp(-0.5*std::pow((abstrketa-1.67732024)/0.88188119,2)); + ptqoptRes += 0.01168753*exp(-0.5*std::pow((abstrketa-2.13599594)/0.2136018417597442820010655851,2)); + } + } + + if (debug) std::cout<<"ptqoptRes = " << ptqoptRes << std::endl; + return ptqoptRes; +} diff --git a/Trigger/EFTracking/EFTrackingEmulation/src/FitFunctions/URD/z0Fitparam_N.C b/Trigger/EFTracking/EFTrackingEmulation/src/FitFunctions/URD/z0Fitparam_N.C new file mode 100644 index 0000000000000000000000000000000000000000..6581fd4554ef6e205331de4fd34fca03f63f5201 --- /dev/null +++ b/Trigger/EFTracking/EFTrackingEmulation/src/FitFunctions/URD/z0Fitparam_N.C @@ -0,0 +1,85 @@ +// Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration +// 2D-function to describe the z0 resolution versus pT and eta. See README + +#include <iostream> +double getz0ResParam_N(float abstrketa, float trkpt, bool debug=false) { + + double z0Res = 0; + if (trkpt>=1.0 && trkpt<1.5) { + if (abstrketa<3.9) { + z0Res += 71.65972485*std::pow(abstrketa, 0); + z0Res += -26.19370915*std::pow(abstrketa, 1); + z0Res += 40.37999526*std::pow(abstrketa, 2); + z0Res += 17.50951981*std::pow(abstrketa, 3); + z0Res += 1.23154903*std::pow(abstrketa, 4); + z0Res += -1.44168366*std::pow(abstrketa, 5); + z0Res += 0.92505577*std::pow(abstrketa, 6); + z0Res += 42.92425474*exp(-0.5*std::pow((abstrketa-1.88701704)/0.04050632,2)); + z0Res += 162.68556467*exp(-0.5*std::pow((abstrketa-2.51822689)/0.2410260099805757727509103461,2)); + } + } + + if (trkpt>=1.5 && trkpt<2.5) { + if (abstrketa<3.9) { + z0Res += 63.04626058*std::pow(abstrketa, 0); + z0Res += -49.33952475*std::pow(abstrketa, 1); + z0Res += 36.09831414*std::pow(abstrketa, 2); + z0Res += 35.03400452*std::pow(abstrketa, 3); + z0Res += -20.42236907*std::pow(abstrketa, 4); + z0Res += 5.26113117*std::pow(abstrketa, 5); + z0Res += 102.40355697*exp(-0.5*std::pow((abstrketa-2.53436441)/0.26300171,2)); + } + } + + if (trkpt>=2.5 && trkpt<5.0) { + if (abstrketa<3.9) { + z0Res += 45.18314991*std::pow(abstrketa, 0); + z0Res += -48.88127799*std::pow(abstrketa, 1); + z0Res += 47.49106974*std::pow(abstrketa, 2); + z0Res += 4.57155872*std::pow(abstrketa, 3); + z0Res += -8.25716340*std::pow(abstrketa, 4); + z0Res += 2.78210384*std::pow(abstrketa, 5); + z0Res += 57.90881664*exp(-0.5*std::pow((abstrketa-2.53926139)/0.27623007,2)); + } + } + + if (trkpt>=5.0 && trkpt<10.0) { + if (abstrketa<3.9) { + z0Res += 30.77411554*std::pow(abstrketa, 0); + z0Res += -63.05190452*std::pow(abstrketa, 1); + z0Res += 134.03156883*std::pow(abstrketa, 2); + z0Res += -143.12115765*std::pow(abstrketa, 3); + z0Res += 54.01517556*std::pow(abstrketa, 4); + z0Res += -5.61428747*std::pow(abstrketa, 5); + z0Res += 76.51135558*exp(-0.5*std::pow((abstrketa-1.94105642)/0.57056972,2)); + z0Res += 75.84135786*exp(-0.5*std::pow((abstrketa-2.58794738)/0.3647087643607762608155553608,2)); + } + } + + if (trkpt>=10.0 && trkpt<20.0) { + if (abstrketa<3.9) { + z0Res += 19.39469788*std::pow(abstrketa, 0); + z0Res += -22.51493172*std::pow(abstrketa, 1); + z0Res += 31.92377013*std::pow(abstrketa, 2); + z0Res += -11.17317474*std::pow(abstrketa, 3); + z0Res += 0.66337736*std::pow(abstrketa, 4); + z0Res += 0.58619897*std::pow(abstrketa, 5); + z0Res += 14.43206857*exp(-0.5*std::pow((abstrketa-2.50442429)/0.32063788,2)); + } + } + + if (trkpt>=20.0) { + if (abstrketa<3.9) { + z0Res += 2.92339716*std::pow(abstrketa, 0); + z0Res += -34.55228105*std::pow(abstrketa, 1); + z0Res += 12.87887345*std::pow(abstrketa, 2); + z0Res += -2.20912261*std::pow(abstrketa, 3); + z0Res += 1.05950066*std::pow(abstrketa, 4); + z0Res += 29.46376030*exp(-0.5*std::pow((abstrketa-1.09960118)/0.71728841,2)); + z0Res += 28.39481084*exp(-0.5*std::pow((abstrketa-2.24335984)/0.6197033253331861724078066800,2)); + } + } + + if (debug) std::cout<<"z0Res = " << z0Res << std::endl; + return z0Res; +}