ATLAS Offline Software
Loading...
Searching...
No Matches
LArDigits2NtupleDumper.py
Go to the documentation of this file.
1#!/usr/bin/env python
2#
3# Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
4
5from AthenaConfiguration.ComponentFactory import CompFactory
6
7if __name__=='__main__':
8
9 import os,sys
10 import argparse
11 from AthenaCommon import Logging
12 log = Logging.logging.getLogger( 'LArDigits2Ntuple' )
13
14 parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
15
16 parser.add_argument('-i','--indir', dest='indir', default="/eos/atlas/atlastier0/rucio/data_test/calibration_pulseall/00414414/data_test.00414414.calibration_pulseall.daq.RAW/", help='input files dir', type=str)
17 parser.add_argument('-p','--inprefix', dest='inpref', default="data_test", help='Input filenames prefix', type=str)
18 parser.add_argument('-y','--inppatt', dest='inppatt', default="lb3512", help='Input filenames pattern', type=str)
19 parser.add_argument('-f','--infile', dest='infile', default="", help='Input filename (if given indir and inprefix are ignored', type=str)
20 parser.add_argument('-r','--run', dest='run', default=0, help='Run number (if not given trying to judge from input file name)', type=int)
21 parser.add_argument('-m','--maxev', dest='maxev', default=-1, help='Max number of events to dump', type=int)
22 parser.add_argument('-x','--outlevel', dest='olevel', default=3, help='OuputLevel for dumping algo', type=int)
23 parser.add_argument('-o','--outfile', dest='outfile', default="Digits.root", help='Output root filename', type=str)
24 parser.add_argument('-n','--nsamp', dest='nsamp', default=0, help='Number of samples to dump', type=int)
25 parser.add_argument('-a','--addHash', dest='ahash', default=False, help='Add hash number to output ntuple', action="store_true")
26 parser.add_argument('-j','--addOffline', dest='offline', default=False, help='Add offline Id to output ntuple', action="store_true")
27 parser.add_argument('-k','--addCalib', dest='calib', default=False, help='Add calib. info to output ntuple', action="store_true")
28 parser.add_argument('-t','--addGeom', dest='geom', default=False, help='Add real geom info to output ntuple', action="store_true")
29 parser.add_argument('-u','--addBC', dest='bc', default=False, help='Add Bad. chan info to output ntuple', action="store_true")
30 parser.add_argument('--addBCID', dest='bcid', default=False, help='Add BCID info to output ntuple', action="store_true")
31 parser.add_argument('-v','--addEvTree', dest='evtree', default=False, help='Add tree with per event info to output ntuple', action="store_true")
32 parser.add_argument('--EMF', dest='emf', default=False, help='Is it for EMF', action='store_true')
33 parser.add_argument('-d','--digikey', dest='dkey', default="FREE", help='Input digits key', type=str)
34 parser.add_argument('-e','--acckey', dest='acckey', default="", help='Input accumulated digits key', type=str)
35 parser.add_argument('-l','--acccalibkey', dest='acccalibkey', default="", help='Input accumulated calib digits key', type=str)
36 parser.add_argument('--CALIB', dest='iscalib', default=False, help='Is it from calib run ?', action='store_true')
37 parser.add_argument('--RDO', dest='rdo', default=False, help='Is it from pool file ?', action='store_true')
38 parser.add_argument('--FTs', dest='ft', default=[], nargs="+", type=int, help='list of FT which will be read out (space separated).')
39 parser.add_argument('--posneg', dest='posneg', default=[], nargs="+", help='side to read out (-1 means both), can give multiple arguments (space separated). Default %(default)s.', type=int,choices=range(-1,2))
40 parser.add_argument('--barrel_ec', dest='be', default=[], nargs="+", help='subdet to read out (-1 means both), can give multiple arguments (space separated) Default %(default)s.', type=int,choices=range(-1,2))
41
42 args = parser.parse_args()
43 if help in args and args.help is not None and args.help:
44 parser.print_help()
45 sys.exit(0)
46
47 for _, value in args._get_kwargs():
48 if value is not None:
49 log.debug(value)
50
51 #Import the flag-container that is the arguemnt to the configuration methods
52 from AthenaConfiguration.AllConfigFlags import initConfigFlags
53 flags = initConfigFlags()
54
55 # add SCDump flags, here re-used for digitsdump
56 from LArCafJobs.LArSCDumperFlags import addSCDumpFlags
57 addSCDumpFlags(flags)
58
59
60 if len(args.infile) > 0:
61 flags.Input.Files = [args.infile]
62 elif len(args.inppatt) > 0:
63 from LArCalibProcessing.GetInputFiles import GetInputFilesFromPattern
64 flags.Input.Files = GetInputFilesFromPattern(args.indir,args.inppatt)
65 else:
66 from LArCalibProcessing.GetInputFiles import GetInputFilesFromPrefix
67 flags.Input.Files = GetInputFilesFromPrefix(args.indir,args.inpref)
68
69 if args.run != 0:
70 flags.Input.RunNumbers = [args.run]
71
72 from LArCalibProcessing.LArCalibConfigFlags import addLArCalibFlags
73 addLArCalibFlags(flags)
74 if len(args.posneg) >= 0:
75 flags.LArCalib.Preselection.Side = args.posneg
76 if len(args.be) >=0:
77 flags.LArCalib.Preselection.BEC = args.be
78 if len(args.ft) > 0:
79 flags.LArCalib.Preselection.FT = args.ft
80 # first autoconfig
81 from LArConditionsCommon.LArRunFormat import getLArFormatForRun
82 try:
83 runinfo=getLArFormatForRun(flags.Input.RunNumbers[0], connstring="COOLONL_LAR/CONDBR2")
84 except Exception:
85 log.warning("Could not get run info, using defaults !")
86 if args.nsamp > 0:
87 flags.LArSCDump.nSamples=args.nsamp
88 else:
89 flags.LArSCDump.nSamples=4
90 else:
91 if runinfo is not None:
92 flags.LArSCDump.nSamples=runinfo.nSamples()
93
94 flags.LArSCDump.digitsKey=args.dkey
95 if args.nsamp > 0 and args.nsamp < flags.LArSCDump.nSamples:
96 flags.LArSCDump.nSamples=args.nsamp
97
98 log.info("Autoconfigured: ")
99 log.info("nSamples: %d digitsKey %s accKey %s accCalibKey %s",flags.LArSCDump.nSamples, flags.LArSCDump.digitsKey, args.acckey, args.acccalibkey)
100
101 #GEometry
102 from AthenaConfiguration.TestDefaults import defaultGeometryTags
103 flags.GeoModel.AtlasVersion = defaultGeometryTags.RUN3
104
105 # now construct the job
106 flags.LAr.doAlign=False
107
108 #if RDO, MC job
109 if args.rdo:
110 flags.Input.isMC=True
111
112 if args.evtree: # should include trigger info
113 flags.Trigger.triggerConfig = 'DB'
114 flags.Trigger.L1.doCTP = True
115 flags.Trigger.L1.doMuon = False
116 flags.Trigger.L1.doCalo = False
117 flags.Trigger.L1.doTopo = False
118
119 flags.Trigger.enableL1CaloLegacy = True
120 flags.Trigger.enableL1CaloPhase1 = True
121
122 # additions for EMF
123 if args.emf:
124 flags.IOVDb.SqliteInput="/afs/cern.ch/user/p/pavol/public/EMF_otherCond.db"
125 flags.IOVDb.SqliteFolders = ("/LAR/BadChannelsOfl/BadChannels","/LAR/BadChannelsOfl/KnownBADFEBs","/LAR/BadChannelsOfl/KnownMNBFEBs","/LAR/BadChannelsOfl/MissingFEBs","/LAR/Identifier/OnOffIdMap",)
126
127 flags.lock()
128 flags.dump()
129
130 #Import the MainServices (boilerplate)
131 from AthenaConfiguration.MainServicesConfig import MainServicesCfg
132 from LArGeoAlgsNV.LArGMConfig import LArGMCfg
133
134 acc = MainServicesCfg(flags)
135 acc.merge(LArGMCfg(flags))
136
137 from LArCabling.LArCablingConfig import LArOnOffIdMappingCfg
138 acc.merge(LArOnOffIdMappingCfg(flags))
139
140 if args.evtree: # should include trigger info
141 from LArCafJobs.LArSCDumperSkeleton import L1CaloMenuCfg
142 acc.merge(L1CaloMenuCfg(flags))
143 from TrigDecisionTool.TrigDecisionToolConfig import TrigDecisionToolCfg
144 tdt = acc.getPrimaryAndMerge(TrigDecisionToolCfg(flags))
145 else:
146 tdt = None
147
148
149 if args.bc:
150 from LArBadChannelTool.LArBadChannelConfig import LArBadFebCfg, LArBadChannelCfg
151 acc.merge(LArBadChannelCfg(flags))
152 acc.merge(LArBadFebCfg(flags))
153
154 if args.geom:
155 log.warning("Adding real geometry is not working yet")
156 acc.addCondAlgo(CompFactory.CaloAlignCondAlg(LArAlignmentStore="",CaloCellPositionShiftFolder=""))
157 acc.addCondAlgo(CompFactory.CaloSuperCellAlignCondAlg())
158 args.offline=True
159
160 from LArCalibTools.LArDigits2NtupleConfig import LArDigits2NtupleCfg
161 acc.merge(LArDigits2NtupleCfg(flags, AddBadChannelInfo=args.bc, AddFEBTempInfo=False, isSC=False, isFlat=True,
162 OffId=args.offline, AddHash=args.ahash, AddCalib=args.calib, RealGeometry=args.geom, # from LArCond2NtupleBase
163 NSamples=flags.LArSCDump.nSamples, FTlist=flags.LArCalib.Preselection.FT, Slotlist=flags.LArCalib.Preselection.Slot, BElist=flags.LArCalib.Preselection.BEC, Sidelist=flags.LArCalib.Preselection.Side,
164 ContainerKey=flags.LArSCDump.digitsKey, AccContainerKey=args.acckey, AccCalibContainerKey=args.acccalibkey, isCalib=args.iscalib, # from LArDigits2Ntuple
165 FillLB=args.evtree, FillBCID=args.bcid, isRDO=args.rdo,
166 OutputLevel=args.olevel
167 ))
168 # ROOT file writing
169 if os.path.exists(args.outfile):
170 os.remove(args.outfile)
171 acc.addService(CompFactory.NTupleSvc(Output = [ "FILE1 DATAFILE='"+args.outfile+"' OPT='NEW'" ]))
172 acc.setAppProperty("HistogramPersistency","ROOT")
173
174 # some logging
175 log.info("Input files to be processed:")
176 for f in flags.Input.Files:
177 log.info(f)
178 log.info("Output file: ")
179 log.info(args.outfile)
180
181
182 # and run
183 acc.run(args.maxev)