CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/DataFormats/BTauReco/src/TauMassTagInfo.cc

Go to the documentation of this file.
00001 #include "DataFormats/BTauReco/interface/TauMassTagInfo.h"
00002 #include "DataFormats/EgammaReco/interface/BasicCluster.h"
00003 #include "DataFormats/TrackReco/interface/Track.h"
00004 #include "DataFormats/TrackReco/interface/TrackFwd.h" 
00005 #include "DataFormats/Common/interface/RefVector.h"
00006 
00007 using namespace edm;
00008 using namespace reco;
00009 using namespace std;
00010 
00011 float reco::TauMassTagInfo::discriminator(double matching_cone, double leading_trk_pt,
00012                                    double signal_cone, double cluster_track_cone, 
00013                                    double m_cut) const {
00014   float discriminator = 0.0;
00015   double invariantMass = getInvariantMass(matching_cone,leading_trk_pt, signal_cone,cluster_track_cone);  
00016   if (invariantMass >= 0.0 && invariantMass < m_cut ) discriminator = 1.0;
00017   return discriminator;
00018 }
00019 //
00020 // -- Set IsolatedTauTag
00021 //
00022 void reco::TauMassTagInfo::setIsolatedTauTag(const IsolatedTauTagInfoRef isolationRef){
00023    isolatedTau = isolationRef;
00024 }
00025 //
00026 // -- Get IsolatedTauTag
00027 //
00028 const IsolatedTauTagInfoRef& reco::TauMassTagInfo::getIsolatedTauTag() const {
00029    return isolatedTau;
00030 }
00031 //
00032 // -- Set Cluster Collection
00033 //
00034 void reco::TauMassTagInfo::storeClusterTrackCollection(reco::BasicClusterRef clusterRef,float dr) {
00035   
00036   clusterMap.insert(clusterRef, dr);
00037 }
00038 //
00039 // -- Calculate 4 momentum vector from tracks only
00040 //
00041 bool reco::TauMassTagInfo::calculateTrkP4(double matching_cone, 
00042                        double leading_trk_pt, double signal_cone, 
00043                        math::XYZTLorentzVector& p4) const {
00044 
00045 
00046   const TrackRef leadTk= isolatedTau->leadingSignalTrack(matching_cone,leading_trk_pt);
00047   if (!leadTk) {
00048     std::cout <<" TauMassTagInfo::  No Leading Track !!  " << std::endl;    
00049     return false;
00050   }
00051   math::XYZVector momentum = (*leadTk).momentum();
00052   const RefVector<TrackCollection> signalTracks = 
00053                  isolatedTau->tracksInCone(momentum,signal_cone,1.0);
00054 //  if (signalTracks.size() == 0 || signalTracks.size()%2 == 0) return false;
00055   if (signalTracks.size() == 0) return false;
00056 
00057   double px_inv = 0.0;
00058   double py_inv = 0.0;
00059   double pz_inv = 0.0;
00060   double e_inv  = 0.0;
00061   for (RefVector<TrackCollection>::const_iterator itrack = signalTracks.begin(); 
00062                itrack != signalTracks.end(); itrack++) {
00063     double p = (*itrack)->p();
00064     double energy = sqrt(p*p + 0.139*0.139); // use correct value!
00065     px_inv += (*itrack)->px();
00066     py_inv += (*itrack)->py();
00067     pz_inv += (*itrack)->pz();
00068     e_inv += energy;
00069   }
00070 
00071   p4.SetPx(px_inv);
00072   p4.SetPy(py_inv);
00073   p4.SetPz(pz_inv);
00074   p4.SetE(e_inv);
00075 
00076   return true;
00077 }
00078 //
00079 // -- Get Invariant Mass
00080 //
00081 double reco::TauMassTagInfo::getInvariantMassTrk(double matching_cone, 
00082                        double leading_trk_pt, double signal_cone) const 
00083 {
00084   math::XYZTLorentzVector totalP4;
00085   if (!calculateTrkP4(matching_cone,leading_trk_pt, signal_cone, totalP4)) return -1.0;
00086   return totalP4.M();
00087 }
00088 //
00089 // -- Get Invariant Mass
00090 //
00091 double reco::TauMassTagInfo::getInvariantMass(double matching_cone, 
00092                        double leading_trk_pt, double signal_cone, 
00093                        double track_cone) const 
00094 {
00095 
00096   math::XYZTLorentzVector totalP4;
00097   if (!calculateTrkP4(matching_cone, leading_trk_pt, signal_cone, totalP4)) return -1.0;
00098 
00099   // Add Clusters away from tracks
00100   for (ClusterTrackAssociationCollection::const_iterator mapIter = clusterMap.begin(); 
00101                                                          mapIter != clusterMap.end(); mapIter++) {
00102     const reco::BasicClusterRef & iclus = mapIter->key;
00103     float dr  = mapIter->val;
00104     if (dr > track_cone) {
00105       math::XYZVector clus3Vec(iclus->x(), iclus->y(), iclus->z());
00106       double e  = iclus->energy(); 
00107       double theta = clus3Vec.theta();
00108       double phi   = clus3Vec.phi();
00109       double px    = e * sin(theta) * cos(phi);
00110       double py    = e * sin(theta) * sin(phi);
00111       double pz    = e * cos(theta);
00112       math::XYZTLorentzVector p4(px,py,pz,e);
00113       totalP4 += p4;  
00114     }           
00115   }
00116   return totalP4.M();
00117 }