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, data18, data22, data23)', choices = [
'mc20a',
'mc20d',
'mc20e',
'mc23a',
'mc23d',
'data18',
'data22',
'data23'])
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(
'--grl', dest =
'grl')
30parser.add_option(
'--inputDir', dest =
'inputDir')
31parser.add_option(
'--inputFile', dest =
'inputFile')
32parser.add_option(
'--inputGrid', dest =
'inputGrid')
33parser.add_option(
'--inputXRD', dest =
'inputXRD')
34parser.add_option(
'--overwrite', dest =
'overwrite', default =
False, action =
'store_true' )
35( options, args ) = parser.parse_args()
38print(
"Configured input data ptag: %s"%(options.ptag))
39ptageqdata = {
'p6266' :
'p6269'}
40if 'data2' in options.type
and options.ptag
in ptageqdata:
41 options.ptag = ptageqdata[options.ptag]
42 print(
"Overriding ptag to equivalent data ptag: -> %s"%(options.ptag))
43print(
"Configured input data type: %s"%(options.type))
44print(
"Configured input data DAOD flavour: %s"%(options.flav))
45print(
"Configured input data sim type: %s"%(
'FullSim' if not options.AF
else 'AF'))
49ROOT.xAOD.Init().ignore()
52outputlvl = {
'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}
57sh = ROOT.SH.SampleHandler()
58sh.setMetaString(
'nc_tree',
'CollectionTree' )
61if options.overwrite
and os.path.exists(options.submission_dir): shutil.rmtree(options.submission_dir)
64cvmfsInputArea =
'/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/SUSYTools'
65sim_type =
"FS" if not options.AF
else "AF3"
67inputFiles[
'mc20e'] =
'DAOD_%s.mc20_13TeV.410470.%s_mc20e_%s.%s.pool.root'%(options.flav, sim_type, options.ptag, options.flav)
68inputFiles[
'mc23a'] =
'mc23_13p6TeV.601229.%s_mc23a_%s.%s.pool.root'%(sim_type, options.ptag, options.flav)
69inputFiles[
'mc23d'] =
'mc23_13p6TeV.601229.%s_mc23d_%s.%s.pool.root'%(sim_type, options.ptag, options.flav)
70inputFiles[
'data18'] =
'data18_13TeV.39757132_%s.%s.pool.root'%(options.ptag,options.flav)
71inputFiles[
'data22'] =
'data22_13p6TeV.39672246_%s.%s.pool.root'%(options.ptag,options.flav)
72inputFiles[
'data23'] =
'data23_13p6TeV.39756993_%s.%s.pool.root'%(options.ptag,options.flav)
79 print(
"Using inputXRD: ",options.inputXRD)
80 pref,server,fname = options.inputXrootd.plit(
'//')
81 dl = ROOT.SH.DiskListXRD(server,fname)
82 ROOT.SH.ScanDir().
scan(sh,dl)
83elif options.inputGrid:
84 print(
"Using inputGrid: ",options.inputGrid)
85 dsname = options.inputGrid.split(
':')[-1].rstrip()
86 ROOT.SH.addGrid(sh,dsname)
88 inputDir = cvmfsInputArea
89 inputFile = inputFiles[options.type]
if options.type
in inputFiles
else ''
91 if options.inputDir: inputDir = options.inputDir
92 if options.inputFile: inputFile = options.inputFile
94 print(
"Using inputDir: ",inputDir)
95 print(
"Using inputFile:",inputFile)
96 ROOT.SH.ScanDir().filePattern(inputFile).
scan(sh, inputDir)
101job.sampleHandler( sh )
102job.options().setDouble( ROOT.EL.Job.optMaxEvents, options.maxEvts )
106from AnaAlgorithm.AnaAlgorithmConfig
import AnaAlgorithmConfig
107config = AnaAlgorithmConfig(
'SUSYToolsAlg' )
108config.addPrivateTool(
"SUSYTools",
"ST::SUSYObjDef_xAOD")
110config.SUSYTools.ConfigFile =
"SUSYTools/SUSYTools_Default.conf"
111if (
"data2" in options.type
or "mc23" in options.type): config.SUSYTools.ConfigFile =
"SUSYTools/SUSYTools_Default_Run3.conf"
112if (
"data" not in options.type): config.DoSyst = options.dosyst
113config.SUSYTools.DataSource = 1
114config.OutputLevel = outputlvl[options.log_level]
115config.SUSYTools.OutputLevel = outputlvl[options.log_level]
116config.SUSYTools.PRWLumiCalcFiles = []
117config.SUSYTools.AutoconfigurePRWTool =
True
118config.SUSYTools.PRWUseCommonMCFiles =
True
119if options.flav ==
"PHYSLITE":
120 print(
"Running on PHYSLITE : ", inputFile)
121 STconfig_lite = str(config.SUSYTools.ConfigFile).
replace(
".conf",
"_LITE.conf")
122 config.SUSYTools.ConfigFile = STconfig_lite
123 config.SUSYTools.IsPHYSLITE =
True
126config.ConfigFile = config.SUSYTools.ConfigFile
130 config.SUSYTools.DataSource = 2
133if 'mc' in options.type:
134 mcCampaign = options.type
135 config.SUSYTools.mcCampaign = options.type
136elif options.type ==
'data18':
138 config.SUSYTools.mcCampaign = options.type
139 config.SUSYTools.DataSource = 0
140elif options.type ==
'data22':
142 config.SUSYTools.mcCampaign = options.type
143 config.SUSYTools.DataSource = 0
144elif options.type ==
'data23':
146 config.SUSYTools.mcCampaign = options.type
147 config.SUSYTools.DataSource = 0
152PRWLumiCalc[
'mc20a'] = [
'/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data16_13TeV/20180129/PHYS_StandardGRL_All_Good_25ns_297730-311481_OflLumi-13TeV-009.root',
153 '/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data15_13TeV/20170619/PHYS_StandardGRL_All_Good_25ns_276262-284484_OflLumi-13TeV-008.root']
154PRWLumiCalc[
'mc20d'] = [
'/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data17_13TeV/20180619/physics_25ns_Triggerno17e33prim.lumicalc.OflLumi-13TeV-010.root']
155PRWLumiCalc[
'mc20e'] = [
'/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data18_13TeV/20190318/ilumicalc_histograms_None_348885-364292_OflLumi-13TeV-010.root']
156PRWLumiCalc[
'mc23a'] = [
'/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data22_13p6TeV/20250321/ilumicalc_histograms_None_431810-440613_OflLumi-Run3-004.root']
157PRWLumiCalc[
'mc23d'] = [
'/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data23_13p6TeV/20250321/ilumicalc_histograms_None_451587-456749_OflLumi-Run3-004.root']
159config.SUSYTools.PRWLumiCalcFiles = PRWLumiCalc[mcCampaign]
161if options.grl: config.GRLFiles = options.grl.split(
',')
162if options.maxEvtsManual: config.maxEvts = options.maxEvtsManual
166if options.driver ==
'direct':
168 driver = ROOT.EL.DirectDriver()
169 if not options.dryrun:
170 driver.submit( job, options.submission_dir )
171elif options.driver ==
'grid':
172 driver = ROOT.EL.PrunDriver()
173 submitFlags = [
'--addNthFieldOfInDSToLFN=2,6']
174 if options.submitFlags: submitFlags += [options.submitFlags]
175 if not options.gridTag: options.gridTag = date.today().strftime(
'%y%m%d')
176 outName =
'user.%s.%%in:name[1]%%.%%in:name[2]%%.%%in:name[3]%%.STAlg_%s'%(os.environ[
'USER'],options.gridTag)
177 driver.options().setString(
"nc_outputSampleName", outName );
178 driver.options().setString(
"nc_EventLoop_SubmitFlags",
' '.join(submitFlags))
179 driver.options().setDouble(ROOT.EL.Job.optGridMergeOutput, 0)
180 if not options.dryrun:
181 if options.express: driver.options().setDouble(ROOT.EL.Job.optGridExpress, 1)
182 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)