ATLAS Offline Software
Loading...
Searching...
No Matches
LArOFFCChannelBuilder.py
Go to the documentation of this file.
1# Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
2from AthenaCommon.Logging import logging
3from AthenaConfiguration.ComponentFactory import CompFactory
4from AthenaConfiguration.Enums import LHCPeriod, ProductionStep
5from LArRecUtils.LArADC2MeVCondAlgConfig import LArADC2MeVCondAlgCfg
6from LArConfiguration.LArElecCalibDBConfig import LArElecCalibDBCfg
7from LArRecUtils.LArRecUtilsConfig import LArOFCCondAlgCfg
8from LArConfiguration.LArConfigFlags import RawChannelSource
9
10
11def LArOFFCRawChannelBuilderCfg(flags, name="LArOFFCRawChannelBuilder", **kwargs):
12
13 acc = LArADC2MeVCondAlgCfg(flags)
14
15 # Index of the digit sample the OFC window starts at, same convention as
16 # the other raw channel builders
17 kwargs.setdefault(
18 "firstSample",
19 (
20 flags.LAr.ROD.nPreceedingSamples
21 if flags.LAr.ROD.nPreceedingSamples != 0
22 else flags.LAr.ROD.FirstSample
23 ),
24 )
25 obj = "AthenaAttributeList"
26 dspkey = "Run2DSPThresholdsKey"
27 from IOVDbSvc.IOVDbSvcConfig import addFolders
28
29 kwargs.setdefault("ShapeKey", "LArShapeSym")
30
31 if flags.Input.isMC:
32 acc.merge(LArOFCCondAlgCfg(flags))
33 kwargs.setdefault("LArRawChannelKey", "LArRawChannels")
34
35 if flags.GeoModel.Run is LHCPeriod.Run1: # back to flat threshold
36 kwargs.setdefault("useDB", False)
37 dspkey = ""
38 else:
39 fld = "/LAR/NoiseOfl/DSPThresholds"
40 sgkey = fld
41 dbString = "OFLP200"
42 dbInstance = "LAR_OFL"
43 acc.merge(
44 addFolders(flags, fld, dbInstance, className=obj, db=dbString)
45 )
46
47 if flags.LAr.ROD.ApplyRODBCIDCorr:
48 # Read the digits produced by LArRODBCIDCorrAlg instead of the raw ones
49 mlog = logging.getLogger("LArOFFCRawChannelBuilderCfg")
50 mlog.info("LAr.ROD.ApplyRODBCIDCorr is set: reading pile-up "
51 "corrected digits LArDigitContainer_PileupCorrected")
52 kwargs.setdefault("LArDigitKey", "LArDigitContainer_PileupCorrected")
53 elif flags.Common.ProductionStep is ProductionStep.PileUpPresampling:
54 kwargs.setdefault(
55 "LArDigitKey", flags.Overlay.BkgPrefix + "LArDigitContainer_MC"
56 )
57 else:
58 kwargs.setdefault("LArDigitKey", "LArDigitContainer_MC")
59
60 else:
61 acc.merge(LArElecCalibDBCfg(flags, ("OFC", "Shape", "Pedestal")))
62 if flags.Overlay.DataOverlay:
63 kwargs.setdefault("LArDigitKey", "LArDigitContainer_MC")
64 kwargs.setdefault("LArRawChannelKey", "LArRawChannels")
65 else:
66 kwargs.setdefault("LArRawChannelKey", "LArRawChannels_FromDigits")
67
68 if "COMP200" in flags.IOVDb.DatabaseInstance:
69 fld = "/LAR/Configuration/DSPThreshold/Thresholds"
70 obj = "LArDSPThresholdsComplete"
71 dspkey = "Run1DSPThresholdsKey"
72 sgkey = "LArDSPThresholds"
73 dbString = "COMP200"
74 else:
75 fld = "/LAR/Configuration/DSPThresholdFlat/Thresholds"
76 sgkey = fld
77 dbString = "CONDBR2"
78 dbInstance = "LAR_ONL"
79 acc.merge(addFolders(flags, fld, dbInstance, className=obj, db=dbString))
80
81 # Run 1 MC falls back to a flat threshold and sets no folder at all
82 if len(dspkey) > 0:
83 kwargs.setdefault(dspkey, sgkey)
84
85 if (
86 flags.LAr.ROD.forceIter
87 or flags.LAr.RawChannelSource is RawChannelSource.Calculated
88 ):
89 # Iterative OFC procedure. There is no OFFC variant of it, so this
90 # falls back to the standard iterative builder and none of the OFFC
91 # properties below may be set here: it declares none of them.
92 kwargs.setdefault("minSample", 2)
93 kwargs.setdefault("maxSample", 12)
94 kwargs.setdefault("minADCforIterInSigma", 4)
95 kwargs.setdefault("minADCforIter", 15)
96 kwargs.setdefault("defaultPhase", 12)
97 nominalPeakSample = 2
98 from LArConditionsCommon.LArRunFormat import getLArFormatForRun
99
100 larformat = getLArFormatForRun(
101 flags.Input.RunNumbers[0],
102 connstring="COOLONL_LAR/" + flags.IOVDb.DatabaseInstance,
103 )
104 if larformat is not None:
105 nominalPeakSample = larformat.firstSample()
106 else:
107 print("WARNING: larformat not found, use nominalPeakSample = 2")
108 nominalPeakSample = 2
109 if nominalPeakSample > 1:
110 kwargs.setdefault("DefaultShiftTimeSample", nominalPeakSample - 2)
111 else:
112 kwargs.setdefault("DefaultShiftTimeSample", 0)
113
114 acc.addEventAlgo(CompFactory.LArRawChannelBuilderIterAlg(**kwargs))
115 else:
116 # Default OFFC Configuration
117 kwargs.setdefault("BelowThreshold", flags.LAr.ROD.OFFCBelowThreshold)
118 kwargs.setdefault("BelowTillReset", flags.LAr.ROD.OFFCBelowTillReset)
119 kwargs.setdefault("NPulse", flags.LAr.ROD.OFFCNPulse)
120 kwargs.setdefault("Q3Cut", flags.LAr.ROD.OFFCQ3Cut)
121 kwargs.setdefault("Q3Offset", flags.LAr.ROD.OFFCQ3Offset)
122 kwargs.setdefault("FilterThreshold", flags.LAr.ROD.OFFCFilterThreshold)
123 # Per-layer tuning. The scalars above stay the fallback for any layer
124 # not named in these maps, so a job that clears them behaves exactly
125 # as it did before.
126 kwargs.setdefault("FilterThresholdByLayer",
127 flags.LAr.ROD.OFFCFilterThresholdByLayer)
128 kwargs.setdefault("Q3CutByLayer", flags.LAr.ROD.OFFCQ3CutByLayer)
129 kwargs.setdefault("Q3OffsetByLayer", flags.LAr.ROD.OFFCQ3OffsetByLayer)
130 kwargs.setdefault("NPulseByLayer", flags.LAr.ROD.OFFCNPulseByLayer)
131 kwargs.setdefault("EnabledLayers", flags.LAr.ROD.OFFCEnabledLayers)
132
133 acc.addEventAlgo(CompFactory.LArOFFCRawChannelBuilder(name, **kwargs))
134
135 return acc
136
137
138if __name__ == "__main__":
139
140 from AthenaConfiguration.AllConfigFlags import initConfigFlags
141 from AthenaCommon.Logging import log
142 from AthenaCommon.Constants import DEBUG
143
144 log.setLevel(DEBUG)
145
146 from AthenaConfiguration.TestDefaults import defaultConditionsTags, defaultGeometryTags, defaultTestFiles
147
148 flags = initConfigFlags()
149 flags.Input.Files = defaultTestFiles.RAW_RUN2
150 flags.GeoModel.AtlasVersion = defaultGeometryTags.RUN2
151 flags.IOVDb.GlobalTag = defaultConditionsTags.RUN2_DATA
152 # in case of testing iterative OFC:
153 #flags.Input.Files = ['/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/RecJobTransformTests/data15_1beam/data15_1beam.00260466.physics_L1Calo.merge.RAW._lb1380._SFO-ALL._0001.1']
154 flags.Input.isMC = False
155 flags.Detector.GeometryTile = False
156 flags.lock()
157
158 from AthenaConfiguration.MainServicesConfig import MainServicesCfg
159 from LArByteStream.LArRawDataReadingConfig import LArRawDataReadingCfg
160
161 acc = MainServicesCfg(flags)
162 acc.merge(LArRawDataReadingCfg(flags))
163 acc.merge(LArOFFCRawChannelBuilderCfg(flags))
164
165 DumpLArRawChannels = CompFactory.DumpLArRawChannels
166 acc.addEventAlgo(
168 LArRawChannelContainerName="LArRawChannels_FromDigits",
169 ),
170 sequenceName="AthAlgSeq",
171 )
172
173 acc.run(3)
void print(char *figname, TCanvas *c1)
LArOFFCRawChannelBuilderCfg(flags, name="LArOFFCRawChannelBuilder", **kwargs)