import FWCore.ParameterSet.Config as cms

process = cms.Process("Analysis")

process.load('Utilities.AnalysisSequences.defaultSequences_cff')
process.TFileService.fileName = 'analysisHistos_pFlowNoiseAnalysis.root'

#############
process.load('Utilities.AnalysisSequences.minimumBiasAnalysisSequences_cff')

# Applying custom PFlow thresholds
from ForwardAnalysis.Utilities.pfCandidateSelector_cfi import pfCandidateSelector
process.pfCandidateNoiseThresholds = pfCandidateSelector.clone()
from ForwardAnalysis.Utilities.ExcludeHFEdgesStringCut import ExcludeHFEdgesStringCut
from ForwardAnalysis.Utilities.PFCandidateNoiseStringCut import PFCandidateNoiseStringCut
# Change thresholds here if needed
from ForwardAnalysis.AnalysisSequences.pfThresholds_cfi import pfThresholds
pfStrCut1 = ExcludeHFEdgesStringCut().cut()
pfStrCut2 = PFCandidateNoiseStringCut(pfThresholds).cut()
# Only noise thresholds
pfStrCut = pfStrCut2
#pfStrCut = '%s & %s' % (pfStrCut1,pfStrCut2)
process.pfCandidateNoiseThresholds.cut = pfStrCut
# Set particle-flow collection
process.pfCandidateNoiseThresholds.src = "particleFlow"
process.pfCandidates = cms.Sequence(process.pfCandidateNoiseThresholds)
process.analysisSequences = cms.Sequence(process.pfCandidates)

