CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch9/src/DQMOffline/Trigger/src/EgHLTMonElemFuncs.cc

Go to the documentation of this file.
00001 #include "DQMOffline/Trigger/interface/EgHLTMonElemFuncs.h"
00002 
00003 #include "DQMOffline/Trigger/interface/EgHLTMonElemMgrEBEE.h"
00004 #include "DQMOffline/Trigger/interface/EgHLTEgCutCodes.h"
00005 #include "DQMOffline/Trigger/interface/EgHLTDQMCut.h"
00006 #include "DQMOffline/Trigger/interface/EgHLTCutMasks.h"
00007 
00008 
00009 using namespace egHLT;
00010 
00011 void MonElemFuncs::initStdEleHists(std::vector<MonElemManagerBase<OffEle>*>& histVec,const std::string& baseName,const BinData& bins)
00012 {
00013   addStdHist<OffEle,float>(histVec,baseName+"_et",baseName+" E_{T};E_{T} (GeV)",bins.et,&OffEle::et); 
00014   addStdHist<OffEle,float>(histVec,baseName+"_etHigh",baseName+" E_{T};E_{T} (GeV)",bins.etHigh,&OffEle::et); 
00015   addStdHist<OffEle,float>(histVec,baseName+"_etSC",baseName+" E^{SC}_{T};E^{SC}_{T} (GeV)",bins.et,&OffEle::etSC);
00016   addStdHist<OffEle,float>(histVec,baseName+"_eta",baseName+" #eta;#eta",bins.eta,&OffEle::detEta);             
00017   addStdHist<OffEle,float>(histVec,baseName+"_phi",baseName+" #phi;#phi (rad)",bins.phi,&OffEle::phi);
00018   addStdHist<OffEle,int>(histVec,baseName+"_charge",baseName+" Charge; charge",bins.charge,&OffEle::charge);
00019   
00020   addStdHist<OffEle,float>(histVec,baseName+"_hOverE",baseName+" H/E; H/E",bins.hOverE,&OffEle::hOverE);
00021   addStdHist<OffEle,float>(histVec,baseName+"_dPhiIn",baseName+" #Delta #phi_{in}; #Delta #phi_{in}",bins.dPhiIn,&OffEle::dPhiIn);
00022   addStdHist<OffEle,float>(histVec,baseName+"_dEtaIn",baseName+" #Delta #eta_{in}; #Delta #eta_{in}",bins.dEtaIn,&OffEle::dEtaIn);
00023   addStdHist<OffEle,float>(histVec,baseName+"_sigmaIEtaIEta",baseName+"#sigma_{i#etai#eta}; #sigma_{i#etai#eta}",bins.sigEtaEta,&OffEle::sigmaIEtaIEta);  
00024   addStdHist<OffEle,float>(histVec,baseName+"_epIn",baseName+"E/p_{in}; E/p_{in}",bins.eOverP,&OffEle::epIn);
00025   addStdHist<OffEle,float>(histVec,baseName+"_epOut",baseName+"E/p_{out}; E/p_{out}",bins.eOverP,&OffEle::epIn); 
00026   addStdHist<OffEle,float>(histVec,baseName+"_invEInvP",baseName+"1/E -1/p; 1/E - 1/p",bins.invEInvP,&OffEle::invEInvP);
00027 
00028   addStdHist<OffEle,float>(histVec,baseName+"_e2x5Over5x5",baseName+"E^{2x5}/E^{5x5}; E^{2x5}/E^{5x5}",bins.e2x5,&OffEle::e2x5MaxOver5x5);
00029   addStdHist<OffEle,float>(histVec,baseName+"_e1x5Over5x5",baseName+"E^{1x5}/E^{5x5}; E^{1x5}/E^{5x5}",bins.e1x5,&OffEle::e1x5Over5x5);
00030   addStdHist<OffEle,float>(histVec,baseName+"_isolEM",baseName+"Isol EM; Isol EM (GeV)",bins.isolEm,&OffEle::isolEm); 
00031   addStdHist<OffEle,float>(histVec,baseName+"_isolHad",baseName+"Isol Had; Isol Had (GeV)",bins.isolHad,&OffEle::isolHad);
00032   addStdHist<OffEle,float>(histVec,baseName+"_isolPtTrks",baseName+"Isol Pt Trks; Isol Pt Tracks (GeV/c)",bins.isolPtTrks,&OffEle::isolPtTrks); 
00033   addStdHist<OffEle,float>(histVec,baseName+"_hltIsolTrksEle",baseName+"HLT Ele Isol Trks; HLT Ele Iso Tracks (GeV/c)",bins.isolPtTrks,&OffEle::hltIsolTrksEle);  
00034   addStdHist<OffEle,float>(histVec,baseName+"_hltIsolTrksPho",baseName+"HLT Pho Isol Trks; HLT Pho Iso Tracks (GeV/c)",bins.isolPtTrks,&OffEle::hltIsolTrksPho); 
00035   addStdHist<OffEle,float>(histVec,baseName+"_hltIsolHad",baseName+"HLT Isol Had; HLT Isol Had (GeV)",bins.isolHad,&OffEle::hltIsolHad);
00036   
00037   histVec.push_back(new MonElemManager2D<OffEle,float,float>(baseName+"_etaVsPhi",
00038                                                              baseName+" #eta vs #phi;#eta;#phi (rad)",
00039                                                              bins.etaVsPhi.nrX,bins.etaVsPhi.xMin,bins.etaVsPhi.xMax,
00040                                                              bins.etaVsPhi.nrY,bins.etaVsPhi.yMin,bins.etaVsPhi.yMax,
00041                                                              &OffEle::detEta,&OffEle::phi));
00042  
00043 }
00044 
00045 void MonElemFuncs::initStdPhoHists(std::vector<MonElemManagerBase<OffPho>*>& histVec,const std::string& baseName,const BinData& bins)
00046 {
00047   addStdHist<OffPho,float>(histVec,baseName+"_et",baseName+" E_{T};E_{T} (GeV)",bins.et,&OffPho::et); 
00048   addStdHist<OffPho,float>(histVec,baseName+"_etHigh",baseName+" E_{T};E_{T} (GeV)",bins.etHigh,&OffPho::et);
00049   addStdHist<OffPho,float>(histVec,baseName+"_etSC",baseName+" E^{SC}_{T};E^{SC}_{T} (GeV)",bins.et,&OffPho::etSC);
00050   addStdHist<OffPho,float>(histVec,baseName+"_eta",baseName+" #eta;#eta",bins.eta,&OffPho::detEta);             
00051   addStdHist<OffPho,float>(histVec,baseName+"_phi",baseName+" #phi;#phi (rad)",bins.phi,&OffPho::phi);
00052   
00053   addStdHist<OffPho,float>(histVec,baseName+"_hOverE",baseName+" H/E; H/E",bins.hOverE,&OffPho::hOverE);
00054   addStdHist<OffPho,float>(histVec,baseName+"_r9",baseName+" R9 ; R9",bins.r9,&OffPho::r9);
00055   addStdHist<OffPho,float>(histVec,baseName+"_sigmaIEtaIEta",baseName+"#sigma_{i#etai#eta}; #sigma_{i#etai#eta}",bins.sigEtaEta,&OffPho::sigmaIEtaIEta);  
00056   addStdHist<OffPho,float>(histVec,baseName+"_e2x5Over5x5",baseName+"E^{2x5}/E^{5x5}; E^{2x5}/E^{5x5}",bins.e2x5,&OffPho::e2x5MaxOver5x5);
00057   addStdHist<OffPho,float>(histVec,baseName+"_e1x5Over5x5",baseName+"E^{1x5}/E^{5x5}; E^{1x5}/E^{5x5}",bins.e1x5,&OffPho::e1x5Over5x5);
00058   addStdHist<OffPho,float>(histVec,baseName+"_isolEM",baseName+"Isol EM; Isol EM (GeV)",bins.isolEm,&OffPho::isolEm); 
00059   addStdHist<OffPho,float>(histVec,baseName+"_isolHad",baseName+"Isol Had; Isol Had (GeV)",bins.isolHad,&OffPho::isolHad);
00060   addStdHist<OffPho,float>(histVec,baseName+"_isolPtTrks",baseName+"Isol Pt Trks; Isol Pt Tracks (GeV/c)",bins.isolPtTrks,&OffPho::isolPtTrks);  
00061   addStdHist<OffPho,int>(histVec,baseName+"_isolNrTrks",baseName+"Isol Nr Trks; Isol Nr Tracks",bins.isolNrTrks,&OffPho::isolNrTrks); 
00062   addStdHist<OffPho,float>(histVec,baseName+"_hltIsolTrks",baseName+"HLT Isol Trks; HLT Iso Tracks (GeV/c)",bins.isolPtTrks,&OffPho::hltIsolTrks); 
00063   addStdHist<OffPho,float>(histVec,baseName+"_hltIsolHad",baseName+"HLT Isol Had; HLT Isol Had (GeV)",bins.isolPtTrks,&OffPho::hltIsolHad);
00064   
00065   histVec.push_back(new MonElemManager2D<OffPho,float,float>(baseName+"_etaVsPhi",
00066                                                              baseName+" #eta vs #phi;#eta;#phi (rad)",
00067                                                              bins.etaVsPhi.nrX,bins.etaVsPhi.xMin,bins.etaVsPhi.xMax,
00068                                                              bins.etaVsPhi.nrY,bins.etaVsPhi.yMin,bins.etaVsPhi.yMax,
00069                                                              &OffPho::detEta,&OffPho::phi));
00070 }
00071  
00072 void MonElemFuncs::initStdEffHists(std::vector<MonElemWithCutBase<OffEle>*>& histVec,const std::string& baseName,const BinData::Data1D& bins,float (OffEle::*vsVarFunc)()const,const CutMasks& masks)
00073 {
00074   initStdEffHists(histVec,baseName,bins.nr,bins.min,bins.max,vsVarFunc,masks);
00075 }
00076   
00077 void MonElemFuncs::initStdEffHists(std::vector<MonElemWithCutBase<OffPho>*>& histVec,const std::string& baseName,const BinData::Data1D& bins,float (OffPho::*vsVarFunc)()const,const CutMasks& masks)
00078 {
00079   initStdEffHists(histVec,baseName,bins.nr,bins.min,bins.max,vsVarFunc,masks);
00080 }
00081 
00082 void MonElemFuncs::initStdEffHists(std::vector<MonElemWithCutBase<OffEle>*>& histVec,const std::string& baseName,int nrBins,double xMin,double xMax,float (OffEle::*vsVarFunc)()const,const CutMasks& masks)
00083 {
00084   //some convience typedefs, I hate typedefs but atleast here where they are defined is obvious
00085   typedef EgHLTDQMVarCut<OffEle> VarCut;
00086   typedef MonElemWithCutEBEE<OffEle,float> MonElemFloat;
00087   int stdCutCode = masks.stdEle;
00088 
00089   //first do the zero and all cuts histograms
00090   histVec.push_back(new MonElemFloat(baseName+"_noCuts",baseName+" NoCuts",nrBins,xMin,xMax,vsVarFunc));
00091   histVec.push_back(new MonElemFloat(baseName+"_allCuts",baseName+" All Cuts",nrBins,xMin,xMax,vsVarFunc,
00092                                      new VarCut(stdCutCode,&OffEle::cutCode))); 
00093                        
00094   //now for the n-1
00095   histVec.push_back(new MonElemFloat(baseName+"_n1_dEtaIn",baseName+" N1 #Delta#eta_{in}",nrBins,xMin,xMax,vsVarFunc,
00096                                      new VarCut(~EgCutCodes::DETAIN&stdCutCode,&OffEle::cutCode)));
00097   histVec.push_back(new MonElemFloat(baseName+"_n1_dPhiIn",baseName+" N1 #Delta#phi_{in}",nrBins,xMin,xMax,vsVarFunc,
00098                                      new VarCut(~EgCutCodes::DPHIIN&stdCutCode,&OffEle::cutCode)));
00099   histVec.push_back(new MonElemFloat(baseName+"_n1_sigmaIEtaIEta",baseName+" N1 #sigma_{#ieta#ieta}",nrBins,xMin,xMax,vsVarFunc,
00100                                      new VarCut(~EgCutCodes::SIGMAIETAIETA&stdCutCode,&OffEle::cutCode)));
00101   histVec.push_back(new MonElemFloat(baseName+"_n1_hOverE",baseName+" N1 H/E",nrBins,xMin,xMax,vsVarFunc,
00102                                      new VarCut(~EgCutCodes::HADEM &stdCutCode,&OffEle::cutCode)));
00103 
00104   histVec.push_back(new MonElemFloat(baseName+"_n1_isolEm",baseName+" N1 Isol Em",nrBins,xMin,xMax,vsVarFunc,
00105                                      new VarCut(~EgCutCodes::ISOLEM&stdCutCode,&OffEle::cutCode)));
00106   histVec.push_back(new MonElemFloat(baseName+"_n1_isolHad",baseName+" N1 Isol Had",nrBins,xMin,xMax,vsVarFunc,
00107                                      new VarCut(~EgCutCodes::ISOLHAD&stdCutCode,&OffEle::cutCode)));
00108   histVec.push_back(new MonElemFloat(baseName+"_n1_isolPtTrks",baseName+" N1 Isol Tracks",nrBins,xMin,xMax,vsVarFunc,
00109                                      new VarCut(~EgCutCodes::ISOLPTTRKS&stdCutCode,&OffEle::cutCode)));
00110   histVec.push_back(new MonElemFloat(baseName+"_n1_hltIsolHad",baseName+" N1 HLT Isol Had",nrBins,xMin,xMax,vsVarFunc,
00111                                      new VarCut(~EgCutCodes::HLTISOLHAD&stdCutCode,&OffEle::cutCode)));
00112   histVec.push_back(new MonElemFloat(baseName+"_n1_hltIsolTrksEle",baseName+" N1 HLT Isol Tracks Ele ",nrBins,xMin,xMax,vsVarFunc,
00113                                      new VarCut(~EgCutCodes::HLTISOLTRKSELE&stdCutCode,&OffEle::cutCode)));
00114 
00115 
00116   histVec.push_back(new MonElemFloat(baseName+"_single_dEtaIn",baseName+" Single #Delta#eta_{in}",nrBins,xMin,xMax,vsVarFunc,
00117                                      new VarCut(EgCutCodes::DETAIN,&OffEle::cutCode)));
00118   histVec.push_back(new MonElemFloat(baseName+"_single_dPhiIn",baseName+" Single #Delta#phi_{in}",nrBins,xMin,xMax,vsVarFunc,
00119                                      new VarCut(EgCutCodes::DPHIIN,&OffEle::cutCode)));
00120   histVec.push_back(new MonElemFloat(baseName+"_single_sigmaIEtaIEta",baseName+" Single #sigma_{#ieta#ieta}",nrBins,xMin,xMax,vsVarFunc,
00121                                      new VarCut(EgCutCodes::SIGMAIETAIETA,&OffEle::cutCode)));
00122   histVec.push_back(new MonElemFloat(baseName+"_single_hOverE",baseName+" Single H/E",nrBins,xMin,xMax,vsVarFunc,
00123                                      new VarCut(EgCutCodes::HADEM,&OffEle::cutCode)));
00124  
00125 
00126   histVec.push_back(new MonElemFloat(baseName+"_single_isolEm",baseName+" Single Isol Em",nrBins,xMin,xMax,vsVarFunc,
00127                                      new VarCut(EgCutCodes::ISOLEM,&OffEle::cutCode)));
00128   histVec.push_back(new MonElemFloat(baseName+"_single_isolHad",baseName+" Single Isol Had",nrBins,xMin,xMax,vsVarFunc,
00129                                      new VarCut(EgCutCodes::ISOLHAD,&OffEle::cutCode)));
00130   histVec.push_back(new MonElemFloat(baseName+"_single_isolPtTrks",baseName+" Single Isol Tracks",nrBins,xMin,xMax,vsVarFunc,
00131                                      new VarCut(EgCutCodes::ISOLPTTRKS,&OffEle::cutCode)));
00132 
00133   histVec.push_back(new MonElemFloat(baseName+"_single_hltIsolHad",baseName+" Single HLT Isol Had",nrBins,xMin,xMax,vsVarFunc,
00134                                      new VarCut(EgCutCodes::HLTISOLHAD,&OffEle::cutCode)));
00135   histVec.push_back(new MonElemFloat(baseName+"_single_hltIsolTrksEle",baseName+" Single HLT Isol Tracks Ele ",nrBins,xMin,xMax,vsVarFunc,
00136                                      new VarCut(EgCutCodes::HLTISOLTRKSELE,&OffEle::cutCode))); 
00137   histVec.push_back(new MonElemFloat(baseName+"_single_hltIsolTrksPho",baseName+" Single HLT Isol Tracks Pho ",nrBins,xMin,xMax,vsVarFunc,
00138                                      new VarCut(EgCutCodes::HLTISOLTRKSPHO,&OffEle::cutCode)));
00139   
00140 }
00141 
00142 void MonElemFuncs::initStdEffHists(std::vector<MonElemWithCutBase<OffPho>*>& histVec,const std::string& baseName,int nrBins,double xMin,double xMax,float (OffPho::*vsVarFunc)()const,const CutMasks& masks)
00143 {
00144   //some convience typedefs, I hate typedefs but atleast here where they are defined is obvious
00145   typedef EgHLTDQMVarCut<OffPho> VarCut;
00146   typedef MonElemWithCutEBEE<OffPho,float> MonElemFloat;
00147   int stdCutCode = masks.stdPho;
00148 
00149   histVec.push_back(new MonElemFloat(baseName+"_noCuts",baseName+" NoCuts",nrBins,xMin,xMax,vsVarFunc));
00150   histVec.push_back(new MonElemFloat(baseName+"_allCuts",baseName+" All Cuts",nrBins,xMin,xMax,vsVarFunc,
00151                                      new VarCut(stdCutCode,&OffPho::cutCode))); 
00152 
00153   
00154   histVec.push_back(new MonElemFloat(baseName+"_n1_sigmaIEtaIEta",baseName+" N1 #sigma_{#ieta#ieta}",nrBins,xMin,xMax,vsVarFunc,
00155                                      new VarCut(~EgCutCodes::SIGMAIETAIETA&stdCutCode,&OffPho::cutCode)));
00156   histVec.push_back(new MonElemFloat(baseName+"_n1_hOverE",baseName+" N1 H/E",nrBins,xMin,xMax,vsVarFunc,
00157                                      new VarCut(~EgCutCodes::R9&stdCutCode,&OffPho::cutCode)));
00158   histVec.push_back(new MonElemFloat(baseName+"_n1_r9",baseName+" N1 R9",nrBins,xMin,xMax,vsVarFunc,
00159                                      new VarCut(~EgCutCodes::HADEM &stdCutCode,&OffPho::cutCode)));
00160   histVec.push_back(new MonElemFloat(baseName+"_n1_isolEm",baseName+" N1 Isol Em",nrBins,xMin,xMax,vsVarFunc,
00161                                      new VarCut(~EgCutCodes::ISOLEM&stdCutCode,&OffPho::cutCode)));
00162   histVec.push_back(new MonElemFloat(baseName+"_n1_isolHad",baseName+" N1 Isol Had",nrBins,xMin,xMax,vsVarFunc,
00163                                      new VarCut(~EgCutCodes::ISOLHAD&stdCutCode,&OffPho::cutCode)));
00164   histVec.push_back(new MonElemFloat(baseName+"_n1_isolPtTrks",baseName+" N1 Pt Isol Tracks",nrBins,xMin,xMax,vsVarFunc,
00165                                      new VarCut(~EgCutCodes::ISOLPTTRKS&stdCutCode,&OffPho::cutCode))); 
00166   histVec.push_back(new MonElemFloat(baseName+"_n1_isolNrTrks",baseName+" N1 Nr Isol Tracks",nrBins,xMin,xMax,vsVarFunc,
00167                                      new VarCut(~EgCutCodes::ISOLNRTRKS&stdCutCode,&OffPho::cutCode)));
00168  
00169   histVec.push_back(new MonElemFloat(baseName+"_single_sigmaIEtaIEta",baseName+" Single #sigma_{#ieta#ieta}",nrBins,xMin,xMax,vsVarFunc,
00170                                      new VarCut(EgCutCodes::SIGMAIETAIETA,&OffPho::cutCode)));
00171   histVec.push_back(new MonElemFloat(baseName+"_single_hltIsolHad",baseName+" N1 HLT Isol Had",nrBins,xMin,xMax,vsVarFunc,
00172                                      new VarCut(EgCutCodes::HLTISOLHAD,&OffPho::cutCode)));
00173   histVec.push_back(new MonElemFloat(baseName+"_single_hltIsolTrksPho",baseName+" N1 HLT Isol Tracks Pho ",nrBins,xMin,xMax,vsVarFunc,
00174                                      new VarCut(EgCutCodes::HLTISOLTRKSPHO,&OffPho::cutCode)));
00175 
00176   
00177 }
00178 
00179 
00180 //we own the passed in cut, so we give it to the first mon element and then clone it after that
00181 //only currently used for trigger tag and probe
00182 void MonElemFuncs::initStdEleCutHists(std::vector<MonElemWithCutBase<OffEle>*>& histVec,const std::string& baseName,const BinData& bins,EgHLTDQMCut<OffEle>* cut)
00183 {
00184   histVec.push_back(new MonElemWithCutEBEE<OffEle,float>(baseName+"_et",
00185                                                          baseName+" E_{T};E_{T} (GeV)",
00186                                                          bins.et.nr,bins.et.min,bins.et.max,&OffEle::et,cut));
00187   histVec.push_back(new MonElemWithCutEBEE<OffEle,float>(baseName+"_eta",
00188                                                          baseName+" #eta;#eta",
00189                                                          bins.eta.nr,bins.eta.min,bins.eta.max,
00190                                                          &OffEle::detEta,cut ? cut->clone(): NULL));            
00191   histVec.push_back(new MonElemWithCutEBEE<OffEle,float>(baseName+"_phi",
00192                                                          baseName+" #phi;#phi (rad)",
00193                                                          bins.phi.nr,bins.phi.min,bins.phi.max,
00194                                                          &OffEle::phi,cut ? cut->clone():NULL));
00195   histVec.push_back(new MonElemWithCutEBEE<OffEle,int>(baseName+"_charge",
00196                                                        baseName+" Charge; charge",
00197                                                        bins.charge.nr,bins.charge.min,bins.charge.max,
00198                                                        &OffEle::charge,cut ? cut->clone():NULL)); 
00199 }
00200 
00201 
00202 
00203 //we transfer ownership of eleCut to addTrigLooseTrigHist which transfers it to the eleMonElems
00204 void MonElemFuncs::initTightLooseTrigHists(std::vector<MonElemContainer<OffEle>*>& eleMonElems,const std::vector<std::string>& tightLooseTrigs,const BinData& bins,EgHLTDQMCut<OffEle>* eleCut)
00205 {
00206   for(size_t trigNr=0;trigNr<tightLooseTrigs.size();trigNr++){
00207     std::vector<std::string> splitString;
00208     boost::split(splitString,tightLooseTrigs[trigNr],boost::is_any_of(std::string(":")));
00209     if(splitString.size()!=2) continue; //format incorrect
00210     const std::string& tightTrig = splitString[0];
00211     const std::string& looseTrig = splitString[1];
00212     //this step is necessary as we want to transfer ownership of eleCut to the addTrigLooseTrigHist func on the last iteration
00213     //but clone it before that
00214     //perhaps my object ownership rules need to be re-evalulated
00215     if(trigNr!=tightLooseTrigs.size()-2) addTightLooseTrigHist(eleMonElems,tightTrig,looseTrig,eleCut->clone(),"gsfEle",bins);
00216     else addTightLooseTrigHist(eleMonElems,tightTrig,looseTrig,eleCut,"gsfEle",bins);
00217   }
00218 } 
00219 
00220 
00221 void MonElemFuncs::initTightLooseTrigHists(std::vector<MonElemContainer<OffPho>*>& phoMonElems,const std::vector<std::string>& tightLooseTrigs,const BinData& bins,EgHLTDQMCut<OffPho>* phoCut)
00222 {
00223   for(size_t trigNr=0;trigNr<tightLooseTrigs.size();trigNr++){
00224     std::vector<std::string> splitString;
00225     boost::split(splitString,tightLooseTrigs[trigNr],boost::is_any_of(std::string(":")));
00226     if(splitString.size()!=2) continue; //format incorrect
00227     const std::string& tightTrig = splitString[0];
00228     const std::string& looseTrig = splitString[1];
00229 
00230     //this step is necessary as we want to transfer ownership of phoCut to the addTrigLooseTrigHist func on the last iteration
00231     //but clone it before that
00232     //perhaps my object ownership rules need to be re-evalulated
00233     if(trigNr!=tightLooseTrigs.size()-2) addTightLooseTrigHist(phoMonElems,tightTrig,looseTrig,phoCut->clone(),"pho",bins);
00234     else addTightLooseTrigHist(phoMonElems,tightTrig,looseTrig,phoCut,"pho",bins);
00235   }
00236 }
00237 
00238 
00239 
00240    
00241 //there is nothing electron specific here, will template at some point
00242 void MonElemFuncs::addTightLooseTrigHist(std::vector<MonElemContainer<OffEle>*>& eleMonElems,
00243                                          const std::string& tightTrig,const std::string& looseTrig,
00244                                          EgHLTDQMCut<OffEle>* eleCut,
00245                                          const std::string& histId,const BinData& bins)
00246 {
00247   MonElemContainer<OffEle>* passMonElem = NULL;
00248   passMonElem = new MonElemContainer<OffEle>(tightTrig+"_"+looseTrig+"_"+histId+"_passTrig","",
00249                                                   &(*(new EgMultiCut<OffEle>) << 
00250                                                     new EgObjTrigCut<OffEle>(TrigCodes::getCode(tightTrig+":"+looseTrig),EgObjTrigCut<OffEle>::AND)  <<
00251                                                     eleCut->clone()));
00252   
00253   
00254   MonElemContainer<OffEle>* failMonElem = NULL;
00255   failMonElem = new MonElemContainer<OffEle>(tightTrig+"_"+looseTrig+"_"+histId+"_failTrig","",
00256                                                   &(*(new EgMultiCut<OffEle>) << 
00257                                                     new EgObjTrigCut<OffEle>(TrigCodes::getCode(looseTrig),EgObjTrigCut<OffEle>::AND,TrigCodes::getCode(tightTrig))  << 
00258                                                     eleCut));
00259   
00260   MonElemFuncs::initStdEleHists(passMonElem->monElems(),passMonElem->name(),bins);
00261   MonElemFuncs::initStdEleHists(failMonElem->monElems(),failMonElem->name(),bins);
00262   eleMonElems.push_back(passMonElem);
00263   eleMonElems.push_back(failMonElem);
00264 }
00265 
00266  
00267 //there is nothing photon specific here, will template at some point
00268 void MonElemFuncs::addTightLooseTrigHist(std::vector<MonElemContainer<OffPho>*>& phoMonElems,
00269                                          const std::string& tightTrig,const std::string& looseTrig,
00270                                          EgHLTDQMCut<OffPho>* phoCut,
00271                                          const std::string& histId,const BinData& bins)
00272 {
00273   MonElemContainer<OffPho>* passMonElem = NULL;
00274   passMonElem = new MonElemContainer<OffPho>(tightTrig+"_"+looseTrig+"_"+histId+"_passTrig","",
00275                                                   &(*(new EgMultiCut<OffPho>) << 
00276                                                     new EgObjTrigCut<OffPho>(TrigCodes::getCode(tightTrig+":"+looseTrig),EgObjTrigCut<OffPho>::AND)  <<
00277                                                     phoCut->clone()));
00278   
00279   
00280   MonElemContainer<OffPho>* failMonElem = NULL;
00281   failMonElem = new MonElemContainer<OffPho>(tightTrig+"_"+looseTrig+"_"+histId+"_failTrig","",
00282                                                   &(*(new EgMultiCut<OffPho>) << 
00283                                                     new EgObjTrigCut<OffPho>(TrigCodes::getCode(looseTrig),EgObjTrigCut<OffPho>::AND,TrigCodes::getCode(tightTrig))  << 
00284                                                     phoCut));
00285   
00286   MonElemFuncs::initStdPhoHists(passMonElem->monElems(),passMonElem->name(),bins);
00287   MonElemFuncs::initStdPhoHists(failMonElem->monElems(),failMonElem->name(),bins);
00288   phoMonElems.push_back(passMonElem);
00289   phoMonElems.push_back(failMonElem);
00290 }
00291 
00292 
00293 
00294 //we transfer ownership of eleCut to the monitor elements
00295 void MonElemFuncs::initTightLooseTrigHistsTrigCuts(std::vector<MonElemContainer<OffEle>*>& eleMonElems,const std::vector<std::string>& tightLooseTrigs,const BinData& bins)
00296 {
00297   for(size_t trigNr=0;trigNr<tightLooseTrigs.size();trigNr++){
00298     std::vector<std::string> splitString;
00299     boost::split(splitString,tightLooseTrigs[trigNr],boost::is_any_of(std::string(":")));
00300     if(splitString.size()!=2) continue; //format incorrect
00301     const std::string& tightTrig = splitString[0];
00302     const std::string& looseTrig = splitString[1];
00303     EgHLTDQMCut<OffEle>* eleCut = new EgHLTDQMUserVarCut<OffEle,TrigCodes::TrigBitSet>(&OffEle::trigCutsCutCode,TrigCodes::getCode(tightTrig));
00304     addTightLooseTrigHist(eleMonElems,tightTrig,looseTrig,eleCut,"gsfEle_trigCuts",bins);
00305   }
00306 } 
00307 
00308 //we transfer ownership of phoCut to the monitor elements
00309 void MonElemFuncs::initTightLooseTrigHistsTrigCuts(std::vector<MonElemContainer<OffPho>*>& phoMonElems,const std::vector<std::string>& tightLooseTrigs,const BinData& bins)
00310 {
00311   for(size_t trigNr=0;trigNr<tightLooseTrigs.size();trigNr++){
00312     std::vector<std::string> splitString;
00313     boost::split(splitString,tightLooseTrigs[trigNr],boost::is_any_of(std::string(":")));
00314     if(splitString.size()!=2) continue; //format incorrect
00315     const std::string& tightTrig = splitString[0];
00316     const std::string& looseTrig = splitString[1];
00317     EgHLTDQMCut<OffPho>* phoCut = new EgHLTDQMUserVarCut<OffPho,TrigCodes::TrigBitSet>(&OffPho::trigCutsCutCode,TrigCodes::getCode(tightTrig));
00318     addTightLooseTrigHist(phoMonElems,tightTrig,looseTrig,phoCut,"pho_trigCuts",bins);
00319   }
00320 } 
00321 
00322 
00323 //we transfer ownership of eleCut to the monitor elements
00324 void MonElemFuncs::initTightLooseDiObjTrigHistsTrigCuts(std::vector<MonElemContainer<OffEle>*>& eleMonElems,const std::vector<std::string>& tightLooseTrigs,const BinData& bins)
00325 {
00326   for(size_t trigNr=0;trigNr<tightLooseTrigs.size();trigNr++){
00327     std::vector<std::string> splitString;
00328     boost::split(splitString,tightLooseTrigs[trigNr],boost::is_any_of(std::string(":")));
00329     if(splitString.size()!=2) continue; //format incorrect
00330     const std::string& tightTrig = splitString[0];
00331     const std::string& looseTrig = splitString[1];
00332     EgHLTDQMCut<OffEle>* eleCut = new EgDiEleUserCut<TrigCodes::TrigBitSet>(&OffEle::trigCutsCutCode,TrigCodes::getCode(tightTrig));
00333     addTightLooseTrigHist(eleMonElems,tightTrig,looseTrig,eleCut,"gsfEle_trigCuts",bins);
00334   }
00335 } 
00336 
00337 
00338 //we transfer ownership of phoCut to the monitor elements
00339 void MonElemFuncs::initTightLooseDiObjTrigHistsTrigCuts(std::vector<MonElemContainer<OffPho>*>& phoMonElems,const std::vector<std::string>& tightLooseTrigs,const BinData& bins)
00340 {
00341   for(size_t trigNr=0;trigNr<tightLooseTrigs.size();trigNr++){
00342     std::vector<std::string> splitString;
00343     boost::split(splitString,tightLooseTrigs[trigNr],boost::is_any_of(std::string(":")));
00344     if(splitString.size()!=2) continue; //format incorrect
00345     const std::string& tightTrig = splitString[0];
00346     const std::string& looseTrig = splitString[1];
00347     EgHLTDQMCut<OffPho>* phoCut = new EgDiPhoUserCut<TrigCodes::TrigBitSet>(&OffPho::trigCutsCutCode,TrigCodes::getCode(tightTrig));
00348     addTightLooseTrigHist(phoMonElems,tightTrig,looseTrig,phoCut,"pho_trigCuts",bins);
00349   }
00350 }
00351 
00352 
00353 
00354 //tag and probe trigger efficiencies
00355 //this is to do measure the trigger efficiency with respect to a fully selected offline electron
00356 //using a tag and probe technique (note: this will be different to the trigger efficiency normally calculated) 
00357 void MonElemFuncs::initTrigTagProbeHists(std::vector<MonElemContainer<OffEle>*>& eleMonElems,const std::vector<std::string> filterNames,int cutMask,const BinData& bins)
00358 {
00359   for(size_t filterNr=0;filterNr<filterNames.size();filterNr++){ 
00360     
00361     std::string trigName(filterNames[filterNr]); 
00362     float etCutValue = trigTools::getEtThresFromName(trigName);
00363     MonElemContainer<OffEle>* monElemCont = new MonElemContainer<OffEle>("trigTagProbe","Trigger Tag and Probe",new EgTrigTagProbeCut(TrigCodes::getCode(trigName),cutMask,&OffEle::cutCode));
00364     MonElemFuncs::initStdEleCutHists(monElemCont->cutMonElems(),trigName+"_"+monElemCont->name()+"_gsfEle_all",bins,new EgGreaterCut<OffEle,float>(etCutValue,&OffEle::etSC));
00365     MonElemFuncs::initStdEleCutHists(monElemCont->cutMonElems(),trigName+"_"+monElemCont->name()+"_gsfEle_pass",bins,&(*(new EgMultiCut<OffEle>) << new EgGreaterCut<OffEle,float>(etCutValue,&OffEle::etSC) << new EgObjTrigCut<OffEle>(TrigCodes::getCode(trigName),EgObjTrigCut<OffEle>::AND)));
00366     
00367     monElemCont->monElems().push_back(new MonElemMgrEBEE<OffEle,float>(trigName+"_"+monElemCont->name()+"_gsfEle_all_etUnCut",monElemCont->name()+"_gsfEle_all E_{T} (Uncut);E_{T} (GeV)",
00368                                                                        bins.et.nr,bins.et.min,bins.et.max,&OffEle::et));
00369     monElemCont->cutMonElems().push_back(new MonElemWithCutEBEE<OffEle,float>(trigName+"_"+monElemCont->name()+"_gsfEle_pass_etUnCut",monElemCont->name()+"_gsfEle_pass E_{T} (Uncut);E_{T} (GeV)",
00370                                                                               bins.et.nr,bins.et.min,bins.et.max,&OffEle::et,new EgObjTrigCut<OffEle>(TrigCodes::getCode(trigName),EgObjTrigCut<OffEle>::AND)));
00371     eleMonElems.push_back(monElemCont);
00372   } //end filter names loop
00373    
00374 }
00375 
00376