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