CMS 3D CMS Logo

Public Member Functions | Private Attributes

ggPFTracks Class Reference

#include <ggPFTracks.h>

List of all members.

Public Member Functions

std::pair< float, float > BeamLineInt (reco::SuperClusterRef sc, vector< edm::RefToBase< reco::Track > > &Tracks, reco::ConversionRefVector &conversions, vector< edm::RefToBase< reco::Track > > &SLTracks, reco::ConversionRefVector &SLconversions)
std::pair< float, float > CombZVtx (reco::SuperClusterRef sc, reco::GsfTrackRef gsf, vector< edm::RefToBase< reco::Track > > &Tracks, reco::ConversionRefVector &conversions, vector< edm::RefToBase< reco::Track > > &SLTracks, reco::ConversionRefVector &SLconversions)
virtual void getPFConvTracks (reco::Photon phot, vector< edm::RefToBase< reco::Track > > &Tracks, reco::ConversionRefVector &conversions, vector< edm::RefToBase< reco::Track > > &SLTracks, reco::ConversionRefVector &SLconversions)
 ggPFTracks (edm::Handle< BeamSpot > &beamSpotHandle)
std::pair< float, float > gsfElectronProj (reco::GsfElectron gsf)
std::pair< float, float > gsfTrackProj (reco::GsfTrackRef gsf)
bool isConv ()
std::pair< float, float > SLCombZVtx (reco::Photon phot, bool &hasSL)
std::pair< float, float > TrackProj (bool isEb, reco::GsfTrackRef gsf, vector< edm::RefToBase< reco::Track > > &SLTracks, reco::ConversionRefVector &SLconversions)
virtual ~ggPFTracks ()

Private Attributes

Handle< BeamSpotbeamSpotHandle_
bool isConv_

Detailed Description

Definition at line 14 of file ggPFTracks.h.


Constructor & Destructor Documentation

ggPFTracks::ggPFTracks ( edm::Handle< BeamSpot > &  beamSpotHandle) [explicit]

Definition at line 5 of file ggPFTracks.cc.

                        :
  beamSpotHandle_(beamSpotHandle),//pass beamspot
  isConv_(false)
{
  
}
ggPFTracks::~ggPFTracks ( ) [virtual]

Definition at line 14 of file ggPFTracks.cc.

{}

Member Function Documentation

std::pair< float, float > ggPFTracks::BeamLineInt ( reco::SuperClusterRef  sc,
vector< edm::RefToBase< reco::Track > > &  Tracks,
reco::ConversionRefVector conversions,
vector< edm::RefToBase< reco::Track > > &  SLTracks,
reco::ConversionRefVector SLconversions 
)

Definition at line 50 of file ggPFTracks.cc.

References beamSpotHandle_, trackerHits::c, conv, edm::RefVector< C, T, F >::size(), slope, mathSSE::sqrt(), lumiQTWidget::t, reco::Vertex::x(), X, x, reco::Vertex::y(), detailsBasic3DVector::y, reco::Vertex::z(), and z.

