8from datetime
import date
12parser = optparse.OptionParser()
14parser.add_option(
'--driver', dest =
'driver', choices = [
'direct',
'grid',
'lxplus'], default =
'direct')
15parser.add_option(
'--gridTag', dest =
'gridTag')
16parser.add_option(
'--submitFlags', dest =
'submitFlags')
17parser.add_option(
'--express', dest =
'express', default =
False, action =
'store_true' )
18parser.add_option(
'-n',
'--dryrun', dest =
'dryrun', default=
False, action =
'store_true' )
20parser.add_option(
'--log-level', dest =
'log_level', default =
'INFO', choices = [
'ALWAYS',
'FATAL',
'ERROR',
'WARNING',
'INFO',
'DEBUG',
'VERBOSE'])
21parser.add_option(
'--dosyst', dest =
'dosyst', default =
False, action =
'store_true')
22parser.add_option(
'-s',
'--submission-dir', dest =
'submission_dir', default =
'submitDir', help =
'Submission directory for EventLoop' )
23parser.add_option(
'-t',
'--type', dest =
'type', default =
'mc20e', help =
'Job type. (mc20a, mc20d, mc20e, mc23a, mc23d, mc23e, data18, data22, data23, data24)', choices = [
'mc20a',
'mc20d',
'mc20e',
'mc23a',
'mc23d',
'mc23e',
'data18',
'data22',
'data23',
'data24'])
24parser.add_option(
'--AF', dest =
'AF', default =
False, action =
'store_true' )
25parser.add_option(
'-f',
'--flav', dest =
'flav', default =
'PHYS', choices = [
"PHYS",
"PHYSLITE"], help =
'input DAOD flavour' )
26parser.add_option(
'-m',
'--maxEvts', dest =
'maxEvts', type =
'int', default = -1, help =
'Max events (-1 is all)' )
27parser.add_option(
'-M',
'--maxEvtsManual', dest =
'maxEvtsManual', type =
'int')
28parser.add_option(
'-p',
'--ptag', dest =
'ptag', default =
'p6266', help =
'ptag' )
29parser.add_option(
'-c',
'--configFile', dest =
'configFile', help =
'Override configfile' )
30parser.add_option(
'--grl', dest =
'grl')
31parser.add_option(
'--inputDir', dest =
'inputDir')
32parser.add_option(
'--inputFile', dest =
'inputFile')
33parser.add_option(
'--inputGrid', dest =
'inputGrid')
34parser.add_option(
'--inputXRD', dest =
'inputXRD')
35parser.add_option(
'--overwrite', dest =
'overwrite', default =
False, action =
'store_true' )
36( options, args ) = parser.parse_args()
39print(
"Configured input data ptag: %s"%(options.ptag))
40ptageqdata = {
'p6266' :
'p6269',
'p6490':
'p6479',
'p6697':
'p6697',
'p7018':
'p7018'}
41if 'data2' in options.type
and options.ptag
in ptageqdata:
42 options.ptag = ptageqdata[options.ptag]
43 print(
"Overriding ptag to equivalent data ptag: -> %s"%(options.ptag))
44print(
"Configured input data type: %s"%(options.type))
45print(
"Configured input data DAOD flavour: %s"%(options.flav))
46print(
"Configured input data sim type: %s"%(
'FullSim' if not options.AF
else 'AF'))
50ROOT.xAOD.Init().ignore()
53outputlvl = {
'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}
58sh = ROOT.SH.SampleHandler()
59sh.setMetaString(
'nc_tree',
'CollectionTree' )
62if options.overwrite
and os.path.exists(options.submission_dir): shutil.rmtree(options.submission_dir)
65cvmfsInputArea =
'/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/SUSYTools'
66sim_type =
"FS" if not options.AF
else "AF3"
68inputFiles[
'mc20e'] =
'DAOD_%s.mc20_13TeV.410470.%s_mc20e_%s.%s.pool.root'%(options.flav, sim_type, options.ptag, options.flav)
69inputFiles[
'mc23a'] =
'mc23_13p6TeV.601229.%s_mc23a_%s.%s.pool.root'%(sim_type, options.ptag, options.flav)
70inputFiles[
'mc23d'] =
'mc23_13p6TeV.601229.%s_mc23d_%s.%s.pool.root'%(sim_type, options.ptag, options.flav)
71inputFiles[
'mc23e'] =
'mc23_13p6TeV.XYZ'
72inputFiles[
'data18'] =
'data18_13TeV.39757132_%s.%s.pool.root'%(options.ptag,options.flav)
73inputFiles[
'data22'] =
'data22_13p6TeV.39672246_%s.%s.pool.root'%(options.ptag,options.flav)
74inputFiles[
'data23'] =
'data23_13p6TeV.39756993_%s.%s.pool.root'%(options.ptag,options.flav)
75inputFiles[
'data24'] =
'data24_13p6TeV.XYZ'
82 print(
"Using inputXRD: ",options.inputXRD)
83 pref,server,fname = options.inputXrootd.plit(
'//')
84 dl = ROOT.SH.DiskListXRD(server,fname)
85 ROOT.SH.ScanDir().
scan(sh,dl)
86elif options.inputGrid:
87 print(
"Using inputGrid: ",options.inputGrid)
88 dsname = options.inputGrid.split(
':')[-1].rstrip()
89 ROOT.SH.addGrid(sh,dsname)
91 inputDir = cvmfsInputArea
92 inputFile = inputFiles[options.type]
if options.type
in inputFiles
else ''
94 if options.inputDir: inputDir = options.inputDir
95 if options.inputFile: inputFile = options.inputFile
97 print(
"Using inputDir: ",inputDir)
98 print(
"Using inputFile:",inputFile)
99 ROOT.SH.ScanDir().filePattern(inputFile).
scan(sh, inputDir)
104job.sampleHandler( sh )
105job.options().setDouble( ROOT.EL.Job.optMaxEvents, options.maxEvts )
109from AnaAlgorithm.AnaAlgorithmConfig
import AnaAlgorithmConfig
110config = AnaAlgorithmConfig(
'SUSYToolsAlg' )
111config.addPrivateTool(
"SUSYTools",
"ST::SUSYObjDef_xAOD")
113config.SUSYTools.ConfigFile =
"SUSYTools/SUSYTools_Default.conf"
114if (
"data2" in options.type
or "mc23" in options.type): config.SUSYTools.ConfigFile =
"SUSYTools/SUSYTools_Default_Run3.conf"
115if (
"data" not in options.type): config.DoSyst = options.dosyst
116config.SUSYTools.DataSource = 1
117config.OutputLevel = outputlvl[options.log_level]
118config.SUSYTools.OutputLevel = outputlvl[options.log_level]
119config.SUSYTools.PRWLumiCalcFiles = []
120config.SUSYTools.AutoconfigurePRWTool =
True
121config.SUSYTools.PRWUseCommonMCFiles =
True
122if options.flav ==
"PHYSLITE":
123 print(
"Running on PHYSLITE : ", inputFile)
124 STconfig_lite =
str(config.SUSYTools.ConfigFile).
replace(
".conf",
"_LITE.conf")
125 config.SUSYTools.ConfigFile = STconfig_lite
126 config.SUSYTools.IsPHYSLITE =
True
128if options.configFile:
129 config.SUSYTools.ConfigFile = options.configFile
132config.ConfigFile = config.SUSYTools.ConfigFile
136 config.SUSYTools.DataSource = 2
139if 'mc' in options.type:
140 mcCampaign = options.type
141 config.SUSYTools.mcCampaign = options.type
142elif options.type ==
'data18':
144 config.SUSYTools.mcCampaign = options.type
145 config.SUSYTools.DataSource = 0
146elif options.type ==
'data22':
148 config.SUSYTools.mcCampaign = options.type
149 config.SUSYTools.DataSource = 0
150elif options.type ==
'data23':
152 config.SUSYTools.mcCampaign = options.type
153 config.SUSYTools.DataSource = 0
154elif options.type ==
'data24':
156 config.SUSYTools.mcCampaign = options.type
157 config.SUSYTools.DataSource = 0
158elif options.type ==
'data25':
160 config.SUSYTools.mcCampaign = options.type
161 config.SUSYTools.DataSource = 0
166PRWLumiCalc[
'mc20a'] = [
'/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data16_13TeV/20180129/PHYS_StandardGRL_All_Good_25ns_297730-311481_OflLumi-13TeV-009.root',
167 '/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data15_13TeV/20170619/PHYS_StandardGRL_All_Good_25ns_276262-284484_OflLumi-13TeV-008.root']
168PRWLumiCalc[
'mc20d'] = [
'/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data17_13TeV/20180619/physics_25ns_Triggerno17e33prim.lumicalc.OflLumi-13TeV-010.root']
169PRWLumiCalc[
'mc20e'] = [
'/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data18_13TeV/20190318/ilumicalc_histograms_None_348885-364292_OflLumi-13TeV-010.root']
170PRWLumiCalc[
'mc23a'] = [
'/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data22_13p6TeV/20250321/ilumicalc_histograms_None_431810-440613_OflLumi-Run3-004.root']
171PRWLumiCalc[
'mc23d'] = [
'/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data23_13p6TeV/20250321/ilumicalc_histograms_None_451587-456749_OflLumi-Run3-004.root']
172PRWLumiCalc[
'mc23e'] = [
'/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data24_13p6TeV/20260127/ilumicalc_histograms_None_473235-486706_OflLumi-Run3-008.root']
173PRWLumiCalc[
'mc23g'] = [
'/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data25_13p6TeV/20260129/ilumicalc_histograms_None_497924-509849_OflLumi-Run3-006.root']
175config.SUSYTools.PRWLumiCalcFiles = PRWLumiCalc[mcCampaign]
177if options.grl: config.GRLFiles = options.grl.split(
',')
178if options.maxEvtsManual: config.maxEvts = options.maxEvtsManual
182if options.driver ==
'direct':
184 driver = ROOT.EL.DirectDriver()
185 if not options.dryrun:
186 driver.submit( job, options.submission_dir )
187elif options.driver ==
'grid':
188 driver = ROOT.EL.PrunDriver()
189 submitFlags = [
'--addNthFieldOfInDSToLFN=2,6']
190 if options.submitFlags: submitFlags += [options.submitFlags]
191 if not options.gridTag: options.gridTag = date.today().strftime(
'%y%m%d')
192 outName =
'user.%s.%%in:name[1]%%.%%in:name[2]%%.%%in:name[3]%%.STAlg_%s'%(os.environ[
'USER'],options.gridTag)
193 driver.options().setString(
"nc_outputSampleName", outName );
194 driver.options().setString(
"nc_EventLoop_SubmitFlags",
' '.join(submitFlags))
195 driver.options().setDouble(ROOT.EL.Job.optGridMergeOutput, 0)
196 if not options.dryrun:
197 if options.express: driver.options().setDouble(ROOT.EL.Job.optGridExpress, 1)
198 driver.submitOnly( job, options.submission_dir )
void print(char *figname, TCanvas *c1)
std::string replace(std::string s, const std::string &s2, const std::string &s3)
void scan(TDirectory *td=0, int depth=0)