9 from AthenaConfiguration.ComponentFactory
import CompFactory
14 selStr[
"passDigiNom"] =
"for unmasked SCs with ADC_max-pedestal > 10*RMS(DB) & good quality bits"
15 selStr[
"badNotMasked"] =
"for unmasked SCs which have bad quality bits"
17 selStr[
"passSCNom"] =
"for unmasked SCs which pass #tau selection with non-zero ET"
18 selStr[
"passSCNom1"] =
"for unmasked SCs which pass #tau selection with ET > 1 GeV"
19 selStr[
"passSCNom10"] =
"for unmasked SCs which pass tau selection with ET > 10 GeV"
20 selStr[
"passSCNom10tauGt3"] =
"for unmasked SCs which pass tau selection with ET > 10 GeV and #tau > 3"
21 selStr[
"saturNotMasked"] =
"for unmasked SCs which are saturated"
22 selStr[
"OFCbOFNotMasked"] =
"for unmasked SCs with OFCb in overflow"
23 selStr[
"onlofflEmismatch"] =
"for unmasked SCs which pass #tau selection where online & offline energies are different"
25 selStr[
"notMaskedEoflNe0"] =
"for unmasked SCs with non-zero ET ofl"
26 selStr[
"notMaskedEoflGt1"] =
"for unmasked SCs with ET ofl > 1 GeV"
31 '''Function to configures some algorithms in the monitoring system.'''
35 from AthenaMonitoring.AthMonitorCfgHelper
import AthMonitorCfgHelper
36 helper = AthMonitorCfgHelper(flags,
'LArDigitalTriggMonAlgCfg')
38 from LArMonitoring.GlobalVariables
import lArDQGlobals
40 from AthenaCommon.Logging
import logging
41 mlog = logging.getLogger(
'LArDigitalTriggMon' )
43 if not flags.DQ.enableLumiAccess:
44 from LumiBlockComps.LuminosityCondAlgConfig
import LuminosityCondAlgCfg
48 from LArCabling.LArCablingConfig
import LArOnOffIdMappingSCCfg
52 from LArConfiguration.LArElecCalibDBConfig
import LArElecCalibDBSCCfg
53 helper.resobj.merge(
LArElecCalibDBSCCfg(flags, condObjs=[
"Ramp",
"DAC2uA",
"Pedestal",
"uA2MeV",
"MphysOverMcal",
"OFC",
"Shape",
"HVScaleCorr"]))
57 larDigitalTriggMonAlg = helper.addAlgorithm(CompFactory.LArDigitalTriggMonAlg(
'larDigitalTriggMonAlg'))
58 larDigitalTriggMonAlg.ProblemsToMask=[
"maskedOSUM"]
64 for i
in range(0,len(streamTypes)):
65 mlog.info(
"runinfo.streamTypes()[i]: "+
str(streamTypes[i]))
66 if streamTypes[i] ==
"SelectedEnergy":
68 larDigitalTriggMonAlg.LArRawSCContainerKey =
"SC_ET_ID"
69 if streamTypes[i] ==
"Energy":
71 larDigitalTriggMonAlg.LArRawSCContainerKey =
"SC_ET"
72 if streamTypes[i] ==
"RawADC":
74 larLATOMEBuilderAlg.LArDigitKey =
"SC"
75 larLATOMEBuilderAlg.isADCBas =
False
76 larDigitalTriggMonAlg.LArDigitContainerKey =
"SC"
77 if streamTypes[i] ==
"ADC":
79 larDigitalTriggMonAlg.isADCBas =
True
80 larDigitalTriggMonAlg.LArDigitContainerKey =
"SC_ADC_BAS"
81 larLATOMEBuilderAlg.isADCBas =
True
82 larLATOMEBuilderAlg.LArDigitKey =
"SC_ADC_BAS"
84 if (hasEtId
and hasEt):
88 if (hasAdc
and hasAdcBas):
90 larDigitalTriggMonAlg.isADCBas=
False
92 mlog.info(
"Mux settings from COOL:")
93 mlog.info(
"has ET Id: "+
str(hasEtId))
94 mlog.info(
"has ET: "+
str(hasEt))
95 mlog.info(
"has ADC: "+
str(hasAdc))
96 mlog.info(
"has ADC Bas: "+
str(hasAdcBas))
99 larDigitalTriggMonAlg.SCMonGroup=SCGroupName
103 SCGroup = helper.addGroup(
104 larDigitalTriggMonAlg,
106 '/LArDigitalTrigger/',
112 LatomeDetBinMapping = dict([
113 (
"0x48",{
"Subdet":
"FCALC",
"Bin":1}),
114 (
"0x4c",{
"Subdet":
"EMEC/HECC",
"Bin":3}),
115 (
"0x44",{
"Subdet":
"EMECC",
"Bin":11}),
116 (
"0x4a",{
"Subdet":
"EMB/EMECC",
"Bin":27}),
117 (
"0x42",{
"Subdet":
"EMBC",
"Bin":43}),
118 (
"0x41",{
"Subdet":
"EMBA",
"Bin":59}),
119 (
"0x49",{
"Subdet":
"EMB/EMECA",
"Bin":75}),
120 (
"0x43",{
"Subdet":
"EMECA",
"Bin":91}),
121 (
"0x4b",{
"Subdet":
"EMEC/HECA",
"Bin":107}),
122 (
"0x47",{
"Subdet":
"FCALA",
"Bin":115})
131 for bb
in range (0,NLatomeBins):
133 for detID
in LatomeDetBinMapping:
134 if bb==(LatomeDetBinMapping[detID][
"Bin"]-1):
135 Label=LatomeDetBinMapping[detID][
"Subdet"]
138 if bb < NLatomeBins_side:
139 BinLabel_LATOME_C+=[Label+
str(phi)]
141 BinLabel_LATOME_A+=[Label+
str(phi)]
143 BinLabel_LATOME+=[Label+
str(phi)]
149 iphi_bins_dict = {
"ALL": 63,
"EMB": 63,
"EMEC": 63,
"HEC": 63,
"FCAL": 15}
154 SCGroup.defineHistogram(
'lumi_block,event_size;EventSize_vs_LB',
155 title=
'Digital trigger event size per LB; LumiBlock; Event size [MB]',
158 xbins=lArDQGlobals.LB_Bins, xmin=lArDQGlobals.LB_Min, xmax=lArDQGlobals.LB_Max)
163 partGroup_digi = helper.addArray([larDigitalTriggMonAlg.LayerNames], larDigitalTriggMonAlg,
'LArDigitalTriggerMon_digi', topPath=
'/LArDigitalTrigger/')
164 partGroup_sc = helper.addArray([larDigitalTriggMonAlg.LayerNames], larDigitalTriggMonAlg,
'LArDigitalTriggerMon_sc', topPath=
'/LArDigitalTrigger/')
166 for part
in larDigitalTriggMonAlg.LayerNames:
168 for sel
in selStr.keys():
169 selStrPart[sel] =
"in "+part+
" "+selStr[sel]
171 for key
in iphi_bins_dict.keys():
172 if part.startswith(key):
173 iphi_bins = iphi_bins_dict[key]
176 partxbins=lArDQGlobals.SuperCell_Variables[
"etaRange"][
"All"][
"All"]
177 partybins=lArDQGlobals.SuperCell_Variables[
"phiRange"][
"All"][
"All"]
180 topPath=
"PerPartition/"
188 partxbins=lArDQGlobals.SuperCell_Variables[
"etaRange"][Part][Side][Sampling]
189 partybins=lArDQGlobals.SuperCell_Variables[
"phiRange"][Part][Side][Sampling]
194 for thisSel
in [
"passDigiNom",
"badNotMasked"]:
195 thisTopPath=f
"/{thisSel}/{topPath}"
198 partGroup_digi.defineHistogram(
'Digi_part_maxpos,Digi_part_partition;Partition_vs_maxSamplePosition_'+thisSel,
199 title=
'Partition vs. position of max sample '+selStrPart[thisSel],
200 cutmask=
'Digi_part_'+thisSel,
203 xbins=nsamples,xmin=0.5,xmax=nsamples+0.5,
204 ybins=lArDQGlobals.N_Partitions, ymin=-0.5, ymax=lArDQGlobals.N_Partitions-0.5,
205 xlabels = [
str(x)
for x
in range(1,nsamples+1)],
206 ylabels=lArDQGlobals.Partitions,
209 partGroup_digi.defineHistogram(
'Digi_part_latomesourceidbin,Digi_part_adc;ADCFullRange_vs_LATOME_'+thisSel,
210 title=
'ADC vs LATOME name '+selStrPart[thisSel]+
'; ; ADC',
211 cutmask=
'Digi_part_'+thisSel,
214 xbins=NLatomeBins,xmin=1,xmax=NLatomeBins+1,
215 ybins=500, ymin=-2, ymax=2500,
216 xlabels=BinLabel_LATOME,
219 partGroup_digi.defineHistogram(
'Digi_part_latomesourceidbin,Digi_part_pedestal;Pedestal_vs_LATOME_'+thisSel,
220 title=
'Pedestal vs LATOME name '+selStrPart[thisSel]+
'; ; Pedestal',
221 cutmask=
'Digi_part_'+thisSel,
224 xbins=NLatomeBins,xmin=1,xmax=NLatomeBins+1,
225 ybins=500, ymin=-2, ymax=2500,
226 xlabels=BinLabel_LATOME,
229 partGroup_digi.defineHistogram(
'Digi_part_latomesourceidbin,Digi_part_maxpos;MaxSamplePosition_vs_LATOME_'+thisSel,
230 title=
'Position of max sample vs. LATOME '+selStrPart[thisSel],
232 cutmask=
'Digi_part_'+thisSel,
234 xbins=NLatomeBins,xmin=1,xmax=NLatomeBins+1,
235 ybins=nsamples,ymin=0.5,ymax=nsamples+0.5,
236 xlabels=BinLabel_LATOME,
237 ylabels = [
str(x)
for x
in range(1,nsamples+1)],
240 partGroup_digi.defineHistogram(
'Digi_part_latomesourceidbin,Digi_part_diff_adc0_ped;Diff_ADC0_Ped_vs_LATOME_'+thisSel,
241 title=
'ADC[0] - Pedestal vs LATOME name '+selStrPart[thisSel]+
'; ; ADC[0] - Pedestal',
243 cutmask=
'Digi_part_'+thisSel,
245 xbins=NLatomeBins,xmin=1,xmax=NLatomeBins+1,
246 ybins=64, ymin=-32, ymax=32,
247 xlabels=BinLabel_LATOME,
250 partGroup_digi.defineHistogram(
'Digi_part_latomesourceidbin,Digi_part_diff_adc_ped_norm;Diff_ADC_Ped_Norm_vs_LATOME_'+thisSel,
251 title=
'(ADC-ped)/fabs(ADC_max-ped) '+selStrPart[thisSel]+
'; LATOME Name; (ADC - pedestal) / fabs(ADC_max - pedestal)',
253 cutmask=
'Digi_part_'+thisSel,
255 xbins=NLatomeBins,xmin=1,xmax=NLatomeBins+1,
256 ybins=64, ymin=-32, ymax=32,
257 xlabels=BinLabel_LATOME,
262 partGroup_digi.defineHistogram(
'Digi_part_eta,Digi_part_phi;Coverage_Eta_Phi_'+thisSel,
263 title=
'SC coverage '+selStrPart[thisSel]+
': #phi vs #eta;#eta;#phi',
265 path=thisTopPath+
'/Coverage',
266 cutmask=
'Digi_part_'+thisSel,
272 if not flags.Common.isOnline:
continue
274 if thisSel !=
"passDigiNom":
continue
275 partGroup_digi.defineHistogram(
'Digi_part_eta,Digi_part_phi,Digi_part_diff_adc0_ped;Coverage_Diff_ADC0_Ped_'+thisSel,
276 title=
'ADC[0] - Pedestal'+selStrPart[thisSel]+
': #phi vs #eta;#eta;#phi',
278 cutmask=
'Digi_part_'+thisSel,
279 path=thisTopPath+
'/Coverage',
286 partGroup_digi.defineHistogram(
'Digi_part_BCID,Digi_part_iphi,Digi_part_diff_adc_ped;Diff_ADC_Ped_Per_BCID_Per_iphi_'+thisSel,
287 title=
'ADC - Pedestal (all samples) '+selStrPart[thisSel]+
': iphi vs BCID;BCID;iphi',
289 cutmask=
'Digi_part_'+thisSel,
291 xbins=3564,xmin=-0.5,xmax=3563.5,
292 ybins=iphi_bins+1,ymin=0,ymax=iphi_bins+1,
300 partGroup_digi.defineHistogram(
'Digi_part_sampos,Digi_part_adc;ADCZoom_vs_SamplePosition_'+thisSel,
301 title=
'ADC (zoom) vs sample position '+selStrPart[thisSel],
302 cutmask=
'Digi_part_'+thisSel,
305 xbins=nsamples,xmin=0.5,xmax=nsamples+0.5,
306 xlabels = [
str(x)
for x
in range(1,nsamples+1)],
307 ybins=750, ymin=0, ymax=1300,
310 partGroup_digi.defineHistogram(
'Digi_part_sampos,Digi_part_adc;ADCFullRange_vs_SamplePosition_'+thisSel,
311 title=
'ADC vs sample position '+selStrPart[thisSel],
312 cutmask=
'Digi_part_'+thisSel,
315 xbins=nsamples,xmin=0.5,xmax=nsamples+0.5,
316 xlabels = [
str(x)
for x
in range(1,nsamples+1)],
317 ybins=500, ymin=0, ymax=5000,
320 partGroup_digi.defineHistogram(
'Digi_part_sampos,Digi_part_pedestal;Pedestal_vs_SamplePosition_'+thisSel,
321 title=
'Pedestal vs sample position '+selStrPart[thisSel],
322 cutmask=
'Digi_part_'+thisSel,
325 xbins=nsamples,xmin=0.5,xmax=nsamples+0.5,
326 xlabels = [
str(x)
for x
in range(1,nsamples+1)],
327 ybins=500, ymin=0, ymax=5000,
330 partGroup_digi.defineHistogram(
'Digi_part_diff_adc0_ped;Diff_ADC0_Ped_'+thisSel,
331 title=
'LATOME (ADC[0]-ped) '+selStrPart[thisSel]+
'; (ADC - pedestal)',
333 cutmask=
'Digi_part_'+thisSel,
335 xbins=50,xmin=-25,xmax=25,
338 partGroup_digi.defineHistogram(
'Digi_part_sampos,Digi_part_diff_adc_ped_norm;Diff_ADC_Ped_Norm_vs_SamplePosition_'+thisSel,
339 title=
'(ADC-ped)/fabs(ADC_max-ped) '+selStrPart[thisSel]+
'; Sample position; (ADC - pedestal) / fabs(ADC_max - pedestal)',
341 cutmask=
'Digi_part_'+thisSel,
343 ybins=40,ymin=-1,ymax=1,
344 xbins=nsamples,xmin=0.5,xmax=nsamples+0.5,
345 xlabels = [
str(x)
for x
in range(1,nsamples+1)],
348 partGroup_digi.defineHistogram(
'Digi_part_BCID, Digi_part_adc;ADC_vs_BCID_'+thisSel,
349 title=
'ADC value vs BCID '+selStrPart[thisSel]+
'; BCID; ADC Value',
351 cutmask=
'Digi_part_'+thisSel,
353 xbins=3564,xmin=-0.5,xmax=3563.5,
354 ybins=500, ymin=0, ymax=5000,
357 partGroup_digi.defineHistogram(
'Digi_part_BCID, Digi_part_diff_adc0_ped;Diff_ADC0_Ped_vs_BCID_'+thisSel,
358 title=
'ADC[0] - Ped value vs BCID '+selStrPart[thisSel]+
'; BCID; ADC[0] Value',
360 cutmask=
'Digi_part_'+thisSel,
362 xbins=3564,xmin=-0.5,xmax=3563.5,
363 ybins=500, ymin=-5, ymax=5,
369 for thisSel
in [
"passSCNom",
"passSCNom1",
"passSCNom10",
"passSCNom10tauGt3",
"saturNotMasked",
"OFCbOFNotMasked",
"onlofflEmismatch",
"notMaskedEoflNe0",
"notMaskedEoflGt1"]:
370 thisTopPath=f
"/{thisSel}/{topPath}"
373 partGroup_sc.defineHistogram(
'SC_part_latomesourceidbin,SC_part_et_onl;SC_ET_Onl_vs_LATOME_'+thisSel,
374 title=
'SC ET [GeV] vs LATOME name '+selStrPart[thisSel]+
'; ; ET SC [GeV]',
376 cutmask=
'SC_part_'+thisSel,
378 xbins=NLatomeBins,xmin=1,xmax=NLatomeBins+1,
379 ybins=200, ymin=-10, ymax=200,
380 xlabels=BinLabel_LATOME,
384 partGroup_sc.defineHistogram(
'SC_part_LB,SC_part_latomesourceidbin;LB_vs_LATOME_'+thisSel,
385 title=
'LATOME name vs LB '+selStrPart[thisSel]+
';LB;LATOME',
387 cutmask=
'SC_part_'+thisSel,
389 xbins=lArDQGlobals.LB_Bins, xmin=lArDQGlobals.LB_Min, xmax=lArDQGlobals.LB_Max,
390 ybins=NLatomeBins,ymin=1,ymax=NLatomeBins+1,
391 ylabels=BinLabel_LATOME,
394 partGroup_sc.defineHistogram(
'SC_part_time,SC_part_et_ofl;time_vs_et_ofl_'+thisSel,
395 title=
'SC coverage '+selStrPart[thisSel]+
': #tau vs ET ofl;#tau;ET ofl',
397 cutmask=
'SC_part_'+thisSel,
399 xbins=500,xmin=-50,xmax=50,
400 ybins=500,ymin=-10,ymax=70,
404 partGroup_sc.defineHistogram(
'SC_part_latomesourceidbin,SC_part_time;MeanOfflineLATOMEtime_vs_LATOME_'+thisSel,
405 title=
'Average LATOME #tau from Offline computation per LATOME'+selStrPart[thisSel]+
'; LATOME ; #tau [ns]',
407 cutmask=
'SC_part_'+thisSel,
409 xbins=NLatomeBins,xmin=1,xmax=NLatomeBins+1,
410 ybins=200, ymin=-50, ymax=50,
411 xlabels=BinLabel_LATOME,
414 partGroup_sc.defineHistogram(
'SC_part_LB,SC_part_latomesourceidbin,SC_part_time;MeanOfflineLATOMEtime_perLB_perLATOME_'+thisSel,
415 title=
'SC #tau '+selStrPart[thisSel]+
': LATOME vs LB;LB;LATOME',
417 cutmask=
'SC_part_'+thisSel,
419 xbins=lArDQGlobals.LB_Bins, xmin=lArDQGlobals.LB_Min, xmax=lArDQGlobals.LB_Max,
420 ybins=NLatomeBins,ymin=1,ymax=NLatomeBins+1,
421 ylabels=BinLabel_LATOME,
424 partGroup_sc.defineHistogram(
'SC_part_LB,SC_part_time;MeanOfflineLATOMEtime_vs_LB_'+thisSel,
425 title=
'Average LATOME #tau from Offline computation per LB '+selStrPart[thisSel]+
'; LumiBloc; #tau [ns]',
427 cutmask=
'SC_part_'+thisSel,
429 xbins=lArDQGlobals.LB_Bins, xmin=lArDQGlobals.LB_Min, xmax=lArDQGlobals.LB_Max,
435 partGroup_sc.defineHistogram(
'SC_part_eta,SC_part_phi;Coverage_Eta_Phi_'+thisSel,
436 title=
'SC coverage '+selStrPart[thisSel]+
': #phi vs #eta;#eta;#phi',
438 cutmask=
'SC_part_'+thisSel,
439 path=thisTopPath+
'/Coverage',
445 partGroup_sc.defineHistogram(
'SC_part_time;OfflineLATOMEtime_'+thisSel,
446 title=
'LATOME #tau from Offline Computation '+selStrPart[thisSel]+
';#tau [ns]; Evts;',
448 cutmask=
'SC_part_'+thisSel,
450 xbins=100,xmin=-25,xmax=25,
454 if not flags.Common.isOnline:
continue
456 if thisSel !=
"passSCNom":
continue
458 partGroup_sc.defineHistogram(
'SC_part_eta,SC_part_phi,SC_part_et_onl;Coverage_Et_Onl_'+thisSel,
459 title=
'SC Energy '+selStrPart[thisSel]+
': #phi vs #eta;#eta;#phi',
461 cutmask=
'SC_part_'+thisSel,
462 path=thisTopPath+
'/Coverage',
467 partGroup_sc.defineHistogram(
'SC_part_eta,SC_part_phi,SC_part_time;Coverage_OfflineLATOMEtime_'+thisSel,
468 title=
'LATOME #tau from Offline Computation '+selStrPart[thisSel]+
': #phi vs #eta;#eta;#phi',
470 cutmask=
'SC_part_'+thisSel,
471 path=thisTopPath+
'/Coverage',
476 partGroup_sc.defineHistogram(
'SC_part_et_onl,SC_part_et_ofl;ET_Ofl_vs_ET_Onl_'+thisSel,
477 title=
'LATOME ET vs Offline Computation '+selStrPart[thisSel]+
'; ET Onl;ET Offl [GeV]',
479 cutmask=
'SC_part_'+thisSel,
481 xbins=0,xmin=0,xmax=20,
482 ybins=0,ymin=0,ymax=20,
485 partGroup_sc.defineHistogram(
'SC_part_et_diff;ET_Diff_OnlOfl_'+thisSel,
486 title=
'LATOME ET vs Offline Computation '+selStrPart[thisSel]+
'; ET Onl - ET Offl [GeV]; Evts;',
488 cutmask=
'SC_part_'+thisSel,
490 xbins=200,xmin=-10,xmax=10,
494 partGroup_sc.defineHistogram(
'SC_part_et_onl;SC_ET_Onl_'+thisSel,
495 title=
'SC eT [GeV] '+selStrPart[thisSel],
497 cutmask=
'SC_part_'+thisSel,
499 xbins=500, xmin=-100, xmax=400,
503 partGroup_sc.defineHistogram(
'SC_part_BCID,SC_part_time;MeanOfflineLATOMEtime_vs_BCID_'+thisSel,
504 title=
'Average LATOME #tau from Offline computation per BCID '+selStrPart[thisSel]+
'; BCID; #tau [ns]',
506 cutmask=
'SC_part_'+thisSel,
508 xbins=3564,xmin=-0.5,xmax=3563.5,
511 partGroup_sc.defineHistogram(
'SC_part_BCID,SC_part_et_onl_muscaled;AvEnergyVsBCID_'+thisSel,
512 title=
'Average Energy vs BCID '+selStrPart[thisSel]+
'; BCID; Energy per SC [MeV]',
514 cutmask=
'SC_part_'+thisSel,
516 xbins=3564,xmin=-0.5,xmax=3563.5,
517 ybins=10, ymin=-20, ymax=20,
521 return helper.result()
524 if __name__==
'__main__':
526 from AthenaConfiguration.AllConfigFlags
import initConfigFlags
527 from AthenaConfiguration.TestDefaults
import defaultGeometryTags
530 from AthenaConfiguration.Enums
import LHCPeriod
531 flags.GeoModel.Run = LHCPeriod.Run3
533 flags.Input.Files = [
"/eos/atlas/atlascerngroupdisk/proj-spot/spot-job-inputs/data23_13p6TeV/data23_13p6TeV.00451569.physics_Main.daq.RAW._lb0260._SFO-14._0001.data"]
535 flags.Output.HISTFileName =
'LArDigitalTriggMonOutput.root'
537 flags.DQ.useTrigger =
False
538 flags.GeoModel.AtlasVersion=defaultGeometryTags.RUN3
539 flags.PerfMon.doFullMonMT=
True
540 flags.Exec.MaxEvents=100
544 from AthenaConfiguration.MainServicesConfig
import MainServicesCfg
548 from CaloRec.CaloRecoConfig
import CaloRecoCfg
551 from LArBadChannelTool.LArBadChannelConfig
import LArBadChannelCfg
554 from LArByteStream.LArRawSCDataReadingConfig
import LArRawSCDataReadingCfg
557 cfg.merge(SCData_acc)
559 larLATOMEBuilderAlg=CompFactory.LArLATOMEBuilderAlg(
"LArLATOMEBuilderAlg",LArDigitKey=
"SC", isADCBas=
False)
560 cfg.addEventAlgo(larLATOMEBuilderAlg)
562 streamTypes = [
"SelectedEnergy",
"ADC"]
566 from PerfMonComps.PerfMonCompsConfig
import PerfMonMTSvcCfg