Referenced by CombZVtx(), and SLCombZVtx().

                                                {
  std::pair<float,float> Zint(0,0);
  TVector3 beamspot(beamSpotHandle_->position().x(),beamSpotHandle_->position().y(),
              beamSpotHandle_->position().z());
  TVector3 SCPos(sc->position().x()-beamspot[0], sc->position().y()-beamspot[1], sc->position().z()-beamspot[2]);
  //find min Conversion radius for track pairs if they exist. 
  float convRMin=130;
  float SLConvRMin=130;
  int c_index=-1; int SLc_index=-1;
  if(conversions.size()>0)
    {
      for(unsigned int c=0; c<conversions.size(); ++c){
        float convR=sqrt(conversions[c]->conversionVertex().x()* conversions[c]->conversionVertex().x() + conversions[c]->conversionVertex().y()* conversions[c]->conversionVertex().y());
        if(convRMin>convR){
          convRMin=convR;
          c_index=c;
        }
      }
    }
  
  if(SLconversions.size()>0){
    for(unsigned int SLc=0; SLc<SLconversions.size(); ++SLc){      
      std::vector<math::XYZPointF> innerPos=SLconversions[SLc]->tracksInnerPosition();
      for (unsigned int t=0; t<innerPos.size(); t++){
        float convR=sqrt( innerPos[t].X()* innerPos[t].X() + innerPos[t].Y()* innerPos[t].Y());
        
        if(SLConvRMin>convR){
          SLc_index=SLc;  
          SLConvRMin=convR;
          
        }
      }
    }
  }
  TVector3 TkPos(beamspot[0],beamspot[1],beamspot[2]);
  //take the smaller Radius:
  if(convRMin<SLConvRMin && c_index>-1){
    //point using Conversion Vertex
    TkPos.SetXYZ(conversions[c_index]->conversionVertex().x()-beamspot[0],
                 conversions[c_index]->conversionVertex().y()-beamspot[1],
                 conversions[c_index]->conversionVertex().z()-beamspot[2] );
  }
  if(SLConvRMin<convRMin && SLc_index>-1){
    reco::Vertex conv=SLconversions[SLc_index]->conversionVertex();
    TkPos.SetXYZ(conv.x()-beamspot[0],
                 conv.y()-beamspot[1],
                 conv.z()-beamspot[2] );
  }
  //Intersection fromt the two points:
  float R1=sqrt(SCPos.X()* SCPos.X() + SCPos.Y()*SCPos.Y()); 
  float R2=sqrt(TkPos.X()* TkPos.X() + TkPos.Y()*TkPos.Y());
  float Z1=SCPos.Z();
  float Z2=TkPos.Z();
  float slope=(Z1-Z2)/(R1-R2);
  Zint.first=Z2 - R2*slope;
  //determine error based on Tracking Region for conversion pairs:
  float sigmaPix=0.06;
  float sigmaTib=0.67;
  float sigmaTob=2.04;
  float sigmaFwd1=0.18;
  float sigmaFwd2=0.61;
  float sigmaFwd3=0.99;
  //error of SL tracks of Conversion based on EB/EE and R>39 R<39 (4 cat)
  float EBLR=0.24;
  float EBHR=0.478;
  float EELR=0.416;
  float EEHR=0.888;
  if(sc->eta()<1.4442){//Barrel
    //if conversion
    if(convRMin<SLConvRMin && c_index>-1){//3 tracking regions
      if(convRMin<=15)Zint.second=sigmaPix;
      else if(convRMin>15 && convRMin<=60)Zint.second=sigmaTib;
      else Zint.second=sigmaTob;
    }  
    //if SL 
    if(SLConvRMin<convRMin && SLc_index>-1){//2 tracking regions
      if(SLConvRMin<39)Zint.second=EBLR;
      else Zint.second=EBHR;
    }
  }
  else{
    //if conversion
    if(convRMin<SLConvRMin && c_index>-1){//3 foreward tracking regions
      float convz=conversions[c_index]->conversionVertex().z();
      if(convz<=50)Zint.second=sigmaFwd1;
      else if(convz>50 && convz<=60)Zint.second=sigmaFwd2;
      else Zint.second=sigmaFwd3;
    }
    //if SL
    if(SLConvRMin<convRMin && SLc_index>-1){//2 tracking regions based on R
      if(SLConvRMin<39)Zint.second=EELR;
      else Zint.second=EEHR;
    }
  }
  return Zint;//return intersection at beamline and error in the pointing based on tracking region
}
std::pair< float, float > ggPFTracks::CombZVtx ( reco::SuperClusterRef  sc,
reco::GsfTrackRef  gsf,
vector< edm::RefToBase< reco::Track > > &  Tracks,
reco::ConversionRefVector conversions,
vector< edm::RefToBase< reco::Track > > &  SLTracks,
reco::ConversionRefVector SLconversions 
)

Definition at line 233 of file ggPFTracks.cc.

References BeamLineInt(), beamSpotHandle_, edm::Ref< C, T, F >::isNonnull(), mathSSE::sqrt(), TrackProj(), and Gflash::Z.

                            {
  std::pair<float, float> combZ(0,0);
  bool isEb;
  TVector3 beamspot(beamSpotHandle_->position().x(),beamSpotHandle_->position().y(),
                    beamSpotHandle_->position().z());
  if(fabs(sc->eta())<1.4442)isEb=true;
  else isEb=false;
  std::pair< float,float> SCZ=BeamLineInt(sc, Tracks, conversions,SLTracks, SLconversions);
  std::pair<float, float> TkPjZ=TrackProj(isEb,gsf,SLTracks, SLconversions);
  //errors in the two methods
  float sigZProj=TkPjZ.second;
  float sigSCPoint=SCZ.second;
  
  if(gsf.isNonnull()){combZ=TkPjZ; return combZ;}//for gsf Tracks just return track Proj
  //weighted avg of the two methods, where weights are based on the error
  float Z=((SCZ.first/(sigSCPoint*sigSCPoint))+ (TkPjZ.first/( sigZProj* sigZProj)))/(1/(sigSCPoint * sigSCPoint)+ 1/(sigZProj * sigZProj));
  //total error sum of the two errors in quadrature
  float sigZ=sqrt((sigSCPoint * sigSCPoint)+ (sigZProj * sigZProj));
  combZ.first=Z; combZ.second=sigZ;
  return combZ;  
}
void ggPFTracks::getPFConvTracks ( reco::Photon  phot,
vector< edm::RefToBase< reco::Track > > &  Tracks,
reco::ConversionRefVector conversions,
vector< edm::RefToBase< reco::Track > > &  SLTracks,
reco::ConversionRefVector SLconversions 
) [virtual]