process.load('Utilities.AnalysisSequences.primaryVertexFilter_cfi')
process.load('Utilities.AnalysisSequences.trackCountFilter_cfi')
process.generalTracksFilter = process.trackCountFilter.clone(
import FWCore.ParameterSet.Config as cms

process = cms.Process("Analysis")

process.load('Utilities.AnalysisSequences.defaultSequences_cff')
process.TFileService.fileName = 'analysisHistos_pFlowNoiseAnalysis.root'

#############
process.load('Utilities.AnalysisSequences.jetAnalysisSequences_cff')

# Applying custom PFlow thresholds
from ForwardAnalysis.Utilities.pfCandidateSelector_cfi import pfCandidateSelector
process.pfCandidateNoiseThresholds = pfCandidateSelector.clone()
from ForwardAnalysis.Utilities.ExcludeHFEdgesStringCut import ExcludeHFEdgesStringCut
from ForwardAnalysis.Utilities.PFCandidateNoiseStringCut import PFCandidateNoiseStringCut
# Change thresholds here if needed
from ForwardAnalysis.AnalysisSequences.pfThresholds_cfi import pfThresholds
pfStrCut1 = ExcludeHFEdgesStringCut().cut()
pfStrCut2 = PFCandidateNoiseStringCut(pfThresholds).cut()
# Only noise thresholds
pfStrCut = pfStrCut2
#pfStrCut = '%s & %s' % (pfStrCut1,pfStrCut2)
process.pfCandidateNoiseThresholds.cut = pfStrCut
# Set particle-flow collection
process.pfCandidateNoiseThresholds.src = "particleFlow" 
process.pfCandidates = cms.Sequence( process.pfCandidateNoiseThresholds ) 
process.analysisSequences = cms.Sequence( process.pfCandidates )

#############
process.load('Utilities.AnalysisTools.pFlowNoiseAnalyzer_cfi')
process.pFlowNoiseAnalyzer.particleFlowTag = "particleFlow"
#selectTracksAssociatedToPV.vertexTag = "analysisVertices"
#selectTracksAssociatedToPV.maxDistanceFromVertex = 0.4

#------------------------------
# Particle flow
from ForwardAnalysis.Utilities.pfCandidateSelector_cfi import pfCandidateSelector as pfCandidateNoiseThresholds
from ForwardAnalysis.Utilities.ExcludeHFEdgesStringCut import ExcludeHFEdgesStringCut
from ForwardAnalysis.Utilities.PFCandidateNoiseStringCut import PFCandidateNoiseStringCut
# Change thresholds here if needed
from ForwardAnalysis.AnalysisSequences.pfThresholds_cfi import pfThresholds

pfStrCutHFEdges = ExcludeHFEdgesStringCut().cut()
pfStrCutNoise = PFCandidateNoiseStringCut(pfThresholds).cut()
pfStrCut = '%s & %s' % (pfStrCutHFEdges,pfStrCutNoise)
pfCandidateNoiseThresholds.cut = pfStrCut
pfCandidateHFEdges = pfCandidateNoiseThresholds.clone( cut = pfStrCutHFEdges )

# Add EtaMax
from ForwardAnalysis.Utilities.etaMaxCandViewSelector_cfi import etaMaxCandViewSelector as etaMaxPFCands
from ForwardAnalysis.Utilities.etaMinCandViewSelector_cfi import etaMinCandViewSelector as etaMinPFCands
etaMaxPFCands.src = "pfCandidateNoiseThresholds"
etaMinPFCands.src = "pfCandidateNoiseThresholds"

from ForwardAnalysis.AnalysisSequences.genChargedParticles_cfi import genChargedParticles
from ForwardAnalysis.AnalysisSequences.genStableParticles_cfi import genStableParticles
genStableParticles.cut = 'status = 1 & ( ( pdgId != 2212 ) | ( pdgId == 2212 & abs(pz) < %f ) )' % (0.75*3500.0)
genProtonDissociative = genStableParticles.clone( cut = 'pdgId == 9902210' )
etaMaxGen = etaMaxPFCands.clone(src = "genStableParticles")
etaMinGen = etaMinPFCands.clone(src = "genStableParticles")

from ForwardAnalysis.AnalysisSequences.edmNtupleCandView_cfi import edmNtupleCandView
#selectTracksAssociatedToPV.vertexTag = "analysisVertices"
#selectTracksAssociatedToPV.maxDistanceFromVertex = 0.4

#------------------------------
# Particle flow
from ForwardAnalysis.Utilities.pfCandidateSelector_cfi import pfCandidateSelector as pfCandidateNoiseThresholds
from ForwardAnalysis.Utilities.ExcludeHFEdgesStringCut import ExcludeHFEdgesStringCut
from ForwardAnalysis.Utilities.PFCandidateNoiseStringCut import PFCandidateNoiseStringCut
# Change thresholds here if needed
from ForwardAnalysis.AnalysisSequences.pfThresholds_cfi import pfThresholds

pfStrCutHFEdges = ExcludeHFEdgesStringCut().cut()
pfStrCutNoise = PFCandidateNoiseStringCut(pfThresholds).cut()
pfStrCut = '%s & %s' % (pfStrCutHFEdges, pfStrCutNoise)
pfCandidateNoiseThresholds.cut = pfStrCut
pfCandidateHFEdges = pfCandidateNoiseThresholds.clone(cut=pfStrCutHFEdges)

# Add EtaMax
from ForwardAnalysis.Utilities.etaMaxCandViewSelector_cfi import etaMaxCandViewSelector as etaMaxPFCands
from ForwardAnalysis.Utilities.etaMinCandViewSelector_cfi import etaMinCandViewSelector as etaMinPFCands
etaMaxPFCands.src = "pfCandidateNoiseThresholds"
etaMinPFCands.src = "pfCandidateNoiseThresholds"

from ForwardAnalysis.AnalysisSequences.genChargedParticles_cfi import genChargedParticles
from ForwardAnalysis.AnalysisSequences.genStableParticles_cfi import genStableParticles
genStableParticles.cut = 'status = 1 & ( ( pdgId != 2212 ) | ( pdgId == 2212 & abs(pz) < %f ) )' % (
    0.75 * 3500.0)
genProtonDissociative = genStableParticles.clone(cut='pdgId == 9902210')
etaMaxGen = etaMaxPFCands.clone(src="genStableParticles")
etaMinGen = etaMinPFCands.clone(src="genStableParticles")
edmNtupleMxGen = edmNtupleCandView.clone(src = "genProtonDissociative")
edmNtupleMxGen.variables = cms.VPSet( cms.PSet( tag = cms.untracked.string("Mx"),
                                                quantity = cms.untracked.string("mass") ) )
edmNtupleEtaMaxGen = edmNtupleEtaMax.clone(src = "etaMaxGen")
edmNtupleEtaMinGen = edmNtupleEtaMin.clone(src = "etaMinGen")

from ForwardAnalysis.AnalysisSequences.etaMaxSelector_cfi import etaMaxSelector as etaMaxFilter
etaMaxFilter.src = "etaMaxPFCands"
from ForwardAnalysis.AnalysisSequences.etaMinSelector_cfi import etaMinSelector as etaMinFilter
etaMinFilter.src = "etaMinPFCands"

etaMaxGenFilter = etaMaxFilter.clone(src = "etaMaxGen")
etaMinGenFilter = etaMinFilter.clone(src = "etaMinGen")


pfCandidateNoiseThresholdsShiftedUp = pfCandidateNoiseThresholds.clone( src= "pfCandidatesShiftedUp" )

etaMaxPFCandsShiftedUp = etaMaxPFCands.clone( src = "pfCandidateNoiseThresholdsShiftedUp" )
etaMinPFCandsShiftedUp = etaMinPFCands.clone( src = "pfCandidateNoiseThresholdsShiftedUp" )

edmNtupleEtaMaxShiftedUp = edmNtupleEtaMax.clone(src = "etaMaxPFCandsShiftedUp")
edmNtupleEtaMinShiftedUp = edmNtupleEtaMin.clone(src = "etaMinPFCandsShiftedUp")

pfCandidateNoiseThresholdsShiftedDown = pfCandidateNoiseThresholds.clone( src= "pfCandidatesShiftedDown" )
etaMaxPFCandsShiftedDown = etaMaxPFCands.clone( src = "pfCandidateNoiseThresholdsShiftedDown" )
etaMinPFCandsShiftedDown = etaMinPFCands.clone( src = "pfCandidateNoiseThresholdsShiftedDown" )

edmNtupleEtaMaxShiftedDown = edmNtupleEtaMax.clone(src = "etaMaxPFCandsShiftedDown")
edmNtupleEtaMinShiftedDown = edmNtupleEtaMin.clone(src = "etaMinPFCandsShiftedDown")

#------------------------------
edmNtupleMxGen = edmNtupleCandView.clone(src="genProtonDissociative")
edmNtupleMxGen.variables = cms.VPSet(
    cms.PSet(tag=cms.untracked.string("Mx"),
             quantity=cms.untracked.string("mass")))
edmNtupleEtaMaxGen = edmNtupleEtaMax.clone(src="etaMaxGen")
edmNtupleEtaMinGen = edmNtupleEtaMin.clone(src="etaMinGen")

from ForwardAnalysis.AnalysisSequences.etaMaxSelector_cfi import etaMaxSelector as etaMaxFilter
etaMaxFilter.src = "etaMaxPFCands"
from ForwardAnalysis.AnalysisSequences.etaMinSelector_cfi import etaMinSelector as etaMinFilter
etaMinFilter.src = "etaMinPFCands"

etaMaxGenFilter = etaMaxFilter.clone(src="etaMaxGen")
etaMinGenFilter = etaMinFilter.clone(src="etaMinGen")

pfCandidateNoiseThresholdsShiftedUp = pfCandidateNoiseThresholds.clone(
    src="pfCandidatesShiftedUp")

etaMaxPFCandsShiftedUp = etaMaxPFCands.clone(
    src="pfCandidateNoiseThresholdsShiftedUp")
etaMinPFCandsShiftedUp = etaMinPFCands.clone(
    src="pfCandidateNoiseThresholdsShiftedUp")

edmNtupleEtaMaxShiftedUp = edmNtupleEtaMax.clone(src="etaMaxPFCandsShiftedUp")
edmNtupleEtaMinShiftedUp = edmNtupleEtaMin.clone(src="etaMinPFCandsShiftedUp")

pfCandidateNoiseThresholdsShiftedDown = pfCandidateNoiseThresholds.clone(
    src="pfCandidatesShiftedDown")
etaMaxPFCandsShiftedDown = etaMaxPFCands.clone(
    src="pfCandidateNoiseThresholdsShiftedDown")
etaMinPFCandsShiftedDown = etaMinPFCands.clone(
    src="pfCandidateNoiseThresholdsShiftedDown")