ATLAS Offline Software
Loading...
Searching...
No Matches
LArRunFormat.py
Go to the documentation of this file.
1#!/usr/bin/env python
2
3# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
4
5from CoolConvUtilities.AtlCoolLib import indirectOpen
6from functools import cache
7
8
10 "Wrapper class to hold LAr run configuration information"
11 def __init__(self,nSamples,gainType,latency,firstSample,format,runType):
12 self._nSamples = nSamples
13 self._gainType = gainType
14 self._latency = latency
15 self._firstSample = firstSample
16 self._format = format
17 self._runType = runType
18
19 def nSamples(self):
20 "Number of samples readout from FEB"
21 return self._nSamples
22
23 def gainType(self):
24 "gainType: 0=auto,1=L,2=M,3=H,4=LM,5=LH,6=ML,7=MH,8=HL,9=HM,10=LMH,11=LHM,12=MLH,13=MHL,14=HLM,15=HML"
25 return self._gainType
26
27 def latency(self):
28 "latency between l1 trigger and readout"
29 return self._latency
30
31 def firstSample(self):
32 "firstsample"
33 return self._firstSample
34
35 def format(self):
36 "format:0=Transparent, 1=Format 1, 2=Format 2"
37 return self._format
38
39 def runType(self):
40 "runType: 0=RawData, 1=RawDataResult, 2=Result"
41 return self._runType
42
43 def stringFormat(self):
44 if (self._format == 0) :
45 return 'transparent'
46 if (self._format == 1) :
47 return 'Format1'
48 if (self._format == 2) :
49 return 'Format2'
50
51 def stringRunType(self):
52 if (self._runType ==0) :
53 return 'RawData'
54 if (self._runType ==1) :
55 return 'RawDataResult'
56 if (self._runType ==2) :
57 return 'Result'
58
59@cache
60def getLArFormatForRun(run,quiet=False,connstring="COOLONL_LAR/CONDBR2"):
61 from AthenaCommon.Logging import logging
62 mlog_LRF = logging.getLogger( 'getLArRunFormatForRun' )
63
64 mlog_LRF.info("Connecting to database %s", connstring)
65
66 runDB=indirectOpen(connstring)
67 if (runDB is None):
68 mlog_LRF.error("Cannot connect to database %s",connstring)
69 raise RuntimeError("getLArFormatForRun ERROR: Cannot connect to database %s",connstring)
70 format=None
71 nSamples=None
72 gainType=None
73 runType=None
74 latency=None
75 firstSample=None
76 try:
77 folder=runDB.getFolder('/LAR/Configuration/RunLog')
78 runiov=run << 32
79 obj=folder.findObject(runiov,0)
80 payload=obj.payload()
81 format=payload['format']
82 nSamples=ord(payload['nbOfSamples'])
83 gainType=payload['gainType']
84 runType=payload['runType']
85 latency=ord(payload['l1aLatency'])
86 firstSample=ord(payload['firstSample'])
87 except Exception:
88 mlog_LRF.warning("No information in /LAR/Configuration/RunLog for run %i", run)
89 #mlog_LRF.warning(e)
90 return None
91 runDB.closeDatabase()
92 return LArRunInfo(nSamples,gainType,latency,firstSample,format,runType)
93
95 "Wrapper class to hold LAr DT run configuration information"
96 def __init__(self,streamTypes, streamLengths, streamTypesPEB, streamLengthsPEB, timing, adccalib, fw):
97 self._sTypes = streamTypes
98 self._sLengths = streamLengths
99 self._sTypesPEB = streamTypesPEB
100 self._sLengthsPEB = streamLengthsPEB
101 self._tim = timing
102 self._adcc = adccalib
103 self._fwversion = fw
104
105 def streamTypes(self):
106 return self._sTypes
107
108 def streamLengths(self):
109 return self._sLengths
110
111 def streamTypesPEB(self):
112 return self._sTypesPEB
113
115 return self._sLengthsPEB
116
117 def timing(self):
118 return self._tim
119
120 def ADCCalib(self):
121 return self._adcc
122
123 def FWversion(self):
124 return self._fwversion
125
126def parse_recipe(recipe,mux,mlog):
127 # parse recipe string of the type at0_bcX-at1_bcY...
128 typesMap={0:"ADC", 1:"RawADC", 2:"Energy", 3:"SelectedEnergy",15:"Invalid"}
129 sTypes=[]
130 sLengths=[]
131 for s,m in ["at0_bc",0],["at1_bc",1]:
132 pos=recipe.find(s)
133 if pos >=0:
134 n=-1
135 try:
136 n=int(recipe[pos+6:pos+8])
137 except Exception:
138 try:
139 n=int(recipe[pos+6:pos+7])
140 except Exception:
141 mlog.warning("could not decode %s",recipe[pos+6:])
142 if n>=0:
143 sLengths.append(n)
144 if mux[m] in typesMap.keys():
145 sTypes.append(typesMap[mux[m]])
146 else:
147 sTypes.append(15)
148 pass
149 pass
150 return (sTypes,sLengths)
151
152@cache
153def getLArDTInfoForRun(run,quiet=False,connstring="COOLONL_LAR/CONDBR2"):
154 from AthenaCommon.Logging import logging
155 mlog_LRF = logging.getLogger( 'getLArDTRunInfoForRun' )
156 mlog_LRF.info("Connecting to database %s", connstring)
157
158 runDB=indirectOpen(connstring)
159 if (runDB is None):
160 mlog_LRF.error("Cannot connect to database %s",connstring)
161 raise RuntimeError("getLArFormatForRun ERROR: Cannot connect to database %s",connstring)
162
163 timing="LAR"
164 adccalib=0
165 mux=[]
166 fw=0
167 try:
168 folder=runDB.getFolder('/LAR/Configuration/RunLogDT')
169 runiov=run << 32
170 obj=folder.findObject(runiov,0)
171 payload=obj.payload()
172 timing=payload['timing_configuration']
173 recipe=payload['recipe_tdaq_A']
174 recipePEB=payload['recipe_tdaq_B']
175 mux.append(ord(payload['mux_setting_0_tdaq']))
176 mux.append(ord(payload['mux_setting_1_tdaq']))
177 adccalib=ord(payload['ADCCalibMode'])
178 if run > 493743: # hardcoded, first run when this info was filled
179 fw=ord(payload['ttype_mask_A'])
180 except Exception:
181 mlog_LRF.warning("No information in /LAR/Configuration/RunLogDT for run %i", run)
182 mlog_LRF.warning("Using defaults: MUX0: ADC MUX1: ET_ID receipe: at0_bc5-at1_bc1_ts1-q")
183 recipe="at0_bc5-at1_bc1_ts1-q"
184 recipePEB=''
185 mux.append(0)
186 mux.append(3)
187
188 runDB.closeDatabase()
189 sTypes, sLengths = parse_recipe(recipe,mux,mlog_LRF)
190 sTypesPEB, sLengthsPEB = parse_recipe(recipePEB,mux,mlog_LRF)
191 return LArDTRunInfo(sTypes, sLengths, sTypesPEB, sLengthsPEB, timing, adccalib, fw)
192
193# command line driver for convenience
194if __name__=='__main__':
195 import sys
196 if len(sys.argv)!=2:
197 print("Syntax",sys.argv[0],'<run>')
198 sys.exit(-1)
199 run=int(sys.argv[1])
200 myformat=getLArFormatForRun(run, connstring="COOLONL_LAR/CONDBR2")
201 if (myformat is not None):
202 print(" LAr run configuration: Nsamples:%d GainType:%d Latency:%d FirstSample:%d Format:%s runType:%s" % (myformat.nSamples(),myformat.gainType(),myformat.latency(),myformat.firstSample(),myformat.stringFormat(),myformat.stringRunType()))
203 else:
204 print(" LAr run information not available")
205
206 myformat1=getLArDTInfoForRun(run, connstring="COOLONL_LAR/CONDBR2")
207 if (myformat1 is not None):
208 print(" LAr DT run configuration: timing:%s adccalib:%d" % (myformat1.timing(),myformat1.ADCCalib()))
209 for i in range(0,len(myformat1.streamTypes())):
210 print(" stream: %s size: %d" % (myformat1.streamTypes()[i], myformat1.streamLengths()[i]))
211 else:
212 print(" LAr DT run information not available")
void print(char *figname, TCanvas *c1)
__init__(self, streamTypes, streamLengths, streamTypesPEB, streamLengthsPEB, timing, adccalib, fw)
__init__(self, nSamples, gainType, latency, firstSample, format, runType)
parse_recipe(recipe, mux, mlog)
getLArFormatForRun(run, quiet=False, connstring="COOLONL_LAR/CONDBR2")
getLArDTInfoForRun(run, quiet=False, connstring="COOLONL_LAR/CONDBR2")