CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_4_5_patch3/src/Validation/RecoTau/python/RecoTauValidation_cfi.py

Go to the documentation of this file.
00001 import FWCore.ParameterSet.Config as cms
00002 import Validation.RecoTau.ValidationUtils as Utils
00003 import copy
00004 import re
00005 import os
00006 
00007 #from Validation.RecoTau.ValidationOptions_cff import *
00008 
00009 
00010 """
00011 
00012    RecoTauValidation_cfi.py
00013 
00014    Contains the standard tau Validation parameters.  It is organized into
00015    the following sections.
00016 
00017    DENOMINATOR 
00018      
00019      Set common kinematic cuts (pt > 5 and eta < 2.5) on the denominator source.
00020      Note that the denominator depends on the type of test (signal/background/e etc)
00021 
00022      The denominator kinematic cutter requires that 
00023 
00024    HISTOGRAMS
00025 
00026      Produce numerator and denominator histgorams used to produce
00027      tau efficiency plots
00028 
00029         Provides sequence: 
00030           TauValNumeratorAndDenominator 
00031         Requires:
00032           tauValSelectedDenominator (filtered GenJet collection)
00033         
00034    EFFICIENCY
00035    
00036      Using numerator and denominators, calculate and store
00037      the efficiency curves
00038 
00039         Provides sequence:
00040           TauEfficiencies
00041         Requires:
00042           TauValNumeratorAndDenominator
00043 
00044    PLOTTING
00045 
00046      Plot curves calculated in efficiency, in both an overlay mode
00047      showing overall performance for a release, and the indvidual 
00048      discriminator efficiency compared to a given release
00049 
00050         Provides sequence:
00051           loadTau
00052           plotTauValidation
00053           loadAndPlotTauValidation
00054 
00055         Requires:
00056           TauEfficiencies, external root file to compare to
00057 
00058      Plotting must be executed in a separate cmsRun job!
00059 
00060    UTILITIES
00061      
00062      Various scripts to automate things...
00063 
00064 
00065 """
00066 
00067 """
00068 
00069 DENOMINATOR
00070 
00071 """
00072 
00073 # require generator level hadrons produced in tau-decay to have transverse momentum above threshold
00074 kinematicSelectedTauValDenominator = cms.EDFilter("GenJetSelector",
00075      src = cms.InputTag("objectTypeSelectedTauValDenominator"),
00076      cut = cms.string('pt > 5. && abs(eta) < 2.5'),
00077      filter = cms.bool(False)
00078 )
00079 
00080 denominator = cms.InputTag("kinematicSelectedTauValDenominator")
00081 
00082 """
00083 
00084 HISTOGRAMS
00085 
00086         Plot the pt/eta/energy/phi spectrum of PFTaus that pass 
00087         a series of PFTauDiscriminator cuts.
00088 
00089         These will be used as the numerator/denominators of the
00090         efficiency calculations
00091 """
00092 
00093 StandardMatchingParameters = cms.PSet(
00094    DataType                     = cms.string('Leptons'),               
00095    MatchDeltaR_Leptons          = cms.double(0.15),
00096    MatchDeltaR_Jets             = cms.double(0.3),
00097    SaveOutputHistograms         = cms.bool(False), #TRUE FOR TEST ONLY
00098    #RefCollection                = cms.InputTag("TauGenJetProducer","selectedGenTauDecaysToHadronsPt5Cumulative"),
00099    RefCollection                = denominator,
00100    TauPtCut            = cms.double(0.),
00101 )
00102 
00103 PFTausHighEfficiencyLeadingPionBothProngs = cms.EDAnalyzer("TauTagValidation",
00104    StandardMatchingParameters,
00105    ExtensionName                = cms.string("LeadingPion"),
00106    TauProducer                  = cms.InputTag('shrinkingConePFTauProducer'),
00107    discriminators               = cms.VPSet(
00108     cms.PSet( discriminator = cms.string("shrinkingConePFTauDiscriminationByLeadingTrackFinding"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00109     cms.PSet( discriminator = cms.string("shrinkingConePFTauDiscriminationByLeadingPionPtCut"),selectionCut = cms.double(0.5),plotStep = cms.bool(False)), #not plotted
00110     cms.PSet( discriminator = cms.string("shrinkingConePFTauDiscriminationByTrackIsolationUsingLeadingPion"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00111     cms.PSet( discriminator = cms.string("shrinkingConePFTauDiscriminationByECALIsolationUsingLeadingPion"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00112     cms.PSet( discriminator = cms.string("shrinkingConePFTauDiscriminationAgainstElectron"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00113     cms.PSet( discriminator = cms.string("shrinkingConePFTauDiscriminationAgainstMuon"),selectionCut = cms.double(0.5),plotStep = cms.bool(True))
00114  )
00115 )
00116 #Clone for DQM. Is there a smarter way? I passed three days on that and I can live with this
00117 PFTausHighEfficiencyLeadingPionBothProngs2 = PFTausHighEfficiencyLeadingPionBothProngs.clone()
00118 
00119 PFTausHighEfficiencyBothProngs = cms.EDAnalyzer("TauTagValidation",
00120    StandardMatchingParameters,
00121    ExtensionName                = cms.string(""),
00122    TauProducer                  = cms.InputTag('shrinkingConePFTauProducer'),
00123    discriminators               = cms.VPSet(
00124     cms.PSet( discriminator = cms.string("shrinkingConePFTauDiscriminationByLeadingTrackFinding"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00125     cms.PSet( discriminator = cms.string("shrinkingConePFTauDiscriminationByLeadingTrackPtCut"),selectionCut = cms.double(0.5),plotStep = cms.bool(False)), #not plotted
00126     cms.PSet( discriminator = cms.string("shrinkingConePFTauDiscriminationByTrackIsolation"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00127     cms.PSet( discriminator = cms.string("shrinkingConePFTauDiscriminationByECALIsolation"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00128     cms.PSet( discriminator = cms.string("shrinkingConePFTauDiscriminationAgainstElectron"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00129     cms.PSet( discriminator = cms.string("shrinkingConePFTauDiscriminationAgainstMuon"),selectionCut = cms.double(0.5),plotStep = cms.bool(True))
00130  )
00131 )
00132 #Clone for DQM.
00133 PFTausHighEfficiencyBothProngs2 = PFTausHighEfficiencyBothProngs.clone()
00134 
00135 RunTancValidation = copy.deepcopy(PFTausHighEfficiencyBothProngs)
00136 RunTancValidation.ExtensionName = "Tanc"
00137 RunTancValidation.discriminators = cms.VPSet(
00138     cms.PSet( discriminator = cms.string("shrinkingConePFTauDiscriminationByLeadingTrackFinding"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00139     cms.PSet( discriminator = cms.string("shrinkingConePFTauDiscriminationByLeadingPionPtCut"),selectionCut = cms.double(0.5),plotStep = cms.bool(False)), #not plotted
00140     cms.PSet( discriminator = cms.string("shrinkingConePFTauDiscriminationByTaNCfrOnePercent"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00141     cms.PSet( discriminator = cms.string("shrinkingConePFTauDiscriminationByTaNCfrHalfPercent"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00142     cms.PSet( discriminator = cms.string("shrinkingConePFTauDiscriminationByTaNCfrQuarterPercent"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00143     cms.PSet( discriminator = cms.string("shrinkingConePFTauDiscriminationByTaNCfrTenthPercent"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00144     cms.PSet( discriminator = cms.string("shrinkingConePFTauDiscriminationAgainstElectron"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00145     cms.PSet( discriminator = cms.string("shrinkingConePFTauDiscriminationAgainstMuon"),selectionCut = cms.double(0.5),plotStep = cms.bool(True))
00146 )
00147 #Clone for DQM.
00148 RunTancValidation2 = RunTancValidation.clone()
00149 
00150 RunHPSValidation = copy.deepcopy(PFTausHighEfficiencyBothProngs)
00151 RunHPSValidation.ExtensionName = ""
00152 #RunHPSValidation.TauPtCut = cms.double(15.)
00153 RunHPSValidation.TauProducer   = cms.InputTag('hpsPFTauProducer')
00154 RunHPSValidation.discriminators = cms.VPSet(
00155    cms.PSet( discriminator = cms.string("hpsPFTauDiscriminationByDecayModeFinding"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00156    cms.PSet( discriminator = cms.string("hpsPFTauDiscriminationByVLooseIsolation"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00157    cms.PSet( discriminator = cms.string("hpsPFTauDiscriminationByLooseIsolation"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00158    cms.PSet( discriminator = cms.string("hpsPFTauDiscriminationByMediumIsolation"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00159    cms.PSet( discriminator = cms.string("hpsPFTauDiscriminationByTightIsolation"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00160    cms.PSet( discriminator = cms.string("hpsPFTauDiscriminationByLooseElectronRejection"),selectionCut = cms.double(0.5),plotStep = cms.bool(False)),
00161    cms.PSet( discriminator = cms.string("hpsPFTauDiscriminationByMediumElectronRejection"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00162    cms.PSet( discriminator = cms.string("hpsPFTauDiscriminationByTightElectronRejection"),selectionCut = cms.double(0.5),plotStep = cms.bool(False)),
00163    cms.PSet( discriminator = cms.string("hpsPFTauDiscriminationByLooseMuonRejection"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00164    cms.PSet( discriminator = cms.string("hpsPFTauDiscriminationByTightMuonRejection"),selectionCut = cms.double(0.5),plotStep = cms.bool(False))
00165 )
00166 #Clone for DQM.
00167 RunHPSValidation2 = RunHPSValidation.clone()
00168 
00169 RunHPSTanc_HPSValidation = copy.deepcopy(PFTausHighEfficiencyBothProngs)
00170 RunHPSTanc_HPSValidation.ExtensionName = "_HPS"
00171 #RunHPSTanc_HPSValidation.TauPtCut      = cms.double(15.)
00172 RunHPSTanc_HPSValidation.TauProducer   = cms.InputTag('hpsTancTaus')
00173 RunHPSTanc_HPSValidation.discriminators = cms.VPSet(
00174    cms.PSet( discriminator = cms.string("hpsTancTausDiscriminationByDecayModeSelection"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00175    cms.PSet( discriminator = cms.string("hpsTancTausDiscriminationByVLooseIsolation"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00176    cms.PSet( discriminator = cms.string("hpsTancTausDiscriminationByLooseIsolation"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00177    cms.PSet( discriminator = cms.string("hpsTancTausDiscriminationByMediumIsolation"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00178    cms.PSet( discriminator = cms.string("hpsTancTausDiscriminationByTightIsolation"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00179    cms.PSet( discriminator = cms.string("hpsTancTausDiscriminationByLooseElectronRejection"),selectionCut = cms.double(0.5),plotStep = cms.bool(False)),
00180    cms.PSet( discriminator = cms.string("hpsTancTausDiscriminationByMediumElectronRejection"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00181    cms.PSet( discriminator = cms.string("hpsTancTausDiscriminationByTightElectronRejection"),selectionCut = cms.double(0.5),plotStep = cms.bool(False)),
00182    cms.PSet( discriminator = cms.string("hpsTancTausDiscriminationByLooseMuonRejection"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00183    cms.PSet( discriminator = cms.string("hpsTancTausDiscriminationByTightMuonRejection"),selectionCut = cms.double(0.5),plotStep = cms.bool(False))
00184 )
00185 #Clone for DQM.
00186 RunHPSTanc_HPSValidation2 = RunHPSTanc_HPSValidation.clone()
00187 
00188 RunHPSTanc_TANCValidation = copy.deepcopy(PFTausHighEfficiencyBothProngs)
00189 RunHPSTanc_TANCValidation.ExtensionName = "_TANC"
00190 RunHPSTanc_TANCValidation.TauProducer   = cms.InputTag('hpsTancTaus')
00191 RunHPSTanc_TANCValidation.discriminators = cms.VPSet(
00192     cms.PSet( discriminator = cms.string("hpsTancTausDiscriminationByDecayModeSelection"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00193     cms.PSet( discriminator = cms.string("hpsTancTausDiscriminationByLeadingPionPtCut"),selectionCut = cms.double(0.5),plotStep = cms.bool(False)), #not plotted
00194     cms.PSet( discriminator = cms.string("hpsTancTausDiscriminationByLeadingTrackFinding"),selectionCut = cms.double(0.5),plotStep = cms.bool(False)),
00195     cms.PSet( discriminator = cms.string("hpsTancTausDiscriminationByLeadingTrackPtCut"),selectionCut = cms.double(0.5),plotStep = cms.bool(False)), #not plotted
00196     cms.PSet( discriminator = cms.string("hpsTancTausDiscriminationByTanc"),selectionCut = cms.double(0.5),plotStep = cms.bool(False)),
00197     cms.PSet( discriminator = cms.string("hpsTancTausDiscriminationByTancVLoose"),selectionCut = cms.double(0.5),plotStep = cms.bool(False)),
00198     cms.PSet( discriminator = cms.string("hpsTancTausDiscriminationByTancLoose"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00199     cms.PSet( discriminator = cms.string("hpsTancTausDiscriminationByTancMedium"),selectionCut = cms.double(0.5),plotStep = cms.bool(False)),
00200     cms.PSet( discriminator = cms.string("hpsTancTausDiscriminationByTancRaw"),selectionCut = cms.double(0.5),plotStep = cms.bool(False)),
00201     cms.PSet( discriminator = cms.string("hpsTancTausDiscriminationByTancTight"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00202 )
00203 #Clone for DQM.
00204 RunHPSTanc_TANCValidation2 = RunHPSTanc_TANCValidation.clone()
00205 
00206 CaloTausBothProngs = cms.EDAnalyzer("TauTagValidation",
00207    StandardMatchingParameters,
00208    ExtensionName                = cms.string(""),
00209    TauProducer                  = cms.InputTag('caloRecoTauProducer'),
00210    discriminators = cms.VPSet(
00211     cms.PSet( discriminator = cms.string("caloRecoTauDiscriminationByLeadingTrackFinding"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00212     cms.PSet( discriminator = cms.string("caloRecoTauDiscriminationByLeadingTrackPtCut"),selectionCut = cms.double(0.5),plotStep = cms.bool(False)), #not plotted
00213     cms.PSet( discriminator = cms.string("caloRecoTauDiscriminationByIsolation"),selectionCut = cms.double(0.5),plotStep = cms.bool(True)),
00214     cms.PSet( discriminator = cms.string("caloRecoTauDiscriminationAgainstElectron"),selectionCut = cms.double(0.5),plotStep = cms.bool(True))
00215  )
00216 )
00217 #Clone for DQM.
00218 CaloTausBothProngs2 = CaloTausBothProngs.clone()
00219 
00220 TauValNumeratorAndDenominator = cms.Sequence(
00221 #      PFTausBothProngs+ OLD
00222       RunHPSTanc_HPSValidation+
00223       RunHPSTanc_TANCValidation+
00224 #      CaloTausBothProngs+ #Kept for compatibility. In the DQM is removed for lightness reason
00225       PFTausHighEfficiencyBothProngs+
00226       PFTausHighEfficiencyLeadingPionBothProngs+
00227       RunTancValidation+
00228       RunHPSValidation
00229    )
00230 
00231 TauValNumeratorAndDenominator2 = cms.Sequence(
00232 #      PFTausBothProngs2+ OLD
00233       RunHPSTanc_HPSValidation2+
00234       RunHPSTanc_TANCValidation2+
00235 #      CaloTausBothProngs2+ #Kept for compatibility. In the DQM is removed for lightness reason
00236       PFTausHighEfficiencyBothProngs2+
00237       PFTausHighEfficiencyLeadingPionBothProngs2+
00238       RunTancValidation2+
00239       RunHPSValidation2
00240    )
00241 """
00242 
00243 EFFICIENCY
00244 
00245         Tau efficiency calculations
00246 
00247         Define the Efficiency curves to produce.  Each
00248         efficiency producer takes the numberator and denominator
00249         histograms and the dependent variables.
00250 """
00251 
00252 plotPset = Utils.SetPlotSequence(TauValNumeratorAndDenominator)
00253 TauEfficiencies = cms.EDAnalyzer("DQMHistEffProducer",
00254     plots = plotPset    
00255 )
00256 
00257  
00258 """
00259 
00260 PLOTTING
00261 
00262         loadTau:  load two separate TauVal root files into the DQM
00263                   so the plotter can access them
00264 
00265 """
00266 
00267 loadTau = cms.EDAnalyzer("DQMFileLoader",
00268   test = cms.PSet(
00269     #inputFileNames = cms.vstring('/afs/cern.ch/user/f/friis/scratch0/MyValidationArea/310pre6NewTags/src/Validation/RecoTau/test/CMSSW_3_1_0_pre6_ZTT_0505Fixes.root'),
00270     inputFileNames = cms.vstring('/opt/sbg/cms/ui4_data1/dbodin/CMSSW_3_5_1/src/TauID/QCD_recoFiles/TauVal_CMSSW_3_6_0_QCD.root'),
00271     scaleFactor = cms.double(1.),
00272     dqmDirectory_store = cms.string('test')
00273   ),
00274   reference = cms.PSet(
00275     inputFileNames = cms.vstring('/opt/sbg/cms/ui4_data1/dbodin/CMSSW_3_5_1/src/TauID/QCD_recoFiles/TauVal_CMSSW_3_6_0_QCD.root'),
00276     scaleFactor = cms.double(1.),
00277     dqmDirectory_store = cms.string('reference')
00278   )
00279 )
00280 
00281 # Lots of junk to define the plot style
00282 
00283 # standard drawing stuff
00284 xAxisStuff = cms.PSet(
00285    xAxisTitle = cms.string('P_{T} / GeV'),
00286    xAxisTitleOffset = cms.double(0.9),
00287    xAxisTitleSize = cms.double(0.05)
00288 )
00289 xModifiers = [['pt',['xAxisTitle'],['P_{T} / GeV']],['eta',['xAxisTitle'],['#eta']],['phi',['xAxisTitle'],['#phi']],['pileup',['xAxisTitle'],['# of Reco Vertices']]]
00290 
00291 yAxisStuff =cms.PSet(
00292    yScale = cms.string('linear'), # linear/log
00293    minY_linear = cms.double(0.),
00294    maxY_linear = cms.double(1.6),
00295    minY_log = cms.double(0.001),
00296    maxY_log = cms.double(1.8),
00297    yAxisTitle = cms.string('#varepsilon'), 
00298    yAxisTitleOffset = cms.double(1.1),
00299    yAxisTitleSize = cms.double(0.05)
00300 )
00301 yModifiers = [['efficiency',['yScale','yAxisTitle'],['linear','#varepsilon']],['fakeRate',['yScale','yAxisTitle'],['log','Fake rate']]]
00302 
00303 legStuff = cms.PSet(
00304    posX = cms.double(0.50),
00305    posY = cms.double(0.72),
00306    sizeX = cms.double(0.39),
00307    sizeY = cms.double(0.17),
00308    header = cms.string(''),
00309    option = cms.string('brNDC'),
00310    borderSize = cms.int32(0),
00311    fillColor = cms.int32(0)
00312 )
00313 legModifiers = [['efficiency',['posY','sizeY'],[0.72,0.17]],['efficiency_overlay',['posY','sizeY'],[0.66,0.23]]]
00314 
00315 drawOptStuff = cms.PSet(
00316    markerColor = cms.int32(1),
00317    markerSize = cms.double(1.),
00318    markerStyle = cms.int32(20),
00319    lineColor = cms.int32(1),
00320    lineStyle = cms.int32(1),
00321    lineWidth = cms.int32(2),
00322    drawOption = cms.string('ex0'),
00323    drawOptionLegend = cms.string('p')
00324 )
00325 drawOptModifiers = [['eff_overlay01',['markerColor','lineColor'],[1,1]],['eff_overlay02',['markerColor','lineColor'],[2,2]],['eff_overlay03',['markerColor','lineColor'],[3,3]],['eff_overlay04',['markerColor','lineColor'],[4,4]],['eff_overlay05',['markerColor','lineColor'],[6,6]],['eff_overlay06',['markerColor','lineColor'],[5,5]],['eff_overlay07',['markerColor','lineColor'],[7,7]],['eff_overlay08',['markerColor','lineColor'],[28,28]],['eff_overlay09',['markerColor','lineColor','markerStyle'],[2,2,29]],['eff_overlay010',['markerColor','lineColor','markerStyle'],[4,4,29]],['eff_overlay011',['markerColor','lineColor','markerStyle'],[6,6,29]]]
00326 
00327 standardDrawingStuff = cms.PSet(
00328   canvasSizeX = cms.int32(640),
00329   canvasSizeY = cms.int32(640),                         
00330   indOutputFileName = cms.string('#PLOT#.png'),
00331   xAxes = Utils.SpawnPSet(xModifiers,xAxisStuff),
00332   yAxes = Utils.SpawnPSet(yModifiers,yAxisStuff),
00333   legends =  Utils.SpawnPSet(legModifiers,legStuff),
00334   labels = cms.PSet(
00335     pt = cms.PSet(
00336       posX = cms.double(0.19),
00337       posY = cms.double(0.77),
00338       sizeX = cms.double(0.12),
00339       sizeY = cms.double(0.04),
00340       option = cms.string('brNDC'),
00341       borderSize = cms.int32(0),
00342       fillColor = cms.int32(0),
00343       textColor = cms.int32(1),
00344       textSize = cms.double(0.04),
00345       textAlign = cms.int32(22),
00346       text = cms.vstring('P_{T} > 5 GeV') #vstring not supported by SpawnPSet
00347     ),
00348     eta = cms.PSet(
00349       posX = cms.double(0.19),
00350       posY = cms.double(0.83),
00351       sizeX = cms.double(0.12),
00352       sizeY = cms.double(0.04),
00353       option = cms.string('brNDC'),
00354       borderSize = cms.int32(0),
00355       fillColor = cms.int32(0),
00356       textColor = cms.int32(1),
00357       textSize = cms.double(0.04),
00358       textAlign = cms.int32(22),
00359       text = cms.vstring('-2.5 < #eta < +2.5')
00360     )
00361   ),
00362   drawOptionSets = cms.PSet(
00363     efficiency = cms.PSet(
00364         test = cms.PSet(
00365         markerColor = cms.int32(4),
00366         markerSize = cms.double(1.),
00367         markerStyle = cms.int32(20),
00368         lineColor = cms.int32(1),
00369         lineStyle = cms.int32(1),
00370         lineWidth = cms.int32(1),
00371         drawOption = cms.string('ep'),
00372         drawOptionLegend = cms.string('p')
00373       ),
00374       reference = cms.PSet(
00375         lineColor = cms.int32(1),
00376         lineStyle = cms.int32(1),
00377         lineWidth = cms.int32(1),
00378         fillColor = cms.int32(41),
00379         drawOption = cms.string('eBand'),
00380         drawOptionLegend = cms.string('l')
00381       )
00382     )
00383   ),
00384   drawOptionEntries =  Utils.SpawnPSet(drawOptModifiers,drawOptStuff)
00385 )
00386 
00387 standardCompareTestAndReference = cms.PSet(
00388   processes = cms.PSet(
00389     test = cms.PSet(
00390       dqmDirectory = cms.string('test'),
00391       legendEntry = cms.string('no test label'),
00392       type = cms.string('smMC') # Data/smMC/bsmMC/smSumMC
00393     ),
00394     reference = cms.PSet(
00395       dqmDirectory = cms.string('reference'),
00396       legendEntry = cms.string('no ref label'),
00397       type = cms.string('smMC') # Data/smMC/bsmMC/smSumMC
00398     )
00399   ),
00400 )
00401         
00402 ##################################################
00403 #
00404 #   The plotting of all the HPS TaNC efficiencies
00405 #
00406 ##################################################
00407 plotPFTauEfficiencies_hps = cms.EDAnalyzer("DQMHistPlotter",
00408                                            standardDrawingStuff,
00409                                            standardCompareTestAndReference,
00410                                            drawJobs = Utils.SpawnDrawJobs(RunHPSTanc_HPSValidation, plotPset),
00411                                            outputFilePath = cms.string('./HPSTancTaus_HPS/'),
00412                                            PrintToFile = cms.bool(True)
00413                                            )
00414 #clone for DQM
00415 plotPFTauEfficiencies_hps2 = plotPFTauEfficiencies_hps.clone()
00416 
00417 plotPFTauEfficiencies_tanc = cms.EDAnalyzer("DQMHistPlotter",
00418                                             standardDrawingStuff,
00419                                             standardCompareTestAndReference,
00420                                             drawJobs = Utils.SpawnDrawJobs(RunHPSTanc_TANCValidation, plotPset),
00421                                             outputFilePath = cms.string('./HPSTancTaus_TANC/'),
00422                                             PrintToFile = cms.bool(True)
00423                                             )
00424 #clone for DQM
00425 plotPFTauEfficiencies_tanc2 =plotPFTauEfficiencies_tanc.clone()
00426 
00427 ##################################################
00428 #
00429 #   The plotting of HPS Efficiencies
00430 #
00431 ##################################################
00432 plotHPSEfficiencies = cms.EDAnalyzer("DQMHistPlotter",
00433                                      standardDrawingStuff,
00434                                      standardCompareTestAndReference,
00435                                      drawJobs = Utils.SpawnDrawJobs(RunHPSValidation, plotPset),
00436                                      outputFilePath = cms.string('./hpsPFTauProducer/'),
00437                                      PrintToFile = cms.bool(True)
00438                                      )
00439 #clone for DQM
00440 plotHPSEfficiencies2 = plotHPSEfficiencies.clone()
00441 
00442 ##################################################
00443 #
00444 #   The plotting of all the PFTauHighEfficiencies ID efficiencies
00445 #
00446 ##################################################
00447 plotPFTauHighEfficiencyEfficiencies = cms.EDAnalyzer("DQMHistPlotter",
00448                                                      standardDrawingStuff,
00449                                                      standardCompareTestAndReference,
00450                                                      drawJobs = Utils.SpawnDrawJobs(PFTausHighEfficiencyBothProngs, plotPset),
00451                                                      outputFilePath = cms.string('./shrinkingConePFTauProducer/'),
00452                                                      PrintToFile = cms.bool(True)
00453                                                      )
00454 #clone for DQM
00455 plotPFTauHighEfficiencyEfficiencies2 = plotPFTauHighEfficiencyEfficiencies.clone()
00456 
00457 ##################################################
00458 #
00459 #   The plotting of all the CaloTau ID efficiencies
00460 #
00461 ##################################################
00462 plotCaloTauEfficiencies = cms.EDAnalyzer("DQMHistPlotter",
00463                                          standardDrawingStuff,
00464                                          standardCompareTestAndReference,
00465                                          drawJobs = Utils.SpawnDrawJobs(CaloTausBothProngs, plotPset),
00466                                          outputFilePath = cms.string('./caloRecoTauProducer/'),
00467                                          PrintToFile = cms.bool(True)
00468                                          )
00469 #clone for DQM
00470 plotCaloTauEfficiencies2 = plotCaloTauEfficiencies.clone()
00471 
00472 ##################################################
00473 #
00474 #   The plotting of all the TaNC efficiencies
00475 #
00476 ##################################################
00477 plotTancValidation = cms.EDAnalyzer("DQMHistPlotter",
00478                                     standardDrawingStuff,
00479                                     standardCompareTestAndReference,
00480                                     drawJobs = Utils.SpawnDrawJobs(RunTancValidation, plotPset),
00481                                     outputFilePath = cms.string('./shrinkingConePFTauProducerTanc/'),
00482                                     PrintToFile = cms.bool(True),
00483                                     )
00484 #clone for DQM
00485 plotTancValidation2 = plotTancValidation.clone()
00486 
00487 ##################################################
00488 #
00489 #   The plotting of all the Shrinking cone leading pion efficiencies
00490 #
00491 ##################################################
00492 plotPFTauHighEfficiencyEfficienciesLeadingPion = cms.EDAnalyzer("DQMHistPlotter",
00493                                                                 standardDrawingStuff,
00494                                                                 standardCompareTestAndReference,
00495                                                                 drawJobs = Utils.SpawnDrawJobs(PFTausHighEfficiencyLeadingPionBothProngs, plotPset),
00496                                                                 outputFilePath = cms.string('./shrinkingConePFTauProducerLeadingPion/'),
00497                                                                 PrintToFile = cms.bool(True)
00498                                                                 )
00499 #clone for DQM
00500 plotPFTauHighEfficiencyEfficienciesLeadingPion2 = plotPFTauHighEfficiencyEfficienciesLeadingPion.clone()
00501 
00502 
00503 plotTauValidation = cms.Sequence(
00504       plotPFTauEfficiencies_hps
00505       +plotPFTauEfficiencies_tanc
00506       +plotPFTauHighEfficiencyEfficiencies
00507 #     +plotCaloTauEfficiencies  #Kept for compatibility. In the DQM is removed for lightness reason
00508       +plotTancValidation
00509       +plotPFTauHighEfficiencyEfficienciesLeadingPion
00510       +plotHPSEfficiencies
00511       )
00512 
00513 plotTauValidation2 = cms.Sequence(
00514       plotPFTauEfficiencies_hps2
00515       +plotPFTauEfficiencies_tanc2
00516       +plotPFTauHighEfficiencyEfficiencies2
00517 #     +plotCaloTauEfficiencies2  #Kept for compatibility. In the DQM is removed for lightness reason
00518       +plotTancValidation2
00519       +plotPFTauHighEfficiencyEfficienciesLeadingPion2
00520       +plotHPSEfficiencies2
00521       )
00522 
00523 
00524 loadAndPlotTauValidation = cms.Sequence(
00525       loadTau
00526       +plotTauValidation
00527       )
00528 
00529 """
00530 
00531 UTILITIES
00532 
00533 """
00534 
00535 class ApplyFunctionToSequence:
00536    """ Helper class that applies a given function to all modules
00537        in a sequence """
00538    def __init__(self,function):
00539       self.functor = function
00540    def enter(self, module):
00541       self.functor(module)
00542    def leave(self, module):
00543       pass
00544 
00545 def TranslateToLegacyProdNames(input):
00546    input = re.sub('fixedConePFTauProducer', 'pfRecoTauProducer', input)
00547    #fixedDiscriminationRegex = re.compile('fixedConePFTauDiscrimination( \w* )')
00548    fixedDiscriminationRegex = re.compile('fixedConePFTauDiscrimination(\w*)')
00549    input = fixedDiscriminationRegex.sub(r'pfRecoTauDiscrimination\1', input)
00550    input = re.sub('shrinkingConePFTauProducer', 'pfRecoTauProducerHighEfficiency', input)
00551    shrinkingDiscriminationRegex = re.compile('shrinkingConePFTauDiscrimination(\w*)')
00552    input = shrinkingDiscriminationRegex.sub(r'pfRecoTauDiscrimination\1HighEfficiency', input)
00553    return input
00554 
00555 
00556 def ConvertDrawJobToLegacyCompare(input):
00557    """ Converts a draw job defined to compare 31X named PFTau validtion efficiencies
00558        to comapre a 31X to a 22X named Validation """
00559    # get the list of drawjobs { name : copyOfPSet }
00560    if not hasattr(input, "drawJobs"):
00561       return
00562    myDrawJobs = input.drawJobs.parameters_()
00563    for drawJobName, drawJobData in myDrawJobs.iteritems():
00564       print drawJobData
00565       if not drawJobData.plots.pythonTypeName() == "cms.PSet":
00566          continue
00567       pSetToInsert = cms.PSet(
00568             standardEfficiencyParameters,
00569             plots = cms.VPSet(
00570                # test plot w/ modern names
00571                cms.PSet(
00572                   dqmMonitorElements = drawJobData.plots.dqmMonitorElements,
00573                   process = cms.string('test'),
00574                   drawOptionEntry = cms.string('eff_overlay01'),
00575                   legendEntry = cms.string(input.processes.test.legendEntry.value())
00576                   ),
00577                # ref plot w/ vintage name
00578                cms.PSet(
00579                   # translate the name
00580                   dqmMonitorElements = cms.vstring(TranslateToLegacyProdNames(drawJobData.plots.dqmMonitorElements.value()[0])),
00581                   process = cms.string('reference'),
00582                   drawOptionEntry = cms.string('eff_overlay02'),
00583                   legendEntry = cms.string(input.processes.reference.legendEntry.value())
00584                   )
00585                )
00586             )
00587       input.drawJobs.__setattr__(drawJobName, pSetToInsert)
00588 
00589 def MakeLabeler(TestLabel, ReferenceLabel):
00590    def labeler(module):
00591       if hasattr(module, 'processes'):
00592          if module.processes.hasParameter(['test', 'legendEntry']) and module.processes.hasParameter([ 'reference', 'legendEntry']):
00593             module.processes.test.legendEntry = TestLabel
00594             module.processes.reference.legendEntry = ReferenceLabel
00595             print "Set test label to %s and reference label to %s for plot producer %s" % (TestLabel, ReferenceLabel, module.label())
00596          else:
00597             print "ERROR in RecoTauValidation_cfi::MakeLabeler - trying to set test/reference label but %s does not have processes.(test/reference).legendEntry parameters!" % module.label()
00598    return labeler
00599 
00600 def SetYmodulesToLog(matchingNames = []):
00601    ''' set all modules whose name contains one of the matching names to log y scale'''
00602    def yLogger(module):
00603       ''' set a module to use log scaling in the yAxis'''
00604       if hasattr(module, 'drawJobs'):
00605          print "EK DEBUG"
00606          drawJobParamGetter = lambda subName : getattr(module.drawJobs, subName)
00607          #for subModule in [getattr(module.drawJobs, subModuleName) for subModuleName in dir(module.drawJobs)]:
00608          attrNames = dir(module.drawJobs)
00609          for subModuleName, subModule in zip(attrNames, map(drawJobParamGetter, attrNames)):
00610             matchedNames = [name for name in matchingNames if subModuleName.find( name) > -1] # matching sub strings
00611             if len(matchingNames) == 0:
00612                matchedNames = ['take','everything','and','dont','bother']
00613             if hasattr(subModule, "yAxis") and len(matchedNames):
00614                print "Setting drawJob: ", subModuleName, " to log scale."
00615                subModule.yAxis = cms.string('fakeRate') #'fakeRate' configuration specifies the log scaling
00616          if len(matchingNames) == 0: 
00617             module.yAxes.efficiency.maxY_log = 40
00618             module.yAxes.fakeRate.maxY_log = 40
00619    return yLogger
00620 
00621 
00622 def SetBaseDirectory(Directory):
00623    def BaseDirectorizer(module):
00624       newPath = Directory
00625       #if module.hasParameter("outputFilePath"):
00626       if hasattr(module, "outputFilePath"):
00627          oldPath = module.outputFilePath.value()
00628          newPath = os.path.join(newPath, oldPath)
00629          if not os.path.exists(newPath):
00630             os.makedirs(newPath)
00631          print newPath
00632          module.outputFilePath = cms.string("%s" % newPath)
00633    return BaseDirectorizer
00634 
00635 def RemoveComparisonPlotCommands(module):
00636    if hasattr(module, 'drawJobs'):
00637       #get draw job parameter names
00638       drawJobs = module.drawJobs.parameterNames_()
00639       for drawJob in drawJobs:
00640          if drawJob != "TauIdEffStepByStep":
00641             module.drawJobs.__delattr__(drawJob)
00642             print "Removing comparison plot", drawJob
00643 
00644 def SetPlotDirectory(myPlottingSequence, directory):
00645    myFunctor = ApplyFunctionToSequence(SetBaseDirectory(directory))
00646    myPlottingSequence.visit(myFunctor)
00647 
00648 def SetTestAndReferenceLabels(myPlottingSequence, TestLabel, ReferenceLabel):
00649    myFunctor = ApplyFunctionToSequence(MakeLabeler(TestLabel, ReferenceLabel))
00650    myPlottingSequence.visit(myFunctor)
00651 
00652 def SetCompareToLegacyProductNames(myPlottingSequence):
00653    myFunctor = ApplyFunctionToSequence(ConvertDrawJobToLegacyCompare)
00654    myPlottingSequence.visit(myFunctor)
00655 
00656 def SetTestFileToPlot(myProcess, FileLoc):
00657    myProcess.loadTau.test.inputFileNames = cms.vstring(FileLoc)
00658 
00659 def SetReferenceFileToPlot(myProcess, FileLoc):
00660    if FileLoc == None:
00661       del myProcess.loadTau.reference
00662    else:
00663       myProcess.loadTau.reference.inputFileNames = cms.vstring(FileLoc)
00664 
00665 def SetLogScale(myPlottingSequence):
00666    myFunctor = ApplyFunctionToSequence(SetYmodulesToLog())
00667    myPlottingSequence.visit(myFunctor)
00668 
00669 def SetSmartLogScale(myPlottingSequence):
00670    myFunctor = ApplyFunctionToSequence(SetYmodulesToLog(['Electron', 'Muon', 'Isolation', 'TaNC']))
00671    myPlottingSequence.visit(myFunctor)
00672 
00673 def SetPlotOnlyStepByStep(myPlottingSequence):
00674    myFunctor = ApplyFunctionToSequence(RemoveComparisonPlotCommands)
00675    myPlottingSequence.visit(myFunctor)