Esempio n. 1
0
def SingleTopStep1(
  process,
  ):

  options = VarParsing('analysis')
  options.register ('isMC', True,
    VarParsing.multiplicity.singleton,
    VarParsing.varType.bool,
    "Run on MC"
  )
  options.register ('doDebug', False,
    VarParsing.multiplicity.singleton,
    VarParsing.varType.bool,
    "Run in debugging mode"
  )
  options.register ('doSkimming', True,
    VarParsing.multiplicity.singleton,
    VarParsing.varType.bool,
    "Preselect events"
  )
  options.register ('doSlimming', True,
    VarParsing.multiplicity.singleton,
    VarParsing.varType.bool,
    "Drop unnecessary collections"
  )
  options.register ('doMuon', True,
    VarParsing.multiplicity.singleton,
    VarParsing.varType.bool,
    "Do muon paths"
  )
  options.register ('doElectron', True,
    VarParsing.multiplicity.singleton,
    VarParsing.varType.bool,
    "Do electron paths"
  )

#Tag from https://twiki.cern.ch/twiki/bin/view/CMSPublic/SWGuideFrontierConditions?redirectedfrom=CMS.SWGuideFrontierConditions#2012_MC_production
# Latest for "53Y Releases (MC)"
  options.register ('globalTag', Config.globalTagMC,
    VarParsing.multiplicity.singleton,
    VarParsing.varType.string,
    "Global tag"
  )
  options.parseArguments()

  process.source.fileNames = cms.untracked.vstring(options.inputFiles)
  process.maxEvents = cms.untracked.PSet(
    input = cms.untracked.int32(options.maxEvents)
  )
  process.out.fileName = cms.untracked.string(options.outputFile)
  process.options = cms.untracked.PSet(wantSummary=cms.untracked.bool(options.doDebug))

  if options.doDebug:
    process.load("FWCore.MessageLogger.MessageLogger_cfi")
    process.MessageLogger = cms.Service("MessageLogger",
      destinations=cms.untracked.vstring('cout', 'debug'),
      debugModules=cms.untracked.vstring('*'),
      cout=cms.untracked.PSet(threshold=cms.untracked.string('INFO')),
      debug=cms.untracked.PSet(threshold=cms.untracked.string('DEBUG')),
    )
  else:
    process.load("FWCore.MessageService.MessageLogger_cfi")

  postfix = ""
  jetCorr = ['L1FastJet', 'L2Relative', 'L3Absolute']
  if not options.isMC:
      jetCorr += ['L2L3Residual']

  usePF2PAT(process, runPF2PAT=True, jetAlgo='AK5', runOnMC=options.isMC, postfix=postfix,
    jetCorrections=('AK5PFchs', jetCorr),
    pvCollection=cms.InputTag('goodOfflinePrimaryVertices'),
    #typeIMetCorrections = True
    typeIMetCorrections = False #Type1 MET now applied later using runMETUncertainties
  )

  # https://twiki.cern.ch/twiki/bin/view/CMSPublic/WorkBookJetEnergyCorrections#JetEnCorPFnoPU2012
  process.pfPileUp.Enable = True
  process.pfPileUp.checkClosestZVertex = False

  #-------------------------------------------------
  # selection step 2: vertex filter
  #-------------------------------------------------

  # https://twiki.cern.ch/twiki/bin/view/CMSPublic/WorkBookJetEnergyCorrections#JetEnCorPFnoPU2012
  # https://twiki.cern.ch/twiki/bin/viewauth/CMS/TWikiTopRefEventSel#Cleaning_Filters
  process.goodOfflinePrimaryVertices = cms.EDFilter(
    "PrimaryVertexObjectFilter"
  , filterParams = cms.PSet(
      minNdof = cms.double(4.0)
    , maxZ = cms.double(24.0)
    , maxRho = cms.double(2.0)
    )
  , filter = cms.bool(True)
  , src = cms.InputTag('offlinePrimaryVertices')
  )


  #-------------------------------------------------
  # Muons
  #-------------------------------------------------

  #if not maxLeptonIso is None:
  #    process.pfIsolatedMuons.isolationCut = maxLeptonIso

  #Use both isolated and non-isolated muons as a patMuon source
  #process.patMuons.pfMuonSource = cms.InputTag("pfMuons")
  #process.muonMatch.src = cms.InputTag("pfMuons")
  process.patMuons.pfMuonSource = cms.InputTag("pfIsolatedMuons")
  process.muonMatch.src = cms.InputTag("pfIsolatedMuons")

  process.selectedPatMuons.cut = "pt>20 && abs(eta)<3.0"

  # muon ID production (essentially track count embedding) must be here
  # because tracks get dropped from the collection after this step, resulting
  # in null ptrs.
  process.muonsWithID = cms.EDProducer(
    'MuonIDProducer',
    muonSrc = cms.InputTag("selectedPatMuons"),
    primaryVertexSource = cms.InputTag("goodOfflinePrimaryVertices")
  )

  #process.muonClones = cms.EDProducer("MuonShallowCloneProducer",
  #    src = cms.InputTag("selectedPatMuons")
  #)

  #-------------------------------------------------
  # Electrons
  # Implemented as in https://indico.cern.ch/getFile.py/access?contribId=1&resId=0&materialId=slides&confId=208765
  #-------------------------------------------------


  #if not maxLeptonIso is None:
  #    process.pfIsolatedElectrons.isolationCut = maxLeptonIso
  #Use both isolated and un-isolated electrons as patElectrons.
  #NB: no need to change process.electronMatch.src to pfElectrons,
  #    it's already gsfElectrons, which is a superset of the pfElectrons
  process.patElectrons.pfElectronSource = cms.InputTag("pfElectrons")

  process.load('EGamma.EGammaAnalysisTools.electronIdMVAProducer_cfi')
  process.mvaID = cms.Sequence(process.mvaTrigV0 + process.mvaNonTrigV0)
  process.patElectrons.electronIDSources.mvaTrigV0 = cms.InputTag("mvaTrigV0")
  process.patElectrons.electronIDSources.mvaNonTrigV0 = cms.InputTag("mvaNonTrigV0")
  process.patPF2PATSequence.replace(process.patElectrons, process.mvaID * process.patElectrons)
  process.selectedPatElectrons.cut = "pt>25 && abs(eta)<3.0"

  process.electronsWithID = cms.EDProducer(
    'ElectronIDProducer',
    electronSrc = cms.InputTag("selectedPatElectrons"),
    primaryVertexSource = cms.InputTag("goodOfflinePrimaryVertices")
  )
  #process.electronClones = cms.EDProducer("ElectronShallowCloneProducer",
  #    src = cms.InputTag("selectedPatElectrons")
  #)

  #if not maxLeptonIso is None:
  #    process.pfIsolatedElectrons.isolationCut = maxLeptonIso

  #electron dR=0.3
  process.pfElectrons.isolationValueMapsCharged = cms.VInputTag(cms.InputTag("elPFIsoValueCharged03PFId"))
  process.pfElectrons.deltaBetaIsolationValueMap = cms.InputTag("elPFIsoValuePU03PFId")
  process.pfElectrons.isolationValueMapsNeutral = cms.VInputTag(cms.InputTag("elPFIsoValueNeutral03PFId"), cms.InputTag("elPFIsoValueGamma03PFId"))
  process.pfElectrons.deltaBetaIsolationValueMap = cms.InputTag("elPFIsoValuePU03PFId")
  process.pfElectrons.isolationValueMapsNeutral = cms.VInputTag(cms.InputTag("elPFIsoValueNeutral03PFId"), cms.InputTag("elPFIsoValueGamma03PFId"))

  process.patElectrons.isolationValues.pfNeutralHadrons = cms.InputTag("elPFIsoValueNeutral03PFId")
  process.patElectrons.isolationValues.pfChargedAll = cms.InputTag("elPFIsoValueChargedAll03PFId")
  process.patElectrons.isolationValues.pfPUChargedHadrons = cms.InputTag("elPFIsoValuePU03PFId")
  process.patElectrons.isolationValues.pfPhotons = cms.InputTag("elPFIsoValueGamma03PFId")
  process.patElectrons.isolationValues.pfChargedHadrons = cms.InputTag("elPFIsoValueCharged03PFId")

  process.pfIsolatedElectrons.isolationValueMapsCharged = cms.VInputTag(cms.InputTag("elPFIsoValueCharged03PFId"))
  process.pfIsolatedElectrons.deltaBetaIsolationValueMap = cms.InputTag("elPFIsoValuePU03PFId")
  process.pfIsolatedElectrons.isolationValueMapsNeutral = cms.VInputTag(cms.InputTag("elPFIsoValueNeutral03PFId"), cms.InputTag("elPFIsoValueGamma03PFId"))


  #-------------------------------------------------
  # Jets
  # MET corrections as https://twiki.cern.ch/twiki/bin/view/CMSPublic/WorkBookMetAnalysis#Type_I_0_with_PAT
  #-------------------------------------------------

  #pfNoTau == True => remove taus from jets
  #process.pfNoTau.enable = noTau

  process.selectedPatJets.cut = cms.string("pt>30 && abs(eta)<5.0")
  process.load("CMGTools.External.pujetidsequence_cff")
  process.patPF2PATSequence += process.puJetIdSqeuence
  #process.jetClones = cms.EDProducer("CaloJetShallowCloneProducer",
  #    src = cms.InputTag("seletedPatJets")
  #)

  #-------------------------------------------------
  # MET uncertainty step
  #-------------------------------------------------
  #Embed the reference to the original jet in the jets, which is constant during the propagation
  process.patJetsWithOwnRef = cms.EDProducer('PatObjectOwnRefProducer<pat::Jet>',
      src=cms.InputTag("selectedPatJets")
  )

  #Note: this module causes a large memory increase when crossing the file boundary
  #Reason - unknown, solution: limit processing to ~1 file.
  from PhysicsTools.PatUtils.tools.metUncertaintyTools import runMEtUncertainties
  runMEtUncertainties(process,
       electronCollection=cms.InputTag("electronsWithID"),
       photonCollection=None,
       muonCollection=cms.InputTag("muonsWithID"),
       tauCollection="", # "" means emtpy, None means cleanPatTaus
       jetCollection=cms.InputTag("patJetsWithOwnRef"),
       jetCorrLabel="L3Absolute" if options.isMC else "L2L3Residual",
       doSmearJets=options.isMC,
       jetCorrPayloadName="AK5PFchs",
       addToPatDefaultSequence=False
  )
  process.stpolMetUncertaintySequence = cms.Sequence(
      process.metUncertaintySequence
  )

  if not options.doSlimming:
      process.out.outputCommands = cms.untracked.vstring('keep *')
  else:
      process.out.outputCommands = cms.untracked.vstring([
          'drop *',

          'keep edmMergeableCounter_*_*_*', # Keep the lumi-block counter information
          'keep edmTriggerResults_TriggerResults__*', #Keep the trigger results
          'keep *_genParticles__*', #keep all the genParticles
          #'keep recoVertexs_offlinePrimaryVertices__*', #keep the offline PV-s
          'keep recoVertexs_goodOfflinePrimaryVertices__*', #keep the offline PV-s

          # Jets
          'keep patJets_*__*',
          'keep double_*_rho_*', #For rho-corr rel iso
          'keep recoGenJets_selectedPatJets_genJets_*', #For Jet MC smearing we need to keep the genJets
          "keep *_puJetId_*_*", # input variables
          "keep *_puJetMva_*_*", # final MVAs and working point flags
          'keep *_jetClones__*',

          # Muons
          'keep patMuons_*__*',
          'keep *_muonClones__*',

          # Electrons
          'keep patElectrons_*__*',
          'keep *_electronClones__*',

          # METs
          'keep patMETs_*__*',

          #ECAL laser corr filter
          'keep bool_ecalLaserCorrFilter__*',

          #For flavour analyzer
          'keep GenEventInfoProduct_generator__*',

          #PU info
          'keep PileupSummaryInfos_addPileupInfo__*',

          ##PFCandidates
          #'keep recoPFCandidates_*_pfCandidates_PAT',
          #'keep recoPFMETs_pfMET__*',
          #'keep recoPFMETs_pfMet__*',
          #'keep recoGenMETs_genMetTrue__*',
          #'keep recoPFCandidates_particleFlow__*',
          #'keep recoConversions_allConversions__*',
          #'keep recoVertexCompositeCandidates_generalV0Candidates_*_*',
          #'keep recoTracks_generalTracks__*',
          #'keep recoBeamSpot_offlineBeamSpot__*',
          #'keep recoMuons_muons__*',

          'keep int_*__PAT',
          'keep ints_*__PAT',
          'keep double_*__PAT',
          'keep doubles_*__PAT',
          'keep float_*__PAT',
          'keep floats_*__PAT',
      ])

  #FIXME: is this correct?
  #Keep events that pass either the muon OR the electron path
  process.out.SelectEvents = cms.untracked.PSet(
    SelectEvents = cms.vstring(
      []
    )
  )

  #-------------------------------------------------
  # Paths
  #-------------------------------------------------

  process.goodOfflinePVCount = cms.EDProducer(
      "CollectionSizeProducer<reco::Vertex>",
      src = cms.InputTag("goodOfflinePrimaryVertices")
  )

  process.preCalcSequences = cms.Sequence(
    process.patJetsWithOwnRef *
    process.goodOfflinePVCount
  )

  process.patPF2PATSequence.insert(process.patPF2PATSequence.index(process.selectedPatMuons) + 1, process.muonsWithID)
  process.patPF2PATSequence.insert(process.patPF2PATSequence.index(process.selectedPatElectrons) + 1, process.electronsWithID)

  #Need separate paths because of skimming

  if options.doMuon:
    process.singleTopPathStep1Mu = cms.Path(
      process.goodOfflinePrimaryVertices
      * process.patPF2PATSequence
      #* process.muonClones
      #* process.electronClones
      #* process.jetClones
    )

  if options.doElectron:
    process.singleTopPathStep1Ele = cms.Path(
      process.goodOfflinePrimaryVertices
      * process.patPF2PATSequence
      #* process.muonClones
      #* process.electronClones
      #* process.jetClones
    )

  if options.doMuon:
    process.out.SelectEvents.SelectEvents.append("singleTopPathStep1Mu")
  if options.doElectron:
    process.out.SelectEvents.SelectEvents.append("singleTopPathStep1Ele")

  process.GlobalTag.globaltag = cms.string(options.globalTag)

  process.singleTopPathStep1Mu += process.preCalcSequences
  process.singleTopPathStep1Ele += process.preCalcSequences

  if options.doMuon:
    process.singleTopPathStep1Mu += process.stpolMetUncertaintySequence
  if options.doElectron:
    process.singleTopPathStep1Ele += process.stpolMetUncertaintySequence


  if options.isMC:
    #https://twiki.cern.ch/twiki/bin/view/CMSPublic/SWGuideBTagJetProbabilityCalibration?redirectedfrom=CMS.SWGuideBTagJetProbabilityCalibration#Calibration_in_53x_Data_and_MC
    process.GlobalTag.toGet = cms.VPSet(
      cms.PSet(record = cms.string("BTagTrackProbability2DRcd"),
      tag = cms.string("TrackProbabilityCalibration_2D_MC53X_v2"),
      connect = cms.untracked.string("frontier://FrontierPrep/CMS_COND_BTAU")),
      cms.PSet(record = cms.string("BTagTrackProbability3DRcd"),
      tag = cms.string("TrackProbabilityCalibration_3D_MC53X_v2"),
      connect = cms.untracked.string("frontier://FrontierPrep/CMS_COND_BTAU"))
    )
  else:
    #https://twiki.cern.ch/twiki/bin/view/CMSPublic/SWGuideBTagJetProbabilityCalibration?redirectedfrom=CMS.SWGuideBTagJetProbabilityCalibration#Calibration_in_53x_Data_and_MC
    process.GlobalTag.toGet = cms.VPSet(
      cms.PSet(record = cms.string("BTagTrackProbability2DRcd"),
      tag = cms.string("TrackProbabilityCalibration_2D_Data53X_v2"),
      connect = cms.untracked.string("frontier://FrontierPrep/CMS_COND_BTAU")),
      cms.PSet(record = cms.string("BTagTrackProbability3DRcd"),
      tag = cms.string("TrackProbabilityCalibration_3D_Data53X_v2"),
      connect = cms.untracked.string("frontier://FrontierPrep/CMS_COND_BTAU"))
    )

    process.load('RecoMET.METFilters.ecalLaserCorrFilter_cfi')
    process.ecalLaserCorrFilter.taggingMode=True

    # https://twiki.cern.ch/twiki/bin/viewauth/CMS/TWikiTopRefEventSel#Cleaning_Filters
    process.scrapingFilter = cms.EDFilter("FilterOutScraping"
      , applyfilter = cms.untracked.bool(True)
      , debugOn = cms.untracked.bool(False)
      , numtrack = cms.untracked.uint32(10)
      , thresh = cms.untracked.double(0.25)
    )

    #if doElectron:
    #  process.singleTopPathStep1Ele.insert(0, process.scrapingFilter)
    #if doMuon:
    #  process.singleTopPathStep1Mu.insert(0, process.scrapingFilter)

    process.patPF2PATSequence += process.scrapingFilter
    process.patPF2PATSequence += process.ecalLaserCorrFilter

  #if not onGrid:
  #  from SingleTopPolarization.Analysis.cmdlineParsing import enableCommandLineArguments
  #  enableCommandLineArguments(process)
  #else:
  #  process.out.fileName = "step1.root"

  if options.doSkimming:
    process.out.fileName.setValue(process.out.fileName.value().replace(".root", "_Skim.root"))
  else:
    process.out.fileName.setValue(process.out.fileName.value().replace(".root", "_noSkim.root"))

  #-----------------------------------------------
  # Skimming
  #-----------------------------------------------

  #Throw away events before particle flow?
  if options.doSkimming:
      from SingleTopPolarization.Analysis.eventSkimming_cfg import skimFilters
      skimFilters(process)

      if options.doMuon:
        process.singleTopPathStep1Mu.insert(0, process.muonSkim)
      if options.doElectron:
        process.singleTopPathStep1Ele.insert(0, process.electronSkim)


  #-----------------------------------------------
  # Skim efficiency counters
  #-----------------------------------------------

  #count all processed events
  countProcessed(process)

  #count events passing mu and ele paths

  if options.doMuon:
    countInSequence(process, process.singleTopPathStep1Mu)
  if options.doElectron:
    countInSequence(process, process.singleTopPathStep1Ele)
  #-------------------------------------------------
  #
  #-------------------------------------------------

  if not options.doSlimming:
    process.out.fileName.setValue(process.out.fileName.value().replace(".root", "_noSlim.root"))

  return process
