diff --git a/InnerDetector/InDetConfig/python/SiSpacePointsSeedToolConfig.py b/InnerDetector/InDetConfig/python/SiSpacePointsSeedToolConfig.py index 2259d6e56bc5babe2036099efbacef6309969be5..f696c55af64c7bf8c0662e8223df8f548c086048 100644 --- a/InnerDetector/InDetConfig/python/SiSpacePointsSeedToolConfig.py +++ b/InnerDetector/InDetConfig/python/SiSpacePointsSeedToolConfig.py @@ -9,6 +9,8 @@ def SiSpacePointsSeedMaker_CosmicCfg( flags, name="InDetSpSeedsMaker_Cosmic", **kwargs): acc = ComponentAccumulator() + kwargs.setdefault("fieldScale",flags.BField.configuredSolenoidFieldScale) + acc.setPrivateTools(CompFactory.InDet.SiSpacePointsSeedMaker_Cosmic( name, **kwargs)) return acc @@ -26,6 +28,7 @@ def SiSpacePointsSeedMaker_HeavyIonCfg( flags.Tracking.ActiveConfig.maxdImpactPPSSeeds) kwargs.setdefault("maxdImpactSSS", flags.Tracking.ActiveConfig.maxdImpactSSSSeeds) + kwargs.setdefault("fieldScale",flags.BField.configuredSolenoidFieldScale) acc.setPrivateTools(CompFactory.InDet.SiSpacePointsSeedMaker_HeavyIon( name+flags.Tracking.ActiveConfig.extension, **kwargs)) @@ -40,6 +43,7 @@ def SiSpacePointsSeedMaker_LowMomentumCfg( flags.Tracking.ActiveConfig.maxPrimaryImpact) kwargs.setdefault("maxZ", flags.Tracking.ActiveConfig.maxZImpact) kwargs.setdefault("minZ", -flags.Tracking.ActiveConfig.maxZImpact) + kwargs.setdefault("fieldScale",flags.BField.configuredSolenoidFieldScale) kwargs.setdefault("maxRadius1", 0.75*flags.Tracking.ActiveConfig.radMax) @@ -61,6 +65,7 @@ def SiSpacePointsSeedMaker_BeamGasCfg( flags.Tracking.ActiveConfig.maxPrimaryImpact) kwargs.setdefault("maxZ", flags.Tracking.ActiveConfig.maxZImpact) kwargs.setdefault("minZ", -flags.Tracking.ActiveConfig.maxZImpact) + kwargs.setdefault("fieldScale",flags.BField.configuredSolenoidFieldScale) kwargs.setdefault("maxRadius1", 0.75*flags.Tracking.ActiveConfig.radMax) @@ -82,6 +87,7 @@ def SiSpacePointsSeedMaker_ATLxkCfg( flags.Tracking.ActiveConfig.maxPrimaryImpact) kwargs.setdefault("maxZ", flags.Tracking.ActiveConfig.maxZImpact) kwargs.setdefault("minZ", -flags.Tracking.ActiveConfig.maxZImpact) + kwargs.setdefault("fieldScale",flags.BField.configuredSolenoidFieldScale) if flags.Tracking.ActiveConfig.extension in ["", "Forward"]: kwargs.setdefault("maxdImpactSSS", diff --git a/InnerDetector/InDetDigitization/PixelDigitization/python/PixelDigitizationConfig.py b/InnerDetector/InDetDigitization/PixelDigitization/python/PixelDigitizationConfig.py index 6ccd4988cc7cda26f68b13de5a9378cc79775868..77c170d6002a0a20a1049ed43f715ce5b01c7e03 100644 --- a/InnerDetector/InDetDigitization/PixelDigitization/python/PixelDigitizationConfig.py +++ b/InnerDetector/InDetDigitization/PixelDigitization/python/PixelDigitizationConfig.py @@ -45,6 +45,7 @@ def RadDamageUtilCfg(flags, name="RadDamageUtil", **kwargs): kwargs.setdefault("betaElectrons", 4.5e-16) kwargs.setdefault("betaHoles", 6.0e-16) kwargs.setdefault("saveDebugMaps", False) + kwargs.setdefault("fieldScale", flags.BField.configuredSolenoidFieldScale) # to handle custom B field where nominal hardcoded RadDamageUtil = CompFactory.RadDamageUtil return RadDamageUtil(name, **kwargs) diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/RadDamageUtil.cxx b/InnerDetector/InDetDigitization/PixelDigitization/src/RadDamageUtil.cxx index b23b94e4df2c1ae7e90f354d1fd85257ffa809f8..e4ca833093fdaad2649210b5780e3cc2be6d127b 100644 --- a/InnerDetector/InDetDigitization/PixelDigitization/src/RadDamageUtil.cxx +++ b/InnerDetector/InDetDigitization/PixelDigitization/src/RadDamageUtil.cxx @@ -288,7 +288,7 @@ const StatusCode RadDamageUtil::generateDistanceTimeMap(TH2F*& distanceMap_e, TH //https://gitlab.cern.ch/radiationDamageDigitization/radDamage_athena_rel22/blob/rel22_radDamageDev_master/scripts/SaveMapsForAthena.C //TODO: From DB call each time double temperature = 300; - double bField = 2;//Tesla + double bField = 2*m_fieldScale;//Tesla //From PixelModuleDesign: TODO //FIXME workaround, if PixelModuleDesign not available: retrieve sensor thickness from E field //double sensorThickness = module->thickness() * 1000.0;//default is 200; diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/RadDamageUtil.h b/InnerDetector/InDetDigitization/PixelDigitization/src/RadDamageUtil.h index d23d772b0752cafaf5fcefcb0672f21673675731..b39d4870f42fd8d94c863bd91ec6325b05cefe72 100644 --- a/InnerDetector/InDetDigitization/PixelDigitization/src/RadDamageUtil.h +++ b/InnerDetector/InDetDigitization/PixelDigitization/src/RadDamageUtil.h @@ -74,6 +74,8 @@ private: this, "saveDebugMaps", false, "Flag to save map" }; + Gaudi::Property<double> m_fieldScale{this, "fieldScale", 1.}; + static double alpha(int n, int Nrep, double a); //Poisson solution factor static double weighting3D(double x, double y, double z, int n, int m, int Nrep, double a, double b); static double weighting2D(double x, double z, double Lx, double sensorThickness); diff --git a/InnerDetector/InDetDigitization/TRT_Digitization/python/TRT_DigitizationConfig.py b/InnerDetector/InDetDigitization/TRT_Digitization/python/TRT_DigitizationConfig.py index 25e3b16175d3847da1b0041a31a888f075479a5c..e523ed046654d340ab775acbdb72794bdb87eebd 100644 --- a/InnerDetector/InDetDigitization/TRT_Digitization/python/TRT_DigitizationConfig.py +++ b/InnerDetector/InDetDigitization/TRT_Digitization/python/TRT_DigitizationConfig.py @@ -62,6 +62,9 @@ def TRT_DigitizationBasicToolCfg(flags, name="TRT_DigitizationBasicTool", **kwar if flags.Digitization.DoXingByXingPileUp: kwargs.setdefault("FirstXing", TRT_FirstXing()) kwargs.setdefault("LastXing", TRT_LastXing()) + if flags.BField.configuredSolenoidFieldScale>0 and flags.BField.configuredSolenoidFieldScale<1: + from AthenaCommon.SystemOfUnits import tesla + kwargs.setdefault("Override_solenoidFieldStrength", flags.BField.configuredSolenoidFieldScale * 2.0 * tesla) from RngComps.RngCompsConfig import AthRNGSvcCfg kwargs.setdefault("RndmSvc", acc.getPrimaryAndMerge(AthRNGSvcCfg(flags)).name) TRTDigitizationTool = CompFactory.TRTDigitizationTool diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_ATLxk.h b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_ATLxk.h index d5563a7251c80f39eee0d78f469f385758ca09a9..292a663a7f711654266d031e7390e1fe30d1a8bb 100644 --- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_ATLxk.h +++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_ATLxk.h @@ -218,6 +218,7 @@ namespace InDet { FloatProperty m_dImpactCutSlopeUnconfirmedPPP{this, "dImpactCutSlopeUnconfirmedPPP", 0.}; FloatProperty m_maxdImpactDecays{this, "maxdImpactForDecays", 20.}; FloatProperty m_ptmin{this, "pTmin", 500.}; + FloatProperty m_fieldScale{this, "fieldScale", 1.}; //@} /// @name Properties, which can be updated in newEvent method. checketa is prepared in EventData. diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_BeamGas.h b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_BeamGas.h index 994d887ae53ab7fd2c78c1e62b587e0520e11e13..6337422a0d8ba601a6ce900541774bd992af868b 100644 --- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_BeamGas.h +++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_BeamGas.h @@ -175,6 +175,7 @@ namespace InDet { //@{ FloatProperty m_ptmin{this, "pTmin", 1000.}; FloatProperty m_etamax{this, "etaMax", 5.3}; + FloatProperty m_fieldScale{this, "fieldScale", 1.}; //@} /// @name Data members, which are updated in only initialize diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_Cosmic.h b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_Cosmic.h index ab5fddaeecad61a3ab8049e9c70848a1694a90b2..b19f2e6888d6c0e7de3f97724402cf95f8872fd3 100644 --- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_Cosmic.h +++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_Cosmic.h @@ -158,6 +158,7 @@ namespace InDet { //@{ FloatProperty m_ptmin{this, "pTmin", 500.}; FloatProperty m_etamax{this, "etaMax", 2.3}; + FloatProperty m_fieldScale{this, "fieldScale", 1.}; //@} /// @name Data members, which are updated in only initialize diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_HeavyIon.h b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_HeavyIon.h index 27584a7a8ad5e9f77f4a11c24c465f60f00872b3..d2fe6df8c9f03690c58a06a43809a3791b3f525a 100644 --- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_HeavyIon.h +++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_HeavyIon.h @@ -176,7 +176,8 @@ namespace InDet { //@{ FloatProperty m_etamax{this, "etaMax", 2.7}; FloatProperty m_ptmin{this, "pTmin", 500.}; - //@} + FloatProperty m_fieldScale{this, "fieldScale", 1.}; + //@} /// @name Data members, which are not updated at all //@{ diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_LowMomentum.h b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_LowMomentum.h index c97d1e6c4fdaa79756f145d2e473280b07021777..972e92313c0c618d880ab13b20905c0e044db442 100644 --- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_LowMomentum.h +++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_LowMomentum.h @@ -172,6 +172,7 @@ namespace InDet { //@{ FloatProperty m_etamax{this, "etaMax", 2.7}; FloatProperty m_ptmin{this, "pTmin", 100.}; + FloatProperty m_fieldScale{this, "fieldScale", 1.}; //@} /// @name Data members, which are updated only in initialize diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_ATLxk.cxx b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_ATLxk.cxx index 681e88d3dd74f2eb8e7ac79a14c8ea92a57843aa..7b5213fa950cecd65bb75806d9cdd39651b33908 100644 --- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_ATLxk.cxx +++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_ATLxk.cxx @@ -907,11 +907,7 @@ bool InDet::SiSpacePointsSeedMaker_ATLxk::newVertices(EventData& data, const std void InDet::SiSpacePointsSeedMaker_ATLxk::buildFrameWork() { - m_ptmin = std::abs(m_ptmin); - - if (m_ptmin < 100.) { - m_ptmin = 100.; - } + m_ptmin = std::max( std::abs(m_ptmin), float(100.*m_fieldScale)); /// ensure consistency in the transverse IP cuts if (m_maxdImpactSSS < m_maxdImpact ) m_maxdImpactSSS = m_maxdImpact; if (m_maxdImpactDecays < m_maxdImpactSSS) m_maxdImpactDecays = m_maxdImpactSSS; @@ -972,11 +968,11 @@ void InDet::SiSpacePointsSeedMaker_ATLxk::buildFrameWork() /// The factor 3 we divide by is motivated by the fact that we combine sets of /// three consecutive phi bins in the seed making step. So each individual bin should /// be approximately a third of the maximum expected azimutal deflection - const float binSizePhi_PPP = m_pixel ? azimuthalStep(m_ptmin,m_maxdImpact,radiusPixelStart,radiusPixelEnd)/3.f : 0.f; + const float binSizePhi_PPP = m_pixel ? azimuthalStep(m_ptmin/m_fieldScale,m_maxdImpact,radiusPixelStart,radiusPixelEnd)/3.f : 0.f; /// case 2: SSS seeds, if we use them constexpr float radiusSctStart = 295.; ; /// approximate lowest R location of strip hits (driven by barrel) constexpr float radiusSctEnd = 560.; /// approximate largest R location of strip hits (driven by endcap) - const float binSizePhi_SSS = m_sct ? azimuthalStep(m_ptmin,m_maxdImpactSSS,radiusSctStart,radiusSctEnd)/3.f : 0.f; + const float binSizePhi_SSS = m_sct ? azimuthalStep(m_ptmin/m_fieldScale,m_maxdImpactSSS,radiusSctStart,radiusSctEnd)/3.f : 0.f; /// pick the larger of the two and invert m_inverseBinSizePhi = 1.f/std::max(binSizePhi_PPP, binSizePhi_SSS); } @@ -985,7 +981,7 @@ void InDet::SiSpacePointsSeedMaker_ATLxk::buildFrameWork() /// a trajectory with 400 MeV, from the origin, and Rmin = 0 / Rmax = 600mm float ptm = 400.; float ptm = 400.; /// if we cut below 400 MeV, adapt the ptm - if (m_ptmin < ptm) ptm = m_ptmin; + if (m_ptmin/m_fieldScale < ptm) ptm = m_ptmin/m_fieldScale; m_inverseBinSizePhi = ptm /60.f; } @@ -1002,7 +998,7 @@ void InDet::SiSpacePointsSeedMaker_ATLxk::buildFrameWork() /// same logic as for the space points above const int nPhiBinsVertexMax = arraySizePhiV; const float inverseBinSizePhiVertexMax = static_cast<float>(nPhiBinsVertexMax)/twoPi; - m_inverseBinSizePhiVertex = m_ptmin/120.f; + m_inverseBinSizePhiVertex = m_ptmin/m_fieldScale/120.f; if (m_inverseBinSizePhiVertex > inverseBinSizePhiVertexMax) m_inverseBinSizePhiVertex = inverseBinSizePhiVertexMax; m_maxBinPhiVertex = static_cast<int>(twoPi*m_inverseBinSizePhiVertex); if (m_maxBinPhiVertex>=nPhiBinsVertexMax) m_maxBinPhiVertex = nPhiBinsVertexMax-1; diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_BeamGas.cxx b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_BeamGas.cxx index 04226e0b598f01e89019929ae1607610490fff91..6d94cda9024171c499f737707a206bda2cbf6639 100644 --- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_BeamGas.cxx +++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_BeamGas.cxx @@ -588,8 +588,7 @@ void InDet::SiSpacePointsSeedMaker_BeamGas::findNext(EventData& data) const void InDet::SiSpacePointsSeedMaker_BeamGas::buildFrameWork() { - m_ptmin = std::abs(m_ptmin); - if (m_ptmin < 300.) m_ptmin = 300.; + m_ptmin = std::max( std::abs(m_ptmin), float(300.*m_fieldScale)); m_etamax = std::abs(m_etamax); m_dzdrmax = 1.f/std::tan(2.f*std::atan(std::exp(-m_etamax))); m_dzdrmin =-m_dzdrmax; @@ -608,7 +607,7 @@ void InDet::SiSpacePointsSeedMaker_BeamGas::buildFrameWork() const float sFmax = static_cast<float>(NFmax)/pi2; const float sFmin = 100./60.; - m_sF = m_ptmin /60.f; + m_sF = m_ptmin/m_fieldScale /60.f; if (m_sF >sFmax ) m_sF = sFmax; else if (m_sF < sFmin) m_sF = sFmin; m_fNmax = static_cast<int>(pi2*m_sF); diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_Cosmic.cxx b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_Cosmic.cxx index 48a489b9a6f8748d9e1a69228a5e5eb71af74ad8..1d2b9ef31a48736f34fb2b5bbfeaaf1decfe4033 100644 --- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_Cosmic.cxx +++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_Cosmic.cxx @@ -49,7 +49,7 @@ StatusCode InDet::SiSpacePointsSeedMaker_Cosmic::initialize() // Build framework // buildFrameWork(); - if ( m_ptmin < 300.) m_ptmin = 300.; + if ( m_ptmin/m_fieldScale < 300.) m_ptmin = 300.*m_fieldScale; // Get output print level // diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_HeavyIon.cxx b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_HeavyIon.cxx index dcf839bdd8aa3ae719cce2757258c0bbabd1812f..be023f96a78cde852417a84daeffa1e7a80d7905 100644 --- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_HeavyIon.cxx +++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_HeavyIon.cxx @@ -583,8 +583,7 @@ bool InDet::SiSpacePointsSeedMaker_HeavyIon::newVertices(EventData& data, const void InDet::SiSpacePointsSeedMaker_HeavyIon::buildFrameWork() { - m_ptmin = std::abs(m_ptmin) ; - if (m_ptmin < 100.) m_ptmin = 100.; + m_ptmin = std::max( std::abs(m_ptmin), float(100.*m_fieldScale)); m_etamax = std::abs(m_etamax) ; m_dzdrmax = 1.f/std::tan(2.f*std::atan(exp(-m_etamax))); m_dzdrmin =-m_dzdrmax ; @@ -603,7 +602,7 @@ void InDet::SiSpacePointsSeedMaker_HeavyIon::buildFrameWork() const float sFmax = static_cast<float>(NFmax)/pi2; const float sFmin = 100./60.; - m_sF = m_ptmin /60.; + m_sF = m_ptmin/m_fieldScale /60.; if (m_sF > sFmax ) m_sF = sFmax; else if (m_sF < sFmin) m_sF = sFmin; m_fNmax = static_cast<int>(pi2*m_sF); @@ -613,7 +612,7 @@ void InDet::SiSpacePointsSeedMaker_HeavyIon::buildFrameWork() // const int NFtmax = SizeRFV; const float sFvmax = static_cast<float>(NFtmax)/pi2; - m_sFv = m_ptmin/120.f; + m_sFv = m_ptmin/m_fieldScale /120.f; if (m_sFv > sFvmax) m_sFv = sFvmax; m_fvNmax = static_cast<int>(pi2*m_sFv); if (m_fvNmax>=NFtmax) m_fvNmax = NFtmax-1; diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_LowMomentum.cxx b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_LowMomentum.cxx index 4a5b540b594fc7e597d016057a839daf5db2bb3a..b5e09ba9beed77f2c29f8094530efde8dc6fa68d 100644 --- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_LowMomentum.cxx +++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_LowMomentum.cxx @@ -567,8 +567,7 @@ bool InDet::SiSpacePointsSeedMaker_LowMomentum::newVertices(EventData& data, con void InDet::SiSpacePointsSeedMaker_LowMomentum::buildFrameWork() { - m_ptmin = std::abs(m_ptmin); - if (m_ptmin < 50.) m_ptmin = 50.; + m_ptmin = std::max( std::abs(m_ptmin), float(50.*m_fieldScale)); m_iptmax = 1.f/std::abs(m_ptmax); m_iptmin = 1.f/std::abs(m_ptmin); m_etamax = std::abs(m_etamax); @@ -586,7 +585,7 @@ void InDet::SiSpacePointsSeedMaker_LowMomentum::buildFrameWork() const int NFmax = SizeRF; const float sFmax = static_cast<float>(NFmax )/pi2; const float sFmin = 100./60.; - m_sF = m_ptmin /60.f; + m_sF = m_ptmin/m_fieldScale /60.f; if (m_sF > sFmax ) m_sF = sFmax; else if (m_sF < sFmin) m_sF = sFmin; m_fNmax = static_cast<int>(pi2*m_sF); diff --git a/MagneticField/MagFieldConfig/python/BFieldConfigFlags.py b/MagneticField/MagFieldConfig/python/BFieldConfigFlags.py index a00c47bb5f613c3e54ad9be70373f5093ae9a459..b3da490a38769b9ccca3ab47fa90324b242a8cc0 100644 --- a/MagneticField/MagFieldConfig/python/BFieldConfigFlags.py +++ b/MagneticField/MagFieldConfig/python/BFieldConfigFlags.py @@ -36,4 +36,6 @@ def createBFieldConfigFlags(): bcf.addFlag("BField.barrelToroidOn", lambda prevFlags : _fieldAutoCfg(prevFlags)[1]) # True when endcap toroid is on bcf.addFlag("BField.endcapToroidOn", lambda prevFlags : _fieldAutoCfg(prevFlags)[1]) + # Solenoid field scale + bcf.addFlag("BField.configuredSolenoidFieldScale", 1.) return bcf diff --git a/MagneticField/MagFieldServices/python/MagFieldServicesConfig.py b/MagneticField/MagFieldServices/python/MagFieldServicesConfig.py index fbb5fa6fde730e17147a5359420b3a77207ce70d..136e0b0f7b9cb54e03941bdaa394aea14e8d4203 100644 --- a/MagneticField/MagFieldServices/python/MagFieldServicesConfig.py +++ b/MagneticField/MagFieldServices/python/MagFieldServicesConfig.py @@ -59,6 +59,12 @@ def AtlasFieldCacheCondAlgCfg(flags, **kwargs): # consider field off if current is below these values: afcArgs.update( SoleMinCurrent = 160 ) # Standby current is 150A afcArgs.update( ToroMinCurrent = 210 ) # Standby current is 200A + elif flags.Input.isMC: + if flags.BField.configuredSolenoidFieldScale>160/7730 and flags.BField.configuredSolenoidFieldScale<1: + afcArgs.update( UseDCS = False ) + afcArgs.update( UseSoleCurrent = flags.BField.configuredSolenoidFieldScale * 7730 ) + else: + afcArgs.update( UseDCS = True ) else: afcArgs.update( UseDCS = True ) # For test, UseDCS is set to False diff --git a/Simulation/G4Atlas/G4AtlasServices/python/G4AtlasFieldServices.py b/Simulation/G4Atlas/G4AtlasServices/python/G4AtlasFieldServices.py index 4907c274779d27edc3f33b62f110e06a2dad3ce3..cbadccdf716ba740a4c589018d0072cfa0b619ca 100644 --- a/Simulation/G4Atlas/G4AtlasServices/python/G4AtlasFieldServices.py +++ b/Simulation/G4Atlas/G4AtlasServices/python/G4AtlasFieldServices.py @@ -5,6 +5,8 @@ from AthenaConfiguration.ComponentFactory import CompFactory def StandardFieldSvcCfg(flags, name="StandardField", **kwargs): result = ComponentAccumulator() + if flags.BField.configuredSolenoidFieldScale>160/7730 and flags.BField.configuredSolenoidFieldScale<1: # custom field configuration + kwargs.setdefault("UseSoleCurrent", flags.BField.configuredSolenoidFieldScale * 7730) result.addService(CompFactory.StandardFieldSvc(name, **kwargs), primary=True) return result diff --git a/Tools/Campaigns/python/MC23.py b/Tools/Campaigns/python/MC23.py index 6dcda7f3cab1831a1ebaf530795493c9d2a645e3..5f95fc1e22a9b35b084c1eb79841f3c15fefd65e 100644 --- a/Tools/Campaigns/python/MC23.py +++ b/Tools/Campaigns/python/MC23.py @@ -251,7 +251,18 @@ def MC23NoPileUpLowMuRun(flags): MC23NoPileUp(flags) flags.Input.ConditionsRunNumber = 420000 + +def MC23NoPileUpLowMuLowB(flags): + """MC23d flags for MC to match special run 460348""" + MC23NoPileUp(flags) + flags.Input.MCCampaign = Campaign.MC23d + flags.Input.ConditionsRunNumber = 465000 + + # B-field configuration + flags.BField.configuredSolenoidFieldScale = 0.4 + + def BeamspotSplitMC23a(): """MC23a beamspot splitting configuration""" substeps = 4 @@ -326,6 +337,19 @@ def MC23Simulation2023HeavyIonRun(flags): flags.Input.LumiBlockNumbers = [1] # dummy value +def MC23dSimulationLowMuLowB(flags): + """MC23 flags for simulation of special run 460348""" + MC23SimulationNoIoV(flags) + flags.Input.MCCampaign = Campaign.MC23d + + flags.Input.RunNumber = [465000] + flags.Input.OverrideRunNumber = True + flags.Input.LumiBlockNumber = [1] # dummy value + + # B-field configuration + flags.BField.configuredSolenoidFieldScale = 0.4 + + def MC23SimulationSingleIoV(flags): """MC23 flags for simulation""" MC23SimulationNoIoV(flags) diff --git a/Tools/Campaigns/python/__init__.py b/Tools/Campaigns/python/__init__.py index 345f8470d7352e19a4a4f4b81138164fa197f206..6fb66184b3ef37e963fdb9ec7903068f03810157 100644 --- a/Tools/Campaigns/python/__init__.py +++ b/Tools/Campaigns/python/__init__.py @@ -15,8 +15,8 @@ from .MC23 import (MC23a, MC23aSingleBeamspot, BeamspotSplitMC23a, MC23cSimulationMultipleIoV, MC23cSimulationMultipleIoVCalibrationHits, MC23d, MC23dSingleBeamspot, BeamspotSplitMC23d, MC23e, MC23eSingleBeamspot, BeamspotSplitMC23e, - MC23eSimulationMultipleIoV, MC23eSimulationMultipleIoVCalibrationHits, - MC23LowMu, MC23NoPileUp, MC23NoPileUpLowMuRun, + MC23eSimulationMultipleIoV, MC23eSimulationMultipleIoVCalibrationHits, MC23dSimulationLowMuLowB, + MC23LowMu, MC23NoPileUp, MC23NoPileUpLowMuRun, MC23NoPileUpLowMuLowB, MC23HeavyIons2023, MC23HeavyIons2023NoPileUp, MC23Simulation2023HeavyIonRun) from .PhaseII import (PhaseIIPileUp1, PhaseIIPileUp60, PhaseIIPileUp140, PhaseIIPileUp200, PhaseIIPileUpMC21a, PhaseIINoPileUp, @@ -46,8 +46,8 @@ __all__ = [ 'MC23cSimulationMultipleIoV', 'MC23cSimulationMultipleIoVCalibrationHits', 'MC23d', 'MC23dSingleBeamspot', 'BeamspotSplitMC23d', 'MC23e', 'MC23eSingleBeamspot', 'BeamspotSplitMC23e', - 'MC23eSimulationMultipleIoV', 'MC23eSimulationMultipleIoVCalibrationHits', - 'MC23LowMu', 'MC23NoPileUp', 'MC23NoPileUpLowMuRun', + 'MC23eSimulationMultipleIoV', 'MC23eSimulationMultipleIoVCalibrationHits', 'MC23dSimulationLowMuLowB', + 'MC23LowMu', 'MC23NoPileUp', 'MC23NoPileUpLowMuRun', 'MC23NoPileUpLowMuLowB', 'MC23HeavyIons2023', 'MC23HeavyIons2023NoPileUp' , 'MC23Simulation2023HeavyIonRun', 'PhaseIIPileUp1', 'PhaseIIPileUp60', 'PhaseIIPileUp140', 'PhaseIIPileUp200', 'PhaseIIPileUpMC21a', 'PhaseIINoPileUp', diff --git a/Tracking/TrkConfig/python/TrackingPassFlags.py b/Tracking/TrkConfig/python/TrackingPassFlags.py index ce588ef382f9c4cde63087e9eb97619acf6ff05a..b4542eae4f3d86bf4ae23793cf79c3cb31e77719 100644 --- a/Tracking/TrkConfig/python/TrackingPassFlags.py +++ b/Tracking/TrkConfig/python/TrackingPassFlags.py @@ -24,22 +24,25 @@ def select( selInd, valuesmap ): raise RuntimeError("No value can be selected from ranges {} given key {}".format( valuesmap.keys(), selInd )) def minPT_ranges( inflags ): + scale = inflags.BField.configuredSolenoidFieldScale return select( inflags.Tracking.cutLevel, - {'-1': 0.1 * Units.GeV, - '2-13': 0.4 * Units.GeV, - '14-': 0.5 * Units.GeV } ) + {'-1': scale * 0.1 * Units.GeV, + '2-13': scale * 0.4 * Units.GeV, + '14-': scale * 0.5 * Units.GeV } ) def minSecondaryPT_ranges( inflags ): + scale = inflags.BField.configuredSolenoidFieldScale return select( inflags.Tracking.cutLevel, - {'-1': 0.4 * Units.GeV, - '2-18': 1.0 * Units.GeV, - '19-': 3.0 * Units.GeV } ) + {'-1': scale * 0.4 * Units.GeV, + '2-18': scale * 1.0 * Units.GeV, + '19-': scale * 3.0 * Units.GeV } ) def minTRTonlyPt_ranges( inflags ): + scale = inflags.BField.configuredSolenoidFieldScale return select( inflags.Tracking.cutLevel, - {'-1': 0.4 * Units.GeV, - '2-5': 1.0 * Units.GeV, - '6-': 2.0 * Units.GeV, } ) + {'-1': scale * 0.4 * Units.GeV, + '2-5': scale * 1.0 * Units.GeV, + '6-': scale * 2.0 * Units.GeV, } ) def minClusters_ranges( inflags ): return select( inflags.Tracking.cutLevel, @@ -272,7 +275,7 @@ def createTrackingPassFlags(): # --- min pt cut for brem icf.addFlag("doBremRecoverySi", lambda pcf: pcf.Tracking.doBremRecovery) - icf.addFlag("minPTBrem", 1. * Units.GeV) # off + icf.addFlag("minPTBrem", lambda pcf: 1. * Units.GeV * pcf.BField.configuredSolenoidFieldScale ) # off # --- Z Boundary Seeding icf.addFlag("doZBoundary", doZBoundary_ranges) @@ -589,11 +592,11 @@ def createHighPileupTrackingPassFlags(): def createMinBiasTrackingPassFlags(): icf = createTrackingPassFlags() icf.extension = "MinBias" - icf.minPT = 0.1 * Units.GeV + icf.minPT = lambda pcf: 0.1 * Units.GeV * pcf.BField.configuredSolenoidFieldScale icf.minClusters = 5 - icf.minSecondaryPt = 0.4 * Units.GeV # Pt cut for back tracking + segment finding for these - icf.minTRTonlyPt = 0.4 * Units.GeV # Pt cut for TRT only + icf.minSecondaryPt = lambda pcf: 0.4 * Units.GeV * pcf.BField.configuredSolenoidFieldScale # Pt cut for back tracking + segment finding for these + icf.minTRTonlyPt = lambda pcf: 0.4 * Units.GeV * pcf.BField.configuredSolenoidFieldScale # Pt cut for TRT only icf.TRTSegFinderPtBins = 50 icf.maxdImpactSSSSeeds = 20.0 # apply cut on SSS seeds icf.excludeUsedTRToutliers = False # TRT outliers are added to the exclusion list @@ -608,7 +611,7 @@ def createUPCTrackingPassFlags(): icf = createMinBiasTrackingPassFlags() icf.extension = "UPC" # --- min pt cut for brem - icf.minPTBrem = 0.75 * Units.GeV + icf.minPTBrem = lambda pcf: 0.75 * Units.GeV * pcf.BField.configuredSolenoidFieldScale # MinBias turns off Brem Recovery, turn it on here icf.doBremRecoverySi = lambda pcf: pcf.Tracking.doBremRecovery return icf @@ -626,8 +629,8 @@ def createLowPtRoITrackingPassFlags(): icf.extension = "LowPtRoI" icf.usePrdAssociationTool = True icf.storeSeparateContainer = True - icf.maxPT = 0.850 * Units.GeV - icf.minPT = 0.050 * Units.GeV + icf.maxPT = lambda pcf: 0.850 * Units.GeV * pcf.BField.configuredSolenoidFieldScale + icf.minPT = lambda pcf: 0.050 * Units.GeV * pcf.BField.configuredSolenoidFieldScale icf.minClusters = 5 icf.minSiNotShared = 4 icf.maxShared = 1 # cut is now on number of shared modules @@ -655,13 +658,13 @@ def createLargeD0TrackingPassFlags(): icf.extension = "LargeD0" icf.usePrdAssociationTool = True icf.storeSeparateContainer = lambda pcf : pcf.Tracking.storeSeparateLargeD0Container - icf.maxPT = 1.0 * Units.TeV - icf.minPT = 900 * Units.MeV + icf.maxPT = lambda pcf: 1.0 * Units.TeV * pcf.BField.configuredSolenoidFieldScale + icf.minPT = lambda pcf: 900 * Units.MeV * pcf.BField.configuredSolenoidFieldScale icf.maxEta = 5 icf.maxPrimaryImpact = 300.0 * Units.mm icf.maxZImpact = 1500.0 * Units.mm icf.maxSecondaryImpact = 300.0 * Units.mm - icf.minSecondaryPt = 500.0 * Units.MeV + icf.minSecondaryPt = lambda pcf: 500.0 * Units.MeV * pcf.BField.configuredSolenoidFieldScale icf.minClusters = 7 icf.minSiNotShared = 5 icf.maxShared = 2 # cut is now on number of shared modules @@ -689,14 +692,14 @@ def createR3LargeD0TrackingPassFlags(): icf.usePrdAssociationTool = True icf.usePixelSeeding = False icf.storeSeparateContainer = lambda pcf : pcf.Tracking.storeSeparateLargeD0Container - icf.maxPT = 1.0 * Units.TeV - icf.minPT = 1.0 * Units.GeV + icf.maxPT = lambda pcf: 1.0 * Units.TeV * pcf.BField.configuredSolenoidFieldScale + icf.minPT = lambda pcf: 1.0 * Units.GeV * pcf.BField.configuredSolenoidFieldScale icf.maxEta = 3 icf.maxPrimaryImpact = 300.0 * Units.mm icf.maxEMImpact = 300 * Units.mm icf.maxZImpact = 500 * Units.mm icf.maxSecondaryImpact = 300.0 * Units.mm - icf.minSecondaryPt = 1000.0 * Units.MeV + icf.minSecondaryPt = lambda pcf: 1000.0 * Units.MeV * pcf.BField.configuredSolenoidFieldScale icf.minClusters = 8 icf.minSiNotShared = 6 icf.maxShared = 2 # cut is now on number of shared modules @@ -730,13 +733,13 @@ def createLowPtLargeD0TrackingPassFlags(): icf.extension = "LowPtLargeD0" icf.usePrdAssociationTool = True icf.storeSeparateContainer = lambda pcf : pcf.Tracking.storeSeparateLargeD0Container - icf.maxPT = 1.0 * Units.TeV - icf.minPT = 100 * Units.MeV + icf.maxPT = lambda pcf: 1.0 * Units.TeV * pcf.BField.configuredSolenoidFieldScale + icf.minPT = lambda pcf: 100 * Units.MeV * pcf.BField.configuredSolenoidFieldScale icf.maxEta = 5 icf.maxPrimaryImpact = 300.0 * Units.mm icf.maxZImpact = 1500.0 * Units.mm icf.maxSecondaryImpact = 300.0 * Units.mm - icf.minSecondaryPt = 400.0 * Units.MeV + icf.minSecondaryPt = lambda pcf: 400.0 * Units.MeV * pcf.BField.configuredSolenoidFieldScale icf.minClusters = 5 icf.minSiNotShared = 5 icf.maxShared = 2 # cut is now on number of shared modules @@ -763,8 +766,8 @@ def createLowPtTrackingPassFlags(): icf.usePrdAssociationTool = True icf.isLowPt = True icf.maxPT = lambda pcf: (1e6 if pcf.Tracking.doMinBias else - pcf.Tracking.MainPass.minPT + 0.3) * Units.GeV - icf.minPT = 0.050 * Units.GeV + pcf.Tracking.MainPass.minPT + 0.3) * Units.GeV * pcf.BField.configuredSolenoidFieldScale + icf.minPT = lambda pcf: 0.050 * Units.GeV * pcf.BField.configuredSolenoidFieldScale icf.minClusters = 5 icf.minSiNotShared = 4 icf.maxShared = 1 # cut is now on number of shared modules @@ -824,8 +827,8 @@ def createVeryLowPtTrackingPassFlags(): icf.isLowPt = True icf.useTRTExtension = False icf.maxPT = lambda pcf : (1e6 if pcf.Tracking.doMinBias else - pcf.Tracking.MainPass.minPT + 0.3) * Units.GeV # some overlap - icf.minPT = 0.050 * Units.GeV + pcf.Tracking.MainPass.minPT + 0.3) * Units.GeV * pcf.BField.configuredSolenoidFieldScale # some overlap + icf.minPT = lambda pcf : 0.050 * Units.GeV * pcf.BField.configuredSolenoidFieldScale icf.minClusters = 3 icf.minSiNotShared = 3 icf.maxShared = 1 # cut is now on number of shared modules @@ -877,7 +880,7 @@ def createBeamGasTrackingPassFlags(): icf = createTrackingPassFlags() icf.extension = "BeamGas" icf.usePrdAssociationTool = True - icf.minPT = 0.500 * Units.GeV + icf.minPT = lambda pcf: 0.500 * Units.GeV * pcf.BField.configuredSolenoidFieldScale icf.maxPrimaryImpact = 300. * Units.mm icf.maxZImpact = 2000. * Units.mm icf.minClusters = 6 @@ -895,7 +898,7 @@ def createBeamGasTrackingPassFlags(): def createVtxLumiTrackingPassFlags(): icf = createTrackingPassFlags() icf.extension = "VtxLumi" - icf.minPT = 0.900 * Units.GeV + icf.minPT = lambda pcf: 0.900 * Units.GeV * pcf.BField.configuredSolenoidFieldScale icf.minClusters = 7 icf.maxPixelHoles = 1 icf.radMax = 600. * Units.mm @@ -910,7 +913,7 @@ def createVtxLumiTrackingPassFlags(): def createVtxBeamSpotTrackingPassFlags(): icf = createTrackingPassFlags() icf.extension = "VtxBeamSpot" - icf.minPT = 0.900 * Units.GeV + icf.minPT = lambda pcf: 0.900 * Units.GeV * pcf.BField.configuredSolenoidFieldScale icf.minClusters = 9 icf.maxPixelHoles = 0 icf.radMax = 320. * Units.mm @@ -925,7 +928,7 @@ def createVtxBeamSpotTrackingPassFlags(): def createCosmicsTrackingPassFlags(): icf = createTrackingPassFlags() icf.extension = "Cosmics" - icf.minPT = 0.500 * Units.GeV + icf.minPT = lambda pcf: 0.500 * Units.GeV * pcf.BField.configuredSolenoidFieldScale icf.maxPrimaryImpact = 1000. * Units.mm icf.maxZImpact = 10000. * Units.mm icf.minClusters = 4 @@ -969,7 +972,7 @@ def createHeavyIonTrackingPassFlags(): 20. if pcf.Tracking.cutLevel >= 2 else 1000. icf.minPT = lambda pcf: \ - 0.3 *Units.GeV if pcf.Tracking.cutLevel in [3, 5] else 0.5 * Units.GeV + 0.3 *Units.GeV * pcf.BField.configuredSolenoidFieldScale if pcf.Tracking.cutLevel in [3, 5] else 0.5 * Units.GeV * pcf.BField.configuredSolenoidFieldScale icf.useParameterizedTRTCuts = lambda pcf: \ False if pcf.Tracking.cutLevel >= 3 else True #Make these false on all HI cut levels >=3, since standard cut levels set it true from levels >=3 icf.useNewParameterizationTRT = lambda pcf: \ @@ -999,14 +1002,14 @@ def createPixelTrackingPassFlags(): def _minPt( pcf ): if pcf.Beam.Type is BeamType.Cosmics: - return 0.5 * Units.GeV + return 0.5 * Units.GeV * pcf.BField.configuredSolenoidFieldScale if pcf.Tracking.PrimaryPassConfig is PrimaryPassConfig.UPC: - return 0.05 * Units.GeV + return 0.05 * Units.GeV * pcf.BField.configuredSolenoidFieldScale if pcf.Tracking.PrimaryPassConfig is PrimaryPassConfig.HIP: - return 0.05 * Units.GeV + return 0.05 * Units.GeV * pcf.BField.configuredSolenoidFieldScale if pcf.Tracking.doMinBias: - return 0.05 * Units.GeV - return 0.1 * Units.GeV + return 0.05 * Units.GeV * pcf.BField.configuredSolenoidFieldScale + return 0.1 * Units.GeV * pcf.BField.configuredSolenoidFieldScale icf.minPT = _minPt icf.minClusters = 3 @@ -1031,7 +1034,7 @@ def createPixelTrackingPassFlags(): icf.useSCT = False icf.useSCTSeeding = False icf.useTRT = False - icf.minSecondaryPt = 3 * Units.GeV + icf.minSecondaryPt = lambda pcf: 3 * Units.GeV * pcf.BField.configuredSolenoidFieldScale icf.maxPrimaryImpact = lambda pcf: 1000. * Units.mm if pcf.Beam.Type is BeamType.Cosmics \ else 10. * Units.mm if pcf.Tracking.doUPC \ else 5. * Units.mm @@ -1057,7 +1060,7 @@ def createDisappearingTrackingPassFlags(): icf.extension = "Disappearing" icf.usePrdAssociationTool = True icf.storeSeparateContainer = True - icf.minPT = 5 * Units.GeV + icf.minPT = lambda pcf: 5 * Units.GeV * pcf.BField.configuredSolenoidFieldScale icf.minClusters = 4 icf.maxHoles = 0 icf.maxPixelHoles = 0 @@ -1085,18 +1088,14 @@ def createSCTTrackingPassFlags(): icf.usePixelSeeding = False icf.useTRT = False - def _pick( default, cosmics, minbias): - def _internal( pcf ): - if pcf.Beam.Type is BeamType.Cosmics: - return cosmics - if pcf.Tracking.doMinBias: - return minbias - return default - return _internal + def _minpt( pcf ): + if pcf.Beam.Type is BeamType.Cosmics: + return 0.5 * Units.GeV * pcf.BField.configuredSolenoidFieldScale + if pcf.Tracking.doMinBias: + return 0.1 * Units.GeV * pcf.BField.configuredSolenoidFieldScale + return 0.1 * Units.GeV * pcf.BField.configuredSolenoidFieldScale - icf.minPT = _pick( default = 0.1 * Units.GeV, - minbias=0.1 * Units.GeV, - cosmics = 0.5* Units.GeV ) + icf.minPT = _minpt icf.maxPrimaryImpact = lambda pcf: 1000. * Units.mm if pcf.Beam.Type is BeamType.Cosmics \ else maxPrimaryImpact_ranges( pcf ) icf.maxZImpact = lambda pcf: 10000. * Units.mm if pcf.Beam.Type is BeamType.Cosmics \ @@ -1137,7 +1136,7 @@ def createTRTTrackingPassFlags(): icf.extension = "TRT" icf.useTIDE_Ambi = False icf.usePrdAssociationTool = True - icf.minPT = 0.4 * Units.GeV + icf.minPT = lambda pcf: 0.4 * Units.GeV * pcf.BField.configuredSolenoidFieldScale icf.minTRTonly = 15 icf.maxTRTonlyShared = 0.7 icf.doBremRecoverySi = False