# RA2MCwithSystematics_fromAOD_cfg.py:
# ------------------------------------------------------------------
# This cfg file is meant for plain MC driven predictions (i.e. not data-driven)
# with systematic uncertainties in contrast to RA2Default_fromAOD_cfg.py which
# is the same, but without systematic uncertainties (i.e. for data).
# ------------------------------------------------------------------
#
import FWCore.ParameterSet.Config as cms

##------------------------------------------------------------------
## Call PAT if running on AOD --------------------------------------
from PhysicsTools.PatAlgos.patTemplate_cfg import *
from PhysicsTools.PatAlgos.tools.coreTools import *
#restrictInputToAOD(process)
#removeMCMatching(process, 'Muons')
#removeAllPATObjectsBut(process, ['Muons'])
#removeSpecificPATObjects(process, ['Electrons', 'Muons', 'Taus'])
from PhysicsTools.PatAlgos.tools.tauTools import *
switchTo31Xdefaults(process)

process.maxEvents.input = -1
process.source.fileNames = [
       #'/store/relval/CMSSW_3_3_0/RelValTTbar/GEN-SIM-RECO/STARTUP31X_V8-v1/0001/3291E09D-67B7-DE11-9ED6-003048678C9A.root'
       'file:/rdata2/uhh-cms014/data/auterman/data/RelVal3_3_0TTbar-GEN-SIM-RECO-STARTUP31X_V8-v1.root'
    ]
#process.MessageLogger.cout = cms.untracked.PSet(
#        default = cms.untracked.PSet(
#            limit = cms.untracked.int32(-1) )) ## show all messages in the log
#process.MessageLogger.destinations = ['cout']



##------------------------------------------------------------------
## An event weight producer ----------------------------------------
process.load("RA2.WeightProducer.weightproducer_cfi")
xsectWeight = 1.0
process.weightProducer.weight = 1.0 * xsectWeight # weight per event for this sample
process.weightProducerLumiUP = cms.EDProducer('WeightProducer', weight = cms.double( 1.05 * xsectWeight) )
process.weightProducerLumiDN = cms.EDProducer('WeightProducer', weight = cms.double( 0.95 * xsectWeight) )


##------------------------------------------------------------------
## Modify Systematic Uncertainties, e.g. JEC------------------------
process.load("RA2.VaryUncertainty.jetenergycorrection_cfi")
process.load("RA2.VaryUncertainty.muonisolationeff_cfi")
process.MuonIsolationEffUP.weightName = 'weightProducer:weight'
process.MuonIsolationEffDN.weightName = 'weightProducer:weight'


##------------------------------------------------------------------
## The RA2 Selection -----------------------------------------------
process.load("RA2.Selection.Selection_cff")
process.PatTagNames.jetTag       = 'cleanLayer1Jets'
process.PatTagNames.metTag       = 'layer1METs'
process.SelectionDefault.selections.selectors.MET.minMET = 20.
#process.SelectionDefault.filterSelection = ['JetPreSelection','MET']
process.SelectionDefaultJECUP   = process.SelectionDefault.clone()
process.SelectionDefaultJECDN   = process.SelectionDefault.clone()

## The RA2 Pre-Selection -------------------------------------------
process.PreSelectionDefault        = process.SelectionDefault.clone()
process.PreSelectionDefault.filterSelection = ['JetPreSelection']
process.PreSelectionDefaultJECUP   = process.PreSelectionDefault.clone()
process.PreSelectionDefaultJECDN   = process.PreSelectionDefault.clone()


##------------------------------------------------------------------
## Produce root file with 'final plots' for the current sample -----
process.TFileService = cms.Service("TFileService",
                       fileName = cms.string("finalplots.root") )
process.load("RA2.FinalPlots.finalplots_cfi")
process.finalPlot.Jet  = process.SelectionDefault.selections.selectors.JetSelection.jetTag
process.finalPlot.MET  = process.SelectionDefault.selections.selectors.MET.metTag
process.finalPlot.weightName = 'weightProducer:weight'
process.finalPlot_JEC_UP  = process.finalPlot.clone() #replace JET collection later
process.finalPlot_JEC_DN  = process.finalPlot.clone() #replace JET collection later
process.finalPlot_Lumi_UP = process.finalPlot.clone()
process.finalPlot_Lumi_UP.weightName = 'weightProducerLumiUP:weight'
process.finalPlot_Lumi_DN = process.finalPlot.clone()
process.finalPlot_Lumi_DN.weightName = 'weightProducerLumiDN:weight'
process.finalPlot_MuIso_UP = process.finalPlot.clone()
process.finalPlot_MuIso_UP.weightName = 'MuonIsolationEffUP:weight'
process.finalPlot_MuIso_DN = process.finalPlot.clone()
process.finalPlot_MuIso_DN.weightName = 'MuonIsolationEffDN:weight'

