CMS 3D CMS Logo

Conversion.cc

Go to the documentation of this file.
00001 #include "DataFormats/EgammaCandidates/interface/Conversion.h"
00002 #include "DataFormats/TrackReco/interface/Track.h" 
00003 #include "DataFormats/CaloRecHit/interface/CaloCluster.h" 
00004 
00005 
00006 using namespace reco;
00007 
00008 Conversion::Conversion(  const reco::CaloClusterPtrVector sc, 
00009                          const std::vector<reco::TrackRef> tr, 
00010                          const std::vector<math::XYZPoint> trackPositionAtEcal, 
00011                          const reco::Vertex  & convVtx,
00012                          const std::vector<reco::CaloClusterPtr> & matchingBC):  
00013                          
00014 
00015   caloCluster_(sc), tracks_(tr), 
00016   thePositionAtEcal_(trackPositionAtEcal), 
00017   theConversionVertex_(convVtx), 
00018   theMatchingBCs_(matchingBC)  {
00019   
00020 }
00021 
00022 
00023 Conversion::~Conversion() { }
00024 
00025 
00026 Conversion * Conversion::clone() const { 
00027   return new Conversion( * this ); 
00028 }
00029 
00030 reco::CaloClusterPtrVector Conversion::caloCluster() const {
00031   return caloCluster_;
00032 }
00033 
00034 
00035 
00036 std::vector<reco::TrackRef>  Conversion::tracks() const { 
00037    return tracks_;
00038 }
00039 
00040 
00041 
00042 bool Conversion::isConverted() const {
00043   
00044   if ( this->nTracks() > 0) 
00045     return true;
00046   else
00047     return false;
00048 }
00049 
00050 
00051 double  Conversion::zOfPrimaryVertexFromTracks()  const  {
00052   double theZOfPrimaryVertexFromTracks=-9999.;
00053 
00054   float pTrkMag=this->pairMomentum().mag();
00055   
00056   if ( pTrkMag>0 && sqrt(this->conversionVertex().position().perp2()) !=0 ) {
00057     float theta=acos(this->pairMomentum().z() /pTrkMag);
00058     theZOfPrimaryVertexFromTracks = this->conversionVertex().position().z()  - sqrt(this->conversionVertex().position().perp2())*(1./tan(theta));
00059     
00060   }
00061 
00062   return  theZOfPrimaryVertexFromTracks;
00063 
00064 }
00065 
00066 
00067 double Conversion::pairInvariantMass() const{
00068   double invMass=-99.;
00069   const float mElec= 0.000511;
00070   if ( nTracks()==2 ) {
00071     double px= tracks()[0]->innerMomentum().x() + tracks()[1]->innerMomentum().x();
00072     double py= tracks()[0]->innerMomentum().y() + tracks()[1]->innerMomentum().y();
00073     double pz= tracks()[0]->innerMomentum().z() + tracks()[1]->innerMomentum().z();
00074     double mom1=tracks()[0]->innerMomentum().Mag2() ;
00075     double mom2=tracks()[1]->innerMomentum().Mag2() ;
00076     double e = sqrt( mom1+ mElec*mElec ) + sqrt( mom2 + mElec*mElec );
00077     invMass= ( e*e - px*px -py*py - pz*pz);
00078   }
00079   
00080   return invMass;
00081 }
00082 
00083 double  Conversion::pairCotThetaSeparation() const  {
00084   double dCotTheta=-99.;
00085   
00086   if ( nTracks()==2 ) {
00087     double theta1=tracks()[0]->innerMomentum().Theta();
00088     double theta2=tracks()[1]->innerMomentum().Theta();
00089     dCotTheta =  1./tan(theta1) - 1./tan(theta2) ;
00090   }
00091 
00092   return dCotTheta;
00093 
00094 }
00095 
00096 GlobalVector  Conversion::pairMomentum() const  {
00097 
00098   double px=0.;
00099   double py=0.;
00100   double pz=0.;
00101   
00102   if ( nTracks()==2 ) {
00103     px= tracks()[0]->innerMomentum().x() + tracks()[1]->innerMomentum().x();
00104     py= tracks()[0]->innerMomentum().y() + tracks()[1]->innerMomentum().y();
00105     pz= tracks()[0]->innerMomentum().z() + tracks()[1]->innerMomentum().z();
00106 
00107   } else if (  nTracks()==1 ) {
00108     px= tracks()[0]->innerMomentum().x() ;
00109     py= tracks()[0]->innerMomentum().y() ;
00110     pz= tracks()[0]->innerMomentum().z() ;
00111   }
00112 
00113   GlobalVector momTracks(px,py,pz);
00114   return momTracks;
00115 
00116 
00117 }
00118 
00119 
00120 
00121 
00122 double  Conversion::EoverP() const  {
00123 
00124 
00125   double ep=-99.;
00126 
00127   if ( nTracks() > 0  ) {
00128     unsigned int size= this->caloCluster().size();
00129     float etot=0.;
00130     for ( unsigned int i=0; i<size; i++) {
00131       etot+= caloCluster()[i]->energy();
00132     }
00133     ep= etot/this->pairMomentum().mag();
00134   }
00135 
00136 
00137 
00138   return ep;  
00139 
00140 }
00141 
00142  

Generated on Tue Jun 9 17:30:43 2009 for CMSSW by  doxygen 1.5.4