8 from datetime
import date
12 parser = optparse.OptionParser()
14 parser.add_option(
'--driver', dest =
'driver', choices = [
'direct',
'grid',
'lxplus'], default =
'direct')
15 parser.add_option(
'--gridTag', dest =
'gridTag')
16 parser.add_option(
'--submitFlags', dest =
'submitFlags')
17 parser.add_option(
'--express', dest =
'express', default =
False, action =
'store_true' )
18 parser.add_option(
'-n',
'--dryrun', dest =
'dryrun', default=
False, action =
'store_true' )
20 parser.add_option(
'--log-level', dest =
'log_level', default =
'INFO', choices = [
'ALWAYS',
'FATAL',
'ERROR',
'WARNING',
'INFO',
'DEBUG',
'VERBOSE'])
21 parser.add_option(
'--dosyst', dest =
'dosyst', default =
False, action =
'store_true')
22 parser.add_option(
'-s',
'--submission-dir', dest =
'submission_dir', default =
'submitDir', help =
'Submission directory for EventLoop' )
23 parser.add_option(
'-t',
'--type', dest =
'type', default =
'mc20e', help =
'Job type. (mc20a, mc20d, mc20e, mc21a, mc23a, data18, data22, data23)', choices = [
'mc20a',
'mc20d',
'mc20e',
'mc21a',
'mc23a',
'data18',
'data22',
'data23'])
24 parser.add_option(
'--AF', dest =
'AF', default =
False, action =
'store_true' )
25 parser.add_option(
'-d',
'--daod', dest =
'daod', type =
'int', default = 0, help =
'input DAOD type. Do not specify for xAOD input' )
26 parser.add_option(
'-f',
'--flav', dest =
'flav', default =
'PHYS', help =
'input DAOD flavour' )
27 parser.add_option(
'-m',
'--maxEvts', dest =
'maxEvts', type =
'int', default = -1, help =
'Max events (-1 is all)' )
28 parser.add_option(
'-M',
'--maxEvtsManual', dest =
'maxEvtsManual', type =
'int')
29 parser.add_option(
'-p',
'--ptag', dest =
'ptag', default =
'p5855', help =
'ptag' )
30 parser.add_option(
'--grl', dest =
'grl')
31 parser.add_option(
'--inputDir', dest =
'inputDir')
32 parser.add_option(
'--inputFile', dest =
'inputFile')
33 parser.add_option(
'--inputGrid', dest =
'inputGrid')
34 parser.add_option(
'--inputXRD', dest =
'inputXRD')
35 parser.add_option(
'--overwrite', dest =
'overwrite', default =
False, action =
'store_true' )
36 ( options, args ) = parser.parse_args()
37 print(
"Configured input data ptag: %s"%(options.ptag))
38 ptageqdata = {
'p5511':
'p5514',
'p5631':
'p5632',
'p5737':
'p5740',
'p5855':
'p5858'}
39 if 'data2' in options.type
and options.ptag
in ptageqdata:
40 options.ptag = ptageqdata[options.ptag]
41 print(
"Overriding ptag to equivalent data ptag: -> %s"%(options.ptag))
42 print(
"Configured input data type: %s"%(options.type))
43 print(
"Configured input data DAOD flavour: %s"%(
'SUSY%d'%options.daod
if options.daod>0
else options.flav))
44 print(
"Configured input data sim type: %s"%(
'FullSim' if not options.AF
else 'AF'))
51 outputlvl = {
'INFO':ROOT.MSG.INFO,
'DEBUG':ROOT.MSG.DEBUG,
'VERBOSE':ROOT.MSG.VERBOSE,
'FATAL':ROOT.MSG.FATAL,
'ALWAYS':ROOT.MSG.ALWAYS,
'ERROR':ROOT.MSG.ERROR,
'WARNING':ROOT.MSG.WARNING}
56 sh = ROOT.SH.SampleHandler()
57 sh.setMetaString(
'nc_tree',
'CollectionTree' )
60 if options.overwrite
and os.path.exists(options.submission_dir): shutil.rmtree(options.submission_dir)
64 '/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/SUSYTools/',
65 '/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/dev/SUSYTools/ART/ARTInput/',
68 inputFiles[
'mc20e'] =
'mc20_13TeV.410470.FS_mc20e_%s.%s.pool.root'%(options.ptag,options.flav)
69 inputFiles[
'mc21a'] =
'mc21_13p6TeV.601229.FS_mc21a_%s.%s.pool.root'%(options.ptag,options.flav)
70 inputFiles[
'mc23a'] =
'mc23_13p6TeV.601229.FS_mc23a_%s.%s.pool.root'%(options.ptag,options.flav)
71 inputFiles[
'data18'] =
'data18_13TeV.00356250_%s.%s.pool.root'%(options.ptag,options.flav)
72 inputFiles[
'data22'] =
'data22_13p6TeV.00440543_%s.%s.pool.root'%(options.ptag,options.flav)
73 inputFiles[
'data23'] =
'data23_13p6TeV.00456314_%s.%s.pool.root'%(options.ptag,options.flav)
74 if options.daod == 0
and not '%s%s'%(options.type,
'_AF' if options.AF
else '')
in inputFiles: sys.exit(
'No input file configured for type %s%s. Exiting.'%(options.type,
'_AF' if options.AF
else ''))
81 print(
"Using inputXRD: ",options.inputXRD)
82 pref,server,fname = options.inputXrootd.plit(
'//')
83 dl = ROOT.SH.DiskListXRD(server,fname)
84 ROOT.SH.ScanDir().
scan(sh,dl)
85 elif options.inputGrid:
86 print(
"Using inputGrid: ",options.inputGrid)
87 dsname = options.inputGrid.split(
':')[-1].rstrip()
88 ROOT.SH.addGrid(sh,dsname)
91 inputDir = cvmfsInputArea[0]
92 ifile = options.type + (
'_AF' if options.AF
else '')
93 inputFile = inputFiles[ifile]
if ifile
in inputFiles
else ''
95 inputDir = cvmfsInputArea[1]
96 inputFile =
'DAOD_%s%s%s.%s.art.merge.root'%(options.type,
'%s%d'%(options.flav,options.daod)
if options.flav==
'SUSY' else options.flav,
'AF' if options.AF
else '',options.ptag)
98 if options.inputDir: inputDir = options.inputDir
99 if options.inputFile: inputFile = options.inputFile
101 print(
"Using inputDir: ",inputDir)
102 print(
"Using inputFile:",inputFile)
108 job.sampleHandler( sh )
109 job.options().setDouble( ROOT.EL.Job.optMaxEvents, options.maxEvts )
113 from AnaAlgorithm.AnaAlgorithmConfig
import AnaAlgorithmConfig
114 config = AnaAlgorithmConfig(
'SUSYToolsAlg' )
115 config.addPrivateTool(
"SUSYTools",
"ST::SUSYObjDef_xAOD")
117 config.SUSYTools.ConfigFile =
"SUSYTools/SUSYTools_Default.conf"
118 if (
"data2" in options.type
or "mc21" in options.type
or "mc23" in options.type): config.SUSYTools.ConfigFile =
"SUSYTools/SUSYTools_Default_Run3.conf"
119 if (
"data" not in options.type): config.DoSyst = options.dosyst
120 config.SUSYTools.DataSource = 1
121 config.OutputLevel = outputlvl[options.log_level]
122 config.SUSYTools.OutputLevel = outputlvl[options.log_level]
123 config.SUSYTools.PRWLumiCalcFiles = []
124 config.SUSYTools.AutoconfigurePRWTool =
True
125 config.SUSYTools.PRWUseCommonMCFiles =
True
126 if options.flav ==
"PHYSLITE":
127 print(
"Running on PHYSLITE : ", inputFile)
128 STconfig_lite =
str(config.SUSYTools.ConfigFile).
replace(
".conf",
"_LITE.conf")
129 config.SUSYTools.ConfigFile = STconfig_lite
130 config.SUSYTools.IsPHYSLITE =
True
134 config.SUSYTools.DataSource = 2
137 if 'mc' in options.type:
138 mcCampaign = options.type
139 config.SUSYTools.mcCampaign = options.type
140 elif options.type ==
'data18':
142 config.SUSYTools.mcCampaign = options.type
143 config.SUSYTools.DataSource = 0
144 elif options.type ==
'data22':
146 config.SUSYTools.mcCampaign = options.type
147 config.SUSYTools.DataSource = 0
148 elif options.type ==
'data23':
150 config.SUSYTools.mcCampaign = options.type
151 config.SUSYTools.DataSource = 0
156 PRWLumiCalc[
'mc20a'] = [
'/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data16_13TeV/20180129/PHYS_StandardGRL_All_Good_25ns_297730-311481_OflLumi-13TeV-009.root',
157 '/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data15_13TeV/20170619/PHYS_StandardGRL_All_Good_25ns_276262-284484_OflLumi-13TeV-008.root']
158 PRWLumiCalc[
'mc20d'] = [
'/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data17_13TeV/20180619/physics_25ns_Triggerno17e33prim.lumicalc.OflLumi-13TeV-010.root']
159 PRWLumiCalc[
'mc20e'] = [
'/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data18_13TeV/20190318/ilumicalc_histograms_None_348885-364292_OflLumi-13TeV-010.root']
160 PRWLumiCalc[
'mc21a'] = [
'/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data22_13p6TeV/20220820/ilumicalc_histograms_None_427882-428855_OflLumi-Run3-001.root']
161 PRWLumiCalc[
'mc23a'] = [
'/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data22_13p6TeV/20220820/ilumicalc_histograms_None_427882-428855_OflLumi-Run3-001.root']
162 PRWLumiCalc[
'mc23c'] = [
'/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data23_13p6TeV/20230828/ilumicalc_histograms_None_451587-456749_OflLumi-Run3-003.root']
164 config.SUSYTools.PRWLumiCalcFiles = PRWLumiCalc[mcCampaign]
166 if options.grl: config.GRLFiles = options.grl.split(
',')
167 if options.maxEvtsManual: config.maxEvts = options.maxEvtsManual
170 job.algsAdd( config )
171 if options.driver ==
'direct':
173 driver = ROOT.EL.DirectDriver()
174 if not options.dryrun:
175 driver.submit( job, options.submission_dir )
176 elif options.driver ==
'grid':
177 driver = ROOT.EL.PrunDriver()
178 submitFlags = [
'--addNthFieldOfInDSToLFN=2,6']
179 if options.submitFlags: submitFlags += [options.submitFlags]
180 if not options.gridTag: options.gridTag = date.today().strftime(
'%y%m%d')
181 outName =
'user.%s.%%in:name[1]%%.%%in:name[2]%%.%%in:name[3]%%.STAlg_%s'%(os.environ[
'USER'],options.gridTag)
182 driver.options().setString(
"nc_outputSampleName", outName );
183 driver.options().setString(
"nc_EventLoop_SubmitFlags",
' '.
join(submitFlags))
184 driver.options().setDouble(ROOT.EL.Job.optGridMergeOutput, 0)
185 if not options.dryrun:
186 if options.express: driver.options().setDouble(ROOT.EL.Job.optGridExpress, 1)
187 driver.submitOnly( job, options.submission_dir )