ATLAS Offline Software
Loading...
Searching...
No Matches
LArConditions2Ntuple.py
Go to the documentation of this file.
1#!/bin/env python
2# Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3
4from AthenaConfiguration.ComponentFactory import CompFactory
5
6
7if __name__=='__main__':
8
9 import os,sys
10 import argparse
11
12 # now process the CL options and assign defaults
13 parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
14 parser.add_argument('-r','--run', dest='run', default=0x7fffffff, help='Run number', type=int)
15 parser.add_argument('--sqlite', dest='sqlite', default=None, help='sqlite file to read from (default: oracle)', type=str)
16 parser.add_argument('-t','--tag',dest='dbtag',default=None,help="Global conditions tag", type=str)
17 parser.add_argument('-f','--ftag',dest='ftag',default=None,help="folder tag suffig", type=str)
18 parser.add_argument('-o','--out', dest='out', default="LArConditions.root", help='Output root file', type=str)
19 parser.add_argument('--ofcfolder',dest='ofcfolder',default="", help="OFC flavor",type=str)
20 parser.add_argument('-s','--isSC', dest='isSC', action='store_true', default=False, help='is SC?')
21 parser.add_argument('-m','--isMC', dest='isMC', action='store_true', default=False, help='is MC?')
22
23 parser.add_argument("--objects",dest="objects",default="PEDESTAL,RAMP",help="List of conditions types to be dumped",type=str)
24 parser.add_argument("--folders",dest="folders",default="/LAR/ElecCalibFlat/Pedestal,/LAR/ElecCalibFlat/Ramp",help="List of folders to be taken from sqlite",type=str)
25 parser.add_argument('--offline',dest="offline", action='store_true', default=False, help='is offline folder?')
26 parser.add_argument('--poolcat',dest="poolcat", default="", type=str, help='is offline folder?')
27 parser.add_argument('-n', '--ntuple', dest='ntname', default='', help='output ntuple name (if different from default)', type=str)
28 parser.add_argument('--oLevel', dest='olevel', default=3, help='OutputLevel of the job', type=int)
29
30 args = parser.parse_args()
31 if help in args and args.help is not None and args.help:
32 parser.print_help()
33 sys.exit(0)
34
35 print(vars(args))
36
37 #Translation table ... with a few potential variant spellings
38 objTable={"RAMP":"Ramp",
39 "DAC2UA":"DAC2uA",
40 "DACUA":"DAC2uA",
41 "PEDESTAL":"Pedestal",
42 "PED":"Pedestal",
43 "UA2MEV":"uA2MeV",
44 "UAMEV":"uA2MeV",
45 "MPHYSOVERMCAL":"MphysOverMcal",
46 "MPHYSMCAL":"MphysOverMcal",
47 "MPMC":"MphysOverMcal",
48 "OFC":"OFC",
49 "SHAPE":"Shape",
50 "HVSCALECORR":"HVScaleCorr",
51 "HVSCALE":"HVScaleCorr",
52 "FSAMPL":"fSampl",
53 "AUTOCORR":"AutoCorr",
54 "AC":"AutoCorr",
55 "CALIWAVE":"CaliWave",
56 "PHYSWAVE":"PhysWave",
57 "OFCCALI":"OFCCali",
58 "ACORR":"AutoCorr",
59 "DSPTHR":"DSPThr",
60 "MINBIAS":"MinBias",
61 "PHYSAC":"PhysAutoCorr",
62 }
63
64 objects=set()
65 objectsOnl=set()
66 for obj in args.objects.split(","):
67 objU=obj.upper()
68 if objU not in objTable:
69 print("ERROR: Unknown conditions type",obj)
70 sys.exit(0)
71
72 objects.add(objTable[objU])
73 if "OFCCALI" not in obj.upper() and 'WAVE' not in obj.upper() and 'DSPTHR' not in obj.upper() and 'MINBIAS' not in obj.upper() and not args.offline:
74 objectsOnl.add(objTable[objU])
75
76 flds=set()
77 for fld in args.folders.split(","):
78 flds.add(fld)
79
80 from AthenaConfiguration.AllConfigFlags import initConfigFlags
81 flags=initConfigFlags()
82 from LArCalibProcessing.LArCalibConfigFlags import addLArCalibFlags
83 addLArCalibFlags(flags, args.isSC)
84
85 flags.Input.RunNumbers=[args.run]
86 from AthenaConfiguration.TestDefaults import defaultGeometryTags
87 flags.GeoModel.AtlasVersion=defaultGeometryTags.RUN3
88
89 flags.Input.Files=[]
90
91 flags.Input.isMC=args.isMC
92 flags.LArCalib.isSC=args.isSC
93
94 flags.LAr.doAlign=False
95
96 flags.LAr.OFCShapeFolder=args.ofcfolder
97
98 from AthenaConfiguration.Enums import LHCPeriod
99 if flags.Input.RunNumbers[0] < 222222:
100 #Set to run1 for early run-numbers
101 flags.GeoModel.Run=LHCPeriod.Run1
102 flags.IOVDb.DatabaseInstance="OFLP200" if flags.Input.isMC else "COMP200"
103 else:
104 flags.GeoModel.Run=LHCPeriod.Run2
105 flags.IOVDb.DatabaseInstance="OFLP200" if flags.Input.isMC else "CONDBR2"
106
107 if args.dbtag:
108 flags.IOVDb.GlobalTag=args.dbtag
109 elif flags.Input.isMC:
110 flags.IOVDb.GlobalTag="OFLCOND-MC16-SDR-20"
111 elif flags.IOVDb.DatabaseInstance == "COMP200":
112 flags.IOVDb.GlobalTag="COMCOND-BLKPA-RUN1-09"
113 else:
114 flags.IOVDb.GlobalTag="CONDBR2-ES1PA-2024-01"
115
116 flags.Exec.OutputLevel=args.olevel
117 flags.Debug.DumpCondStore=True
118 flags.Debug.DumpDetStore=True
119
120 if (args.sqlite):
121 flags.IOVDb.SqliteInput=args.sqlite
122 flags.IOVDb.SqliteFolders=tuple(flds)
123 if len(objects)!=len(objectsOnl):
124 flags.IOVDb.DBConnection="COOLOFL_LAR/CONDBR2"
125
126 if "fSampl" in objects:
127 flags.Overlay.DataOverlay=True
128
129 flags.lock()
130
131 from AthenaConfiguration.MainServicesConfig import MainServicesCfg
132 cfg=MainServicesCfg(flags)
133
134 #MC Event selector since we have no input data file
135 from McEventSelector.McEventSelectorConfig import McEventSelectorCfg
136 cfg.merge(McEventSelectorCfg(flags,
137 EventsPerRun = 1,
138 FirstEvent = 1,
139 InitialTimeStamp = 0,
140 TimeStampInterval = 1))
141
142
143 if "fSampl" in objects:
144 from IOVDbSvc.IOVDbSvcConfig import addOverride
145 cfg.merge(addOverride(flags,"/LAR/ElecCalibMC/fSampl","LARElecCalibMCfSampl-G496-19213-FTFP_BERT_BIRK"))
146
147 #Get LAr basic services and cond-algos
148 from LArGeoAlgsNV.LArGMConfig import LArGMCfg
149 cfg.merge(LArGMCfg(flags))
150
151 if flags.LArCalib.isSC:
152 #Setup SuperCell cabling
153 from LArCabling.LArCablingConfig import LArOnOffIdMappingSCCfg, LArCalibIdMappingSCCfg, LArLATOMEMappingCfg
154 cfg.merge(LArOnOffIdMappingSCCfg(flags))
155 cfg.merge(LArCalibIdMappingSCCfg(flags))
156 cfg.merge(LArLATOMEMappingCfg(flags))
157 if not args.offline:
158 from LArConfiguration.LArElecCalibDBConfig import LArElecCalibDBSCCfg
159 cfg.merge(LArElecCalibDBSCCfg(flags,objectsOnl))
160 else:
161 #Setup regular cabling
162 from LArCabling.LArCablingConfig import LArOnOffIdMappingCfg, LArCalibIdMappingCfg
163 cfg.merge(LArOnOffIdMappingCfg(flags))
164 cfg.merge(LArCalibIdMappingCfg(flags))
165 if not args.offline:
166 from LArConfiguration.LArElecCalibDBConfig import LArElecCalibDBCfg
167 cfg.merge(LArElecCalibDBCfg(flags,objectsOnl))
168
169 from LArBadChannelTool.LArBadChannelConfig import LArBadChannelCfg
170 cfg.merge(LArBadChannelCfg(flags, isSC=flags.LArCalib.isSC))
171
172 bcKey = "LArBadChannelSC" if flags.LArCalib.isSC else "LArBadChannel"
173
174 if "Pedestal" in objects:
175 ckey = "LArPedestalSC" if flags.LArCalib.isSC else "LArPedestal"
176 cfg.addEventAlgo(CompFactory.LArPedestals2Ntuple(ContainerKey = ckey,
177 AddFEBTempInfo = False,
178 AddCalib = True,
179 isSC = flags.LArCalib.isSC,
180 BadChanKey = bcKey
181 ))
182
183 if "AutoCorr" in objects:
184 from IOVDbSvc.IOVDbSvcConfig import addFolders
185 if flags.LArCalib.isSC:
186 cfg.merge(addFolders(flags,'/LAR/ElecCalibOflSC/AutoCorrs/AutoCorr',modifiers='<key>LArAutoCorrSC</key>',className='LArAutoCorrComplete'))
187 else:
188 if args.ftag:
189 cfg.merge(addFolders(flags,'/LAR/ElecCalibOfl/AutoCorrs/AutoCorr',tag="".join('/LAR/ElecCalibOfl/AutoCorrs/AutoCorr'.split('/')) + args.ftag))
190 else:
191 cfg.merge(addFolders(flags,'/LAR/ElecCalibOfl/AutoCorrs/AutoCorr',className='LArAutoCorrComplete'))
192 ckey="LArAutoCorrSC" if flags.LArCalib.isSC else "LArAutoCorr"
193 cfg.addEventAlgo(CompFactory.LArAutoCorr2Ntuple(ContainerKey = "LArAutoCorrSym" if flags.Input.isMC else ckey,
194 AddFEBTempInfo = False,
195 AddCalib = True,
196 isSC = flags.LArCalib.isSC,
197 ApplyCorrection = True,
198 AddCorrUndo = True,
199 BadChanKey = bcKey,
200
201 ))
202
203 if "PhysAutoCorr" in objects:
204 from IOVDbSvc.IOVDbSvcConfig import addFolders
205 if flags.LArCalib.isSC:
206 cfg.merge(addFolders(flags,'/LAR/ElecCalibOflSC/AutoCorrs/PhysicsAutoCorr',modifiers='<key>LArAutoCorrSC</key>',className='LArAutoCorrComplete'))
207 else:
208 if args.ftag:
209 cfg.merge(addFolders(flags,'/LAR/ElecCalibOfl/AutoCorrs/PhysicsAutoCorr',tag="".join('/LAR/ElecCalibOfl/AutoCorrs/PhysicsAutoCorr'.split('/')) + args.ftag))
210 else:
211 cfg.merge(addFolders(flags,'/LAR/ElecCalibOfl/AutoCorrs/PhysicsAutoCorr',className='LArAutoCorrComplete'))
212 ckey="LArPhysAutoCorrSC" if flags.LArCalib.isSC else "LArPhysAutoCorr"
213 cfg.addEventAlgo(CompFactory.LArAutoCorr2Ntuple(ContainerKey = ckey,
214 AddFEBTempInfo = False,
215 AddCalib = True,
216 isSC = flags.LArCalib.isSC,
217 ApplyCorrection = not flags.Input.isMC,
218 AddCorrUndo = not flags.Input.isMC,
219 BadChanKey = bcKey,
220
221 ))
222
223 if "Ramp" in objects:
224 ckey = "LArRampSC" if flags.LArCalib.isSC else "LArRamp"
225 if args.offline:
226 from IOVDbSvc.IOVDbSvcConfig import addFolders
227 if flags.LArCalib.isSC:
228 cfg.merge(addFolders(flags,'/LAR/ElecCalibOflSC/Ramps/RampLinea',modifiers='<key>LArRampSC</key>',className='LArRampComplete'))
229 else:
230 cfg.merge(addFolders(flags,'/LAR/ElecCalibOfl/Ramps/RampLinea',className='LArRampComplete'))
231 cfg.addEventAlgo(CompFactory.LArRamps2Ntuple(RampKey="LArRampSym" if flags.Input.isMC else ckey,
232 AddFEBTempInfo = False,
233 AddCalib = True,
234 isSC = flags.LArCalib.isSC,
235 ApplyCorr = True,
236 AddCorrUndo = True,
237 BadChanKey = bcKey
238 ))
239
240 if "OFC" in objects:
241 if args.offline:
242 from IOVDbSvc.IOVDbSvcConfig import addFolders
243 for fld in flds:
244 if 'OFC' in fld:
245 if args.ftag:
246 cfg.merge(addFolders(flags,fld,tag="".join(fld.split('/')) + args.ftag))
247 else:
248 cfg.merge(addFolders(flags,fld))
249 ckey= 'LArOFC'
250 ntname= 'OFC' if '1phase' in fld else 'OFC_1ns'
251 break
252 else:
253 ckey = "LArOFCSC" if flags.LArCalib.isSC else "LArOFC"
254 ntname = 'OFC'
255 cfg.addEventAlgo(CompFactory.LArOFC2Ntuple(AddFEBTempInfo = False,
256 ContainerKey=ckey,
257 NtupleName=ntname,
258 isSC = flags.LArCalib.isSC,
259 BadChanKey = bcKey
260 ))
261
262 if "OFCCali" in objects:
263 if args.offline:
264 from IOVDbSvc.IOVDbSvcConfig import addFolders
265 for fld in flds:
266 if 'OFC' in fld:
267 if args.ftag:
268 cfg.merge(addFolders(flags,fld,tag="".join(foldername.split('/')) + args.ftag))
269 else:
270 cfg.merge(addFolders(flags,fld))
271 ckey= 'LArOFC' if '1phase' in fld else 'LArOFC'
272 break
273 else:
274 ckey = "LArOFCSCCali" if flags.LArCalib.isSC else "LArOFCCali"
275 fldr = "/LAR/ElecCalibFlatSC/OFCCali" if flags.LArCalib.isSC else "/LAR/ElecCalibFlat/OFCCali"
276 dbString = "<db>sqlite://;schema="+args.sqlite+";dbname=CONDBR2" if args.sqlite else "<db>COOLONL_LAR/CONDBR2</db>"
277 from IOVDbSvc.IOVDbSvcConfig import addFolders
278 cfg.merge(addFolders(flags,fldr,detDb=dbString,className="CondAttrListCollection"))
279 LArOFCSCCondAlg = CompFactory.getComp("LArFlatConditionsAlg<LArOFCSC>")("LArOFCSCCaliCondAlg")
280 LArOFCSCCondAlg.ReadKey=fldr
281 LArOFCSCCondAlg. WriteKey=ckey
282 cfg.addCondAlgo(LArOFCSCCondAlg)
283
284 cfg.addEventAlgo(CompFactory.LArOFC2Ntuple("LArOFC2NtupleCali",
285 AddFEBTempInfo = False,
286 ContainerKey=ckey,
287 NtupleName="OFCCali" if args.ntname=='' else args.ntname,
288 isSC = flags.LArCalib.isSC,
289 BadChanKey = bcKey
290 ))
291
292
293 if "Shape" in objects:
294 if args.offline:
295 from IOVDbSvc.IOVDbSvcConfig import addFolders
296 for fld in flds:
297 if 'Shape' in fld:
298 if args.ftag:
299 cfg.merge(addFolders(flags,fld,tag="".join(fld.split('/')) + args.ftag))
300 else:
301 cfg.merge(addFolders(flags,fld))
302 ckey= 'LArShape'
303 ntname= 'SHAPE' if '1phase' in fld else 'SHAPE_1ns'
304 break
305 else:
306 ckey = "LArShapeSC" if flags.LArCalib.isSC else "LArShape"
307 if flags.Input.isMC:
308 ckey="LArShapeSym"
309
310 cfg.addEventAlgo(CompFactory.LArShape2Ntuple(ContainerKey=ckey,
311 AddFEBTempInfo = False,
312 AddCalib = True,
313 isSC = flags.LArCalib.isSC,
314 BadChanKey = bcKey
315
316 ))
317 if "MphysOverMcal" in objects:
318 if args.offline:
319 from IOVDbSvc.IOVDbSvcConfig import addFolders
320 if flags.LArCalib.isSC:
321 print('offline, adding /LAR/ElecCalibOflSC/MphysOverMcal/RTM folder')
322 cfg.merge(addFolders(flags,'/LAR/ElecCalibOflSC/MphysOverMcal/RTM',modifiers='<key>LArMphysOverMcalSC</key>',className='LArMphysOverMcalComplete'))
323 else:
324 cfg.merge(addFolders(flags,'/LAR/ElecCalibOfl/MphysOverMcal/RTM',className='LArMphysOverMcalComplete'))
325
326 cfg.addEventAlgo(CompFactory.LArMphysOverMcal2Ntuple(ContainerKey = "LArMphysOverMcalSC" if flags.LArCalib.isSC else "LArMphysOverMcal",
327 AddFEBTempInfo = False,
328 AddCalib = True,
329 isSC = flags.LArCalib.isSC,
330 BadChanKey = bcKey
331 ))
332
333 #ADC2MeV and DACuA are handled by the same ntuple dumper
334 if "DAC2uA" in objects or "uA2MeV" in objects:
335 uackey = "LAruA2MeVSC" if flags.LArCalib.isSC else "LAruA2MeV"
336 dackey = "LArDAC2uASC" if flags.LArCalib.isSC else "LArDAC2uA"
337 ua2MeVKey="LAruA2MeVSym" if flags.Input.isMC else uackey
338 dac2uAKey="LArDAC2uASym" if flags.Input.isMC else dackey
339
340 cfg.addEventAlgo(CompFactory.LAruA2MeV2Ntuple(uA2MeVKey=ua2MeVKey if "uA2MeV" in objects else "",
341 DAC2uAKey=dac2uAKey if "DAC2uA" in objects else "",
342 isSC = flags.LArCalib.isSC,
343 BadChanKey = bcKey
344 ))
345
346
347 if "HVScaleCorr" in objects:
348 # hack to read from sqlite created by HV computations
349 iovDbSvc=cfg.getService("IOVDbSvc")
350 for i in range(0,len(iovDbSvc.Folders)):
351 if (iovDbSvc.Folders[i].find("HVScaleCorr")>=0):
352 iovDbSvc.Folders[i]+="<key>/LAR/ElecCalibFlatSC/HVScaleCorr</key>"
353
354 cfg.addEventAlgo(CompFactory.LArHVScaleCorr2Ntuple(ContainerKey= "LArHVScaleCorrSC" if flags.LArCalib.isSC else "LArHVScaleCorr",
355 AddFEBTempInfo = False,
356 isSC = flags.LArCalib.isSC,
357 BadChanKey = bcKey
358 ))
359
360 if "fSampl" in objects:
361 cfg.addEventAlgo(CompFactory.LArfSampl2Ntuple(ContainerKey="LArfSamplSC" if flags.LArCalib.isSC else "LArfSamplSym",
362 isSC=flags.LArCalib.isSC
363 ))
364
365 if "CaliWave" in objects:
366 if flags.Input.isMC:
367 print('No CaliWave in MC')
368 else:
369 fld = "/LAR/ElecCalibOflSC/CaliWaves/CaliWave" if flags.LArCalib.isSC else "/LAR/ElecCalibOfl/CaliWaves/CaliWave"
370 from IOVDbSvc.IOVDbSvcConfig import addFolders
371 cfg.merge(addFolders(flags,fld,modifiers='<key>LArCaliWave</key><typeName>LArCaliWaveContainer</typeName>'))
372 cfg.addEventAlgo(CompFactory.LArCaliWaves2Ntuple(KeyList = ["LArCaliWave"],
373 NtupleName = "CALIWAVE",
374 AddFEBTempInfo = False,
375 SaveDerivedInfo = True,
376 AddCalib = True,
377 SaveJitter = True,
378 isFlat = False,
379 isSC = flags.LArCalib.isSC,
380 BadChanKey = bcKey
381 ))
382
383 if "PhysWave" in objects:
384 if flags.Input.isMC:
385 print('No PhysWave in MC yet')
386 else:
387 fld = "/LAR/ElecCalibOflSC/PhysWaves/RTM" if flags.LArCalib.isSC else "/LAR/ElecCalibOfl/PhysWaves/RTM"
388 from IOVDbSvc.IOVDbSvcConfig import addFolders
389 cfg.merge(addFolders(flags,fld))
390 cfg.addEventAlgo(CompFactory.LArPhysWaves2Ntuple(KeyList = ["LArPhysWave"],
391 NtupleName = "PHYSWAVE",
392 AddFEBTempInfo = False,
393 SaveDerivedInfo = True,
394 AddCalib = True,
395 isFlat = False,
396 isSC = flags.LArCalib.isSC,
397 BadChanKey = bcKey
398 ))
399
400 if "DSPThr" in objects:
401 from IOVDbSvc.IOVDbSvcConfig import addFoldersSplitOnline
402 f1 = "/LAR/Configuration/DSPThresholdFlat/Thresholds"
403 f2 = "/LAR/NoiseOfl/DSPThresholds"
404 cfg.merge(addFoldersSplitOnline(flags,"LAR",f1,f2,splitMC=True))
405 cfg.addEventAlgo(CompFactory.LArDSPThresholds2Ntuple(DumpFlat=True,FlatFolder=f2 if flags.Input.isMC else f1))
406
407 if "MinBias" in objects:
408 #FIXME different for MC
409 from IOVDbSvc.IOVDbSvcConfig import addFolders
410 if args.offline:
411 myfld="/LAR/ElecCalibOfl/LArPileupAverage"
412 mydb="LAR_OFL"
413 else:
414 myfld="/LAR/LArPileup/LArPileupAverage"
415 mydb="LAR_ONL"
416 if args.ftag:
417 cfg.merge(addFolders(flags,myfld,detDb=mydb,className="LArMinBiasAverageMC",tag="".join(myfld.split('/')) + args.ftag))
418 else:
419 cfg.merge(addFolders(flags,myfld,detDb=mydb,className="LArMinBiasAverageMC"))
420 LArMinBiasAverageSymAlg = CompFactory.getComp("LArSymConditionsAlg<LArMinBiasAverageMC, LArMinBiasAverageSym>")
421 LArMCSymCondAlg=CompFactory.LArMCSymCondAlg
422 cfg.addCondAlgo(LArMCSymCondAlg(ReadKey="LArOnOffIdMap"))
423 cfg.addCondAlgo(LArMinBiasAverageSymAlg(ReadKey="LArPileupAverage",WriteKey="LArSymPileupAverage"))
424 cfg.addEventAlgo(CompFactory.LArMinBias2Ntuple(ContainerKey="",ContainerKeyAv="LArSymPileupAverage"))
425
426 rootfile=args.out
427 if os.path.exists(rootfile):
428 os.remove(rootfile)
429 cfg.addService(CompFactory.NTupleSvc(Output = [ "FILE1 DATAFILE='"+rootfile+"' OPT='NEW'" ]))
430 cfg.setAppProperty("HistogramPersistency","ROOT")
431
432 if args.dbtag and 'CALIB' in args.dbtag:
433 cfg.getService("IOVDbSvc").DBInstance=""
434
435 if args.poolcat:
436 cfg.getService("PoolSvc").ReadCatalog+=["xmlcatalog_file:%s"%args.poolcat,]
437
438 cfg.run(1)
439 sys.exit(0)
440
void print(char *figname, TCanvas *c1)
STL class.
std::string find(const std::string &s)
return a remapped string
Definition hcg.cxx:138
std::vector< std::string > split(const std::string &s, const std::string &t=":")
Definition hcg.cxx:177