CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/DQMOffline/EGamma/plugins/ElectronTagProbeAnalyzer.cc

Go to the documentation of this file.
00001 
00002 #include "DQMOffline/EGamma/plugins/ElectronTagProbeAnalyzer.h"
00003 
00004 #include "DQMServices/Core/interface/MonitorElement.h"
00005 
00006 #include "DataFormats/GsfTrackReco/interface/GsfTrack.h"
00007 #include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
00008 #include "DataFormats/EgammaReco/interface/BasicClusterFwd.h"
00009 #include "DataFormats/VertexReco/interface/VertexFwd.h"
00010 #include "DataFormats/VertexReco/interface/Vertex.h"
00011 #include "DataFormats/Common/interface/Handle.h"
00012 #include "DataFormats/BeamSpot/interface/BeamSpot.h"
00013 #include "DataFormats/Common/interface/TriggerResults.h"
00014 
00015 #include "FWCore/Common/interface/TriggerNames.h"
00016 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00017 #include "FWCore/Framework/interface/EDAnalyzer.h"
00018 #include "FWCore/Framework/interface/Event.h"
00019 #include "FWCore/Framework/interface/MakerMacros.h"
00020 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00021 //#include "FWCore/Framework/interface/EDAnalyzer.h"
00022 #include "FWCore/ServiceRegistry/interface/Service.h"
00023 
00024 #include "CLHEP/Units/GlobalPhysicalConstants.h"
00025 #include "TMath.h"
00026 
00027 #include <iostream>
00028 
00029 using namespace reco ;
00030 
00031 ElectronTagProbeAnalyzer::ElectronTagProbeAnalyzer( const edm::ParameterSet & conf )
00032  : ElectronDqmAnalyzerBase(conf)
00033  {
00034   // general, collections
00035   Selection_ = conf.getParameter<int>("Selection");
00036   electronCollection_ = conf.getParameter<edm::InputTag>("ElectronCollection");
00037   matchingObjectCollection_ = conf.getParameter<edm::InputTag>("MatchingObjectCollection");
00038   trackCollection_ = conf.getParameter<edm::InputTag>("TrackCollection");
00039   vertexCollection_ = conf.getParameter<edm::InputTag>("VertexCollection");
00040   gsftrackCollection_ = conf.getParameter<edm::InputTag>("GsfTrackCollection");
00041   beamSpotTag_ = conf.getParameter<edm::InputTag>("BeamSpot");
00042   readAOD_ = conf.getParameter<bool>("ReadAOD");
00043 
00044   // tag and probe
00045   massLow_ = conf.getParameter< double >("MassLow");
00046   massHigh_ = conf.getParameter< double >("MassHigh");
00047   TPchecksign_ = conf.getParameter<bool>("TpCheckSign");
00048   TAGcheckclass_ = conf.getParameter<bool>("TagCheckClass");
00049   PROBEetcut_ = conf.getParameter<bool>("ProbeEtCut");
00050   PROBEcheckclass_ = conf.getParameter<bool>("ProbeCheckClass");
00051 
00052   // electron selection
00053   minEt_ = conf.getParameter<double>("MinEt");
00054   minPt_ = conf.getParameter<double>("MinPt");
00055   maxAbsEta_ = conf.getParameter<double>("MaxAbsEta");
00056   isEB_ = conf.getParameter<bool>("SelectEb");
00057   isEE_ = conf.getParameter<bool>("SelectEe");
00058   isNotEBEEGap_ = conf.getParameter<bool>("SelectNotEbEeGap");
00059   isEcalDriven_ = conf.getParameter<bool>("SelectEcalDriven");
00060   isTrackerDriven_ = conf.getParameter<bool>("SelectTrackerDriven");
00061   eOverPMinBarrel_ = conf.getParameter<double>("MinEopBarrel");
00062   eOverPMaxBarrel_ = conf.getParameter<double>("MaxEopBarrel");
00063   eOverPMinEndcaps_ = conf.getParameter<double>("MinEopEndcaps");
00064   eOverPMaxEndcaps_ = conf.getParameter<double>("MaxEopEndcaps");
00065   dEtaMinBarrel_ = conf.getParameter<double>("MinDetaBarrel");
00066   dEtaMaxBarrel_ = conf.getParameter<double>("MaxDetaBarrel");
00067   dEtaMinEndcaps_ = conf.getParameter<double>("MinDetaEndcaps");
00068   dEtaMaxEndcaps_ = conf.getParameter<double>("MaxDetaEndcaps");
00069   dPhiMinBarrel_ = conf.getParameter<double>("MinDphiBarrel");
00070   dPhiMaxBarrel_ = conf.getParameter<double>("MaxDphiBarrel");
00071   dPhiMinEndcaps_ = conf.getParameter<double>("MinDphiEndcaps");
00072   dPhiMaxEndcaps_ = conf.getParameter<double>("MaxDphiEndcaps");
00073   sigIetaIetaMinBarrel_ = conf.getParameter<double>("MinSigIetaIetaBarrel");
00074   sigIetaIetaMaxBarrel_ = conf.getParameter<double>("MaxSigIetaIetaBarrel");
00075   sigIetaIetaMinEndcaps_ = conf.getParameter<double>("MinSigIetaIetaEndcaps");
00076   sigIetaIetaMaxEndcaps_ = conf.getParameter<double>("MaxSigIetaIetaEndcaps");
00077   hadronicOverEmMaxBarrel_ = conf.getParameter<double>("MaxHoeBarrel");
00078   hadronicOverEmMaxEndcaps_ = conf.getParameter<double>("MaxHoeEndcaps");
00079   mvaMin_ = conf.getParameter<double>("MinMva");
00080   tipMaxBarrel_ = conf.getParameter<double>("MaxTipBarrel");
00081   tipMaxEndcaps_ = conf.getParameter<double>("MaxTipEndcaps");
00082   tkIso03Max_ = conf.getParameter<double>("MaxTkIso03");
00083   hcalIso03Depth1MaxBarrel_ = conf.getParameter<double>("MaxHcalIso03Depth1Barrel");
00084   hcalIso03Depth1MaxEndcaps_ = conf.getParameter<double>("MaxHcalIso03Depth1Endcaps");
00085   hcalIso03Depth2MaxEndcaps_ = conf.getParameter<double>("MaxHcalIso03Depth2Endcaps");
00086   ecalIso03MaxBarrel_ = conf.getParameter<double>("MaxEcalIso03Barrel");
00087   ecalIso03MaxEndcaps_ = conf.getParameter<double>("MaxEcalIso03Endcaps");
00088 
00089   // for trigger
00090   triggerResults_ = conf.getParameter<edm::InputTag>("TriggerResults");
00091 //  HLTPathsByName_= conf.getParameter<std::vector<std::string > >("HltPaths");
00092 //  HLTPathsByIndex_.resize(HLTPathsByName_.size());
00093 
00094   // histos limits and binning
00095   nbineta=conf.getParameter<int>("NbinEta");
00096   nbineta2D=conf.getParameter<int>("NbinEta2D");
00097   etamin=conf.getParameter<double>("EtaMin");
00098   etamax=conf.getParameter<double>("EtaMax");
00099   //
00100   nbinphi=conf.getParameter<int>("NbinPhi");
00101   nbinphi2D=conf.getParameter<int>("NbinPhi2D");
00102   phimin=conf.getParameter<double>("PhiMin");
00103   phimax=conf.getParameter<double>("PhiMax");
00104   //
00105   nbinpt=conf.getParameter<int>("NbinPt");
00106   nbinpteff=conf.getParameter<int>("NbinPtEff");
00107   nbinpt2D=conf.getParameter<int>("NbinPt2D");
00108   ptmax=conf.getParameter<double>("PtMax");
00109   //
00110   nbinp=conf.getParameter<int>("NbinP");
00111   nbinp2D=conf.getParameter<int>("NbinP2D");
00112   pmax=conf.getParameter<double>("PMax");
00113   //
00114   nbineop=conf.getParameter<int>("NbinEop");
00115   nbineop2D=conf.getParameter<int>("NbinEop2D");
00116   eopmax=conf.getParameter<double>("EopMax");
00117   eopmaxsht=conf.getParameter<double>("EopMaxSht");
00118   //
00119   nbindeta=conf.getParameter<int>("NbinDeta");
00120   detamin=conf.getParameter<double>("DetaMin");
00121   detamax=conf.getParameter<double>("DetaMax");
00122   //
00123   nbindphi=conf.getParameter<int>("NbinDphi");
00124   dphimin=conf.getParameter<double>("DphiMin");
00125   dphimax=conf.getParameter<double>("DphiMax");
00126   //
00127   nbindetamatch=conf.getParameter<int>("NbinDetaMatch");
00128   nbindetamatch2D=conf.getParameter<int>("NbinDetaMatch2D");
00129   detamatchmin=conf.getParameter<double>("DetaMatchMin");
00130   detamatchmax=conf.getParameter<double>("DetaMatchMax");
00131   //
00132   nbindphimatch=conf.getParameter<int>("NbinDphiMatch");
00133   nbindphimatch2D=conf.getParameter<int>("NbinDphiMatch2D");
00134   dphimatchmin=conf.getParameter<double>("DphiMatchMin");
00135   dphimatchmax=conf.getParameter<double>("DphiMatchMax");
00136   //
00137   nbinfhits=conf.getParameter<int>("NbinFhits");
00138   fhitsmax=conf.getParameter<double>("FhitsMax");
00139   //
00140   nbinlhits=conf.getParameter<int>("NbinLhits");
00141   lhitsmax=conf.getParameter<double>("LhitsMax");
00142   //
00143   nbinxyz=conf.getParameter<int>("NbinXyz");
00144   nbinxyz2D=conf.getParameter<int>("NbinXyz2D");
00145   //
00146   nbinpoptrue= conf.getParameter<int>("NbinPopTrue");
00147   poptruemin=conf.getParameter<double>("PopTrueMin");
00148   poptruemax=conf.getParameter<double>("PopTrueMax");
00149   //
00150   nbinmee= conf.getParameter<int>("NbinMee");
00151   meemin=conf.getParameter<double>("MeeMin");
00152   meemax=conf.getParameter<double>("MeeMax");
00153   //
00154   nbinhoe= conf.getParameter<int>("NbinHoe");
00155   hoemin=conf.getParameter<double>("HoeMin");
00156   hoemax=conf.getParameter<double>("HoeMax");
00157  }
00158 
00159 ElectronTagProbeAnalyzer::~ElectronTagProbeAnalyzer()
00160  {}
00161 
00162 void ElectronTagProbeAnalyzer::book()
00163  {
00164   nEvents_ = 0 ;
00165   //nAfterTrigger_ = 0 ;
00166 
00167   // basic quantities
00168   h1_vertexPt_barrel = bookH1("vertexPt_barrel","ele transverse momentum in barrel",nbinpt,0.,ptmax,"p_{T vertex} (GeV/c)");
00169   h1_vertexPt_endcaps = bookH1("vertexPt_endcaps","ele transverse momentum in endcaps",nbinpt,0.,ptmax,"p_{T vertex} (GeV/c)");
00170   h1_vertexEta = bookH1("vertexEta","ele momentum #eta",nbineta,etamin,etamax,"#eta");
00171   h2_vertexEtaVsPhi = bookH2("vertexEtaVsPhi","ele momentum #eta vs #phi",nbineta2D,etamin,etamax,nbinphi2D,phimin,phimax,"#eta","#phi (rad)");
00172   h2_vertexXvsY = bookH2("vertexXvsY","ele vertex x vs y",nbinxyz2D,-0.1,0.1,nbinxyz2D,-0.1,0.1,"x (cm)","y (cm)" );
00173   h1_vertexZ = bookH1("vertexZ","ele vertex z",nbinxyz,-25, 25,"z (cm)" );
00174 
00175   // super-clusters
00176 //  h1_sclPhi = bookH1("sclPhi","ele supercluster phi",nbinphi,phimin,phimax);
00177   h1_sclEt = bookH1("sclEt","ele supercluster transverse energy",nbinpt,0.,ptmax);
00178 
00179   // electron track
00180   h1_chi2 = bookH1("chi2","ele track #chi^{2}",100,0.,15.,"#Chi^{2}");
00181   h1_foundHits = bookH1("foundHits","ele track # found hits",nbinfhits,0.,fhitsmax,"N_{hits}");
00182   h1_lostHits = bookH1("lostHits","ele track # lost hits",5,0.,5.,"N_{lost hits}");
00183 
00184   // electron matching and ID
00185   h1_Eop_barrel = bookH1( "Eop_barrel","ele E/P_{vertex} in barrel",nbineop,0.,eopmax,"E/P_{vertex}");
00186   h1_Eop_endcaps = bookH1( "Eop_endcaps","ele E/P_{vertex} in endcaps",nbineop,0.,eopmax,"E/P_{vertex}");
00187   h1_EeleOPout_barrel = bookH1( "EeleOPout_barrel","ele E_{ele}/P_{out} in barrel",nbineop,0.,eopmax,"E_{ele}/P_{out}");
00188   h1_EeleOPout_endcaps = bookH1( "EeleOPout_endcaps","ele E_{ele}/P_{out} in endcaps",nbineop,0.,eopmax,"E_{ele}/P_{out}");
00189   h1_dEtaSc_propVtx_barrel = bookH1( "dEtaSc_propVtx_barrel","ele #eta_{sc} - #eta_{tr}, prop from vertex, in barrel",nbindetamatch,detamatchmin,detamatchmax,"#eta_{sc} - #eta_{tr}");
00190   h1_dEtaSc_propVtx_endcaps = bookH1( "dEtaSc_propVtx_endcaps","ele #eta_{sc} - #eta_{tr}, prop from vertex, in endcaps",nbindetamatch,detamatchmin,detamatchmax,"#eta_{sc} - #eta_{tr}");
00191   h1_dEtaEleCl_propOut_barrel = bookH1( "dEtaEleCl_propOut_barrel","ele #eta_{EleCl} - #eta_{tr}, prop from outermost, in barrel",nbindetamatch,detamatchmin,detamatchmax,"#eta_{elecl} - #eta_{tr}");
00192   h1_dEtaEleCl_propOut_endcaps = bookH1( "dEtaEleCl_propOut_endcaps","ele #eta_{EleCl} - #eta_{tr}, prop from outermost, in endcaps",nbindetamatch,detamatchmin,detamatchmax,"#eta_{elecl} - #eta_{tr}");
00193   h1_dPhiSc_propVtx_barrel = bookH1( "dPhiSc_propVtx_barrel","ele #phi_{sc} - #phi_{tr}, prop from vertex, in barrel",nbindphimatch,dphimatchmin,dphimatchmax,"#phi_{sc} - #phi_{tr} (rad)");
00194   h1_dPhiSc_propVtx_endcaps = bookH1( "dPhiSc_propVtx_endcaps","ele #phi_{sc} - #phi_{tr}, prop from vertex, in endcaps",nbindphimatch,dphimatchmin,dphimatchmax,"#phi_{sc} - #phi_{tr} (rad)");
00195   h1_dPhiEleCl_propOut_barrel = bookH1( "dPhiEleCl_propOut_barrel","ele #phi_{EleCl} - #phi_{tr}, prop from outermost, in barrel",nbindphimatch,dphimatchmin,dphimatchmax,"#phi_{elecl} - #phi_{tr} (rad)");
00196   h1_dPhiEleCl_propOut_endcaps = bookH1( "dPhiEleCl_propOut_endcaps","ele #phi_{EleCl} - #phi_{tr}, prop from outermost, in endcaps",nbindphimatch,dphimatchmin,dphimatchmax,"#phi_{elecl} - #phi_{tr} (rad)");
00197   h1_Hoe_barrel = bookH1("Hoe_barrel","ele hadronic energy / em energy, in barrel", nbinhoe, hoemin, hoemax,"H/E","Events","ELE_LOGY E1 P") ;
00198   h1_Hoe_endcaps = bookH1("Hoe_endcaps","ele hadronic energy / em energy, in endcaps", nbinhoe, hoemin, hoemax,"H/E","Events","ELE_LOGY E1 P") ;
00199   h1_sclSigEtaEta_barrel = bookH1("sclSigEtaEta_barrel","ele supercluster sigma eta eta in barrel",100,0.,0.05);
00200   h1_sclSigEtaEta_endcaps = bookH1("sclSigEtaEta_endcaps","ele supercluster sigma eta eta in endcaps",100,0.,0.05);
00201 
00202   // fbrem
00203   h1_fbrem = bookH1("fbrem","ele brem fraction",100,0.,1.,"P_{in} - P_{out} / P_{in}") ;
00204   h1_classes = bookH1("classes","ele electron classes",10,0.0,10.);
00205 
00206   // pflow
00207   h1_mva = bookH1( "mva","ele identification mva",100,-1.,1.);
00208   h1_provenance = bookH1( "provenance","ele provenance",5,-2.,3.);
00209 
00210   // isolation
00211   h1_tkSumPt_dr03 = bookH1("tkSumPt_dr03","tk isolation sum, dR=0.3",100,0.0,20.,"TkIsoSum, cone 0.3 (GeV/c)","Events","ELE_LOGY E1 P");
00212   h1_ecalRecHitSumEt_dr03 = bookH1("ecalRecHitSumEt_dr03","ecal isolation sum, dR=0.3",100,0.0,20.,"EcalIsoSum, cone 0.3 (GeV)","Events","ELE_LOGY E1 P");
00213   h1_hcalTowerSumEt_dr03 = bookH1("hcalTowerSumEt_dr03","hcal isolation sum, dR=0.3",100,0.0,20.,"HcalIsoSum, cone 0.3 (GeV)","Events","ELE_LOGY E1 P");
00214 
00215   // di-electron mass
00216   setBookIndex(200) ;
00217   h1_mee = bookH1("mee","ele pairs invariant mass", nbinmee, meemin, meemax,"m_{ee} (GeV/c^{2})");
00218   h1_mee_os = bookH1("mee_os","ele pairs invariant mass, opposite sign", nbinmee, meemin, meemax,"m_{e^{+}e^{-}} (GeV/c^{2})");
00219 
00220 
00221 
00222   //===========================
00223   // histos for matching and matched matched objects
00224   //===========================
00225 
00226   // matching object
00227   std::string matchingObjectType ;
00228   if (std::string::npos!=matchingObjectCollection_.label().find("SuperCluster",0))
00229    { matchingObjectType = "SC" ; }
00230   if (matchingObjectType=="")
00231    { edm::LogError("ElectronMcFakeValidator::beginJob")<<"Unknown matching object type !" ; }
00232   else
00233    { edm::LogInfo("ElectronMcFakeValidator::beginJob")<<"Matching object type: "<<matchingObjectType ; }
00234 
00235   // matching object distributions
00236   h1_matchingObject_Eta = bookH1withSumw2("matchingObject_Eta",matchingObjectType+" #eta",nbineta,etamin,etamax,"#eta_{SC}");
00237   h1_matchingObject_Pt = bookH1withSumw2("matchingObject_Pt",matchingObjectType+" pt",nbinpteff,5.,ptmax);
00238   h1_matchingObject_Phi = bookH1withSumw2("matchingObject_Phi",matchingObjectType+" phi",nbinphi,phimin,phimax);
00239   //h1_matchingObject_Z = bookH1withSumw2("matchingObject_Z",matchingObjectType+" z",nbinxyz,-25,25);
00240 
00241   h1_matchedObject_Eta = bookH1withSumw2("matchedObject_Eta","Efficiency vs matching SC #eta",nbineta,etamin,etamax);
00242   h1_matchedObject_Pt = bookH1withSumw2("matchedObject_Pt","Efficiency vs matching SC E_{T}",nbinpteff,5.,ptmax);
00243   h1_matchedObject_Phi = bookH1withSumw2("matchedObject_Phi","Efficiency vs matching SC phi",nbinphi,phimin,phimax);
00244   //h1_matchedObject_Z = bookH1withSumw2("matchedObject_Z","Efficiency vs matching SC z",nbinxyz,-25,25);
00245 
00246  }
00247 
00248 void ElectronTagProbeAnalyzer::analyze( const edm::Event& iEvent, const edm::EventSetup & iSetup )
00249  {
00250   nEvents_++ ;
00251 
00252   edm::Handle<GsfElectronCollection> gsfElectrons ;
00253   iEvent.getByLabel(electronCollection_,gsfElectrons) ;
00254   edm::Handle<reco::SuperClusterCollection> recoClusters ;
00255   iEvent.getByLabel(matchingObjectCollection_,recoClusters) ;
00256   edm::Handle<reco::TrackCollection> tracks;
00257   iEvent.getByLabel(trackCollection_,tracks);
00258   edm::Handle<reco::GsfTrackCollection> gsfTracks;
00259   iEvent.getByLabel(gsftrackCollection_,gsfTracks);
00260   edm::Handle<reco::VertexCollection> vertices;
00261   iEvent.getByLabel(vertexCollection_,vertices);
00262   edm::Handle<reco::BeamSpot> recoBeamSpotHandle ;
00263   iEvent.getByLabel(beamSpotTag_,recoBeamSpotHandle) ;
00264   const BeamSpot bs = *recoBeamSpotHandle ;
00265 
00266   int ievt = iEvent.id().event();
00267   int irun = iEvent.id().run();
00268   int ils = iEvent.luminosityBlock();
00269 
00270   edm::LogInfo("ElectronMcSignalValidator::analyze")
00271     <<"Treating "<<gsfElectrons.product()->size()<<" electrons"
00272     <<" from event "<<ievt<<" in run "<<irun<<" and lumiblock "<<ils ;
00273   //h1_num_->Fill((*gsfElectrons).size()) ;
00274 
00275   // selected rec electrons
00276   reco::GsfElectronCollection::const_iterator gsfIter ;
00277   for
00278    ( gsfIter=gsfElectrons->begin() ;
00279      gsfIter!=gsfElectrons->end();
00280      gsfIter++ )
00281    {
00282     // vertex TIP
00283     double vertexTIP =
00284      (gsfIter->vertex().x()-bs.position().x()) * (gsfIter->vertex().x()-bs.position().x()) +
00285      (gsfIter->vertex().y()-bs.position().y()) * (gsfIter->vertex().y()-bs.position().y()) ;
00286     vertexTIP = sqrt(vertexTIP) ;
00287 
00288     // select electrons
00289     if (!selected(gsfIter,vertexTIP)) continue ;
00290 
00291     reco::SuperClusterRef sclTagRef = gsfIter->superCluster() ;
00292     reco::SuperClusterCollection::const_iterator moIter ;
00293     for
00294      ( moIter=recoClusters->begin() ;
00295        moIter!=recoClusters->end() ;
00296        moIter++ )
00297      {
00298             if (moIter->eta()==sclTagRef->eta()) continue ;
00299 
00300       /*
00301       if
00302         ( moIter->energy()/cosh(moIter->eta())>maxPtMatchingObject_ ||
00303           std::abs(moIter->eta())> maxAbsEtaMatchingObject_ )
00304         { continue ; }
00305       */
00306 
00307       // Additional cuts on Tag
00308 
00309       // Additional cuts on Probe
00310       if(PROBEetcut_ && (moIter->energy()/cosh(moIter->eta())<minEt_)) continue ;
00311 
00312       float SCenergy = moIter->energy();
00313       math::XYZPoint caloposition = moIter->position();
00314       float theta = caloposition.Theta();
00315       math::XYZVector momentum;
00316       float SCmomentumX = SCenergy*sin(theta)*cos(moIter->phi());
00317       float SCmomentumY = SCenergy*sin(theta)*sin(moIter->phi());
00318       float SCmomentumZ = SCenergy*cos(theta);
00319       const reco::Particle::LorentzVector pSCprobecandidate(SCmomentumX,SCmomentumY,SCmomentumZ,SCenergy);
00320 
00321       math::XYZTLorentzVector p12 = (*gsfIter).p4()+ pSCprobecandidate;
00322       float mee2 = p12.Dot(p12);
00323       float invMass = sqrt(mee2);
00324 
00325       if( invMass < massLow_ || invMass > massHigh_ ) continue ;
00326       h1_mee->Fill(invMass) ;
00327 
00328       h1_matchingObject_Eta->Fill( moIter->eta() );
00329       h1_matchingObject_Pt->Fill( moIter->energy()/cosh(moIter->eta()) );
00330       h1_matchingObject_Phi->Fill( moIter->phi() );
00331       //h1_matchingObject_Z->Fill(  moIter->z() );
00332 
00333       reco::GsfElectron bestGsfElectron;
00334       reco::SuperClusterRef sclProbeRef;
00335       bool okGsfFound = false;
00336       //double gsfOkRatio = 999999.;
00337       reco::GsfElectronCollection::const_iterator gsfIter2 ;
00338 
00339       for
00340        ( gsfIter2=gsfElectrons->begin();
00341          gsfIter2!=gsfElectrons->end() ;
00342          gsfIter2++ )
00343        {
00344               // matching with ref
00345               sclProbeRef = gsfIter2->superCluster();
00346 
00347               if (sclProbeRef->eta() == moIter->eta())
00348          {
00349           //std::cout << "les deux ref SC sont egales : " << std::endl;
00350           bestGsfElectron=*gsfIter2;
00351 
00352           // opposite sign checking
00353           bool opsign = (((gsfIter->charge())*(bestGsfElectron.charge()))<0.) ;
00354           if ( TPchecksign_ && !opsign )
00355            { okGsfFound = false ; break ; }
00356           else
00357            { okGsfFound = true ; }
00358          } //fi on gsfEleSC.eta == probeSC.eta
00359 
00360 //        // matching with cone
00361 //        double dphi = gsfIter2->phi()-moIter->phi();
00362 //        if (std::abs(dphi)>CLHEP::pi)
00363 //         dphi = dphi < 0? (CLHEP::twopi) + dphi : dphi - CLHEP::twopi;
00364 //        double deltaR = sqrt(pow((moIter->eta()-gsfIter2->eta()),2) + pow(dphi,2));
00365 //        if ( deltaR < deltaR_ )
00366 //        {
00367 //         double tmpGsfRatio = gsfIter2->p()/moIter->energy();
00368 //         if ( std::abs(tmpGsfRatio-1) < std::abs(gsfOkRatio-1))
00369 //          {
00370 //           gsfOkRatio = tmpGsfRatio;
00371 //           bestGsfElectron=*gsfIter2;
00372 //           okGsfFound = true;
00373 //          }
00374 //        } // fi on deltaR
00375 
00376        }// end of loop on gsfEle to find the best one which matches with probe SC
00377 
00378       if (okGsfFound)
00379        {
00380         // fill matched histos for eff
00381         fillMatchedHistos(moIter,bestGsfElectron) ;
00382 
00383         // basic quantities
00384         if (bestGsfElectron.isEB()) h1_vertexPt_barrel->Fill( bestGsfElectron.pt() );
00385         if (bestGsfElectron.isEE()) h1_vertexPt_endcaps->Fill( bestGsfElectron.pt() );
00386         h1_vertexEta->Fill( bestGsfElectron.eta() );
00387         h2_vertexEtaVsPhi->Fill( bestGsfElectron.eta(), bestGsfElectron.phi() );
00388         h2_vertexXvsY->Fill( bestGsfElectron.vertex().x(), bestGsfElectron.vertex().y() );
00389         h1_vertexZ->Fill( bestGsfElectron.vertex().z() );
00390 
00391         // supercluster related distributions
00392         reco::SuperClusterRef sclRef = bestGsfElectron.superCluster() ;
00393         double R=TMath::Sqrt(sclRef->x()*sclRef->x() + sclRef->y()*sclRef->y() +sclRef->z()*sclRef->z());
00394         double Rt=TMath::Sqrt(sclRef->x()*sclRef->x() + sclRef->y()*sclRef->y());
00395         h1_sclEt->Fill(sclRef->energy()*(Rt/R));
00396 
00397         if (!readAOD_)
00398         { // track extra does not exist in AOD
00399          h1_foundHits->Fill( bestGsfElectron.gsfTrack()->numberOfValidHits() );
00400          h1_lostHits->Fill( bestGsfElectron.gsfTrack()->numberOfLostHits() );
00401          h1_chi2->Fill( bestGsfElectron.gsfTrack()->normalizedChi2() );
00402         }
00403 
00404         // match distributions
00405         if (bestGsfElectron.isEB())
00406         {
00407          h1_Eop_barrel->Fill( bestGsfElectron.eSuperClusterOverP() );
00408          h1_EeleOPout_barrel->Fill( bestGsfElectron.eEleClusterOverPout() );
00409          h1_dEtaSc_propVtx_barrel->Fill(bestGsfElectron.deltaEtaSuperClusterTrackAtVtx());
00410          h1_dEtaEleCl_propOut_barrel->Fill(bestGsfElectron.deltaEtaEleClusterTrackAtCalo());
00411          h1_dPhiSc_propVtx_barrel->Fill(bestGsfElectron.deltaPhiSuperClusterTrackAtVtx());
00412          h1_dPhiEleCl_propOut_barrel->Fill(bestGsfElectron.deltaPhiEleClusterTrackAtCalo());
00413          h1_Hoe_barrel->Fill(bestGsfElectron.hadronicOverEm());
00414          h1_sclSigEtaEta_barrel->Fill( bestGsfElectron.scSigmaEtaEta() );
00415         }
00416         if (bestGsfElectron.isEE())
00417         {
00418          h1_Eop_endcaps->Fill( bestGsfElectron.eSuperClusterOverP() );
00419          h1_EeleOPout_endcaps->Fill( bestGsfElectron.eEleClusterOverPout() );
00420          h1_dEtaSc_propVtx_endcaps->Fill(bestGsfElectron.deltaEtaSuperClusterTrackAtVtx());
00421          h1_dEtaEleCl_propOut_endcaps->Fill(bestGsfElectron.deltaEtaEleClusterTrackAtCalo());
00422          h1_dPhiSc_propVtx_endcaps->Fill(bestGsfElectron.deltaPhiSuperClusterTrackAtVtx());
00423          h1_dPhiEleCl_propOut_endcaps->Fill(bestGsfElectron.deltaPhiEleClusterTrackAtCalo());
00424          h1_Hoe_endcaps->Fill(bestGsfElectron.hadronicOverEm());
00425          h1_sclSigEtaEta_endcaps->Fill( bestGsfElectron.scSigmaEtaEta() );
00426         }
00427 
00428         // fbrem
00429         h1_fbrem->Fill(bestGsfElectron.fbrem()) ;
00430         int eleClass = bestGsfElectron.classification() ;
00431         if (bestGsfElectron.isEE()) eleClass+=5;
00432         h1_classes->Fill(eleClass);
00433 
00434         // pflow
00435         h1_mva->Fill(bestGsfElectron.mva()) ;
00436         if (bestGsfElectron.ecalDrivenSeed()) h1_provenance->Fill(1.) ;
00437         if (bestGsfElectron.trackerDrivenSeed()) h1_provenance->Fill(-1.) ;
00438         if (bestGsfElectron.trackerDrivenSeed()||bestGsfElectron.ecalDrivenSeed()) h1_provenance->Fill(0.);
00439         if (bestGsfElectron.trackerDrivenSeed()&&!bestGsfElectron.ecalDrivenSeed()) h1_provenance->Fill(-2.);
00440         if (!bestGsfElectron.trackerDrivenSeed()&&bestGsfElectron.ecalDrivenSeed()) h1_provenance->Fill(2.);
00441 
00442         // isolation
00443         h1_tkSumPt_dr03->Fill(bestGsfElectron.dr03TkSumPt());
00444         h1_ecalRecHitSumEt_dr03->Fill(bestGsfElectron.dr03EcalRecHitSumEt());
00445         h1_hcalTowerSumEt_dr03->Fill(bestGsfElectron.dr03HcalTowerSumEt());
00446 
00447         // inv Mass with opposite sign
00448         if (((gsfIter->charge())*(bestGsfElectron.charge()))<0.)
00449         { h1_mee_os->Fill(invMass) ; }
00450 
00451        }// fi on OkGsfFound
00452 
00453      } // end of loop on SC to find probe SC
00454 
00455    }// end of loop on Tag gsfEle
00456 
00457  }
00458 
00459 float ElectronTagProbeAnalyzer::computeInvMass
00460  ( const reco::GsfElectron & e1,
00461    const reco::GsfElectron & e2 )
00462  {
00463   math::XYZTLorentzVector p12 = e1.p4()+e2.p4() ;
00464   float mee2 = p12.Dot(p12) ;
00465   float invMass = sqrt(mee2) ;
00466   return invMass ;
00467  }
00468 
00469 void ElectronTagProbeAnalyzer::fillMatchedHistos
00470  ( const reco::SuperClusterCollection::const_iterator & moIter,
00471    const reco::GsfElectron & electron )
00472  {
00473   // generated distributions for matched electrons
00474   h1_matchedObject_Eta->Fill( moIter->eta() );
00475 //  h1_matchedObject_AbsEta->Fill( std::abs(moIter->eta()) );
00476   h1_matchedObject_Pt->Fill( moIter->energy()/cosh(moIter->eta()) );
00477   h1_matchedObject_Phi->Fill( moIter->phi() );
00478   //h1_matchedObject_Z->Fill( moIter->z() );
00479 
00480   //classes
00481 //  int eleClass = electron.classification() ;
00482 //  h_classes->Fill(eleClass) ;
00483 //  h_matchedEle_eta->Fill(std::abs(electron.eta()));
00484 //  if (electron.classification() == GsfElectron::GOLDEN) h_matchedEle_eta_golden->Fill(std::abs(electron.eta()));
00485 //  if (electron.classification() == GsfElectron::SHOWERING) h_matchedEle_eta_shower->Fill(std::abs(electron.eta()));
00486 //  //if (electron.classification() == GsfElectron::BIGBREM) h_matchedEle_eta_bbrem->Fill(std::abs(electron.eta()));
00487 //  //if (electron.classification() == GsfElectron::OLDNARROW) h_matchedEle_eta_narrow->Fill(std::abs(electron.eta()));
00488  }
00489 
00490 //bool ElectronTagProbeAnalyzer::trigger( const edm::Event & e )
00491 // {
00492 //  // retreive TriggerResults from the event
00493 //  edm::Handle<edm::TriggerResults> triggerResults ;
00494 //  e.getByLabel(triggerResults_,triggerResults) ;
00495 //
00496 //  bool accept = false ;
00497 //
00498 //  if (triggerResults.isValid())
00499 //   {
00500 //    //std::cout << "TriggerResults found, number of HLT paths: " << triggerResults->size() << std::endl;
00501 //    // get trigger names
00502 //    const edm::TriggerNames & triggerNames = e.triggerNames(*triggerResults);
00508 //
00509 //    unsigned int n = HLTPathsByName_.size() ;
00510 //    for (unsigned int i=0; i!=n; i++)
00511 //     {
00512 //      HLTPathsByIndex_[i]=triggerNames_.triggerIndex(HLTPathsByName_[i]) ;
00513 //     }
00514 //
00515 //    // empty input vectors (n==0) means any trigger paths
00516 //    if (n==0)
00517 //     {
00518 //      n=triggerResults->size() ;
00519 //      HLTPathsByName_.resize(n) ;
00520 //      HLTPathsByIndex_.resize(n) ;
00521 //      for ( unsigned int i=0 ; i!=n ; i++)
00522 //       {
00523 //        HLTPathsByName_[i]=triggerNames_.triggerName(i) ;
00524 //        HLTPathsByIndex_[i]=i ;
00525 //       }
00526 //     }
00527 //
00543 //
00544 //    // count number of requested HLT paths which have fired
00545 //    unsigned int fired=0 ;
00546 //    for ( unsigned int i=0 ; i!=n ; i++ )
00547 //     {
00548 //      if (HLTPathsByIndex_[i]<triggerResults->size())
00549 //       {
00550 //        if (triggerResults->accept(HLTPathsByIndex_[i]))
00551 //         {
00552 //          fired++ ;
00553 //          h1_triggers->Fill(float(HLTPathsByIndex_[i]));
00554 //          //std::cout << "Fired HLT path= " << HLTPathsByName_[i] << std::endl ;
00555 //          accept = true ;
00556 //         }
00557 //       }
00558 //     }
00559 //
00560 //   }
00561 //
00562 //  return accept ;
00563 // }
00564 
00565 bool ElectronTagProbeAnalyzer::selected( const reco::GsfElectronCollection::const_iterator & gsfIter , double vertexTIP )
00566  {
00567   if ((Selection_>0)&&generalCut(gsfIter)) return false ;
00568   if ((Selection_>=1)&&etCut(gsfIter)) return false ;
00569   if ((Selection_>=2)&&isolationCut(gsfIter,vertexTIP)) return false ;
00570   if ((Selection_>=3)&&idCut(gsfIter)) return false ;
00571   return true ;
00572  }
00573 
00574 bool ElectronTagProbeAnalyzer::generalCut( const reco::GsfElectronCollection::const_iterator & gsfIter)
00575  {
00576   if (std::abs(gsfIter->eta())>maxAbsEta_) return true ;
00577   if (gsfIter->pt()<minPt_) return true ;
00578 
00579   if (gsfIter->isEB() && isEE_) return true ;
00580   if (gsfIter->isEE() && isEB_) return true ;
00581   if (gsfIter->isEBEEGap() && isNotEBEEGap_) return true ;
00582 
00583   if (gsfIter->ecalDrivenSeed() && isTrackerDriven_) return true ;
00584   if (gsfIter->trackerDrivenSeed() && isEcalDriven_) return true ;
00585 
00586   return false ;
00587  }
00588 
00589 bool ElectronTagProbeAnalyzer::etCut( const reco::GsfElectronCollection::const_iterator & gsfIter )
00590  {
00591   if (gsfIter->superCluster()->energy()/cosh(gsfIter->superCluster()->eta())<minEt_) return true ;
00592 
00593   return false ;
00594  }
00595 
00596 bool ElectronTagProbeAnalyzer::isolationCut( const reco::GsfElectronCollection::const_iterator & gsfIter, double vertexTIP )
00597  {
00598   if (gsfIter->isEB() && vertexTIP > tipMaxBarrel_) return true ;
00599   if (gsfIter->isEE() && vertexTIP > tipMaxEndcaps_) return true ;
00600 
00601   if (gsfIter->dr03TkSumPt() > tkIso03Max_) return true ;
00602   if (gsfIter->isEB() && gsfIter->dr03HcalDepth1TowerSumEt() > hcalIso03Depth1MaxBarrel_) return true ;
00603   if (gsfIter->isEE() && gsfIter->dr03HcalDepth1TowerSumEt() > hcalIso03Depth1MaxEndcaps_) return true ;
00604   if (gsfIter->isEE() && gsfIter->dr03HcalDepth2TowerSumEt() > hcalIso03Depth2MaxEndcaps_) return true ;
00605   if (gsfIter->isEB() && gsfIter->dr03EcalRecHitSumEt() > ecalIso03MaxBarrel_) return true ;
00606   if (gsfIter->isEE() && gsfIter->dr03EcalRecHitSumEt() > ecalIso03MaxEndcaps_) return true ;
00607 
00608   return false ;
00609  }
00610 
00611 bool ElectronTagProbeAnalyzer::idCut( const reco::GsfElectronCollection::const_iterator & gsfIter )
00612  {
00613   if (gsfIter->isEB() && gsfIter->eSuperClusterOverP() < eOverPMinBarrel_) return true ;
00614   if (gsfIter->isEB() && gsfIter->eSuperClusterOverP() > eOverPMaxBarrel_) return true ;
00615   if (gsfIter->isEE() && gsfIter->eSuperClusterOverP() < eOverPMinEndcaps_) return true ;
00616   if (gsfIter->isEE() && gsfIter->eSuperClusterOverP() > eOverPMaxEndcaps_) return true ;
00617   if (gsfIter->isEB() && std::abs(gsfIter->deltaEtaSuperClusterTrackAtVtx()) < dEtaMinBarrel_) return true ;
00618   if (gsfIter->isEB() && std::abs(gsfIter->deltaEtaSuperClusterTrackAtVtx()) > dEtaMaxBarrel_) return true ;
00619   if (gsfIter->isEE() && std::abs(gsfIter->deltaEtaSuperClusterTrackAtVtx()) < dEtaMinEndcaps_) return true ;
00620   if (gsfIter->isEE() && std::abs(gsfIter->deltaEtaSuperClusterTrackAtVtx()) > dEtaMaxEndcaps_) return true ;
00621   if (gsfIter->isEB() && std::abs(gsfIter->deltaPhiSuperClusterTrackAtVtx()) < dPhiMinBarrel_) return true ;
00622   if (gsfIter->isEB() && std::abs(gsfIter->deltaPhiSuperClusterTrackAtVtx()) > dPhiMaxBarrel_) return true ;
00623   if (gsfIter->isEE() && std::abs(gsfIter->deltaPhiSuperClusterTrackAtVtx()) < dPhiMinEndcaps_) return true ;
00624   if (gsfIter->isEE() && std::abs(gsfIter->deltaPhiSuperClusterTrackAtVtx()) > dPhiMaxEndcaps_) return true ;
00625   if (gsfIter->isEB() && gsfIter->scSigmaIEtaIEta() < sigIetaIetaMinBarrel_) return true ;
00626   if (gsfIter->isEB() && gsfIter->scSigmaIEtaIEta() > sigIetaIetaMaxBarrel_) return true ;
00627   if (gsfIter->isEE() && gsfIter->scSigmaIEtaIEta() < sigIetaIetaMinEndcaps_) return true ;
00628   if (gsfIter->isEE() && gsfIter->scSigmaIEtaIEta() > sigIetaIetaMaxEndcaps_) return true ;
00629   if (gsfIter->isEB() && gsfIter->hadronicOverEm() > hadronicOverEmMaxBarrel_) return true ;
00630   if (gsfIter->isEE() && gsfIter->hadronicOverEm() > hadronicOverEmMaxEndcaps_) return true ;
00631 
00632   return false ;
00633  }
00634 
00635 
00636