ATLAS Offline Software
CharginosConfig.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
2 
3 from AthenaConfiguration.AccumulatorCache import AccumulatorCache
4 import shutil, re
5 from AthenaConfiguration.ComponentFactory import CompFactory
6 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
7 from AthenaCommon.SystemOfUnits import MeV, ns, GeV # noqa: F401
8 from AthenaConfiguration.Enums import ProductionStep
9 from ExtraParticles.PDGHelpers import getPDGTABLE
10 
11 
12 @AccumulatorCache
14 
15  # Download generic PDGTABLE (overwrite existing one if it exists)
16  if getPDGTABLE('PDGTABLE.MeV'):
17  shutil.move('PDGTABLE.MeV', 'PDGTABLE.MeV.org')
18 
19  # an example line to illustrate the fixed format, see PDGTABLE.MeV for more details
20  # M 1000022 0.E+00 +0.0E+00 -0.0E+00 ~chi(0,1) 0
21 
22  lines = open('PDGTABLE.MeV.org').readlines()
23  for pdgid,mass,name,charge in replace:
24  if not re.search(r'[MW]\s+'+str(pdgid)+r'\s+\S+', ''.join(lines)):
25  lines.append('M' + str(pdgid).rjust(8) +''.ljust(26) +
26  ('%11.5E' % mass).ljust(15) +
27  '+0.0E+00'.ljust(9) + '-0.0E+00'.ljust(9) +
28  name.strip() + ''.ljust(6) + charge.strip()+''.rjust(20-len(name.strip())) + '\n')
29  lines.append('W' + str(pdgid).rjust(8) +''.ljust(26) +
30  '0.E+00'.ljust(15) + '+0.0E+00'.ljust(9) + '-0.0E+00'.ljust(9) +
31  name.strip() + ''.ljust(6) + charge.strip()+''.rjust(20-len(name.strip())) + '\n')
32  else:
33  from past.builtins import xrange # Temporary workaround for python3 compatibility use range in CA-based config
34  for i in xrange(len(lines)):
35  if re.search(r'M\s+'+str(pdgid)+r'\s+\S+', lines[i]):
36  l = lines[i]
37  lines[i] = l[0:35] + ('%11.5E' % mass).ljust(14) + l[49:]
38 
39  update = open('PDGTABLE.MeV', 'w')
40  update.write(''.join(lines))
41  update.close()
42 
43 
44 def CharginosPhysicsToolCfg(flags, name="CharginosPhysicsTool", **kwargs):
45  result = ComponentAccumulator()
46  # Example specialConfiguration: {'AMSBC1Mass': '1200.16*GeV', 'AMSBN1Mass': '1200.0*GeV', 'AMSBC1Lifetime': '0.2*ns'}
47  C1Mass = eval(flags.Input.SpecialConfiguration.get("AMSBC1Mass", None))
48  N1Mass = eval(flags.Input.SpecialConfiguration.get("AMSBN1Mass", None))
49  C1Lifetime = eval(flags.Input.SpecialConfiguration.get("AMSBC1Lifetime", "-1.0"))
50 
51  kwargs.setdefault("CharginoPlusMass", C1Mass)
52  kwargs.setdefault("CharginoPlusStable", (C1Lifetime < 0))
53  if not (C1Lifetime < 0):
54  kwargs.setdefault("CharginoPlusLifetime", C1Lifetime)
55 
56  kwargs.setdefault("CharginoMinusMass", C1Mass)
57  kwargs.setdefault("CharginoMinusStable", (C1Lifetime < 0))
58  if not (C1Lifetime < 0):
59  kwargs.setdefault("CharginoMinusLifetime", C1Lifetime)
60 
61  kwargs.setdefault("NeutralinoMass", N1Mass)
62 
63  result.setPrivateTools(CompFactory.CharginosPhysicsTool(name, **kwargs))
64  return result
65 
66 
67 def CharginoPlusToPiPlusNeutralinoCfg(flags, name="CharginoPlusToPiPlusNeutralino", **kwargs):
68  result = ComponentAccumulator()
69  C1ToPiBR = 1.0
70  C1ToEleBR = eval(flags.Input.SpecialConfiguration.get("AMSBC1ToEleBR", "-1.0"))
71  if C1ToEleBR > 0.0:
72  C1ToPiBR -= C1ToEleBR
73  C1ToMuBR = eval(flags.Input.SpecialConfiguration.get("AMSBC1ToMuBR", "-1.0"))
74  if C1ToMuBR > 0.0:
75  C1ToPiBR -= C1ToMuBR
76  kwargs.setdefault("ParticleName","s_chi_plus_1")
77  kwargs.setdefault("BR",C1ToPiBR) #Branching Ratio
78  kwargs.setdefault("Daughters","s_chi_0_1,pi+")
79  result.setPrivateTools(CompFactory.AddPhysicsDecayTool(name, **kwargs))
80  return result
81 
82 
83 def CharginoMinusToPiMinusNeutralinoCfg(flags, name="CharginoMinusToPiMinusNeutralino", **kwargs):
84  result = ComponentAccumulator()
85  C1ToPiBR = 1.0
86  C1ToEleBR = eval(flags.Input.SpecialConfiguration.get("AMSBC1ToEleBR", "-1.0"))
87  if C1ToEleBR > 0.0:
88  C1ToPiBR -= C1ToEleBR
89  C1ToMuBR = eval(flags.Input.SpecialConfiguration.get("AMSBC1ToMuBR", "-1.0"))
90  if C1ToMuBR > 0.0:
91  C1ToPiBR -= C1ToMuBR
92  kwargs.setdefault("ParticleName","s_chi_minus_1")
93  kwargs.setdefault("BR",C1ToPiBR) #Branching Ratio
94  kwargs.setdefault("Daughters","s_chi_0_1,pi-")
95  result.setPrivateTools(CompFactory.AddPhysicsDecayTool(name, **kwargs))
96  return result
97 
98 
99 def CharginoPlusToEPlusNeutralinoCfg(flags, name="CharginoPlusToEPlusNeutralino", **kwargs):
100  result = ComponentAccumulator()
101  C1ToEBR = 0.0
102  C1ToEleBR = eval(flags.Input.SpecialConfiguration.get("AMSBC1ToEleBR", "-1.0"))
103  if C1ToEleBR > 0.0:
104  C1ToEBR = C1ToEleBR
105  kwargs.setdefault("ParticleName","s_chi_plus_1")
106  kwargs.setdefault("BR",C1ToEBR) #Branching Ratio
107  kwargs.setdefault("Daughters","s_chi_0_1,nu_e,e+")
108  result.setPrivateTools(CompFactory.AddPhysicsDecayTool(name, **kwargs))
109  return result
110 
111 
112 def CharginoMinusToEMinusNeutralinoCfg(flags, name="CharginoMinusToEMinusNeutralino", **kwargs):
113  result = ComponentAccumulator()
114  C1ToEBR = 0.0
115  C1ToEleBR = eval(flags.Input.SpecialConfiguration.get("AMSBC1ToEleBR", "-1.0"))
116  if C1ToEleBR > 0.0:
117  C1ToEBR = C1ToEleBR
118  kwargs.setdefault("ParticleName","s_chi_minus_1")
119  kwargs.setdefault("BR",C1ToEBR) #Branching Ratio
120  kwargs.setdefault("Daughters","s_chi_0_1,anti_nu_e,e-")
121  result.setPrivateTools(CompFactory.AddPhysicsDecayTool(name, **kwargs))
122  return result
123 
124 
125 def CharginoPlusToMuPlusNeutralinoCfg(flags, name="CharginoPlusToMuPlusNeutralino", **kwargs):
126  result = ComponentAccumulator()
127  C1ToMuonBR = 0.0
128  C1ToMuBR = eval(flags.Input.SpecialConfiguration.get("AMSBC1ToMuBR", "-1.0"))
129  if C1ToMuBR > 0.0:
130  C1ToMuonBR = C1ToMuBR
131  kwargs.setdefault("ParticleName","s_chi_plus_1")
132  kwargs.setdefault("BR",C1ToMuonBR) #Branching Ratio
133  kwargs.setdefault("Daughters","s_chi_0_1,nu_mu,mu+")
134  result.setPrivateTools(CompFactory.AddPhysicsDecayTool(name, **kwargs))
135  return result
136 
137 
138 def CharginoMinusToMuMinusNeutralinoCfg(flags, name="CharginoMinusToMuMinusNeutralino", **kwargs):
139  result = ComponentAccumulator()
140  C1ToMuonBR = 0.0
141  C1ToMuBR = eval(flags.Input.SpecialConfiguration.get("AMSBC1ToMuBR", "-1.0"))
142  if C1ToMuBR > 0.0:
143  C1ToMuonBR = C1ToMuBR
144  kwargs.setdefault("ParticleName","s_chi_minus_1")
145  kwargs.setdefault("BR",C1ToMuonBR) #Branching Ratio
146  kwargs.setdefault("Daughters","s_chi_0_1,anti_nu_mu,mu-")
147  result.setPrivateTools(CompFactory.AddPhysicsDecayTool(name, **kwargs))
148  return result
149 
150 
151 def AMSB_Cfg(flags):
152  result = ComponentAccumulator()
153  if flags.Common.ProductionStep == ProductionStep.Simulation:
154  from G4AtlasServices.G4AtlasServicesConfig import PhysicsListSvcCfg
155  result.merge(PhysicsListSvcCfg(flags))
156  C1Mass = eval(flags.Input.SpecialConfiguration["AMSBC1Mass"])
157  N1Mass = eval(flags.Input.SpecialConfiguration["AMSBN1Mass"])
158  # patching PDGTABLE
159  get_and_fix_PDGTABLE_AMSB([(1000022, N1Mass, '~chi(0,1)', '0'), (1000024, C1Mass, '~chi(+,1)', '+')])
160  from ExtraParticles.PDGHelpers import updateExtraParticleAcceptList
161  updateExtraParticleAcceptList('G4particle_acceptlist_ExtraParticles.txt', [1000022,-1000024,1000024])
162  if flags.Common.ProductionStep == ProductionStep.Simulation:
163  physicsOptions = [ result.popToolsAndMerge(CharginosPhysicsToolCfg(flags)) ]
164  # Add Chargino decays if necessary
165  C1Lifetime = eval(flags.Input.SpecialConfiguration.get("AMSBC1Lifetime", "-1.0"))
166  if C1Lifetime > 0.0:
167  physicsOptions += [ result.popToolsAndMerge(CharginoPlusToPiPlusNeutralinoCfg(flags)) ]
168  physicsOptions += [ result.popToolsAndMerge(CharginoMinusToPiMinusNeutralinoCfg(flags)) ]
169  C1ToEleBR = eval(flags.Input.SpecialConfiguration.get("AMSBC1ToEleBR", "-1.0"))
170  if C1ToEleBR > 0.0:
171  physicsOptions += [ result.popToolsAndMerge(CharginoPlusToEPlusNeutralinoCfg(flags)) ]
172  physicsOptions += [ result.popToolsAndMerge(CharginoMinusToEMinusNeutralinoCfg(flags)) ]
173  C1ToMuBR = eval(flags.Input.SpecialConfiguration.get("AMSBC1ToMuBR", "-1.0"))
174  if C1ToMuBR > 0.0:
175  physicsOptions += [ result.popToolsAndMerge(CharginoPlusToMuPlusNeutralinoCfg(flags)) ]
176  physicsOptions += [ result.popToolsAndMerge(CharginoMinusToMuMinusNeutralinoCfg(flags)) ]
177  result.getService("PhysicsListSvc").PhysOption += physicsOptions
178 
179  return result
180 
181 
182 def AMSB_VerboseSelectorCfg(flags, name="G4UA::VerboseSelectorTool", **kwargs):
183  kwargs.setdefault('TargetEvent',1)
184  kwargs.setdefault('VerboseLevel',1)
185  kwargs.setdefault('TargetPdgIDs',
186  [
187  1000022, # ~chi(0,1)
188  -1000024,1000024 # ~chi(+,1)
189  ])
190  from G4DebuggingTools.G4DebuggingToolsConfig import VerboseSelectorToolCfg
191  return VerboseSelectorToolCfg(flags, name, **kwargs)
xrange
void xrange(TH1 *h, bool symmetric)
Definition: computils.cxx:515
PDGHelpers.updateExtraParticleAcceptList
def updateExtraParticleAcceptList(listName='G4particle_acceptlist_ExtraParticles.txt', pdgcodes=[])
Definition: PDGHelpers.py:57
SystemOfUnits
python.JetAnalysisCommon.ComponentAccumulator
ComponentAccumulator
Definition: JetAnalysisCommon.py:302
python.G4DebuggingToolsConfig.VerboseSelectorToolCfg
def VerboseSelectorToolCfg(flags, name="G4UA::VerboseSelectorTool", **kwargs)
Definition: G4DebuggingToolsConfig.py:8
PDGHelpers.getPDGTABLE
def getPDGTABLE(table)
Definition: PDGHelpers.py:37
CharginosConfig.AMSB_Cfg
def AMSB_Cfg(flags)
Definition: CharginosConfig.py:151
CharginosConfig.CharginoPlusToEPlusNeutralinoCfg
def CharginoPlusToEPlusNeutralinoCfg(flags, name="CharginoPlusToEPlusNeutralino", **kwargs)
Definition: CharginosConfig.py:99
CharginosConfig.CharginoPlusToPiPlusNeutralinoCfg
def CharginoPlusToPiPlusNeutralinoCfg(flags, name="CharginoPlusToPiPlusNeutralino", **kwargs)
Definition: CharginosConfig.py:67
CharginosConfig.CharginoMinusToMuMinusNeutralinoCfg
def CharginoMinusToMuMinusNeutralinoCfg(flags, name="CharginoMinusToMuMinusNeutralino", **kwargs)
Definition: CharginosConfig.py:138
CharginosConfig.CharginoMinusToPiMinusNeutralinoCfg
def CharginoMinusToPiMinusNeutralinoCfg(flags, name="CharginoMinusToPiMinusNeutralino", **kwargs)
Definition: CharginosConfig.py:83
TCS::join
std::string join(const std::vector< std::string > &v, const char c=',')
Definition: Trigger/TrigT1/L1Topo/L1TopoCommon/Root/StringUtils.cxx:10
G4AtlasServicesConfig.PhysicsListSvcCfg
def PhysicsListSvcCfg(flags, name="PhysicsListSvc", **kwargs)
Definition: G4AtlasServicesConfig.py:22
Trk::open
@ open
Definition: BinningType.h:40
CharginosConfig.get_and_fix_PDGTABLE_AMSB
def get_and_fix_PDGTABLE_AMSB(replace)
Definition: CharginosConfig.py:13
str
Definition: BTagTrackIpAccessor.cxx:11
CharginosConfig.CharginoMinusToEMinusNeutralinoCfg
def CharginoMinusToEMinusNeutralinoCfg(flags, name="CharginoMinusToEMinusNeutralino", **kwargs)
Definition: CharginosConfig.py:112
CharginosConfig.CharginosPhysicsToolCfg
def CharginosPhysicsToolCfg(flags, name="CharginosPhysicsTool", **kwargs)
Definition: CharginosConfig.py:44
CharginosConfig.AMSB_VerboseSelectorCfg
def AMSB_VerboseSelectorCfg(flags, name="G4UA::VerboseSelectorTool", **kwargs)
Definition: CharginosConfig.py:182
CharginosConfig.CharginoPlusToMuPlusNeutralinoCfg
def CharginoPlusToMuPlusNeutralinoCfg(flags, name="CharginoPlusToMuPlusNeutralino", **kwargs)
Definition: CharginosConfig.py:125