Definition at line 16 of file ggPFTracks.cc.

References trackerHits::c, edm::RefVector< C, T, F >::clear(), reco::Photon::conversions(), reco::Photon::conversionsOneLeg(), isConv_, edm::RefVector< C, T, F >::push_back(), edm::RefVector< C, T, F >::size(), lumiQTWidget::t, and testEve_cfg::tracks.

Referenced by SLCombZVtx().

                                  {
  Tracks.clear();
  conversions.clear();
  SLTracks.clear();
  SLconversions.clear();
  conversions=phot.conversions();
  //loop over conversion paris
  for(unsigned int c=0; c<conversions.size(); ++c){
    const std::vector<edm::RefToBase<reco::Track> > tracks = conversions[c]->tracks();
    for (unsigned int t=0; t<tracks.size(); t++){
      Tracks.push_back(tracks[t]);
    }
  }
  
  reco::ConversionRefVector  SLConversions=phot.conversionsOneLeg();
  
  for(unsigned int SLc=0; SLc<SLConversions.size(); ++SLc){
    const std::vector<edm::RefToBase<reco::Track> > tracks = SLConversions[SLc]->tracks();
    SLconversions.push_back(SLConversions[SLc]);
    
    for (unsigned int t=0; t<tracks.size(); t++){
      SLTracks.push_back(tracks[t]);
    }
  }
  if(SLConversions.size()>0 || conversions.size()>0)isConv_=true;
}
std::pair< float, float > ggPFTracks::gsfElectronProj ( reco::GsfElectron  gsf)

Definition at line 215 of file ggPFTracks.cc.

References funct::cos(), reco::GsfElectron::gsfTrack(), funct::sin(), mathSSE::sqrt(), funct::tan(), theta(), reco::GsfElectron::trackMomentumAtVtx(), reco::GsfElectron::trackPositionAtVtx(), and Gflash::Z.

Referenced by ggPFPhotons::SLPoint().

                                                    {
  //if there is a gsf electron then use this for track projection Plenty of inner hits
  
  float theta =gsf.trackMomentumAtVtx().theta();
  
  float tkz=gsf.trackPositionAtVtx().Z();
  float tkR=sqrt(gsf.trackPositionAtVtx().X()* gsf.trackPositionAtVtx().X()+ gsf.trackPositionAtVtx().Y()* gsf.trackPositionAtVtx().Y());
  float thetErr=gsf.gsfTrack()->thetaError();
  float Z=tkz-tkR/tan(theta);
  float Zerr=((-1*(cos(theta)*cos(theta))/(sin(theta)* sin(theta))-1)*tkR*thetErr);
  std::pair<float,float> ZProj(0,0);
  ZProj.first=Z; ZProj.second=Zerr;
  return ZProj;
  
}
std::pair< float, float > ggPFTracks::gsfTrackProj ( reco::GsfTrackRef  gsf)

Definition at line 197 of file ggPFTracks.cc.

References funct::cos(), funct::sin(), mathSSE::sqrt(), funct::tan(), theta(), and Gflash::Z.

Referenced by TrackProj().

                                                 {
  //if there is a gsf track then use this for track projection Plenty of inner hits
  
  float theta =gsf->innerMomentum().theta();
  
  float tkz=gsf->innerPosition().Z();
  float tkR=sqrt(gsf->innerPosition().X()* gsf->innerPosition().X()+ gsf->innerPosition().Y()* gsf->innerPosition().Y());
  float thetErr=gsf->thetaError();
  float Z=tkz-tkR/tan(theta);
  float Zerr=((-1*(cos(theta)*cos(theta))/(sin(theta)* sin(theta))-1)*tkR*thetErr);
  std::pair<float,float> ZProj(0,0);
  ZProj.first=Z; ZProj.second=Zerr;
  return ZProj;
  
}
bool ggPFTracks::isConv ( ) [inline]

Definition at line 60 of file ggPFTracks.h.

Referenced by ggPFPhotons::SLPoint().

{return isConv_;}
std::pair< float, float > ggPFTracks::SLCombZVtx ( reco::Photon  phot,
bool &  hasSL 
)

Definition at line 264 of file ggPFTracks.cc.

References BeamLineInt(), beamSpotHandle_, convBrem_cff::convTracks, getPFConvTracks(), reco::Photon::isEB(), edm::RefVector< C, T, F >::size(), mathSSE::sqrt(), reco::Photon::superCluster(), TrackProj(), and Gflash::Z.

