2121import importlib .util
2222import argparse
2323from os import environ , mkdir
24- from os .path import join , dirname , isdir , isabs
24+ from os .path import join , dirname , isdir , isabs , isfile
2525import random
2626import json
2727import itertools
6161parser .add_argument ('-ini' ,help = 'generator init parameters file (full paths required), for example: ${O2DPG_ROOT}/MC/config/PWGHF/ini/GeneratorHF.ini' , default = '' )
6262parser .add_argument ('-confKey' ,help = 'generator or trigger configuration key values, for example: "GeneratorPythia8.config=pythia8.cfg;A.x=y"' , default = '' )
6363parser .add_argument ('--readoutDets' ,help = 'comma separated string of detectors readout (does not modify material budget - only hit creation)' , default = 'all' )
64+ parser .add_argument ('--make-evtpool' , help = 'Generate workflow for event pool creation.' , action = 'store_true' )
6465
6566parser .add_argument ('-interactionRate' ,help = 'Interaction rate, used in digitization' , default = - 1 )
6667parser .add_argument ('-bcPatternFile' ,help = 'Bunch crossing pattern file, used in digitization (a file name or "ccdb")' , default = '' )
@@ -688,9 +689,14 @@ def getDPL_global_options(bigshm=False, ccdbbackend=True):
688689 # possible generator)
689690
690691 workflow ['stages' ].append (SGN_CONFIG_task )
692+
693+ # default flags for extkinO2 signal simulation (no transport)
694+ extkinO2Config = ''
695+ if GENERATOR == 'extkinO2' :
696+ extkinO2Config = ';GeneratorFromO2Kine.randomize=true;GeneratorFromO2Kine.rngseed=' + str (TFSEED )
691697
692698 # determine final conf key for signal simulation
693- CONFKEY = constructConfigKeyArg (create_geant_config (args , args .confKey ))
699+ CONFKEY = constructConfigKeyArg (create_geant_config (args , args .confKey + extkinO2Config ))
694700 # -----------------
695701 # transport signals
696702 # -----------------
@@ -730,7 +736,11 @@ def getDPL_global_options(bigshm=False, ccdbbackend=True):
730736 # determine the skip number
731737 cmd = 'export HEPMCEVENTSKIP=$(${O2DPG_ROOT}/UTILS/ReadHepMCEventSkip.sh ../HepMCEventSkip.json ' + str (tf ) + ');'
732738 SGNGENtask ['cmd' ] = cmd
733- SGNGENtask ['cmd' ] += '${O2_ROOT}/bin/o2-sim --noGeant -j 1 --field ccdb --vertexMode kCCDB' \
739+
740+ # No vertexing for event pool generation
741+ vtxmode = 'kNoVertex' if args .make_evtpool else 'kCCDB'
742+
743+ SGNGENtask ['cmd' ] += '${O2_ROOT}/bin/o2-sim --noGeant -j 1 --field ccdb --vertexMode ' + vtxmode \
734744 + ' --run ' + str (args .run ) + ' ' + str (CONFKEY ) + str (TRIGGER ) \
735745 + ' -g ' + str (GENERATOR ) + ' ' + str (INIFILE ) + ' -o genevents ' + embeddinto \
736746 + ('' , ' --timestamp ' + str (args .timestamp ))[args .timestamp != - 1 ] \
@@ -743,6 +753,11 @@ def getDPL_global_options(bigshm=False, ccdbbackend=True):
743753 if sep_event_mode == True :
744754 workflow ['stages' ].append (SGNGENtask )
745755 signalneeds = signalneeds + [SGNGENtask ['name' ]]
756+ if args .make_evtpool :
757+ continue
758+
759+ # GeneratorFromO2Kine parameters are needed only before the transport
760+ CONFKEY = re .sub (r'GeneratorFromO2Kine.*?;' , '' , CONFKEY )
746761
747762 sgnmem = 6000 if COLTYPE == 'PbPb' else 4000
748763 SGNtask = createTask (name = 'sgnsim_' + str (tf ), needs = signalneeds , tf = tf , cwd = 'tf' + str (tf ), lab = ["GEANT" ],
@@ -1509,26 +1524,32 @@ def addQCPerTF(taskName, needs, readerCommand, configFilePath, objectsFile=''):
15091524 TFcleanup ['cmd' ] += 'rm *cluster*.root'
15101525 workflow ['stages' ].append (TFcleanup )
15111526
1512- # AOD merging as one global final step
1513- aodmergerneeds = ['aod_' + str (tf ) for tf in range (1 , NTIMEFRAMES + 1 )]
1514- AOD_merge_task = createTask (name = 'aodmerge' , needs = aodmergerneeds , lab = ["AOD" ], mem = '2000' , cpu = '1' )
1515- AOD_merge_task ['cmd' ] = ' set -e ; [ -f aodmerge_input.txt ] && rm aodmerge_input.txt; '
1516- AOD_merge_task ['cmd' ] += ' for i in `seq 1 ' + str (NTIMEFRAMES ) + '`; do echo "tf${i}/AO2D.root" >> aodmerge_input.txt; done; '
1517- AOD_merge_task ['cmd' ] += ' o2-aod-merger --input aodmerge_input.txt --output AO2D.root'
1518- # produce MonaLisa event stat file
1519- AOD_merge_task ['cmd' ] += ' ; ${O2DPG_ROOT}/MC/bin/o2dpg_determine_eventstat.py'
1520- workflow ['stages' ].append (AOD_merge_task )
1521-
1522- job_merging = False
1523- if includeFullQC :
1524- workflow ['stages' ].extend (include_all_QC_finalization (ntimeframes = NTIMEFRAMES , standalone = False , run = args .run , productionTag = args .productionTag , conditionDB = args .conditionDB , qcdbHost = args .qcdbHost ))
1525-
1526-
1527- if includeAnalysis :
1528- # include analyses and potentially final QC upload tasks
1529- add_analysis_tasks (workflow ["stages" ], needs = [AOD_merge_task ["name" ]], is_mc = True , collision_system = COLTYPE )
1530- if QUALITYCONTROL_ROOT :
1531- add_analysis_qc_upload_tasks (workflow ["stages" ], args .productionTag , args .run , "passMC" )
1527+ if not args .make_evtpool :
1528+ # AOD merging as one global final step
1529+ aodmergerneeds = ['aod_' + str (tf ) for tf in range (1 , NTIMEFRAMES + 1 )]
1530+ AOD_merge_task = createTask (name = 'aodmerge' , needs = aodmergerneeds , lab = ["AOD" ], mem = '2000' , cpu = '1' )
1531+ AOD_merge_task ['cmd' ] = ' set -e ; [ -f aodmerge_input.txt ] && rm aodmerge_input.txt; '
1532+ AOD_merge_task ['cmd' ] += ' for i in `seq 1 ' + str (NTIMEFRAMES ) + '`; do echo "tf${i}/AO2D.root" >> aodmerge_input.txt; done; '
1533+ AOD_merge_task ['cmd' ] += ' o2-aod-merger --input aodmerge_input.txt --output AO2D.root'
1534+ # produce MonaLisa event stat file
1535+ AOD_merge_task ['cmd' ] += ' ; ${O2DPG_ROOT}/MC/bin/o2dpg_determine_eventstat.py'
1536+ workflow ['stages' ].append (AOD_merge_task )
1537+
1538+ job_merging = False
1539+ if includeFullQC :
1540+ workflow ['stages' ].extend (include_all_QC_finalization (ntimeframes = NTIMEFRAMES , standalone = False , run = args .run , productionTag = args .productionTag , conditionDB = args .conditionDB , qcdbHost = args .qcdbHost ))
1541+
1542+ if includeAnalysis :
1543+ # include analyses and potentially final QC upload tasks
1544+ add_analysis_tasks (workflow ["stages" ], needs = [AOD_merge_task ["name" ]], is_mc = True , collision_system = COLTYPE )
1545+ if QUALITYCONTROL_ROOT :
1546+ add_analysis_qc_upload_tasks (workflow ["stages" ], args .productionTag , args .run , "passMC" )
1547+ else :
1548+ wfneeds = ['sgngen_' + str (tf ) for tf in range (1 , NTIMEFRAMES + 1 )]
1549+ tfpool = ['tf' + str (tf ) + '/genevents_Kine.root' for tf in range (1 , NTIMEFRAMES + 1 )]
1550+ POOL_merge_task = createTask (name = 'poolmerge' , needs = wfneeds , lab = ["POOL" ], mem = '2000' , cpu = '1' )
1551+ POOL_merge_task ['cmd' ] = '${O2DPG_ROOT}/UTILS/root_merger.py -o evtpool.root -i ' + ',' .join (tfpool )
1552+ workflow ['stages' ].append (POOL_merge_task )
15321553
15331554# adjust for alternate (RECO) software environments
15341555adjust_RECO_environment (workflow , args .alternative_reco_software )
0 commit comments