Esempio n. 2
0
def SingleTopStep1(
    process,
    ):

    options = VarParsing('analysis')
    options.register ('isMC', True,
        VarParsing.multiplicity.singleton,
        VarParsing.varType.bool,
        "Run on MC"
    )
    options.register ('doDebug', False,
        VarParsing.multiplicity.singleton,
        VarParsing.varType.bool,
        "Run in debugging mode"
    )
    options.register ('doSkimming', True,
        VarParsing.multiplicity.singleton,
        VarParsing.varType.bool,
        "Preselect events"
    )
    options.register ('doSlimming', True,
        VarParsing.multiplicity.singleton,
        VarParsing.varType.bool,
        "Drop unnecessary collections"
    )
    options.register ('runOnFastSim', False,
        VarParsing.multiplicity.singleton,
        VarParsing.varType.bool,
        "FastSim-specific processing"
    )

    options.register ('doSync', False,
        VarParsing.multiplicity.singleton,
        VarParsing.varType.bool,
        "Synchronization exercise"
    )

    #Tag from https://twiki.cern.ch/twiki/bin/view/CMSPublic/SWGuideFrontierConditions?redirectedfrom=CMS.SWGuideFrontierConditions#2012_MC_production
    #Latest for "53Y Releases (MC)"
    options.register ('globalTag', Config.globalTagMC,
        VarParsing.multiplicity.singleton,
        VarParsing.varType.string,
        "Global tag"
    )
    options.parseArguments()

    if len(options.inputFiles)==0:
            options.inputFiles = cms.untracked.vstring(['/store/relval/CMSSW_5_3_6-START53_V14/RelValProdTTbar/AODSIM/v2/00000/76ED0FA6-1E2A-E211-B8F1-001A92971B72.root'])
    process.source.fileNames = cms.untracked.vstring(options.inputFiles)
    process.maxEvents = cms.untracked.PSet(
        input = cms.untracked.int32(options.maxEvents)
    )
    process.out.fileName = cms.untracked.string(options.outputFile)
    process.options = cms.untracked.PSet(wantSummary=cms.untracked.bool(options.doDebug))

    if options.doDebug:
        process.load("FWCore.MessageLogger.MessageLogger_cfi")
        process.MessageLogger = cms.Service("MessageLogger",
            destinations=cms.untracked.vstring('cout', 'debug'),
            debugModules=cms.untracked.vstring('*'),
            cout=cms.untracked.PSet(threshold=cms.untracked.string('INFO')),
            debug=cms.untracked.PSet(threshold=cms.untracked.string('DEBUG')),
        )
    else:
        process.load("FWCore.MessageService.MessageLogger_cfi")

    #https://twiki.cern.ch/twiki/bin/viewauth/CMS/IntroToJEC
    #https://twiki.cern.ch/twiki/bin/view/CMSPublic/WorkBookJetEnergyCorrections#JetEnCor2012Summer13
    postfix = ""
    jetCorr = ['L1FastJet', 'L2Relative', 'L3Absolute']
    if not options.isMC:
            jetCorr += ['L2L3Residual']
    print options

    usePF2PAT(process, runPF2PAT=True, jetAlgo='AK5', runOnMC=options.isMC, postfix=postfix,
        jetCorrections=('AK5PFchs', jetCorr),
        pvCollection=cms.InputTag('goodOfflinePrimaryVertices'),
        #typeIMetCorrections = True
        typeIMetCorrections = False #Type1 MET now applied later using runMETUncertainties
    )

    # https://twiki.cern.ch/twiki/bin/view/CMSPublic/WorkBookJetEnergyCorrections#JetEnCorPFnoPU2012
    process.pfPileUp.Enable = True
    process.pfPileUp.checkClosestZVertex = False

    #-------------------------------------------------
    # selection step 2: vertex filter
    #-------------------------------------------------

    # https://twiki.cern.ch/twiki/bin/view/CMSPublic/WorkBookJetEnergyCorrections#JetEnCorPFnoPU2012
    # https://twiki.cern.ch/twiki/bin/viewauth/CMS/TWikiTopRefEventSel#Cleaning_Filters
    #process.goodOfflinePrimaryVertices = cms.EDFilter(
    #    "PrimaryVertexObjectFilter"
    #, filterParams = cms.PSet(
    #        minNdof = cms.double(4.0)
    #    , maxZ = cms.double(24.0)
    #    , maxRho = cms.double(2.0)
    #    )
    #, filter = cms.bool(True)
    #, src = cms.InputTag('offlinePrimaryVertices')
    #)

    process.goodOfflinePrimaryVertices = cms.EDFilter("FirstVertexFilter",
        src = cms.InputTag("offlinePrimaryVertices"),
        cut = cms.string('!isFake & ndof >= 4. & abs(z) < 24. & position.Rho < 2.')
    )

    from EventFilters_cff import ApplyEventFilters
    ApplyEventFilters(process, runOnFastSim=options.runOnFastSim)
    #-------------------------------------------------
    # Muons
    #-------------------------------------------------

    #process.selectedPatMuons.cut = "pt>10 && abs(eta)<3.0"

    # Enable delta-beta correction for the muon isolation and set the recommended cut [1]
    # [1] https://twiki.cern.ch/twiki/bin/view/CMSPublic/SWGuideMuonId?rev=46#Muon_Isolation
    process.pfIsolatedMuons.doDeltaBetaCorrection = True
    process.pfIsolatedMuons.deltaBetaFactor = -0.5
    process.pfIsolatedMuons.isolationCut = 0.2

    #process.pfSelectedMuons.cut = 'abs(eta)<2.5 && pt>10.'
    process.pfSelectedMuons.cut = '(pt > 10.) && (abs(eta) < 2.5) && (muonRef.isAvailable) && (muonRef.isPFMuon) && (muonRef.isGlobalMuon || isTrackerMuon)'
    process.patMuons.embedTrack = True
    process.patMuons.usePV = False
    #process.selectedPatMuons.cut = "(abs(eta) < 2.5) && (pt > 10.0) && ((chargedHadronIso+max(0.,neutralHadronIso+photonIso-0.50*puChargedHadronIso))/pt < 0.20) && (isPFMuon && (isGlobalMuon || isTrackerMu)"

    # Release cuts on compatibility with the first primary vertex (similar to electrons)
    process.pfMuonsFromVertex.d0Cut = 9999.
    process.pfMuonsFromVertex.d0SigCut = 9999.
    process.pfMuonsFromVertex.dzCut = 9999.
    process.pfMuonsFromVertex.dzSigCut = 9999.

    process.patMuons.pfMuonSource = cms.InputTag("pfIsolatedMuons")
    process.muonMatch.src = cms.InputTag("pfIsolatedMuons")

    process.muonMatchAll = process.muonMatch.clone(
        src = cms.InputTag("pfMuons")
    )
    process.patMuonsAll = process.patMuons.clone(
        pfMuonSource = cms.InputTag("pfMuons"),
        genParticleMatch = cms.InputTag("muonMatchAll"),
    )
    process.selectedPatMuonsAll = process.selectedPatMuons.clone(
        src = cms.InputTag("patMuonsAll"),
    )

    # muon ID production (essentially track count embedding) must be here
    # because tracks get dropped from the collection after this step, resulting
    # in null ptrs.
    process.muonsWithID = cms.EDProducer(
        'MuonIDProducer',
        muonSrc = cms.InputTag("selectedPatMuons"),
        primaryVertexSource = cms.InputTag("goodOfflinePrimaryVertices")
    )
    process.muonsWithIDAll = process.muonsWithID.clone(
        muonSrc = cms.InputTag("selectedPatMuonsAll")
    )
    process.muonSequence = cms.Sequence()
    if options.isMC:
        process.muonSequence += process.muonMatchAll
    process.muonSequence += (
        process.patMuonsAll *
        process.selectedPatMuonsAll *
        process.muonsWithIDAll
    )

    #-------------------------------------------------
    # Electrons
    # Implemented as in https://indico.cern.ch/getFile.py/access?contribId=1&resId=0&materialId=slides&confId=208765
    #-------------------------------------------------

    #From EgammaAnalysis/ElectronTools/test/patTuple_electronId_cfg.py
    process.load('EgammaAnalysis.ElectronTools.electronIdMVAProducer_cfi')
    process.load('EgammaAnalysis.ElectronTools.electronIsolatorFromEffectiveArea_cfi')
    process.mvaID = cms.Sequence(    process.mvaTrigV0 + process.mvaTrigNoIPV0 + process.mvaNonTrigV0 )
    process.patElectrons.electronIDSources = cms.PSet(
        mvaTrigV0 = cms.InputTag("mvaTrigV0"),
        mvaNonTrigV0 = cms.InputTag("mvaNonTrigV0"),
        mvaTrigNoIPV0 = cms.InputTag("mvaTrigNoIPV0"),
    )
    process.patPF2PATSequence.replace(process.patElectrons, process.mvaID * process.patElectrons)
    #process.selectedPatElectrons.cut = "pt>20 && abs(eta)<3.0"

    process.electronsWithID = cms.EDProducer(
        'ElectronIDProducer',
        electronSrc = cms.InputTag("selectedPatElectrons"),
        primaryVertexSource = cms.InputTag("goodOfflinePrimaryVertices")
    )

    process.pfElectrons.isolationValueMapsCharged = cms.VInputTag(cms.InputTag("elPFIsoValueCharged03PFId"))
    process.pfElectrons.isolationValueMapsNeutral = cms.VInputTag(cms.InputTag("elPFIsoValueNeutral03PFId"), cms.InputTag("elPFIsoValueGamma03PFId"))
    process.pfElectrons.isolationValueMapsNeutral = cms.VInputTag(cms.InputTag("elPFIsoValueNeutral03PFId"), cms.InputTag("elPFIsoValueGamma03PFId"))

    process.patElectrons.isolationValues.pfNeutralHadrons = cms.InputTag("elPFIsoValueNeutral03PFId")
    process.patElectrons.isolationValues.pfChargedAll = cms.InputTag("elPFIsoValueChargedAll03PFId")
    process.patElectrons.isolationValues.pfPUChargedHadrons = cms.InputTag("elPFIsoValuePU03PFId")
    process.patElectrons.isolationValues.pfPhotons = cms.InputTag("elPFIsoValueGamma03PFId")
    process.patElectrons.isolationValues.pfChargedHadrons = cms.InputTag("elPFIsoValueCharged03PFId")

    process.pfIsolatedElectrons.isolationValueMapsCharged = cms.VInputTag(cms.InputTag("elPFIsoValueCharged03PFId"))
    process.pfIsolatedElectrons.deltaBetaIsolationValueMap = cms.InputTag('elPFIsoValueEA03')
    # Define a module to produce a value map with rho correction of electron isolation. The
    # configuration fragment is copied from [1] because it is not included in the current tag of
    # UserCode/EGamma/EGammaAnalysisTools. General outline of configuration is inspired by [2].
    # [1] http://cmssw.cvs.cern.ch/cgi-bin/cmssw.cgi/UserCode/EGamma/EGammaAnalysisTools/python/electronIsolatorFromEffectiveArea_cfi.py?hideattic=0&revision=1.1.2.2&view=markup
    # [2] https://twiki.cern.ch/twiki/bin/viewauth/CMS/TwikiTopRefHermeticTopProjections?rev=4#Electrons
    #
    # In both real data and simulation an effective area derived from real data (2012 HCP dataset)
    # is applied. Possible difference between data and simulation is belived to be small [3-4]
    # [3] https://hypernews.cern.ch/HyperNews/CMS/get/top/1607.html
    # [4] https://hypernews.cern.ch/HyperNews/CMS/get/egamma/1263/1/2/1.html
    process.elPFIsoValueEA03 = cms.EDFilter('ElectronIsolatorFromEffectiveArea',
        gsfElectrons = cms.InputTag('gsfElectrons'),
        pfElectrons = cms.InputTag('pfSelectedElectrons'),
        rhoIso = cms.InputTag('kt6PFJets', 'rho'),
        EffectiveAreaType = cms.string('kEleGammaAndNeutralHadronIso03'),
        EffectiveAreaTarget = cms.string('kEleEAData2012'))
    process.patPF2PATSequence.replace(
        process.pfIsolatedElectrons,
        process.elPFIsoValueEA03 * process.pfIsolatedElectrons
    )
    process.pfIsolatedElectrons.isolationValueMapsNeutral = cms.VInputTag(cms.InputTag("elPFIsoValueNeutral03PFId"), cms.InputTag("elPFIsoValueGamma03PFId"))

    #process.pfIdentifiedElectrons = cms.EDFilter("ElectronIDPFCandidateSelector",
    #    recoGsfElectrons = cms.InputTag("gsfElectrons"),
    #    electronIdMap = cms.InputTag("mvaTrigV0"),
    #    electronIdCut = cms.double(0.0),
    #    src = cms.InputTag("pfSelectedElectrons")
    #)
    #process.pfSelectedElectrons.src = 'pfIdentifiedElectrons'
    #process.pfSelectedElectrons.cut = 'abs(eta)<2.5 && pt>20. && gsfTrackRef.isNonnull && gsfTrackRef.trackerExpectedHitsInner.numberOfLostHits<2'

    # Adjust parameters for the rho correction [1]. The cut on the isolation value is set in
    # accordance with [2]
    # [1] https://twiki.cern.ch/twiki/bin/viewauth/CMS/TwikiTopRefHermeticTopProjections?rev=4#Electrons
    # [2] https://twiki.cern.ch/twiki/bin/view/CMS/TWikiTopRefEventSel?rev=178#Veto
    process.pfIsolatedElectrons.doDeltaBetaCorrection = True
    process.pfIsolatedElectrons.deltaBetaFactor = -1.
    process.pfIsolatedElectrons.isolationCut = 0.15

    process.patPF2PATSequence.replace(
        process.pfSelectedElectrons,
        process.mvaTrigV0 +
        #process.pfIdentifiedElectrons +
        process.pfSelectedElectrons +
        process.elPFIsoValueEA03
    )

    process.patElectrons.isolationValues.user = cms.VInputTag(cms.InputTag("elPFIsoValueEA03"))
    process.patElectrons.electronIDSources = cms.PSet( mvaTrigV0 = cms.InputTag("mvaTrigV0"))

    # Release cuts on compatibility with the first primary vertex, as recommended in [1]
    # [1] https://hypernews.cern.ch/HyperNews/CMS/get/egamma-elecid/72/1.html
    process.pfElectronsFromVertex.d0Cut = 9999.
    process.pfElectronsFromVertex.d0SigCut = 9999.
    process.pfElectronsFromVertex.dzCut = 9999.
    process.pfElectronsFromVertex.dzSigCut = 9999.

    # Apply remaining cuts that define veto electrons as required in [1]. It is implemented via an
    # additional module and not in pfSelectedElectrons, becase all the isolation maps are associated
    # with the latter collection, and they will be needed also for a looser electron selection
    # [1] https://twiki.cern.ch/twiki/bin/view/CMS/TWikiTopRefEventSel?rev=178#Veto
    process.pfElectronsForTopProjection = process.pfSelectedElectrons.clone(
        src = "pfIsolatedElectrons",
        cut = "pt > 20. && abs(eta) < 2.5")
    process.pfNoElectron.topCollection = 'pfElectronsForTopProjection'

    process.patPF2PATSequence.replace(process.pfIsolatedElectrons,
        process.pfIsolatedElectrons * process.pfElectronsForTopProjection)

    #process.selectedPatElectrons.cut = "(abs(eta)<2.5) && (pt>20.) && ((chargedHadronIso + max(0.0, neutralHadronIso + photonIso - 1.0*userIsolation('User1Iso')))/pt < 0.15) && (electronID('mvaTrigV0') > 0.00)"

    process.patElectronsAll = process.patElectrons.clone(
        pfElectronSource=cms.InputTag("pfElectrons")
    )
    process.selectedPatElectronsAll = process.selectedPatElectrons.clone(
        src=cms.InputTag("patElectronsAll")
    )
    process.electronsWithIDAll = process.electronsWithID.clone(
        electronSrc = cms.InputTag("selectedPatElectronsAll")
    )

    process.electronSequence = cms.Sequence(
        process.patElectronsAll *
        process.selectedPatElectronsAll *
        process.electronsWithIDAll
    )

    #---------------------------------------------
    # Trigger matching
    #---------------------------------------------

    process.load('PhysicsTools.PatAlgos.triggerLayer1.triggerProducer_cfi')
    process.load('PhysicsTools.PatAlgos.triggerLayer1.triggerEventProducer_cfi')

    process.patTriggerSequence = cms.Sequence(
        process.patTrigger *
        process.patTriggerEvent
    )

    #-------------------------------------------------
    # Jets
    # MET corrections as https://twiki.cern.ch/twiki/bin/view/CMSPublic/WorkBookMetAnalysis#Type_I_0_with_PAT
    #-------------------------------------------------

    #Taus are NOT removed from jets
    process.pfNoTau.enable = False

    # From Andrey's code
    # Jet identification criteria as recommended in [1-2]. The fraction of neutral-hadron and
    # HF-hadron energy is defined below differently from the formula in [2]. However, the formula
    # is written for uncorrected jets, while JEC-corrected ones are used below. One can rescale the
    # jet energy in the formula, but the expression below yields the same result. All accessors to
    # energy fractions from PAT jets account for the effect of JEC
    # [1] https://twiki.cern.ch/twiki/bin/viewauth/CMS/JetID
    # [2] https://hypernews.cern.ch/HyperNews/CMS/get/JetMET/1429.html
    jetQualityCut = "numberOfDaughters > 1 & (neutralHadronEnergyFraction + HFHadronEnergyFraction) < 0.99 & neutralEmEnergyFraction < 0.99 & (abs(eta) < 2.4 & chargedEmEnergyFraction < 0.99 & chargedHadronEnergyFraction > 0. & chargedMultiplicity > 0 | abs(eta) >= 2.4)"

    # Apply the jet ID defined above to selected pat jets. It will be inherited by all the jet
    # collections considered in the analysis, including those produced by the MET uncertainty tool.
    # The latter is reasonable as we do not want to apply JEC variation, for instance, to fake jets
    process.selectedPatJets.cut = jetQualityCut

    process.load("CMGTools.External.pujetidsequence_cff")
    process.patPF2PATSequence += process.puJetIdSqeuence

    #-------------------------------------------------
    # MET uncertainty step
    #-------------------------------------------------
    #Embed the reference to the original jet in the jets, which is constant during the propagation
    process.patJetsWithOwnRef = cms.EDProducer('PatObjectOwnRefProducer<pat::Jet>',
            src=cms.InputTag("selectedPatJets")
    )

    #Note: this module causes a large memory increase when crossing the file boundary
    #Reason - unknown, solution: limit processing to ~1 file.
    from PhysicsTools.PatUtils.tools.metUncertaintyTools import runMEtUncertainties
    #for type 0

    process.load('JetMETCorrections.Type1MET.pfMETsysShiftCorrections_cfi')
    if options.isMC:
            corrpars = process.pfMEtSysShiftCorrParameters_2012runABCDvsNvtx_mc
    else:
            corrpars = process.pfMEtSysShiftCorrParameters_2012runABCDvsNvtx_data

    runMEtUncertainties(process,
             electronCollection=cms.InputTag("electronsWithID"),
             photonCollection=None,
             muonCollection=cms.InputTag("muonsWithID"),
             tauCollection="", # "" means emtpy, None means cleanPatTaus
             jetCollection=cms.InputTag("patJetsWithOwnRef"),
             jetCorrLabel="L3Absolute" if options.isMC else "L2L3Residual",
             doSmearJets=options.isMC and not options.doSync,
             #doSmearJets=False,
             jetCorrPayloadName="AK5PFchs",
             addToPatDefaultSequence=False,
             doApplyType0corr=True,
             doApplySysShiftCorr = True,
             makeType1corrPFMEt = True, makeType1p2corrPFMEt = False,
             sysShiftCorrParameter = corrpars
    )

    #process.selectedVerticesForMEtCorr.src = cms.InputTag("goodOfflinePrimaryVertices")

    process.metUncertaintySequence.replace(process.patType1CorrectedPFMet,
        process.type0PFMEtCorrection + process.patPFMETtype0Corr + process.pfMEtSysShiftCorrSequence + process.patType1CorrectedPFMet
    )

    #Switch off checking for overlaps between leptons and jets
    #process.patJetsWithOwnRefNotOverlappingWithLeptonsForMEtUncertainty.checkOverlaps = cms.PSet()
    #process.patJetsNotOverlappingWithLeptonsForMEtUncertainty.checkOverlaps = cms.PSet()

    process.stpolMetUncertaintySequence = cms.Sequence(
            process.metUncertaintySequence
    )

    if not options.doSlimming or options.doDebug:
            process.out.outputCommands = cms.untracked.vstring('keep *')
    else:
            process.out.outputCommands = cms.untracked.vstring([
                    'drop *',

                    'keep edmMergeableCounter_*_*_*', # Keep the lumi-block counter information
                    'keep edmTriggerResults_TriggerResults__*', #Keep the trigger results
                    'keep *_genParticles__*', #keep all the genParticles
                    #'keep recoVertexs_offlinePrimaryVertices__*', #keep the offline PV-s
                    'keep recoVertexs_goodOfflinePrimaryVertices__*', #keep the offline PV-s

                    # Trigger
                    'keep *_patTrigger_*_*',
                    'keep *_patTriggerEvent_*_*',

                    # Jets
                    'keep patJets_*__*',
                    'keep double_*_rho_*', #For rho-corr rel iso
                    'keep recoGenJets_selectedPatJets_genJets_*', #For Jet MC smearing we need to keep the genJets
                    "keep *_puJetId_*_*", # input variables
                    "keep *_puJetMva_*_*", # final MVAs and working point flags
                    'keep *_jetClones__*',

                    # Muons
                    'keep *_muons__*', #reco muons
                    'keep patMuons_muonsWithID__*',
                    'keep patMuons_muonsWithIDAll__*',
                    'keep *_muonClones__*',

                    # Electrons
                    'keep patElectrons_electronsWithID__*',
                    'keep patElectrons_electronsWithIDAll__*',
                    'keep *_electronClones__*',

                    # METs
                    'keep patMETs_*__*',

                    #ECAL laser corr filter
                    'keep bool_ecalLaserCorrFilter__*',

                    #For flavour analyzer
                    'keep GenEventInfoProduct_generator__*',

                    #PU info
                    'keep PileupSummaryInfos_addPileupInfo__*',

                    ##PFCandidates
                    #'keep recoPFCandidates_*_pfCandidates_PAT',
                    #'keep recoPFMETs_pfMET__*',
                    #'keep recoPFMETs_pfMet__*',
                    #'keep recoGenMETs_genMetTrue__*',
                    #'keep recoPFCandidates_particleFlow__*',
                    #'keep recoConversions_allConversions__*',
                    #'keep recoVertexCompositeCandidates_generalV0Candidates_*_*',
                    #'keep recoTracks_generalTracks__*',
                    #'keep recoBeamSpot_offlineBeamSpot__*',
                    #'keep recoMuons_muons__*',

                    'keep int_*__PAT',
                    'keep ints_*__PAT',
                    'keep double_*__PAT',
                    'keep doubles_*__PAT',
                    'keep float_*__PAT',
                    'keep floats_*__PAT',
            ])

    process.out.SelectEvents = cms.untracked.PSet(
        SelectEvents = cms.vstring(
            ["singleTopPathStep1Mu", "singleTopPathStep1Ele"] if options.doSkimming else ["*"]
        )
    )

    #-------------------------------------------------
    # Paths
    #-------------------------------------------------

    process.goodOfflinePVCount = cms.EDProducer(
            "CollectionSizeProducer<reco::Vertex>",
            src = cms.InputTag("goodOfflinePrimaryVertices")
    )

    process.preCalcSequences = cms.Sequence(
        process.patJetsWithOwnRef *
        process.goodOfflinePVCount
    )

    process.patPF2PATSequence.insert(process.patPF2PATSequence.index(process.selectedPatMuons) + 1, process.muonsWithID)
    process.patPF2PATSequence.insert(process.patPF2PATSequence.index(process.selectedPatElectrons) + 1, process.electronsWithID)

    #Need separate paths because of skimming
    process.singleTopSequence = cms.Sequence(
            process.goodOfflinePrimaryVertices
            * process.eventFiltersSequence
            * process.patPF2PATSequence
    )

    process.GlobalTag.globaltag = cms.string(options.globalTag)

    process.singleTopSequence += process.preCalcSequences
    process.singleTopSequence += process.stpolMetUncertaintySequence
    process.singleTopSequence += process.patTriggerSequence
    process.singleTopSequence += process.muonSequence
    process.singleTopSequence += process.electronSequence

    if options.isMC:
        #https://twiki.cern.ch/twiki/bin/view/CMSPublic/SWGuideBTagJetProbabilityCalibration?redirectedfrom=CMS.SWGuideBTagJetProbabilityCalibration#Calibration_in_53x_Data_and_MC
        process.GlobalTag.toGet = cms.VPSet(
            cms.PSet(record = cms.string("BTagTrackProbability2DRcd"),
            tag = cms.string("TrackProbabilityCalibration_2D_MC53X_v2"),
            connect = cms.untracked.string("frontier://FrontierPrep/CMS_COND_BTAU")),
            cms.PSet(record = cms.string("BTagTrackProbability3DRcd"),
            tag = cms.string("TrackProbabilityCalibration_3D_MC53X_v2"),
            connect = cms.untracked.string("frontier://FrontierPrep/CMS_COND_BTAU"))
        )
    else:
        #https://twiki.cern.ch/twiki/bin/view/CMSPublic/SWGuideBTagJetProbabilityCalibration?redirectedfrom=CMS.SWGuideBTagJetProbabilityCalibration#Calibration_in_53x_Data_and_MC
        process.GlobalTag.toGet = cms.VPSet(
            cms.PSet(record = cms.string("BTagTrackProbability2DRcd"),
            tag = cms.string("TrackProbabilityCalibration_2D_Data53X_v2"),
            connect = cms.untracked.string("frontier://FrontierPrep/CMS_COND_BTAU")),
            cms.PSet(record = cms.string("BTagTrackProbability3DRcd"),
            tag = cms.string("TrackProbabilityCalibration_3D_Data53X_v2"),
            connect = cms.untracked.string("frontier://FrontierPrep/CMS_COND_BTAU"))
        )

        #Filters added by a separate method
        #process.load('RecoMET.METFilters.ecalLaserCorrFilter_cfi')
        #process.ecalLaserCorrFilter.taggingMode=True

        # https://twiki.cern.ch/twiki/bin/viewauth/CMS/TWikiTopRefEventSel#Cleaning_Filters
        #process.scrapingFilter = cms.EDFilter("FilterOutScraping"
        #    , applyfilter = cms.untracked.bool(True)
        #    , debugOn = cms.untracked.bool(False)
        #    , numtrack = cms.untracked.uint32(10)
        #    , thresh = cms.untracked.double(0.25)
        #)

        #process.singleTopSequence += process.scrapingFilter
        #process.singleTopSequence += process.ecalLaserCorrFilter

    if options.doSkimming:
        process.out.fileName.setValue(process.out.fileName.value().replace(".root", "_Skim.root"))
    else:
        process.out.fileName.setValue(process.out.fileName.value().replace(".root", "_noSkim.root"))

    process.singleTopPathStep1Mu = cms.Path(process.singleTopSequence)
    process.singleTopPathStep1Ele = cms.Path(process.singleTopSequence)

    #process.chsalgos[0].tmvaWeights = cms.string('CMGTools/External/data/TMVAClassificationCategory_JetID_53X_chs_Dec2012.weights.xml')
    #process.chsalgos_5x[0].tmvaWeights = cms.string('CMGTools/External/data/TMVAClassificationCategory_JetID_53X_chs_Dec2012.weights.xml')

    #-----------------------------------------------
    # Skimming
    #-----------------------------------------------

    #Throw away events before particle flow?
    if options.doSkimming:
        from SingleTopPolarization.Analysis.eventSkimming_cfg import skimFilters
        skimFilters(process)
        process.singleTopPathStep1Mu.insert(0, process.muonSkim)
        process.singleTopPathStep1Ele.insert(0, process.electronSkim)

    #-----------------------------------------------
    # Skim efficiency counters
    #-----------------------------------------------

    #count all processed events
    countProcessed(process)

    #count events passing mu and ele paths
    countInSequence(process, process.singleTopPathStep1Mu)
    countInSequence(process, process.singleTopPathStep1Ele)

    if not options.doSlimming:
        process.out.fileName.setValue(process.out.fileName.value().replace(".root", "_noSlim.root"))

    return process