Referenced by ggPFPhotons::SLPoint().

                                                {
  std::pair<float, float> combZ(0,0);
  TVector3 beamspot(beamSpotHandle_->position().x(),beamSpotHandle_->position().y(),
                    beamSpotHandle_->position().z());
  bool isEb=phot.isEB();
  //only want to use SL so the conversion pair variables will be dummy for the get function
  vector<edm::RefToBase<reco::Track> >convTracks; 
  reco::ConversionRefVector pairConv;
  
  reco::ConversionRefVector SLConversions;
  vector<edm::RefToBase<reco::Track> >SLTracks; 
  reco::GsfTrackRef gsfdummy;
  getPFConvTracks(phot,convTracks,pairConv ,SLTracks,SLConversions);
  
  if(SLConversions.size()>0){
    hasSL=true;
    vector<edm::RefToBase<reco::Track> >dummy; 
    reco::ConversionRefVector pairdummy;
    std::pair<float, float> TkPjZ=TrackProj(isEb,gsfdummy,SLTracks, SLConversions);
    std::pair< float,float> SCZ=BeamLineInt(phot.superCluster(), dummy,pairdummy,SLTracks, SLConversions);
    //errors in the two methods
    float sigZProj=TkPjZ.second;
    float sigSCPoint=SCZ.second;
    //weighted avg of the two methods, where weights are based on the error
    float Z=((SCZ.first/(sigSCPoint*sigSCPoint))+ (TkPjZ.first/(sigZProj * sigZProj)))/(1/(sigSCPoint*sigSCPoint)+ 1/(sigZProj * sigZProj));
    //total error sum of the two errors in quadrature
    float sigZ=sqrt((sigSCPoint*sigSCPoint)+ (sigZProj * sigZProj));
    combZ.first=Z; combZ.second=sigZ;
  }
  else if(pairConv.size()>0){//else use Conversion pairs if available 
    std::pair< float,float> SCZ=BeamLineInt(phot.superCluster(),convTracks, pairConv, SLTracks, SLConversions);   
    combZ.first=SCZ.first;
    combZ.second=SCZ.second;
    hasSL=false;
  }
  else{//returns beamspot
    combZ.first=beamspot.Z();
    combZ.second=0;
    hasSL=false;
  }
  return combZ;
}
std::pair< float, float > ggPFTracks::TrackProj ( bool  isEb,
reco::GsfTrackRef  gsf,
vector< edm::RefToBase< reco::Track > > &  SLTracks,
reco::ConversionRefVector SLconversions 
)

Definition at line 153 of file ggPFTracks.cc.

References conv, funct::cos(), gsfTrackProj(), edm::Ref< C, T, F >::isNonnull(), funct::sin(), edm::RefVector< C, T, F >::size(), mathSSE::sqrt(), funct::tan(), theta(), testEve_cfg::tracks, reco::Vertex::x(), reco::Vertex::y(), Gflash::Z, and reco::Vertex::z().

Referenced by CombZVtx(), and SLCombZVtx().

                             {
  std::pair<float,float> ZProj(0,0);
  
  if(gsf.isNonnull()){//if there is a gsf track then use this for track projection Plenty of inner hits
    ZProj=gsfTrackProj(gsf);
    return ZProj;
  }
  
  float minR=210;
  int SLind=-1;
  if(SLconversions.size()>0){//find track with min Radius (starts earliest)
    for(unsigned int SLc=0; SLc<SLconversions.size(); ++SLc){     
      reco::Vertex conv=SLconversions[SLc]->conversionVertex();
      float convR=sqrt( conv.x() * conv.x() + conv.y() * conv.y());
      if(convR<minR){
        minR=convR;
        SLind=SLc;
      }
    }
    reco::Vertex conv=SLconversions[SLind]->conversionVertex();
    const std::vector<edm::RefToBase<reco::Track> > tracks = SLconversions[SLind]->tracks();
    float theta =tracks[0]->theta();
    float tkz=conv.z();
    float tkR=sqrt( conv.x() * conv.x() + conv.y() * conv.y());
    float thetErr=tracks[0]->thetaError();
    float Z=tkz-tkR/tan(theta);//track projection
    float Zerr=((-1*(cos(theta)*cos(theta))/(sin(theta)* sin(theta))-1)*tkR*thetErr); //projection error based on theta err of track theta derivative of the Zproj
    //for early tracks theta error is very small so just hard code an error 
    //that is measured by looking at the track Proj resolutin in MC
    if(tkR<39 && isEb)Zerr=0.234; 
    if(tkR<39 && !isEb)Zerr=0.341;
    ZProj.first=Z; ZProj.second=Zerr;
    return ZProj;
  }
  return ZProj;
}

Member Data Documentation

Definition at line 65 of file ggPFTracks.h.

Referenced by BeamLineInt(), CombZVtx(), and SLCombZVtx().

bool ggPFTracks::isConv_ [private]

Definition at line 66 of file ggPFTracks.h.

Referenced by getPFConvTracks().