00001
00003
00004
00005
00007
00008 #include "tmb_tree/TMBMuon.hpp"
00009 #include "TError.h"
00010 #include "TMath.h"
00011 #include "tmb_tree/TMBTrack.hpp"
00012
00013 namespace {
00014 Double_t MuonMass = 0.1057;
00015 }
00016
00017 ClassImp(TMBMuon)
00018
00019
00020 TMBMuon::TMBMuon()
00021 : TMBLorentzVector(0,0,0,MuonMass, kPtEtaPhiM),
00022 _best(kCentralCorr)
00023 {
00024 }
00025
00026 TMBMuon::TMBMuon(Double_t pT, Double_t eta, Double_t phi, Type best,
00027 const TMBMuonType& local, const TMBMuonType& localcorr,
00028 const TMBMuonType& central, const TMBMuonType& centralcorr,
00029 const TMBMuonType& global, const TMBMuonType& smearedMC)
00030 : TMBLorentzVector(pT,eta,phi,MuonMass,kPtEtaPhiM),
00031 _local(local),
00032 _localcorr(localcorr),
00033 _central(central),
00034 _centralcorr(centralcorr),
00035 _global(global),
00036 _smearedMC(smearedMC),
00037 _best(best)
00038 {
00039 }
00040
00041 void TMBMuon::SetLocalInfo(Int_t nhit, Int_t ndeck, Int_t region, Int_t octant,
00042 Float_t chisqloc, Float_t sctimeA, Float_t sctimeB, Float_t sctimeC,
00043 Float_t xA, Float_t yA, Float_t zA, Float_t bdl)
00044 {
00045 _nhit = nhit;
00046 _ndeck = ndeck;
00047 _region = region;
00048 _octant = octant;
00049 _chisqloc = chisqloc;
00050 _sctimeA = sctimeA;
00051 _sctimeB = sctimeB;
00052 _sctimeC = sctimeC;
00053 _xA = xA;
00054 _yA = yA;
00055 _zA = zA;
00056 _bdl = bdl;
00057 }
00058
00059 void TMBMuon::SetMatchingInfo(Int_t nseg, Int_t ndof,
00060 Float_t deltaPhi, Float_t deltaEta, Float_t deltaDrift,
00061 Float_t chisq, Float_t zAtPca, Float_t impPar, Float_t impParSig,
00062 Float_t err_zAtPca, Float_t err_impPar, Float_t dca, Float_t deteta,
00063 TRef chptr, TRef vtxref)
00064 {
00065 _nseg = nseg;
00066 _ndof = ndof;
00067 _deltaPhi = deltaPhi;
00068 _deltaEta = deltaEta;
00069 _deltaDrift = deltaDrift;
00070 _chisq = chisq;
00071 _zAtPca = zAtPca;
00072 _impPar = impPar;
00073 _impParSig = impParSig;
00074 _err_zAtPca = err_zAtPca;
00075 _err_impPar = err_impPar;
00076 _dca = dca;
00077 _deteta = deteta;
00078 _chptr = chptr;
00079 _vtxref = vtxref;
00080 }
00081
00082 void TMBMuon::SetMTCInfo(Int_t nmtc, Int_t calnLayer, Float_t etrack_best,
00083 Float_t caleSig, Float_t calEta, Float_t calPhi, Float_t eloss)
00084 {
00085 _nmtc = nmtc;
00086 _calnLayer = calnLayer;
00087 _etrack_best = etrack_best;
00088 _caleSig = caleSig;
00089 _calEta = calEta;
00090 _calPhi = calPhi;
00091 _eloss = eloss;
00092 }
00093
00094 void TMBMuon::SetIsolationInfo(Int_t nTrk5, Float_t EInCone1, Float_t EInCone15, Float_t EInCone2,
00095 Float_t EInCone4, Float_t EInCone6,
00096 Float_t drJet5, Float_t etTrkCone5, Float_t etHalo)
00097 {
00098 _nTrk5 = nTrk5;
00099 _EInCone1 = EInCone1;
00100 _EInCone15 = EInCone15;
00101 _EInCone2 = EInCone2;
00102 _EInCone4 = EInCone4;
00103 _EInCone6 = EInCone6;
00104 _drJet5 = drJet5;
00105 _etTrkCone5 = etTrkCone5;
00106 _etHalo = etHalo;
00107 }
00108
00109 void TMBMuon::SetFlags(Int_t isLoose, Int_t isMedium, Int_t isTight,
00110 Int_t hasLocal, Int_t hasCentral, Int_t hasCal,
00111 Int_t isMuonEventOK, Int_t isCosmic, Int_t isCosmicT)
00112 {
00113 _isLoose = isLoose;
00114 _isMedium = isMedium;
00115 _isTight = isTight;
00116 _hasLocal = hasLocal;
00117 _hasCentral = hasCentral;
00118 _hasCal = hasCal;
00119 _isMuonEventOK = isMuonEventOK;
00120 _isCosmic = isCosmic;
00121 _isCosmicT = isCosmicT;
00122 }
00123
00124 void TMBMuon::SetExpectedHits(Int_t expWhitsA, Int_t expWhitsBC,
00125 Int_t expShitsA, Int_t expShitsBC)
00126 {
00127 _expWhitsA = expWhitsA;
00128 _expWhitsBC = expWhitsBC;
00129 _expShitsA = expShitsA;
00130 _expShitsBC = expShitsBC;
00131 }
00132
00133 void TMBMuon::SetMCsmearingRand(Float_t rand)
00134 {
00135 _rand = rand;
00136 }
00137
00138 void TMBMuon::CorrectPt(double dca)
00139 {
00140
00141 if(!_hasCentral) return;
00142 const TMBTrack* trk = GetChargedTrack();
00143 if(trk) {
00144 double err_rqpt = trk->trerrs(4, 0);
00145 double err_rr = trk->trerrs(0, 0);
00146 float qopt = trk->qpt();
00147 qopt -= dca * err_rqpt / err_rr;
00148 double pTcorr = 1 / qopt;
00149 int q = 1;
00150 if(pTcorr<0) {
00151 pTcorr *= -1;
00152 q = -1;
00153 }
00154 double scale = pTcorr / trk->Pt();
00155 double corrpx = scale * trk->Px();
00156 double corrpy = scale * trk->Py();
00157 double corrpz = scale * trk->Pz();
00158 double corrE = scale * trk->E();
00159
00160
00161 SetPxPyPzE(corrpx,corrpy,corrpz,corrE);
00162
00163 TMBMuonType new_centralcorr(pTcorr,Eta(),Phi(),err_pT(),err_eta(),err_phi(),q);
00164 _centralcorr = new_centralcorr;
00165
00166 _best = TMBMuon::kCentralCorr;
00167 }
00168
00169 }
00170
00171 Int_t TMBMuon::charge() const
00172 {
00173 switch(_best) {
00174 case kLocalCorr: return _localcorr.charge();
00175 case kCentralCorr: return _centralcorr.charge();
00176 case kSmearedMC: return _smearedMC.charge();
00177 default: Error("TMBMuon::charge","bad best muon type");
00178 }
00179 return 0;
00180 }
00181
00182 Double_t TMBMuon::tlm() const
00183 {
00184 switch(_best) {
00185 case kLocalCorr: return _localcorr.tlm();
00186 case kCentralCorr: return _centralcorr.tlm();
00187 case kSmearedMC: return _smearedMC.tlm();
00188 default: Error("TMBMuon::tlm","bad best muon type");
00189 }
00190 return 0;
00191 }
00192
00193 Double_t TMBMuon::err_phi() const
00194 {
00195 switch(_best) {
00196 case kLocalCorr: return _localcorr.err_phi();
00197 case kCentralCorr: return _centralcorr.err_phi();
00198 case kSmearedMC: return _smearedMC.err_phi();
00199 default: Error("TMBMuon::err_phi","bad best muon type");
00200 }
00201 return 0;
00202 }
00203
00204 Double_t TMBMuon::err_eta() const
00205 {
00206 switch(_best) {
00207 case kLocalCorr: return _localcorr.err_eta();
00208 case kCentralCorr: return _centralcorr.err_eta();
00209 case kSmearedMC: return _smearedMC.err_eta();
00210 default: Error("TMBMuon::err_eta","bad best muon type");
00211 }
00212 return 0;
00213 }
00214
00215 Double_t TMBMuon::err_pT() const
00216 {
00217 switch(_best) {
00218 case kLocalCorr: return _localcorr.err_pT();
00219 case kCentralCorr: return _centralcorr.err_pT();
00220 case kSmearedMC: return _smearedMC.err_pT();
00221 default: Error("TMBMuon::err_pT","bad best muon type");
00222 }
00223 return 0;
00224 }
00225
00226 Int_t TMBMuon::wireHitsA() const
00227 {
00228 return (_nhit % 10);
00229 }
00230
00231 Int_t TMBMuon::wireHitsB() const
00232 {
00233 return (_nhit / 10)%10;
00234 }
00235
00236 Int_t TMBMuon::wireHitsC() const
00237 {
00238 return (_nhit / 100)%10;
00239 }
00240
00241 Int_t TMBMuon::wireHitsBC() const
00242 {
00243 return (wireHitsB() + wireHitsC());
00244 }
00245
00246 int TMBMuon::scintHitsA() const {
00247 return (_nhit / 1000)%10;
00248 }
00249
00250 int TMBMuon::scintHitsBC() const {
00251 return scintHitsB() + scintHitsC();
00252 }
00253
00254 int TMBMuon::scintHitsB() const {
00255 return (_nhit/10000)%10;
00256 }
00257
00258 int TMBMuon::scintHitsC() const {
00259 return (_nhit/100000)%10;
00260 }
00261
00262 Double_t TMBMuon::GetEtaDetector(Double_t eta, Double_t z, Double_t rdet) const
00263 {
00264 float z0 = z + rdet*sinh(eta);
00265 float temp = z0/rdet + sqrt(z0*z0/rdet/rdet + 1.);
00266 return (temp>0?log(temp):eta);
00267 }
00268
00269 Double_t TMBMuon::chisqProb() const
00270 {
00271 return TMath::Prob(_chisq,_ndof);
00272 }
00273
00274