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
00021
00022 void reco::TauMassTagInfo::setIsolatedTauTag(const IsolatedTauTagInfoRef isolationRef){
00023 isolatedTau = isolationRef;
00024 }
00025
00026
00027
00028 const IsolatedTauTagInfoRef& reco::TauMassTagInfo::getIsolatedTauTag() const {
00029 return isolatedTau;
00030 }
00031
00032
00033
00034 void reco::TauMassTagInfo::storeClusterTrackCollection(reco::BasicClusterRef clusterRef,float dr) {
00035
00036 clusterMap.insert(clusterRef, dr);
00037 }
00038
00039
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
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);
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
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
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
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 }