ATLAS Offline Software
Loading...
Searching...
No Matches
LArCalib_HVCorrConfig.py
Go to the documentation of this file.
1#!/usr/bin/env python3
2# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3
4
5from AthenaConfiguration.ComponentFactory import CompFactory
6from AthenaConfiguration.MainServicesConfig import MainEvgenServicesCfg
7
8def HVCorrConfig(flags,outputName="hvcorr",runOut=0, lbOut=0, voltages=[], currents=[], isHI=False, hipatch=1.0):
9
10 from LArGeoAlgsNV.LArGMConfig import LArGMCfg
11 result=LArGMCfg(flags)
12
13 #Use the standard LArHVScaleCfg and adjust properties afterwards as needed
14 from LArCalibUtils.LArHVScaleConfig import LArHVScaleCfg
15
16 result.merge(LArHVScaleCfg(flags))
17 alg = result.getCondAlgo("LArHVCondAlg")
18 alg.UndoOnlineHVCorr=False
19 alg.keyOutputCorr="NewLArHVScaleCorr"
20 alg.fixCurrent = currents
21 alg.fixHV = voltages
22
23 from LArCabling.LArCablingConfig import LArOnOffIdMappingSCCfg
24 result.merge(LArOnOffIdMappingSCCfg(flags))
25 result.addEventAlgo(CompFactory.LArHVCorrToSCHVCorr(ContainerKey="NewLArHVScaleCorr",OutputKey="NewSCLArHVScaleCorr",
26 OutputFolder="/LAR/ElecCalibFlatSC/HVScaleCorrNew",
27 IsHeavyIons=isHI, PatchInHeavyIons=hipatch,
28 PhysicsWeights="TrigT1CaloCalibUtils/HVcorrPhysicsWeights.txt"))
29
30 #The LArHVCorrMaker creates a flat blob in a CondAttrListCollection
31 #Input: The HV Scale Correction computed by the LArHVCondAlg based on the DCS HV values
32 result.addEventAlgo(CompFactory.LArHVCorrMaker(LArHVScaleCorr="NewLArHVScaleCorr",folderName="/LAR/ElecCalibFlat/HVScaleCorrNew"))
33
36
37 #Ntuple writing ...
38 from LArCalibTools.LArCalib_HVScale2NtupleConfig import LArHVScaleCorr2NtupleCfg
39 result.merge(LArHVScaleCorr2NtupleCfg(flags,rootfile=outputName+'_ntuple.root',addSC=True))
40 result.getEventAlgo("LArHVScaleCorr2Ntuple").ContainerKey="NewLArHVScaleCorr"
41 result.getEventAlgo("LArSCHVScaleCorr2Ntuple").ContainerKey="NewSCLArHVScaleCorr"
42 result.getEventAlgo("LArSCHVScaleCorr2Ntuple").NtuplePath="/NTUPLES/FILE1/HVSCALESC"
43
44 #sqlite writing ...
45 from RegistrationServices.OutputConditionsAlgConfig import OutputConditionsAlgCfg
46 result.merge(OutputConditionsAlgCfg(flags,
47 outputFile="dummy.root",
48 ObjectList=["CondAttrListCollection#/LAR/ElecCalibFlat/HVScaleCorrNew#/LAR/ElecCalibFlat/HVScaleCorr",
49 "CondAttrListCollection#/LAR/ElecCalibFlatSC/HVScaleCorrNew#/LAR/ElecCalibFlatSC/HVScaleCorr",],
50 Run1=runOut,
51 LB1=lbOut
52 ))
53
54
55
56 #RegistrationSvc
57 result.addService(CompFactory.IOVRegistrationSvc(RecreateFolders = True,
58 SVFolder=True,
59 OverrideNames = ["HVScaleCorr"],
60 OverrideTypes = ["Blob16M"],
61 ))
62
63 result.getService("IOVDbSvc").DBInstance=""
64 return result
65
66
67if __name__=="__main__":
68 import itertools
69 import re
70 import sys
71 from time import time,strptime
72 from calendar import timegm
73 import argparse
74 parser= argparse.ArgumentParser(description="Recalculate HV corrections based on DCS values")
75 parser.add_argument('datestamp',help="time specification like 2007-05-25:14:01:00")
76 parser.add_argument('Run',type=int, nargs='?', default=0,help="IOV start (run-number)")
77 parser.add_argument('LB',type=int, nargs='?', default=0,help="IOV start (run-number)")
78 parser.add_argument('-g', '--globaltag', type=str, help="Global conditions Tag ")
79 parser.add_argument('-o', '--output',type=str,default="hvcorr",help="name stub for root and sqlite output files")
80 parser.add_argument('-l','--olevel',type=int, default=3,help="OutputLevel")
81 parser.add_argument('-V','--voltage',type=str, default=[], action='append', nargs=1,
82 help="use -V \"<ID> <HV>\" to set the voltage for this line instead of reading it from DCS")
83 parser.add_argument('-I','--current',type=str, default=[], action='append', nargs=1,
84 help="use -I \"<ID> <current>\" to set the current for this line instead of reading it from DCS")
85 parser.add_argument('-s', '--sqlite',type=str,default="",help="name of sqlite file to be used instead of COOL")
86 parser.add_argument('--isHI', dest='hi', default=False, help='is for HI ?', action='store_true')
87
88 parser.add_argument('--patchHI',dest='patchhi',type=float, default=1.4,help="Ptching value for HI")
89
90 args = parser.parse_args()
91 try:
92 ts=strptime(args.datestamp+'/UTC','%Y-%m-%d:%H:%M:%S/%Z')
93 TimeStamp=int(timegm(ts))
94 TimeStamp_ns=TimeStamp*1000000000
95 except ValueError as e:
96 print("ERROR in time specification, use e.g. 2007-05-25:14:01:00")
97 print(e)
98 sys.exit(-1)
99
100 from LArCalibProcessing.TimeStampToRunLumi import TimeStampToRunLumi
101
102 rlb=TimeStampToRunLumi(TimeStamp_ns)
103 if rlb is None:
104 rlb=[0xFFFFFFF-1,0]
105 print("WARNING: Failed to convert time",TimeStamp_ns,"into a run/lumi number. Using 'infinite' run-number",rlb[0])
106
107
108 print("---> Working on run",rlb[0],"LB",rlb[1],"Timestamp:",TimeStamp)
109 timediff=int(time()-TimeStamp)
110 if timediff<0:
111 print("ERROR: Timestamp in the future???")
112 else:
113 (days,remainder)=divmod(timediff,24*60*60)
114 (hours,seconds)=divmod(remainder,60*60)
115 print ("---> Timestamp is %i days %i hours and %i minutes ago" % (days,hours,int(seconds/60)))
116 pass
117
118 print("Output IOV will be from run %i lumiblock %i to INF" % (args.Run,args.LB))
119 args.voltage = list(itertools.chain.from_iterable(args.voltage))
120 args.current = list(itertools.chain.from_iterable(args.current))
121 for x in args.voltage + args.current:
122 if re.match(r"\d+\s+\d+\.?\d*", x) is None:
123 print("ERROR: invalid voltage/current specification, should be of the form \"<line ID> <HV>\"")
124 sys.exit(-1)
125 outputName=args.output
126
127 from AthenaConfiguration.TestDefaults import defaultGeometryTags
128 from AthenaConfiguration.AllConfigFlags import initConfigFlags
129 ConfigFlags=initConfigFlags()
130
131 if args.globaltag:
132 ConfigFlags.IOVDb.GlobalTag=args.globaltag
133
134 ConfigFlags.Input.RunNumbers=[rlb[0]]
135 ConfigFlags.Input.LumiBlockNumbers=[rlb[1]]
136 ConfigFlags.Input.TimeStamps=[TimeStamp]
137 ConfigFlags.Input.Files=[]
138 ConfigFlags.IOVDb.DatabaseInstance="CONDBR2"
139 ConfigFlags.IOVDb.DBConnection="sqlite://;schema="+outputName+".db;dbname=CONDBR2"
140 if len(args.sqlite)>0:
141 ConfigFlags.IOVDb.SqliteInput=args.sqlite
142 ConfigFlags.IOVDb.SqliteFolders=("/LAR/ElecCalibFlat/HVScaleCorr",)
143 ConfigFlags.GeoModel.AtlasVersion=defaultGeometryTags.RUN3
144 ConfigFlags.Exec.OutputLevel=args.olevel
145 ConfigFlags.lock()
146 cfg=MainEvgenServicesCfg(ConfigFlags)
147 #First LB not set by McEventSelectorCfg, set it here:
148 cfg.getService("EventSelector").FirstLB=ConfigFlags.Input.LumiBlockNumbers[0]
149 cfg.merge(HVCorrConfig(ConfigFlags, outputName, runOut=args.Run, lbOut=args.LB,
150 voltages=args.voltage, currents=args.current,isHI=args.hi,hipatch=args.patchhi))
151
152 print("Start running...")
153 import sys
154 sys.exit(cfg.run(1).isFailure())
void print(char *figname, TCanvas *c1)
HVCorrConfig(flags, outputName="hvcorr", runOut=0, lbOut=0, voltages=[], currents=[], isHI=False, hipatch=1.0)