CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_4_5_patch3/src/DataFormats/EgammaCandidates/interface/GsfElectron.h

Go to the documentation of this file.
00001  #ifndef GsfElectron_h
00002 #define GsfElectron_h
00003 
00004 #include "DataFormats/EgammaCandidates/interface/GsfElectronFwd.h"
00005 #include "DataFormats/EgammaCandidates/interface/GsfElectronCore.h"
00006 #include "DataFormats/RecoCandidate/interface/RecoCandidate.h"
00007 #include "DataFormats/GsfTrackReco/interface/GsfTrackFwd.h"
00008 //#include "DataFormats/GsfTrackReco/interface/GsfTrack.h"
00009 #include "DataFormats/TrackReco/interface/TrackFwd.h"
00010 #include "DataFormats/EgammaReco/interface/SuperCluster.h"
00011 #include "DataFormats/EgammaReco/interface/SuperClusterFwd.h"
00012 #include "DataFormats/CaloRecHit/interface/CaloClusterFwd.h"
00013 #include "DataFormats/CaloTowers/interface/CaloTowerDetId.h"
00014 //#include "DataFormats/Math/interface/LorentzVector.h"
00015 #include "DataFormats/GeometryVector/interface/GlobalPoint.h"
00016 #include "DataFormats/GeometryVector/interface/GlobalVector.h"
00017 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00018 #include <vector>
00019 #include <limits>
00020 
00021 namespace reco
00022  {
00023 
00024 
00025 /****************************************************************************
00026  * \class reco::GsfElectron
00027  *
00028  * An Electron with a GsfTrack seeded from an ElectronSeed.
00029  * Renamed from PixelMatchGsfElectron.
00030  * Originally adapted from the TRecElectron class in ORCA.
00031  *
00032  * \author Claude Charlot - Laboratoire Leprince-Ringuet - École polytechnique, CNRS/IN2P3
00033  * \author David Chamont  - Laboratoire Leprince-Ringuet - École polytechnique, CNRS/IN2P3
00034  *
00035  ****************************************************************************/
00036 
00037 class GsfElectron : public RecoCandidate
00038  {
00039 
00040   //=======================================================
00041   // Constructors
00042   //
00043   // The clone() method with arguments, and the copy
00044   // constructor with edm references is designed for
00045   // someone which want to duplicates all
00046   // collections.
00047   //=======================================================
00048 
00049   public :
00050 
00051     // some nested structures defined later on
00052     struct ChargeInfo ;
00053     struct TrackClusterMatching ;
00054     struct TrackExtrapolations ;
00055     struct ClosestCtfTrack ;
00056     struct FiducialFlags ;
00057     struct ShowerShape ;
00058     struct IsolationVariables ;
00059     struct ConversionRejection ;
00060 
00061     GsfElectron() ;
00062     GsfElectron( const GsfElectronCoreRef & ) ;
00063     GsfElectron
00064      (
00065       const GsfElectron &,
00066       const GsfElectronCoreRef &
00067      ) ;
00068     GsfElectron
00069      (
00070       const GsfElectron & electron,
00071       const GsfElectronCoreRef & core,
00072       const CaloClusterPtr & electronCluster,
00073       const TrackRef & closestCtfTrack,
00074       const TrackBaseRef & conversionPartner,
00075       const GsfTrackRefVector & ambiguousTracks
00076      ) ;
00077     GsfElectron
00078      (
00079       int charge,
00080       const ChargeInfo &,
00081       const GsfElectronCoreRef &,
00082       const TrackClusterMatching &,
00083       const TrackExtrapolations &,
00084       const ClosestCtfTrack &,
00085       const FiducialFlags &,
00086       const ShowerShape &,
00087       const ConversionRejection &,
00088       float fbrem
00089      ) ;
00090     GsfElectron * clone() const ;
00091     GsfElectron * clone
00092      (
00093       const GsfElectronCoreRef & core,
00094       const CaloClusterPtr & electronCluster,
00095       const TrackRef & closestCtfTrack,
00096       const TrackBaseRef & conversionPartner,
00097       const GsfTrackRefVector & ambiguousTracks
00098      ) const ;
00099     virtual ~GsfElectron() {} ;
00100 
00101   private:
00102 
00103     void init() ;
00104 
00105 
00106   //=======================================================
00107   // Candidate methods and complementary information
00108   //
00109   // The gsf electron producer has tried to best evaluate
00110   // the four momentum and charge and given those values to
00111   // the GsfElectron constructor, which forwarded them to
00112   // the Candidate constructor. Those values can be retreived
00113   // with getters inherited from Candidate : p4() and charge().
00114   //=======================================================
00115 
00116   public:
00117 
00118     // Inherited from Candidate
00119     // const LorentzVector & charge() const ;
00120     // const LorentzVector & p4() const ;
00121 
00122     // Complementary struct
00123     struct ChargeInfo
00124      {
00125       int scPixCharge ;
00126       bool isGsfCtfScPixConsistent ;
00127       bool isGsfScPixConsistent ;
00128       bool isGsfCtfConsistent ;
00129       ChargeInfo()
00130         : scPixCharge(0), isGsfCtfScPixConsistent(false),
00131           isGsfScPixConsistent(false), isGsfCtfConsistent(false)
00132         {}
00133      } ;
00134 
00135     // Charge info accessors
00136     // to get gsf track charge: gsfTrack()->charge()
00137     // to get ctf track charge, if closestCtfTrackRef().isNonnull(): closestCtfTrackRef()->charge()
00138     int scPixCharge() const { return chargeInfo_.scPixCharge ; }
00139     bool isGsfCtfScPixChargeConsistent() const { return chargeInfo_.isGsfCtfScPixConsistent ; }
00140     bool isGsfScPixChargeConsistent() const { return chargeInfo_.isGsfScPixConsistent ; }
00141     bool isGsfCtfChargeConsistent() const { return chargeInfo_.isGsfCtfConsistent ; }
00142     const ChargeInfo & chargeInfo() const { return chargeInfo_ ; }
00143 
00144     // Candidate redefined methods
00145     virtual bool isElectron() const { return true ; }
00146     virtual bool overlap( const Candidate & ) const ;
00147 
00148   private:
00149 
00150     // Complementary attributes
00151     ChargeInfo chargeInfo_ ;
00152 
00153 
00154   //=======================================================
00155   // Core Attributes
00156   //
00157   // They all have been computed before, when building the
00158   // collection of GsfElectronCore instances. Each GsfElectron
00159   // has a reference toward a GsfElectronCore.
00160   //=======================================================
00161 
00162   public:
00163 
00164     // accessors
00165     virtual GsfElectronCoreRef core() const ;
00166 
00167     // forward core methods
00168     virtual SuperClusterRef superCluster() const { return core()->superCluster() ; }
00169     virtual GsfTrackRef gsfTrack() const { return core()->gsfTrack() ; }
00170     virtual TrackRef closestTrack() const { return core()->ctfTrack() ; }
00171     float ctfGsfOverlap() const { return core()->ctfGsfOverlap() ; }
00172     bool ecalDrivenSeed() const { return core()->ecalDrivenSeed() ; }
00173     bool trackerDrivenSeed() const { return core()->trackerDrivenSeed() ; }
00174     SuperClusterRef pflowSuperCluster() const { return core()->pflowSuperCluster() ; }
00175 
00176     // backward compatibility
00177     struct ClosestCtfTrack
00178      {
00179       TrackRef ctfTrack ; // best matching ctf track
00180       float shFracInnerHits ; // fraction of common hits between the ctf and gsf tracks
00181       ClosestCtfTrack() : shFracInnerHits(0.) {}
00182       ClosestCtfTrack( TrackRef track, float sh ) : ctfTrack(track), shFracInnerHits(sh) {}
00183      } ;
00184     float shFracInnerHits() const { return core()->ctfGsfOverlap() ; }
00185     TrackRef closestCtfTrackRef() const { return core()->ctfTrack() ; }
00186     ClosestCtfTrack closestCtfTrack() const { return ClosestCtfTrack(core()->ctfTrack(),core()->ctfGsfOverlap()) ; }
00187 
00188   private:
00189 
00190     // attributes
00191     GsfElectronCoreRef core_ ;
00192 
00193 
00194   //=======================================================
00195   // Track-Cluster Matching Attributes
00196   //=======================================================
00197 
00198   public:
00199 
00200     struct TrackClusterMatching
00201      {
00202       CaloClusterPtr electronCluster ;  // basic cluster best matching gsf track
00203       float eSuperClusterOverP ;        // the supercluster energy / track momentum at the PCA to the beam spot
00204       float eSeedClusterOverP ;         // the seed cluster energy / track momentum at the PCA to the beam spot
00205       float eSeedClusterOverPout ;      // the seed cluster energy / track momentum at calo extrapolated from the outermost track state
00206       float eEleClusterOverPout ;       // the electron cluster energy / track momentum at calo extrapolated from the outermost track state
00207       float deltaEtaSuperClusterAtVtx ; // the supercluster eta - track eta position at calo extrapolated from innermost track state
00208       float deltaEtaSeedClusterAtCalo ; // the seed cluster eta - track eta position at calo extrapolated from the outermost track state
00209       float deltaEtaEleClusterAtCalo ;  // the electron cluster eta - track eta position at calo extrapolated from the outermost state
00210       float deltaPhiEleClusterAtCalo ;  // the electron cluster phi - track phi position at calo extrapolated from the outermost track state
00211       float deltaPhiSuperClusterAtVtx ; // the supercluster phi - track phi position at calo extrapolated from the innermost track state
00212       float deltaPhiSeedClusterAtCalo ; // the seed cluster phi - track phi position at calo extrapolated from the outermost track state
00213       TrackClusterMatching()
00214        : eSuperClusterOverP(0.),
00215          eSeedClusterOverP(0.),
00216          eSeedClusterOverPout(0.),
00217          eEleClusterOverPout(0.),
00218          deltaEtaSuperClusterAtVtx(std::numeric_limits<float>::infinity()),
00219          deltaEtaSeedClusterAtCalo(std::numeric_limits<float>::infinity()),
00220          deltaEtaEleClusterAtCalo(std::numeric_limits<float>::infinity()),
00221          deltaPhiEleClusterAtCalo(std::numeric_limits<float>::infinity()),
00222          deltaPhiSuperClusterAtVtx(std::numeric_limits<float>::infinity()),
00223          deltaPhiSeedClusterAtCalo(std::numeric_limits<float>::infinity())
00224         {}
00225      } ;
00226 
00227     // accessors
00228     CaloClusterPtr electronCluster() const { return trackClusterMatching_.electronCluster ; }
00229     float eSuperClusterOverP() const { return trackClusterMatching_.eSuperClusterOverP ; }
00230     float eSeedClusterOverP() const { return trackClusterMatching_.eSeedClusterOverP ; }
00231     float eSeedClusterOverPout() const { return trackClusterMatching_.eSeedClusterOverPout ; }
00232     float eEleClusterOverPout() const { return trackClusterMatching_.eEleClusterOverPout ; }
00233     float deltaEtaSuperClusterTrackAtVtx() const { return trackClusterMatching_.deltaEtaSuperClusterAtVtx ; }
00234     float deltaEtaSeedClusterTrackAtCalo() const { return trackClusterMatching_.deltaEtaSeedClusterAtCalo ; }
00235     float deltaEtaEleClusterTrackAtCalo() const { return trackClusterMatching_.deltaEtaEleClusterAtCalo ; }
00236     float deltaPhiSuperClusterTrackAtVtx() const { return trackClusterMatching_.deltaPhiSuperClusterAtVtx ; }
00237     float deltaPhiSeedClusterTrackAtCalo() const { return trackClusterMatching_.deltaPhiSeedClusterAtCalo ; }
00238     float deltaPhiEleClusterTrackAtCalo() const { return trackClusterMatching_.deltaPhiEleClusterAtCalo ; }
00239     const TrackClusterMatching & trackClusterMatching() const { return trackClusterMatching_ ; }
00240 
00241     // for backward compatibility, usefull ?
00242     void setDeltaEtaSuperClusterAtVtx( float de ) { trackClusterMatching_.deltaEtaSuperClusterAtVtx = de ; }
00243     void setDeltaPhiSuperClusterAtVtx( float dphi ) { trackClusterMatching_.deltaPhiSuperClusterAtVtx = dphi ; }
00244 
00245 
00246   private:
00247 
00248     // attributes
00249     TrackClusterMatching trackClusterMatching_ ;
00250 
00251 
00252   //=======================================================
00253   // Track extrapolations
00254   //=======================================================
00255 
00256   public :
00257 
00258     struct TrackExtrapolations
00259      {
00260       math::XYZPointF  positionAtVtx ;     // the track PCA to the beam spot
00261       math::XYZPointF  positionAtCalo ;    // the track PCA to the supercluster position
00262       math::XYZVectorF momentumAtVtx ;     // the track momentum at the PCA to the beam spot
00263       math::XYZVectorF momentumAtCalo ;    // the track momentum extrapolated at the supercluster position from the innermost track state
00264       math::XYZVectorF momentumOut ;       // the track momentum extrapolated at the seed cluster position from the outermost track state
00265       math::XYZVectorF momentumAtEleClus ; // the track momentum extrapolated at the ele cluster position from the outermost track state
00266       math::XYZVectorF momentumAtVtxWithConstraint ;     // the track momentum at the PCA to the beam spot using bs constraint
00267      } ;
00268 
00269     // accessors
00270     math::XYZPointF trackPositionAtVtx() const { return trackExtrapolations_.positionAtVtx ; }
00271     math::XYZPointF trackPositionAtCalo() const { return trackExtrapolations_.positionAtCalo ; }
00272     math::XYZVectorF trackMomentumAtVtx() const { return trackExtrapolations_.momentumAtVtx ; }
00273     math::XYZVectorF trackMomentumAtCalo() const { return trackExtrapolations_.momentumAtCalo ; }
00274     math::XYZVectorF trackMomentumOut() const { return trackExtrapolations_.momentumOut ; }
00275     math::XYZVectorF trackMomentumAtEleClus() const { return trackExtrapolations_.momentumAtEleClus ; }
00276     math::XYZVectorF trackMomentumAtVtxWithConstraint() const { return trackExtrapolations_.momentumAtVtxWithConstraint ; }
00277     const TrackExtrapolations & trackExtrapolations() const { return trackExtrapolations_ ; }
00278 
00279     // for backward compatibility
00280     math::XYZPointF TrackPositionAtVtx() const { return trackPositionAtVtx() ; }
00281     math::XYZPointF TrackPositionAtCalo() const { return trackPositionAtCalo() ; }
00282 
00283 
00284   private:
00285 
00286     // attributes
00287     TrackExtrapolations trackExtrapolations_ ;
00288 
00289 
00290   //=======================================================
00291   // SuperCluster direct access
00292   //=======================================================
00293 
00294   public :
00295 
00296     // direct accessors
00297     math::XYZPoint superClusterPosition() const { return superCluster()->position() ; } // the super cluster position
00298     int basicClustersSize() const { return superCluster()->clustersSize() ; } // number of basic clusters inside the supercluster
00299     CaloCluster_iterator basicClustersBegin() const { return superCluster()->clustersBegin() ; }
00300     CaloCluster_iterator basicClustersEnd() const { return superCluster()->clustersEnd() ; }
00301 
00302     // for backward compatibility
00303     math::XYZPoint caloPosition() const { return superCluster()->position() ; }
00304 
00305 
00306 
00307   //=======================================================
00308   // Fiducial Flags
00309   //=======================================================
00310 
00311   public :
00312 
00313     struct FiducialFlags
00314      {
00315       bool isEB ;        // true if particle is in ECAL Barrel
00316       bool isEE ;        // true if particle is in ECAL Endcaps
00317       bool isEBEEGap ;   // true if particle is in the crack between EB and EE
00318       bool isEBEtaGap ;  // true if particle is in EB, and inside the eta gaps between modules
00319       bool isEBPhiGap ;  // true if particle is in EB, and inside the phi gaps between modules
00320       bool isEEDeeGap ;  // true if particle is in EE, and inside the gaps between dees
00321       bool isEERingGap ; // true if particle is in EE, and inside the gaps between rings
00322       FiducialFlags()
00323        : isEB(false), isEE(false), isEBEEGap(false),
00324          isEBEtaGap(false), isEBPhiGap(false),
00325              isEEDeeGap(false), isEERingGap(false)
00326            {}
00327      } ;
00328 
00329     // accessors
00330     bool isEB() const { return fiducialFlags_.isEB ; }
00331     bool isEE() const { return fiducialFlags_.isEE ; }
00332     bool isGap() const { return ((isEBEEGap())||(isEBGap())||(isEEGap())) ; }
00333     bool isEBEEGap() const { return fiducialFlags_.isEBEEGap ; }
00334     bool isEBGap() const { return (isEBEtaGap()||isEBPhiGap()) ; }
00335     bool isEBEtaGap() const { return fiducialFlags_.isEBEtaGap ; }
00336     bool isEBPhiGap() const { return fiducialFlags_.isEBPhiGap ; }
00337     bool isEEGap() const { return (isEEDeeGap()||isEERingGap()) ; }
00338     bool isEEDeeGap() const { return fiducialFlags_.isEEDeeGap ; }
00339     bool isEERingGap() const { return fiducialFlags_.isEERingGap ; }
00340     const FiducialFlags & fiducialFlags() const { return fiducialFlags_ ; }
00341 
00342 
00343   private:
00344 
00345     // attributes
00346     FiducialFlags fiducialFlags_ ;
00347 
00348 
00349   //=======================================================
00350   // Shower Shape Variables
00351   //=======================================================
00352 
00353   public :
00354 
00355     struct ShowerShape
00356      {
00357       float sigmaEtaEta ;        // weighted cluster rms along eta and inside 5x5 (absolute eta)
00358       float sigmaIetaIeta ;      // weighted cluster rms along eta and inside 5x5 (new, Xtal eta)
00359       float e1x5 ;               // energy inside 1x5 in etaxphi around the seed Xtal
00360       float e2x5Max ;            // energy inside 2x5 in etaxphi around the seed Xtal (max bwt the 2 possible sums)
00361       float e5x5 ;               // energy inside 5x5 in etaxphi around the seed Xtal
00362       float hcalDepth1OverEcal ; // hcal over ecal seed cluster energy using 1st hcal depth (using hcal towers within a cone)
00363       float hcalDepth2OverEcal ; // hcal over ecal seed cluster energy using 2nd hcal depth (using hcal towers within a cone)
00364       std::vector<CaloTowerDetId> hcalTowersBehindClusters ; //
00365       float hcalDepth1OverEcalBc ; // hcal over ecal seed cluster energy using 1st hcal depth (using hcal towers behind clusters)
00366       float hcalDepth2OverEcalBc ; // hcal over ecal seed cluster energy using 2nd hcal depth (using hcal towers behind clusters)
00367       ShowerShape()
00368        : sigmaEtaEta(std::numeric_limits<float>::infinity()),
00369              sigmaIetaIeta(std::numeric_limits<float>::infinity()),
00370              e1x5(0.), e2x5Max(0.), e5x5(0.),
00371        hcalDepth1OverEcal(0.), hcalDepth2OverEcal(0.),
00372        hcalDepth1OverEcalBc(0.), hcalDepth2OverEcalBc(0.)
00373        {}
00374      } ;
00375 
00376     // accessors
00377     float sigmaEtaEta() const { return showerShape_.sigmaEtaEta ; }
00378     float sigmaIetaIeta() const { return showerShape_.sigmaIetaIeta ; }
00379     float e1x5() const { return showerShape_.e1x5 ; }
00380     float e2x5Max() const { return showerShape_.e2x5Max ; }
00381     float e5x5() const { return showerShape_.e5x5 ; }
00382     float hcalDepth1OverEcal() const { return showerShape_.hcalDepth1OverEcal ; }
00383     float hcalDepth2OverEcal() const { return showerShape_.hcalDepth2OverEcal ; }
00384     float hcalOverEcal() const { return hcalDepth1OverEcal() + hcalDepth2OverEcal() ; }
00385     const std::vector<CaloTowerDetId> & hcalTowersBehindClusters() const { return showerShape_.hcalTowersBehindClusters ; }
00386     float hcalDepth1OverEcalBc() const { return showerShape_.hcalDepth1OverEcalBc ; }
00387     float hcalDepth2OverEcalBc() const { return showerShape_.hcalDepth2OverEcalBc ; }
00388     float hcalOverEcalBc() const { return hcalDepth1OverEcalBc() + hcalDepth2OverEcalBc() ; }
00389     const ShowerShape & showerShape() const { return showerShape_ ; }
00390 
00391     // for backward compatibility
00392     float scSigmaEtaEta() const { return sigmaEtaEta() ; }
00393     float scSigmaIEtaIEta() const { return sigmaIetaIeta() ; }
00394     float scE1x5() const { return e1x5() ; }
00395     float scE2x5Max() const { return e2x5Max() ; }
00396     float scE5x5() const { return e5x5() ; }
00397     float hadronicOverEm() const {return hcalOverEcal();}
00398     float hadronicOverEm1() const {return hcalDepth1OverEcal();}
00399     float hadronicOverEm2() const {return hcalDepth2OverEcal();}
00400 
00401 
00402   private:
00403 
00404     // attributes
00405     ShowerShape showerShape_ ;
00406 
00407 
00408   //=======================================================
00409   // Isolation Variables
00410   //=======================================================
00411 
00412   public :
00413 
00414     struct IsolationVariables
00415      {
00416       float tkSumPt ;                // track iso deposit with electron footprint removed
00417       float ecalRecHitSumEt ;        // ecal iso deposit with electron footprint removed
00418       float hcalDepth1TowerSumEt ;   // hcal depht 1 iso deposit with electron footprint removed
00419       float hcalDepth2TowerSumEt ;   // hcal depht 2 iso deposit with electron footprint removed
00420       float hcalDepth1TowerSumEtBc ; // hcal depht 1 iso deposit without towers behind clusters
00421       float hcalDepth2TowerSumEtBc ; // hcal depht 2 iso deposit without towers behind clusters
00422       IsolationVariables()
00423        : tkSumPt(0.), ecalRecHitSumEt(0.),
00424          hcalDepth1TowerSumEt(0.), hcalDepth2TowerSumEt(0.),
00425          hcalDepth1TowerSumEtBc(0.), hcalDepth2TowerSumEtBc(0.)
00426        {}
00427      } ;
00428 
00429     // 03 accessors
00430     float dr03TkSumPt() const { return dr03_.tkSumPt ; }
00431     float dr03EcalRecHitSumEt() const { return dr03_.ecalRecHitSumEt ; }
00432     float dr03HcalDepth1TowerSumEt() const { return dr03_.hcalDepth1TowerSumEt ; }
00433     float dr03HcalDepth2TowerSumEt() const { return dr03_.hcalDepth2TowerSumEt ; }
00434     float dr03HcalTowerSumEt() const { return dr03HcalDepth1TowerSumEt()+dr03HcalDepth2TowerSumEt() ; }
00435     float dr03HcalDepth1TowerSumEtBc() const { return dr03_.hcalDepth1TowerSumEtBc ; }
00436     float dr03HcalDepth2TowerSumEtBc() const { return dr03_.hcalDepth2TowerSumEtBc ; }
00437     float dr03HcalTowerSumEtBc() const { return dr03HcalDepth1TowerSumEtBc()+dr03HcalDepth2TowerSumEtBc() ; }
00438     const IsolationVariables & dr03IsolationVariables() const { return dr03_ ; }
00439 
00440     // 04 accessors
00441     float dr04TkSumPt() const { return dr04_.tkSumPt ; }
00442     float dr04EcalRecHitSumEt() const { return dr04_.ecalRecHitSumEt ; }
00443     float dr04HcalDepth1TowerSumEt() const { return dr04_.hcalDepth1TowerSumEt ; }
00444     float dr04HcalDepth2TowerSumEt() const { return dr04_.hcalDepth2TowerSumEt ; }
00445     float dr04HcalTowerSumEt() const { return dr04HcalDepth1TowerSumEt()+dr04HcalDepth2TowerSumEt() ; }
00446     float dr04HcalDepth1TowerSumEtBc() const { return dr04_.hcalDepth1TowerSumEtBc ; }
00447     float dr04HcalDepth2TowerSumEtBc() const { return dr04_.hcalDepth2TowerSumEtBc ; }
00448     float dr04HcalTowerSumEtBc() const { return dr04HcalDepth1TowerSumEtBc()+dr04HcalDepth2TowerSumEtBc() ; }
00449     const IsolationVariables & dr04IsolationVariables() const { return dr04_ ; }
00450 
00451     // setters ?!?
00452     void setDr03Isolation( const IsolationVariables & dr03 ) { dr03_ = dr03 ; }
00453     void setDr04Isolation( const IsolationVariables & dr04 ) { dr04_ = dr04 ; }
00454 
00455     // for backward compatibility
00456     void setIsolation03( const IsolationVariables & dr03 ) { dr03_ = dr03 ; }
00457     void setIsolation04( const IsolationVariables & dr04 ) { dr04_ = dr04 ; }
00458     const IsolationVariables & isolationVariables03() const { return dr03_ ; }
00459     const IsolationVariables & isolationVariables04() const { return dr04_ ; }
00460 
00461   private:
00462 
00463     // attributes
00464     IsolationVariables dr03_ ;
00465     IsolationVariables dr04_ ;
00466 
00467 
00468   //=======================================================
00469   // Conversion Rejection Information
00470   //=======================================================
00471 
00472   public :
00473 
00474     struct ConversionRejection
00475      {
00476       int flags ;  // -infinity:not-computed, other: as computed by Puneeth conversion code
00477       TrackBaseRef partner ; // conversion partner
00478       float dist ; // distance to the conversion partner
00479       float dcot ; // difference of cot(angle) with the conversion partner track
00480       float radius ; // signed conversion radius
00481       ConversionRejection()
00482        : flags(-std::numeric_limits<float>::infinity()),
00483          dist(std::numeric_limits<float>::infinity()),
00484          dcot(std::numeric_limits<float>::infinity()),
00485          radius(std::numeric_limits<float>::infinity())
00486        {}
00487      } ;
00488 
00489     // accessors
00490     int convFlags() const { return conversionRejection_.flags ; }
00491     TrackBaseRef convPartner() const { return conversionRejection_.partner ; }
00492     float convDist() const { return conversionRejection_.dist ; }
00493     float convDcot() const { return conversionRejection_.dcot ; }
00494     float convRadius() const { return conversionRejection_.radius ; }
00495     const ConversionRejection & conversionRejectionVariables() const { return conversionRejection_ ; }
00496 
00497   private:
00498 
00499     // attributes
00500     ConversionRejection conversionRejection_ ;
00501 
00502 
00503   //=======================================================
00504   // Pflow Information
00505   //=======================================================
00506 
00507   public:
00508 
00509     struct PflowIsolationVariables
00510       {
00511        float chargedHadronIso ;
00512        float neutralHadronIso ;
00513        float photonIso ;
00514        PflowIsolationVariables()
00515         : chargedHadronIso(0.), neutralHadronIso(0.), photonIso(0.)
00516         {}
00517       } ;
00518 
00519     struct MvaInput
00520      {
00521       int earlyBrem ; // Early Brem detected (-2=>unknown,-1=>could not be evaluated,0=>wrong,1=>true)
00522       int lateBrem ; // Late Brem detected (-2=>unknown,-1=>could not be evaluated,0=>wrong,1=>true)
00523       float sigmaEtaEta ; // Sigma-eta-eta with the PF cluster
00524       float hadEnergy ; // Associated PF Had Cluster energy
00525       float deltaEta ; // PF-cluster GSF track delta-eta
00526       MvaInput()
00527        : earlyBrem(-2), lateBrem(-2),
00528          sigmaEtaEta(std::numeric_limits<float>::infinity()),
00529          hadEnergy(0.),
00530          deltaEta(std::numeric_limits<float>::infinity())
00531        {}
00532      } ;
00533 
00534     struct MvaOutput
00535      {
00536       int status ; // see PFCandidateElectronExtra::StatusFlag
00537       float mva ;
00538       MvaOutput()
00539        : status(-1), mva(-999999999.)
00540        {}
00541      } ;
00542 
00543     // accessors
00544     const ShowerShape & pfShowerShape() const { return pfShowerShape_ ; }
00545     const PflowIsolationVariables & pfIsolationVariables() const { return pfIso_ ; }
00546     const MvaInput & mvaInput() const { return mvaInput_ ; }
00547     const MvaOutput & mvaOutput() const { return mvaOutput_ ; }
00548 
00549     // setters
00550     void setPfShowerShape( const ShowerShape & shape ) { pfShowerShape_ = shape ; }
00551     void setPfIsolationVariables( const PflowIsolationVariables & iso ) { pfIso_ = iso ; }
00552     void setMvaInput( const MvaInput & mi ) { mvaInput_ = mi ; }
00553     void setMvaOutput( const MvaOutput & mo ) { mvaOutput_ = mo ; }
00554 
00555     // for backward compatibility
00556     float mva() const { return mvaOutput_.mva ; }
00557 
00558   private:
00559 
00560     ShowerShape pfShowerShape_ ;
00561     PflowIsolationVariables pfIso_ ;
00562     MvaInput mvaInput_ ;
00563     MvaOutput mvaOutput_ ;
00564 
00565 
00566   //=======================================================
00567   // Preselection and Ambiguity
00568   //=======================================================
00569 
00570   public :
00571 
00572     // accessors
00573     bool ecalDriven() const ; // return true if ecalDrivenSeed() and passingCutBasedPreselection()
00574     bool passingCutBasedPreselection() const { return passCutBasedPreselection_ ; }
00575     bool passingMvaPreselection() const { return passMvaPreslection_ ; }
00576     bool ambiguous() const { return ambiguous_ ; }
00577     GsfTrackRefVector::size_type ambiguousGsfTracksSize() const { return ambiguousGsfTracks_.size() ; }
00578     GsfTrackRefVector::const_iterator ambiguousGsfTracksBegin() const { return ambiguousGsfTracks_.begin() ; }
00579     GsfTrackRefVector::const_iterator ambiguousGsfTracksEnd() const { return ambiguousGsfTracks_.end() ; }
00580 
00581     // setters
00582     void setPassCutBasedPreselection( bool flag ) { passCutBasedPreselection_ = flag ; }
00583     void setPassMvaPreselection( bool flag ) { passMvaPreslection_ = flag ; }
00584     void setAmbiguous( bool flag ) { ambiguous_ = flag ; }
00585     void clearAmbiguousGsfTracks() { ambiguousGsfTracks_.clear() ; }
00586     void addAmbiguousGsfTrack( const reco::GsfTrackRef & t ) { ambiguousGsfTracks_.push_back(t) ; }
00587 
00588   private:
00589 
00590     // attributes
00591     bool passCutBasedPreselection_ ;
00592     bool passMvaPreslection_ ;
00593     bool ambiguous_ ;
00594     GsfTrackRefVector ambiguousGsfTracks_ ; // ambiguous gsf tracks
00595 
00596 
00597   //=======================================================
00598   // Brem Fraction and Classification
00599   // * fbrem given to the GsfElectron constructor
00600   // * classification computed later
00601   //=======================================================
00602 
00603   public :
00604 
00605     enum Classification { UNKNOWN=-1, GOLDEN=0, BIGBREM=1, OLDNARROW=2, SHOWERING=3, GAP=4 } ;
00606 
00607     // accessors
00608     float fbrem() const { return fbrem_ ; }
00609     int numberOfBrems() const { return basicClustersSize()-1 ; }
00610     Classification classification() const { return class_ ; }
00611 
00612     // setters
00613     void classifyElectron( Classification myclass ) { class_ = myclass ; }
00614 
00615   private:
00616 
00617     // attributes
00618     float fbrem_ ; // the brem fraction from gsf fit: (track momentum in - track momentum out) / track momentum in
00619     Classification class_ ; // fbrem and number of clusters based electron classification
00620 
00621 
00622   //=======================================================
00623   // Corrections
00624   //
00625   // The only methods, with classification, which modify
00626   // the electrons after they have been constructed.
00627   // They change a given characteristic, such as the super-cluster
00628   // energy, and propagate the change consistently
00629   // to all the depending attributes.
00630   // We expect the methods to be called in a given order
00631   // and so to store specific kind of corrections
00632   // 1) classify()
00633   // 2) correctEcalEnergy() : depending on classification and eta
00634   // 3) correctMomemtum() : depending on classification and ecal energy and tracker momentum errors
00635   //
00636   // Beware that correctEcalEnergy() is modifying few attributes which
00637   // were potentially used for preselection, whose value used in
00638   // preselection will not be available any more :
00639   // hcalDepth1OverEcal, hcalDepth2OverEcal, eSuperClusterOverP,
00640   // eSeedClusterOverP, eEleClusterOverPout.
00641   //=======================================================
00642 
00643   public :
00644 
00645     enum P4Kind { P4_UNKNOWN=-1, P4_FROM_SUPER_CLUSTER=0, P4_COMBINATION=1, P4_PFLOW_COMBINATION=2 } ;
00646 
00647     struct Corrections
00648      {
00649       bool isEcalEnergyCorrected ;  // true if ecal energy has been corrected
00650       float ecalEnergy ;            // ecal corrected energy (if !isEcalEnergyCorrected this value is identical to the supercluster energy)
00651       float ecalEnergyError ;       // error on correctedCaloEnergy
00652       //bool isMomentumCorrected ;    // DEPRECATED
00653       float trackMomentumError ;    // track momentum error from gsf fit
00654       //
00655       LorentzVector fromSuperClusterP4 ; // for P4_FROM_SUPER_CLUSTER
00656       float fromSuperClusterP4Error ;    // for P4_FROM_SUPER_CLUSTER
00657       LorentzVector combinedP4 ;    // for P4_COMBINATION
00658       float combinedP4Error ;       // for P4_COMBINATION
00659       LorentzVector pflowP4 ;       // for P4_PFLOW_COMBINATION
00660       float pflowP4Error ;          // for P4_PFLOW_COMBINATION
00661       P4Kind candidateP4Kind ;  // say which momentum has been stored in reco::Candidate
00662       //
00663       Corrections()
00664        : isEcalEnergyCorrected(false), ecalEnergy(0.), ecalEnergyError(999.),
00665              /*isMomentumCorrected(false),*/ trackMomentumError(999.),
00666              fromSuperClusterP4Error(999.), combinedP4Error(999.), pflowP4Error(999.),
00667              candidateP4Kind(P4_UNKNOWN)
00668        {}
00669      } ;
00670 
00671     // setters
00672     void setEcalEnergyError( float energyError ) ;
00673     void setCorrectedEcalEnergy( float newEnergy ) ;
00674     void setTrackMomentumError( float trackMomentumError ) ;
00675     void setP4( P4Kind kind, const LorentzVector & p4, float p4Error, bool setCandidate ) ;
00676     using RecoCandidate::setP4 ;
00677 
00678     // accessors
00679     bool isEcalEnergyCorrected() const { return corrections_.isEcalEnergyCorrected ; }
00680     float ecalEnergy() const { return corrections_.ecalEnergy ; }
00681     float ecalEnergyError() const { return corrections_.ecalEnergyError ; }
00682     float trackMomentumError() const { return corrections_.trackMomentumError ; }
00683     const LorentzVector & p4( P4Kind kind ) const ;
00684     using RecoCandidate::p4 ;
00685     float p4Error( P4Kind kind ) const ;
00686     P4Kind candidateP4Kind() const { return corrections_.candidateP4Kind ; }
00687     const Corrections & corrections() const { return corrections_ ; }
00688 
00689     // for backward compatibility
00690     //bool isMomentumCorrected() const { return corrections_.isMomentumCorrected ; }
00691     float caloEnergy() const
00692      { return ecalEnergy() ; }
00693     bool isEnergyScaleCorrected() const
00694      { return isEcalEnergyCorrected() ; }
00695     void correctEcalEnergy( float newEnergy, float newEnergyError )
00696      {
00697       setCorrectedEcalEnergy(newEnergy) ;
00698       setEcalEnergyError(newEnergyError) ;
00699      }
00700     void correctMomentum( const LorentzVector & p4, float trackMomentumError, float p4Error )
00701      { setTrackMomentumError(trackMomentumError) ; setP4(P4_COMBINATION,p4,p4Error,true) ; }
00702 
00703 
00704   private:
00705 
00706     // attributes
00707     Corrections corrections_ ;
00708 
00709  } ;
00710 
00711  } // namespace reco
00712 
00713 #endif