##------------------------------------------------------------------
## Produce 'Preselection plots' for the current sample -------------
process.preselPlot          = process.finalPlot.clone()
process.preselPlot_JEC_UP   = process.finalPlot_JEC_UP.clone() 
process.preselPlot_JEC_DN   = process.finalPlot_JEC_DN.clone() 
process.preselPlot_Lumi_UP  = process.finalPlot_Lumi_UP.clone()
process.preselPlot_Lumi_DN  = process.finalPlot_Lumi_DN.clone()
process.preselPlot_MuIso_UP = process.finalPlot_MuIso_UP.clone()
process.preselPlot_MuIso_DN = process.finalPlot_MuIso_DN.clone()

##replace all jets in Path JecUp by jets+1 sigma JEC, same for met--
SeqJECUP = cms.Sequence(    	  process.PreSelectionDefaultJECUP
		          	* process.preselPlot_JEC_UP 
                          	* process.SelectionDefaultJECUP
		          	* process.finalPlot_JEC_UP )
massSearchReplaceAnyInputTag(SeqJECUP, #replace all jets by 'jets + 1sigma JEC'
                             process.SelectionDefault.selections.selectors.JetSelection.jetTag,
			     'JetEnergyCorrectionUP:Jets')
massSearchReplaceAnyInputTag(SeqJECUP, #replace MET
                             process.SelectionDefault.selections.selectors.MET.metTag,
			     'JetEnergyCorrectionUP:METs')
#replace all jets in Path JecDn by jets-1 sigma JEC, same for met
SeqJECDN = cms.Sequence(   	  process.PreSelectionDefaultJECDN
		          	* process.preselPlot_JEC_DN 
                          	* process.SelectionDefaultJECDN
		          	* process.finalPlot_JEC_DN )
massSearchReplaceAnyInputTag(SeqJECDN, #replace all jets by 'jets - 1sigma JEC'
                             process.SelectionDefault.selections.selectors.JetSelection.jetTag,
			     'JetEnergyCorrectionDN:Jets')
massSearchReplaceAnyInputTag(SeqJECDN, #replace MET
                             process.SelectionDefault.selections.selectors.MET.metTag,
			     'JetEnergyCorrectionDN:METs')
#all other syst. uncertainies use only modified event-weights but unchanged 
# jet/MET collections; no replace is therefore necessary!


##Show contents
process.content = cms.EDAnalyzer("EventContentAnalyzer")

##------------------------------------------------------------------
## Call all modules ------------------------------------------------  
##default
process.default = cms.Path(	  process.weightProducer
			  	* process.patDefaultSequence 
                          	* process.PreSelectionDefault
		          	* process.preselPlot 
                          	* process.SelectionDefault
		          	* process.finalPlot )
###JEC UP
process.JECUP	= cms.Path(	 process.weightProducer
			       * process.patDefaultSequence
			       * process.JetEnergyCorrectionUP 
			       * SeqJECUP )
##JEC DN
process.JECDN	= cms.Path(	 process.weightProducer
			       * process.patDefaultSequence
			       * process.JetEnergyCorrectionDN
			       * SeqJECDN )
# Lumi UP
process.LumiUP = cms.Path(	 process.weightProducerLumiUP
			       * process.patDefaultSequence 
			       * process.PreSelectionDefault
			       * process.preselPlot_Lumi_UP 
			       * process.SelectionDefault
			       * process.finalPlot_Lumi_UP )
# Lumi DN
process.LumiDN = cms.Path(	 process.weightProducerLumiDN
			       * process.patDefaultSequence 
			       * process.PreSelectionDefault
			       * process.preselPlot_Lumi_DN 
			       * process.SelectionDefault
			       * process.finalPlot_Lumi_DN )
# Muon Isolation Efficiency UP
process.MuIsoUP = cms.Path(	 process.weightProducer
			       * process.patDefaultSequence
			       * process.MuonIsolationEffUP
			       * process.PreSelectionDefault
			       * process.preselPlot_MuIso_UP 
			       * process.SelectionDefault
			       * process.finalPlot_MuIso_UP )
# Muon Isolation Efficiency DN
process.MuIsoDN = cms.Path(	 process.weightProducer
			       * process.patDefaultSequence 
			       * process.MuonIsolationEffDN
			       * process.PreSelectionDefault
			       * process.preselPlot_MuIso_DN 
			       * process.SelectionDefault
			       * process.finalPlot_MuIso_DN )

##------------------------------------------------------------------
## Write EDM-output file -------------------------------------------
process.out.SelectEvents.SelectEvents = [ 'default', 'JECUP', 'JECDN']
process.out.outputCommands += ['keep *_weightProducer_*_*', 
                               'keep *_weightProducerLumiUP_*_*', 
                               'keep *_weightProducerLumiDN_*_*', 
                               'keep *_JetEnergyCorrectionUP_*_*',
                               'keep *_JetEnergyCorrectionDN_*_*',
                               'keep *_MuonIsolationEffUP_*_*',
                               'keep *_MuonIsolationEffDN_*_*',
                               'keep patMETs_*_*_*',
			      ]

## process.outpath is set in PhysicsTools.PatAlgos.patTemplate_cfg
## No EDM-output file
del process.outpath