Esempio n. 3
0
def SingleTopStep1(process, ):

    options = VarParsing('analysis')
    options.register('isMC', True, VarParsing.multiplicity.singleton,
                     VarParsing.varType.bool, "Run on MC")
    options.register('doDebug', False, VarParsing.multiplicity.singleton,
                     VarParsing.varType.bool, "Run in debugging mode")
    options.register('doSkimming', True, VarParsing.multiplicity.singleton,
                     VarParsing.varType.bool, "Preselect events")
    options.register('doSlimming', True, VarParsing.multiplicity.singleton,
                     VarParsing.varType.bool, "Drop unnecessary collections")
    options.register('doMuon', True, VarParsing.multiplicity.singleton,
                     VarParsing.varType.bool, "Do muon paths")
    options.register('doElectron', True, VarParsing.multiplicity.singleton,
                     VarParsing.varType.bool, "Do electron paths")

    #Tag from https://twiki.cern.ch/twiki/bin/view/CMSPublic/SWGuideFrontierConditions?redirectedfrom=CMS.SWGuideFrontierConditions#2012_MC_production
    # Latest for "53Y Releases (MC)"
    options.register('globalTag', Config.globalTagMC,
                     VarParsing.multiplicity.singleton,
                     VarParsing.varType.string, "Global tag")
    options.parseArguments()

    process.source.fileNames = cms.untracked.vstring(options.inputFiles)
    process.maxEvents = cms.untracked.PSet(
        input=cms.untracked.int32(options.maxEvents))
    process.out.fileName = cms.untracked.string(options.outputFile)
    process.options = cms.untracked.PSet(
        wantSummary=cms.untracked.bool(options.doDebug))

    if options.doDebug:
        process.load("FWCore.MessageLogger.MessageLogger_cfi")
        process.MessageLogger = cms.Service(
            "MessageLogger",
            destinations=cms.untracked.vstring('cout', 'debug'),
            debugModules=cms.untracked.vstring('*'),
            cout=cms.untracked.PSet(threshold=cms.untracked.string('INFO')),
            debug=cms.untracked.PSet(threshold=cms.untracked.string('DEBUG')),
        )
    else:
        process.load("FWCore.MessageService.MessageLogger_cfi")

    postfix = ""
    jetCorr = ['L1FastJet', 'L2Relative', 'L3Absolute']
    if not options.isMC:
        jetCorr += ['L2L3Residual']

    usePF2PAT(
        process,
        runPF2PAT=True,
        jetAlgo='AK5',
        runOnMC=options.isMC,
        postfix=postfix,
        jetCorrections=('AK5PFchs', jetCorr),
        pvCollection=cms.InputTag('goodOfflinePrimaryVertices'),
        #typeIMetCorrections = True
        typeIMetCorrections=
        False  #Type1 MET now applied later using runMETUncertainties
    )

    # https://twiki.cern.ch/twiki/bin/view/CMSPublic/WorkBookJetEnergyCorrections#JetEnCorPFnoPU2012
    process.pfPileUp.Enable = True
    process.pfPileUp.checkClosestZVertex = False

    #-------------------------------------------------
    # selection step 2: vertex filter
    #-------------------------------------------------

    # https://twiki.cern.ch/twiki/bin/view/CMSPublic/WorkBookJetEnergyCorrections#JetEnCorPFnoPU2012
    # https://twiki.cern.ch/twiki/bin/viewauth/CMS/TWikiTopRefEventSel#Cleaning_Filters
    process.goodOfflinePrimaryVertices = cms.EDFilter(
        "PrimaryVertexObjectFilter",
        filterParams=cms.PSet(minNdof=cms.double(4.0),
                              maxZ=cms.double(24.0),
                              maxRho=cms.double(2.0)),
        filter=cms.bool(True),
        src=cms.InputTag('offlinePrimaryVertices'))

    #-------------------------------------------------
    # Muons
    #-------------------------------------------------

    #if not maxLeptonIso is None:
    #    process.pfIsolatedMuons.isolationCut = maxLeptonIso

    #Use both isolated and non-isolated muons as a patMuon source
    #process.patMuons.pfMuonSource = cms.InputTag("pfMuons")
    #process.muonMatch.src = cms.InputTag("pfMuons")
    process.patMuons.pfMuonSource = cms.InputTag("pfIsolatedMuons")
    process.muonMatch.src = cms.InputTag("pfIsolatedMuons")

    process.selectedPatMuons.cut = "pt>20 && abs(eta)<3.0"

    # muon ID production (essentially track count embedding) must be here
    # because tracks get dropped from the collection after this step, resulting
    # in null ptrs.
    process.muonsWithID = cms.EDProducer(
        'MuonIDProducer',
        muonSrc=cms.InputTag("selectedPatMuons"),
        primaryVertexSource=cms.InputTag("goodOfflinePrimaryVertices"))

    #process.muonClones = cms.EDProducer("MuonShallowCloneProducer",
    #    src = cms.InputTag("selectedPatMuons")
    #)

    #-------------------------------------------------
    # Electrons
    # Implemented as in https://indico.cern.ch/getFile.py/access?contribId=1&resId=0&materialId=slides&confId=208765
    #-------------------------------------------------

    #if not maxLeptonIso is None:
    #    process.pfIsolatedElectrons.isolationCut = maxLeptonIso
    #Use both isolated and un-isolated electrons as patElectrons.
    #NB: no need to change process.electronMatch.src to pfElectrons,
    #    it's already gsfElectrons, which is a superset of the pfElectrons
    process.patElectrons.pfElectronSource = cms.InputTag("pfElectrons")

    process.load('EGamma.EGammaAnalysisTools.electronIdMVAProducer_cfi')
    process.mvaID = cms.Sequence(process.mvaTrigV0 + process.mvaNonTrigV0)
    process.patElectrons.electronIDSources.mvaTrigV0 = cms.InputTag(
        "mvaTrigV0")
    process.patElectrons.electronIDSources.mvaNonTrigV0 = cms.InputTag(
        "mvaNonTrigV0")
    process.patPF2PATSequence.replace(process.patElectrons,
                                      process.mvaID * process.patElectrons)
    process.selectedPatElectrons.cut = "pt>25 && abs(eta)<3.0"

    process.electronsWithID = cms.EDProducer(
        'ElectronIDProducer',
        electronSrc=cms.InputTag("selectedPatElectrons"),
        primaryVertexSource=cms.InputTag("goodOfflinePrimaryVertices"))
    #process.electronClones = cms.EDProducer("ElectronShallowCloneProducer",
    #    src = cms.InputTag("selectedPatElectrons")
    #)

    #if not maxLeptonIso is None:
    #    process.pfIsolatedElectrons.isolationCut = maxLeptonIso

    #electron dR=0.3
    process.pfElectrons.isolationValueMapsCharged = cms.VInputTag(
        cms.InputTag("elPFIsoValueCharged03PFId"))
    process.pfElectrons.deltaBetaIsolationValueMap = cms.InputTag(
        "elPFIsoValuePU03PFId")
    process.pfElectrons.isolationValueMapsNeutral = cms.VInputTag(
        cms.InputTag("elPFIsoValueNeutral03PFId"),
        cms.InputTag("elPFIsoValueGamma03PFId"))
    process.pfElectrons.deltaBetaIsolationValueMap = cms.InputTag(
        "elPFIsoValuePU03PFId")
    process.pfElectrons.isolationValueMapsNeutral = cms.VInputTag(
        cms.InputTag("elPFIsoValueNeutral03PFId"),
        cms.InputTag("elPFIsoValueGamma03PFId"))

    process.patElectrons.isolationValues.pfNeutralHadrons = cms.InputTag(
        "elPFIsoValueNeutral03PFId")
    process.patElectrons.isolationValues.pfChargedAll = cms.InputTag(
        "elPFIsoValueChargedAll03PFId")
    process.patElectrons.isolationValues.pfPUChargedHadrons = cms.InputTag(
        "elPFIsoValuePU03PFId")
    process.patElectrons.isolationValues.pfPhotons = cms.InputTag(
        "elPFIsoValueGamma03PFId")
    process.patElectrons.isolationValues.pfChargedHadrons = cms.InputTag(
        "elPFIsoValueCharged03PFId")

    process.pfIsolatedElectrons.isolationValueMapsCharged = cms.VInputTag(
        cms.InputTag("elPFIsoValueCharged03PFId"))
    process.pfIsolatedElectrons.deltaBetaIsolationValueMap = cms.InputTag(
        "elPFIsoValuePU03PFId")
    process.pfIsolatedElectrons.isolationValueMapsNeutral = cms.VInputTag(
        cms.InputTag("elPFIsoValueNeutral03PFId"),
        cms.InputTag("elPFIsoValueGamma03PFId"))

    #-------------------------------------------------
    # Jets
    # MET corrections as https://twiki.cern.ch/twiki/bin/view/CMSPublic/WorkBookMetAnalysis#Type_I_0_with_PAT
    #-------------------------------------------------

    #pfNoTau == True => remove taus from jets
    #process.pfNoTau.enable = noTau

    process.selectedPatJets.cut = cms.string("pt>30 && abs(eta)<5.0")
    process.load("CMGTools.External.pujetidsequence_cff")
    process.patPF2PATSequence += process.puJetIdSqeuence
    #process.jetClones = cms.EDProducer("CaloJetShallowCloneProducer",
    #    src = cms.InputTag("seletedPatJets")
    #)

    #-------------------------------------------------
    # MET uncertainty step
    #-------------------------------------------------
    #Embed the reference to the original jet in the jets, which is constant during the propagation
    process.patJetsWithOwnRef = cms.EDProducer(
        'PatObjectOwnRefProducer<pat::Jet>',
        src=cms.InputTag("selectedPatJets"))

    #Note: this module causes a large memory increase when crossing the file boundary
    #Reason - unknown, solution: limit processing to ~1 file.
    from PhysicsTools.PatUtils.tools.metUncertaintyTools import runMEtUncertainties
    runMEtUncertainties(
        process,
        electronCollection=cms.InputTag("electronsWithID"),
        photonCollection=None,
        muonCollection=cms.InputTag("muonsWithID"),
        tauCollection="",  # "" means emtpy, None means cleanPatTaus
        jetCollection=cms.InputTag("patJetsWithOwnRef"),
        jetCorrLabel="L3Absolute" if options.isMC else "L2L3Residual",
        doSmearJets=options.isMC,
        jetCorrPayloadName="AK5PFchs",
        addToPatDefaultSequence=False)
    process.stpolMetUncertaintySequence = cms.Sequence(
        process.metUncertaintySequence)

    if not options.doSlimming:
        process.out.outputCommands = cms.untracked.vstring('keep *')
    else:
        process.out.outputCommands = cms.untracked.vstring([
            'drop *',
            'keep edmMergeableCounter_*_*_*',  # Keep the lumi-block counter information
            'keep edmTriggerResults_TriggerResults__*',  #Keep the trigger results
            'keep *_genParticles__*',  #keep all the genParticles
            #'keep recoVertexs_offlinePrimaryVertices__*', #keep the offline PV-s
            'keep recoVertexs_goodOfflinePrimaryVertices__*',  #keep the offline PV-s

            # Jets
            'keep patJets_*__*',
            'keep double_*_rho_*',  #For rho-corr rel iso
            'keep recoGenJets_selectedPatJets_genJets_*',  #For Jet MC smearing we need to keep the genJets
            "keep *_puJetId_*_*",  # input variables
            "keep *_puJetMva_*_*",  # final MVAs and working point flags
            'keep *_jetClones__*',

            # Muons
            'keep patMuons_*__*',
            'keep *_muonClones__*',

            # Electrons
            'keep patElectrons_*__*',
            'keep *_electronClones__*',

            # METs
            'keep patMETs_*__*',

            #ECAL laser corr filter
            'keep bool_ecalLaserCorrFilter__*',

            #For flavour analyzer
            'keep GenEventInfoProduct_generator__*',

            #PU info
            'keep PileupSummaryInfos_addPileupInfo__*',

            ##PFCandidates
            #'keep recoPFCandidates_*_pfCandidates_PAT',
            #'keep recoPFMETs_pfMET__*',
            #'keep recoPFMETs_pfMet__*',
            #'keep recoGenMETs_genMetTrue__*',
            #'keep recoPFCandidates_particleFlow__*',
            #'keep recoConversions_allConversions__*',
            #'keep recoVertexCompositeCandidates_generalV0Candidates_*_*',
            #'keep recoTracks_generalTracks__*',
            #'keep recoBeamSpot_offlineBeamSpot__*',
            #'keep recoMuons_muons__*',
            'keep int_*__PAT',
            'keep ints_*__PAT',
            'keep double_*__PAT',
            'keep doubles_*__PAT',
            'keep float_*__PAT',
            'keep floats_*__PAT',
        ])

    #FIXME: is this correct?
    #Keep events that pass either the muon OR the electron path
    process.out.SelectEvents = cms.untracked.PSet(SelectEvents=cms.vstring([]))

    #-------------------------------------------------
    # Paths
    #-------------------------------------------------

    process.goodOfflinePVCount = cms.EDProducer(
        "CollectionSizeProducer<reco::Vertex>",
        src=cms.InputTag("goodOfflinePrimaryVertices"))

    process.preCalcSequences = cms.Sequence(process.patJetsWithOwnRef *
                                            process.goodOfflinePVCount)

    process.patPF2PATSequence.insert(
        process.patPF2PATSequence.index(process.selectedPatMuons) + 1,
        process.muonsWithID)
    process.patPF2PATSequence.insert(
        process.patPF2PATSequence.index(process.selectedPatElectrons) + 1,
        process.electronsWithID)

    #Need separate paths because of skimming

    if options.doMuon:
        process.singleTopPathStep1Mu = cms.Path(
            process.goodOfflinePrimaryVertices * process.patPF2PATSequence
            #* process.muonClones
            #* process.electronClones
            #* process.jetClones
        )

    if options.doElectron:
        process.singleTopPathStep1Ele = cms.Path(
            process.goodOfflinePrimaryVertices * process.patPF2PATSequence
            #* process.muonClones
            #* process.electronClones
            #* process.jetClones
        )

    if options.doMuon:
        process.out.SelectEvents.SelectEvents.append("singleTopPathStep1Mu")
    if options.doElectron:
        process.out.SelectEvents.SelectEvents.append("singleTopPathStep1Ele")

    process.GlobalTag.globaltag = cms.string(options.globalTag)

    process.singleTopPathStep1Mu += process.preCalcSequences
    process.singleTopPathStep1Ele += process.preCalcSequences

    if options.doMuon:
        process.singleTopPathStep1Mu += process.stpolMetUncertaintySequence
    if options.doElectron:
        process.singleTopPathStep1Ele += process.stpolMetUncertaintySequence

    if options.isMC:
        #https://twiki.cern.ch/twiki/bin/view/CMSPublic/SWGuideBTagJetProbabilityCalibration?redirectedfrom=CMS.SWGuideBTagJetProbabilityCalibration#Calibration_in_53x_Data_and_MC
        process.GlobalTag.toGet = cms.VPSet(
            cms.PSet(record=cms.string("BTagTrackProbability2DRcd"),
                     tag=cms.string("TrackProbabilityCalibration_2D_MC53X_v2"),
                     connect=cms.untracked.string(
                         "frontier://FrontierPrep/CMS_COND_BTAU")),
            cms.PSet(record=cms.string("BTagTrackProbability3DRcd"),
                     tag=cms.string("TrackProbabilityCalibration_3D_MC53X_v2"),
                     connect=cms.untracked.string(
                         "frontier://FrontierPrep/CMS_COND_BTAU")))
    else:
        #https://twiki.cern.ch/twiki/bin/view/CMSPublic/SWGuideBTagJetProbabilityCalibration?redirectedfrom=CMS.SWGuideBTagJetProbabilityCalibration#Calibration_in_53x_Data_and_MC
        process.GlobalTag.toGet = cms.VPSet(
            cms.PSet(
                record=cms.string("BTagTrackProbability2DRcd"),
                tag=cms.string("TrackProbabilityCalibration_2D_Data53X_v2"),
                connect=cms.untracked.string(
                    "frontier://FrontierPrep/CMS_COND_BTAU")),
            cms.PSet(
                record=cms.string("BTagTrackProbability3DRcd"),
                tag=cms.string("TrackProbabilityCalibration_3D_Data53X_v2"),
                connect=cms.untracked.string(
                    "frontier://FrontierPrep/CMS_COND_BTAU")))

        process.load('RecoMET.METFilters.ecalLaserCorrFilter_cfi')
        process.ecalLaserCorrFilter.taggingMode = True

        # https://twiki.cern.ch/twiki/bin/viewauth/CMS/TWikiTopRefEventSel#Cleaning_Filters
        process.scrapingFilter = cms.EDFilter(
            "FilterOutScraping",
            applyfilter=cms.untracked.bool(True),
            debugOn=cms.untracked.bool(False),
            numtrack=cms.untracked.uint32(10),
            thresh=cms.untracked.double(0.25))

        #if doElectron:
        #  process.singleTopPathStep1Ele.insert(0, process.scrapingFilter)
        #if doMuon:
        #  process.singleTopPathStep1Mu.insert(0, process.scrapingFilter)

        process.patPF2PATSequence += process.scrapingFilter
        process.patPF2PATSequence += process.ecalLaserCorrFilter

    #if not onGrid:
    #  from SingleTopPolarization.Analysis.cmdlineParsing import enableCommandLineArguments
    #  enableCommandLineArguments(process)
    #else:
    #  process.out.fileName = "step1.root"

    if options.doSkimming:
        process.out.fileName.setValue(process.out.fileName.value().replace(
            ".root", "_Skim.root"))
    else:
        process.out.fileName.setValue(process.out.fileName.value().replace(
            ".root", "_noSkim.root"))

    #-----------------------------------------------
    # Skimming
    #-----------------------------------------------

    #Throw away events before particle flow?
    if options.doSkimming:
        from SingleTopPolarization.Analysis.eventSkimming_cfg import skimFilters
        skimFilters(process)

        if options.doMuon:
            process.singleTopPathStep1Mu.insert(0, process.muonSkim)
        if options.doElectron:
            process.singleTopPathStep1Ele.insert(0, process.electronSkim)

    #-----------------------------------------------
    # Skim efficiency counters
    #-----------------------------------------------

    #count all processed events
    countProcessed(process)

    #count events passing mu and ele paths

    if options.doMuon:
        countInSequence(process, process.singleTopPathStep1Mu)
    if options.doElectron:
        countInSequence(process, process.singleTopPathStep1Ele)
    #-------------------------------------------------
    #
    #-------------------------------------------------

    if not options.doSlimming:
        process.out.fileName.setValue(process.out.fileName.value().replace(
            ".root", "_noSlim.root"))

    return process