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 = '' )
@@ -699,9 +700,14 @@ def getDPL_global_options(bigshm=False, ccdbbackend=True):
699700 # possible generator)
700701
701702 workflow ['stages' ].append (SGN_CONFIG_task )
703+
704+ # default flags for extkinO2 signal simulation (no transport)
705+ extkinO2Config = ''
706+ if GENERATOR == 'extkinO2' :
707+ extkinO2Config = ';GeneratorFromO2Kine.randomize=true;GeneratorFromO2Kine.rngseed=' + str (TFSEED )
702708
703709 # determine final conf key for signal simulation
704- CONFKEY = constructConfigKeyArg (create_geant_config (args , args .confKey ))
710+ CONFKEY = constructConfigKeyArg (create_geant_config (args , args .confKey + extkinO2Config ))
705711 # -----------------
706712 # transport signals
707713 # -----------------
@@ -741,7 +747,11 @@ def getDPL_global_options(bigshm=False, ccdbbackend=True):
741747 # determine the skip number
742748 cmd = 'export HEPMCEVENTSKIP=$(${O2DPG_ROOT}/UTILS/ReadHepMCEventSkip.sh ../HepMCEventSkip.json ' + str (tf ) + ');'
743749 SGNGENtask ['cmd' ] = cmd
744- SGNGENtask ['cmd' ] += '${O2_ROOT}/bin/o2-sim --noGeant -j 1 --field ccdb --vertexMode kCCDB' \
750+
751+ # No vertexing for event pool generation
752+ vtxmode = 'kNoVertex' if args .make_evtpool else 'kCCDB'
753+
754+ SGNGENtask ['cmd' ] += '${O2_ROOT}/bin/o2-sim --noGeant -j 1 --field ccdb --vertexMode ' + vtxmode \
745755 + ' --run ' + str (args .run ) + ' ' + str (CONFKEY ) + str (TRIGGER ) \
746756 + ' -g ' + str (GENERATOR ) + ' ' + str (INIFILE ) + ' -o genevents ' + embeddinto \
747757 + ('' , ' --timestamp ' + str (args .timestamp ))[args .timestamp != - 1 ] \
@@ -754,6 +764,11 @@ def getDPL_global_options(bigshm=False, ccdbbackend=True):
754764 if sep_event_mode == True :
755765 workflow ['stages' ].append (SGNGENtask )
756766 signalneeds = signalneeds + [SGNGENtask ['name' ]]
767+ if args .make_evtpool :
768+ continue
769+
770+ # GeneratorFromO2Kine parameters are needed only before the transport
771+ CONFKEY = re .sub (r'GeneratorFromO2Kine.*?;' , '' , CONFKEY )
757772
758773 sgnmem = 6000 if COLTYPE == 'PbPb' else 4000
759774 SGNtask = createTask (name = 'sgnsim_' + str (tf ), needs = signalneeds , tf = tf , cwd = 'tf' + str (tf ), lab = ["GEANT" ],
@@ -1520,26 +1535,32 @@ def addQCPerTF(taskName, needs, readerCommand, configFilePath, objectsFile=''):
15201535 TFcleanup ['cmd' ] += 'rm *cluster*.root'
15211536 workflow ['stages' ].append (TFcleanup )
15221537
1523- # AOD merging as one global final step
1524- aodmergerneeds = ['aod_' + str (tf ) for tf in range (1 , NTIMEFRAMES + 1 )]
1525- AOD_merge_task = createTask (name = 'aodmerge' , needs = aodmergerneeds , lab = ["AOD" ], mem = '2000' , cpu = '1' )
1526- AOD_merge_task ['cmd' ] = ' set -e ; [ -f aodmerge_input.txt ] && rm aodmerge_input.txt; '
1527- AOD_merge_task ['cmd' ] += ' for i in `seq 1 ' + str (NTIMEFRAMES ) + '`; do echo "tf${i}/AO2D.root" >> aodmerge_input.txt; done; '
1528- AOD_merge_task ['cmd' ] += ' o2-aod-merger --input aodmerge_input.txt --output AO2D.root'
1529- # produce MonaLisa event stat file
1530- AOD_merge_task ['cmd' ] += ' ; ${O2DPG_ROOT}/MC/bin/o2dpg_determine_eventstat.py'
1531- workflow ['stages' ].append (AOD_merge_task )
1532-
1533- job_merging = False
1534- if includeFullQC :
1535- workflow ['stages' ].extend (include_all_QC_finalization (ntimeframes = NTIMEFRAMES , standalone = False , run = args .run , productionTag = args .productionTag , conditionDB = args .conditionDB , qcdbHost = args .qcdbHost ))
1536-
1537-
1538- if includeAnalysis :
1539- # include analyses and potentially final QC upload tasks
1540- add_analysis_tasks (workflow ["stages" ], needs = [AOD_merge_task ["name" ]], is_mc = True , collision_system = COLTYPE )
1541- if QUALITYCONTROL_ROOT :
1542- add_analysis_qc_upload_tasks (workflow ["stages" ], args .productionTag , args .run , "passMC" )
1538+ if not args .make_evtpool :
1539+ # AOD merging as one global final step
1540+ aodmergerneeds = ['aod_' + str (tf ) for tf in range (1 , NTIMEFRAMES + 1 )]
1541+ AOD_merge_task = createTask (name = 'aodmerge' , needs = aodmergerneeds , lab = ["AOD" ], mem = '2000' , cpu = '1' )
1542+ AOD_merge_task ['cmd' ] = ' set -e ; [ -f aodmerge_input.txt ] && rm aodmerge_input.txt; '
1543+ AOD_merge_task ['cmd' ] += ' for i in `seq 1 ' + str (NTIMEFRAMES ) + '`; do echo "tf${i}/AO2D.root" >> aodmerge_input.txt; done; '
1544+ AOD_merge_task ['cmd' ] += ' o2-aod-merger --input aodmerge_input.txt --output AO2D.root'
1545+ # produce MonaLisa event stat file
1546+ AOD_merge_task ['cmd' ] += ' ; ${O2DPG_ROOT}/MC/bin/o2dpg_determine_eventstat.py'
1547+ workflow ['stages' ].append (AOD_merge_task )
1548+
1549+ job_merging = False
1550+ if includeFullQC :
1551+ workflow ['stages' ].extend (include_all_QC_finalization (ntimeframes = NTIMEFRAMES , standalone = False , run = args .run , productionTag = args .productionTag , conditionDB = args .conditionDB , qcdbHost = args .qcdbHost ))
1552+
1553+ if includeAnalysis :
1554+ # include analyses and potentially final QC upload tasks
1555+ add_analysis_tasks (workflow ["stages" ], needs = [AOD_merge_task ["name" ]], is_mc = True , collision_system = COLTYPE )
1556+ if QUALITYCONTROL_ROOT :
1557+ add_analysis_qc_upload_tasks (workflow ["stages" ], args .productionTag , args .run , "passMC" )
1558+ else :
1559+ wfneeds = ['sgngen_' + str (tf ) for tf in range (1 , NTIMEFRAMES + 1 )]
1560+ tfpool = ['tf' + str (tf ) + '/genevents_Kine.root' for tf in range (1 , NTIMEFRAMES + 1 )]
1561+ POOL_merge_task = createTask (name = 'poolmerge' , needs = wfneeds , lab = ["POOL" ], mem = '2000' , cpu = '1' )
1562+ POOL_merge_task ['cmd' ] = '${O2DPG_ROOT}/UTILS/root_merger.py -o evtpool.root -i ' + ',' .join (tfpool )
1563+ workflow ['stages' ].append (POOL_merge_task )
15431564
15441565# adjust for alternate (RECO) software environments
15451566adjust_RECO_environment (workflow , args .alternative_reco_software )
0 commit comments