Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
import re, os, sys
import FWCore.ParameterSet.Config as cms
from Configuration.DataProcessing.GetScenario import getScenario

"""
Example configuration for online reconstruction meant for visualization clients.
"""

unitTest = 'unitTest=True' in sys.argv

if unitTest:
    from DQM.Integration.config.unittestinputsource_cfi import options, runType, source
else:
    from DQM.Integration.config.inputsource_cfi import options, runType, source, set_BeamSplashRun_settings

# this is needed to map the names of the run-types chosen by DQM to the scenarios, ideally we could converge to the same names
#scenarios = {'pp_run': 'ppEra_Run2_2016','cosmic_run':'cosmicsEra_Run2_2016','hi_run':'HeavyIons'}
#scenarios = {'pp_run': 'ppEra_Run2_2016','pp_run_stage1': 'ppEra_Run2_2016','cosmic_run':'cosmicsEra_Run2_2016','cosmic_run_stage1':'cosmicsEra_Run2_2016','hi_run':'HeavyIonsEra_Run2_HI'}
scenarios = {'pp_run': 'ppEra_Run3','cosmic_run':'cosmicsEra_Run3','hi_run':'ppEra_Run3_pp_on_PbPb_approxSiStripClusters', 'commissioning_run':'cosmicsEra_Run3'}

if not runType.getRunTypeName() in scenarios.keys():
    msg = "Error getting the scenario out of the 'runkey', no mapping for: %s\n"%runType.getRunTypeName()
    raise RuntimeError(msg)

scenarioName = scenarios[runType.getRunTypeName()]

if not unitTest :
  if options.BeamSplashRun :
    scenarioName = 'ppEra_Run3'
    pass

print("Using scenario:",scenarioName)

try:
    scenario = getScenario(scenarioName)
except Exception as ex:
    msg = "Error getting Scenario implementation for %s\n" % (
        scenarioName,)
    msg += str(ex)
    raise RuntimeError(msg)

# A hack necessary to prevert scenario.visualizationProcessing
# from overriding the connect string
from DQM.Integration.config.FrontierCondition_GT_autoExpress_cfi import GlobalTag
kwds = {
   'globalTag': GlobalTag.globaltag.value(),
   'globalTagConnect': GlobalTag.connect.value(),
   'beamSplashRun' : ":localreco+hcalOnlyGlobalRecoSequence+caloTowersRec" if options.BeamSplashRun else "",
}

# explicitly select the input collection, since we get multiple in online
from EventFilter.RawDataCollector.rawDataMapperByLabel_cfi import rawDataMapperByLabel
rawDataMapperByLabel.rawCollectionList = ["rawDataRepacker"]

# example of how to add a filer IN FRONT of all the paths, eg for HLT selection
#kwds['preFilter'] = 'DQM/Integration/config/visualizationPreFilter.hltfilter'

# The following filter was used during 2018 high pile up (HPU) run.
#kwds['preFilter'] = 'DQM/Integration/config/visualizationPreFilter.pixelClusterFilter'

process = scenario.visualizationProcessing(writeTiers=['FEVT'], **kwds)

if unitTest:
    process.__dict__['_Process__name'] = "RECONEW"

process.source = source

if not unitTest:
    process.source.inputFileTransitionsEachEvent = True
    process.source.skipFirstLumis                = True
    process.source.minEventsPerLumi              = 0
    process.source.nextLumiTimeoutMillis         = 10000

    if options.BeamSplashRun:
        set_BeamSplashRun_settings( process.source )

    # stream label
    if runType.getRunType() == runType.hi_run:
        process.source.streamLabel = "streamHIDQMEventDisplay"
    else:
        process.source.streamLabel = "streamDQMEventDisplay"

    m = re.search(r"\((\w+)\)", str(source.runNumber))
    runno = str(m.group(1))
    outDir= options.outputBaseDir+'/EvD/run'+runno+'/streamEvDOutput2'
else:
    runno = options.runNumber
    outDir = "./upload"

#create output directory
try:
    os.makedirs(outDir)
except:
    pass

process.options = cms.untracked.PSet(
        Rethrow = cms.untracked.vstring('ProductNotFound'),
        wantSummary = cms.untracked.bool(True),
        numberOfThreads = cms.untracked.uint32(8),
        numberOfStreams = cms.untracked.uint32(8)
    )

process.maxEvents = cms.untracked.PSet(
        input = cms.untracked.int32(-1)
    )
oldo = process._Process__outputmodules["FEVToutput"]
del process._Process__outputmodules["FEVToutput"]

process.FEVToutput = cms.OutputModule("JsonWritingTimeoutPoolOutputModule",
    splitLevel = oldo.splitLevel,
    outputCommands = oldo.outputCommands,
    fileName = oldo.fileName,
    dataset = oldo.dataset,
    runNumber = cms.untracked.uint32(int(runno)),
    streamLabel = cms.untracked.string("streamEvDOutput2_dqmcluster"),
    # output path must exist!
    outputPath = cms.untracked.string(outDir),
)

if hasattr(oldo, 'SelectEvents'):
    process.FEVToutput.SelectEvents = oldo.SelectEvents

process.DQMMonitoringService = cms.Service("DQMMonitoringService")

dump = False
if dump:
    psetFile = open("RunVisualizationProcessingCfg.py", "w")
    psetFile.write(process.dumpPython())
    psetFile.close()
    cmsRun = "cmsRun -e RunVisualizationProcessingCfg.py"
    print("Now do:\n%s" % cmsRun)

print("Global Tag used:", process.GlobalTag.globaltag.value())
print("Final Source settings:", process.source)