00001
00002
00003
00004
00006
00007
00008
00010
00011 #include "tmb_tree/TMBMuon.hpp"
00012 #include "TError.h"
00013 #include "TMath.h"
00014 #include "tmb_tree/TMBTrack.hpp"
00015 #include "kinem_util/AnglesUtil.hpp"
00016 #include <iostream>
00017
00018 using namespace std;
00019
00020 namespace {
00021 Double_t MuonMass = 0.1057;
00022 }
00023
00024 ClassImp(TMBMuon)
00025
00026
00027 TMBMuon::TMBMuon()
00028 : TMBLorentzVector(0,0,0,MuonMass, kPtEtaPhiM),
00029 _best(kCentralCorr)
00030 {
00031 }
00032
00033 TMBMuon::TMBMuon(Double_t pT, Double_t eta, Double_t phi, Type best,
00034 const TMBMuonType& local, const TMBMuonType& localcorr,
00035 const TMBMuonType& central, const TMBMuonType& centralcorr,
00036 const TMBMuonType& global, const TMBMuonType& smearedMC)
00037 : TMBLorentzVector(pT,eta,phi,MuonMass,kPtEtaPhiM),
00038 _local(local),
00039 _localcorr(localcorr),
00040 _central(central),
00041 _centralcorr(centralcorr),
00042 _global(global),
00043 _smearedMC(smearedMC),
00044 _best(best)
00045 {
00046 }
00047
00048 void TMBMuon::SetLocalInfo(Int_t nhit, Int_t ndeck, Int_t region, Int_t octant,
00049 Float_t chisqloc, Float_t sctimeA, Float_t sctimeB, Float_t sctimeC,
00050 Float_t xA, Float_t yA, Float_t zA, Float_t bdl)
00051 {
00052 _nhit = nhit;
00053 _ndeck = ndeck;
00054 _region = region;
00055 _octant = octant;
00056 _chisqloc = chisqloc;
00057 _sctimeA = sctimeA;
00058 _sctimeB = sctimeB;
00059 _sctimeC = sctimeC;
00060 _xA = xA;
00061 _yA = yA;
00062 _zA = zA;
00063 _bdl = bdl;
00064 }
00065
00066 void TMBMuon::SetMatchingInfo(Int_t nseg, Int_t ndof,
00067 Float_t deltaPhi, Float_t deltaEta, Float_t deltaDrift,
00068 Float_t chisq, Float_t zAtPca, Float_t impPar, Float_t impParSig,
00069 Float_t err_zAtPca, Float_t err_impPar, Float_t dca,
00070 TRef chptr, TRef vtxref)
00071 {
00072 _nseg = nseg;
00073 _ndof = ndof;
00074 _deltaPhi = deltaPhi;
00075 _deltaEta = deltaEta;
00076 _deltaDrift = deltaDrift;
00077 _chisq = chisq;
00078 _zAtPca = zAtPca;
00079 _impPar = impPar;
00080 _impParSig = impParSig;
00081 _err_zAtPca = err_zAtPca;
00082 _err_impPar = err_impPar;
00083 _dca = dca;
00084 _chptr = chptr;
00085 _vtxref = vtxref;
00086 }
00087
00088 void TMBMuon::SetDetEta(Float_t deteta)
00089 {
00090 _deteta = deteta;
00091 }
00092
00093 void TMBMuon::SetMTCInfo(Int_t nmtc, Int_t calnLayer, Float_t etrack_best,
00094 Float_t caleSig, Float_t calEta, Float_t calPhi, Float_t eloss)
00095 {
00096 _nmtc = nmtc;
00097 _calnLayer = calnLayer;
00098 _etrack_best = etrack_best;
00099 _caleSig = caleSig;
00100 _calEta = calEta;
00101 _calPhi = calPhi;
00102 _eloss = eloss;
00103 }
00104
00105 void TMBMuon::SetIsolationInfo(Int_t nTrk5, Float_t EInCone1, Float_t EInCone15, Float_t EInCone2,
00106 Float_t EInCone4, Float_t EInCone6,
00107 Float_t drJet5, Float_t etTrkCone5, Float_t etHalo)
00108 {
00109 _nTrk5 = nTrk5;
00110 _EInCone1 = EInCone1;
00111 _EInCone15 = EInCone15;
00112 _EInCone2 = EInCone2;
00113 _EInCone4 = EInCone4;
00114 _EInCone6 = EInCone6;
00115 _drJet5 = drJet5;
00116 _etTrkCone5 = etTrkCone5;
00117 _etHalo = etHalo;
00118 }
00119
00120 void TMBMuon::SetFlags(Int_t isLoose, Int_t isMedium, Int_t isTight,
00121 Int_t hasLocal, Int_t hasCentral, Int_t hasCal,
00122 Int_t isMuonEventOK, Int_t isCosmic, Int_t isCosmicT)
00123 {
00124 _isLoose = isLoose;
00125 _isMedium = isMedium;
00126 _isTight = isTight;
00127 _hasLocal = hasLocal;
00128 _hasCentral = hasCentral;
00129 _hasCal = hasCal;
00130 _isMuonEventOK = isMuonEventOK;
00131 _isCosmic = isCosmic;
00132 _isCosmicT = isCosmicT;
00133 }
00134
00135 void TMBMuon::SetExpectedHits(Int_t expWhitsA, Int_t expWhitsBC,
00136 Int_t expShitsA, Int_t expShitsBC)
00137 {
00138 _expWhitsA = expWhitsA;
00139 _expWhitsBC = expWhitsBC;
00140 _expShitsA = expShitsA;
00141 _expShitsBC = expShitsBC;
00142 }
00143
00144 void TMBMuon::SetMCsmearingRand(Float_t rand)
00145 {
00146 _rand = rand;
00147 }
00148
00149 void TMBMuon::CorrectPt(double dca)
00150 {
00151
00152 if(!_hasCentral) return;
00153 const TMBTrack* trk = GetChargedTrack();
00154 if(trk) {
00155 double err_rqpt = trk->trerrs(4, 0);
00156 double err_rr = trk->trerrs(0, 0);
00157 float qopt = trk->qpt();
00158 qopt -= dca * err_rqpt / err_rr;
00159 double pTcorr = 1 / qopt;
00160 int q = 1;
00161 if(pTcorr<0) {
00162 pTcorr *= -1;
00163 q = -1;
00164 }
00165 double scale = pTcorr / trk->Pt();
00166 double corrpx = scale * trk->Px();
00167 double corrpy = scale * trk->Py();
00168 double corrpz = scale * trk->Pz();
00169 double corrE = scale * trk->E();
00170
00171
00172 SetPxPyPzE(corrpx,corrpy,corrpz,corrE);
00173
00174 TMBMuonType new_centralcorr(pTcorr,Eta(),Phi(),err_pT(),err_eta(),err_phi(),q);
00175 _centralcorr = new_centralcorr;
00176
00177 _best = TMBMuon::kCentralCorr;
00178 }
00179
00180 }
00181
00182 Int_t TMBMuon::charge() const
00183 {
00184 switch(_best) {
00185 case kLocalCorr: return _localcorr.charge();
00186 case kCentralCorr: return _centralcorr.charge();
00187 case kSmearedMC: return _smearedMC.charge();
00188 default: Error("TMBMuon::charge","bad best muon type");
00189 }
00190 return 0;
00191 }
00192
00193 Double_t TMBMuon::tlm() const
00194 {
00195 switch(_best) {
00196 case kLocalCorr: return _localcorr.tlm();
00197 case kCentralCorr: return _centralcorr.tlm();
00198 case kSmearedMC: return _smearedMC.tlm();
00199 default: Error("TMBMuon::tlm","bad best muon type");
00200 }
00201 return 0;
00202 }
00203
00204 Double_t TMBMuon::err_phi() const
00205 {
00206 switch(_best) {
00207 case kLocalCorr: return _localcorr.err_phi();
00208 case kCentralCorr: return _centralcorr.err_phi();
00209 case kSmearedMC: return _smearedMC.err_phi();
00210 default: Error("TMBMuon::err_phi","bad best muon type");
00211 }
00212 return 0;
00213 }
00214
00215 Double_t TMBMuon::err_eta() const
00216 {
00217 switch(_best) {
00218 case kLocalCorr: return _localcorr.err_eta();
00219 case kCentralCorr: return _centralcorr.err_eta();
00220 case kSmearedMC: return _smearedMC.err_eta();
00221 default: Error("TMBMuon::err_eta","bad best muon type");
00222 }
00223 return 0;
00224 }
00225
00226 Double_t TMBMuon::err_pT() const
00227 {
00228 switch(_best) {
00229 case kLocalCorr: return _localcorr.err_pT();
00230 case kCentralCorr: return _centralcorr.err_pT();
00231 case kSmearedMC: return _smearedMC.err_pT();
00232 default: Error("TMBMuon::err_pT","bad best muon type");
00233 }
00234 return 0;
00235 }
00236
00237 Int_t TMBMuon::wireHitsA() const
00238 {
00239 return (_nhit % 10);
00240 }
00241
00242 Int_t TMBMuon::wireHitsB() const
00243 {
00244 return (_nhit / 10)%10;
00245 }
00246
00247 Int_t TMBMuon::wireHitsC() const
00248 {
00249 return (_nhit / 100)%10;
00250 }
00251
00252 Int_t TMBMuon::wireHitsBC() const
00253 {
00254 return (wireHitsB() + wireHitsC());
00255 }
00256
00257 int TMBMuon::scintHitsA() const {
00258 return (_nhit / 1000)%10;
00259 }
00260
00261 int TMBMuon::scintHitsBC() const {
00262 return scintHitsB() + scintHitsC();
00263 }
00264
00265 int TMBMuon::scintHitsB() const {
00266 return (_nhit/10000)%10;
00267 }
00268
00269 int TMBMuon::scintHitsC() const {
00270 return (_nhit/100000)%10;
00271 }
00272
00273 Double_t TMBMuon::GetEtaDetector(Double_t eta, Double_t z, Double_t rdet) const
00274 {
00275 float z0 = z + rdet*sinh(eta);
00276 float temp = z0/rdet + sqrt(z0*z0/rdet/rdet + 1.);
00277 return (temp>0?log(temp):eta);
00278 }
00279
00280 bool TMBMuon::isInHole(Int_t solpol) const
00281 {
00282 double deta = GetEtaDetector(solpol);
00283 return ( fabs(deta)<1.25 && this->Phi()>4.25 && this->Phi()<5.15);
00284 }
00285
00286 Double_t TMBMuon::GetEtaDetector(Int_t solpol) const
00287 {
00288 double theta = this->Theta();
00289 double phi = this->Phi();
00290 double qpt = (this->Pt()==0)?0:this->charge()/this->Pt();
00291 phi+= solpol *qpt *0.36;
00292 double z0 = _zAtPca;
00293 double deta = -99.;
00294 TMBTrack* track = this->GetChargedTrack();
00295 if(track){
00296 theta = track->Theta();
00297 phi = track->Phi();
00298 z0 = track->z();
00299 deta = det_eta(theta, phi, z0);
00300 } else {
00301 deta = kinem::eta(_xA,_yA,_zA);
00302 }
00303
00304 return deta;
00305 }
00306
00307 Double_t TMBMuon::det_eta(double theta, double phi, double z0) const
00308 {
00309 float x_A = 292.;
00310 float y_A = 294.;
00311 float z_A = 442.;
00312 float pi = kinem::PI;
00313
00314 if(phi<0) phi += 2*pi;
00315 if(phi>2*pi) phi -= 2*pi;
00316
00317 double x = 0;
00318 double y = 0;
00319 double z = 0;
00320 int forward = 0;
00321
00322 if(theta < pi/2) z = z_A;
00323 else z = -z_A;
00324
00325
00326 double r = fabs( (z - z0)*tan(theta) );
00327 x = r*cos(phi);
00328 y = r*sin(phi);
00329 if (fabs(x)<x_A && fabs(y)<y_A) forward = 1;
00330
00331
00332 if(!forward){
00333 if(phi > 7*pi/4 || phi < pi/4){
00334 x = x_A;
00335 y = x* tan(phi);
00336 }
00337 else if(phi > pi/4 && phi < 3*pi/4){
00338 y = y_A;
00339 x = y/tan(phi);
00340 }
00341 else if(phi > 3*pi/4 && phi < 5*pi/4){
00342 x = -x_A;
00343 y = x* tan(phi);
00344 }
00345 else if(phi > 5*pi/4 && phi < 7*pi/4){
00346 y = -y_A;
00347 x = y/tan(phi);
00348 }
00349
00350 r = sqrt(x*x + y*y);
00351 z = z0 + r/tan(theta);
00352 }
00353
00354 float eta = -log( tan( atan2(r,z)/2));
00355 return eta;
00356 }
00357
00358 Double_t TMBMuon::chisqProb() const
00359 {
00360 return TMath::Prob(_chisq,_ndof);
00361 }
00362
00363
00364
00365 void TMBMuon::ActAsSmeared(Float_t * par, bool zjpsiparams) {
00366 float rndnum=MCsmearingRand();
00367 if ( rndnum>98 ) return;
00368
00369
00370
00371
00372 if ( !hasCentral() || GetChargedTrack() == NULL ) return;
00373 int numSMTHits = GetChargedTrack()->nsmt();
00374 int numCFTHits = GetChargedTrack()->ncft();
00375 int ncft_cut=0;
00376 float eta_cut=100;
00377 float eta_cft_cut=100;
00378 int ipar_off=0;
00379
00380 TMBMuonType Muon;
00381 float q_over_pt;
00382 if (numSMTHits == 0 ) {
00383 Muon=CentralCorr();
00384 ipar_off+=2;
00385 ncft_cut=int(par[I_nosmt_ncft_cut_TMBMuon]+0.5);
00386 eta_cut =par[I_nosmt_eta_cut_TMBMuon];
00387 eta_cft_cut =par[I_nosmt_eta_cft_cut_TMBMuon];
00388 } else {
00389 Muon=Central();
00390 ncft_cut=int(par[I_smt_ncft_cut_TMBMuon]+0.5);
00391 eta_cut =par[I_smt_eta_cut_TMBMuon];
00392 eta_cft_cut =par[I_smt_eta_cft_cut_TMBMuon];
00393 }
00394 float det_etaCFT=0;
00395 if ( GetChargedTrack() != NULL ) det_etaCFT=GetChargedTrack()->det_etaCFT();
00396 if ( Muon.Pt()< 1e-4) return;
00397
00398 if (!zjpsiparams) {
00399 if ( fabs(det_etaCFT) > eta_cft_cut || fabs(Muon.Eta() ) > eta_cut || numCFTHits < ncft_cut )
00400 ipar_off+=1;
00401 float par_A=par[ipar_off+I_par_A_TMBMuon];
00402 float par_B=par[ipar_off+I_par_B_TMBMuon];
00403 float par_Bpt=par[ipar_off+I_par_Bpt_TMBMuon];
00404 float scale=par[ipar_off+I_scale_TMBMuon];
00405 float width=par_A+par_B/Muon.Pt()+par_Bpt*Muon.Pt();
00406 q_over_pt = scale*Muon.charge()/Muon.Pt()+width*rndnum;
00407 } else {
00408 if ( fabs(det_etaCFT) > eta_cft_cut) ipar_off+=1;
00409 float par_A=par[ipar_off+I_par_A_TMBMuon];
00410 float par_B=par[ipar_off+I_par_B_TMBMuon];
00411 float coshpt = cosh(Muon.Eta())/Muon.Pt()/Muon.Pt();
00412 float width = sqrt(par_A*par_A + par_B*par_B*coshpt);
00413 q_over_pt = Muon.charge()/Muon.Pt()+width*rndnum;
00414
00415 }
00416
00417 float pT=Muon.Pt();
00418 if (q_over_pt != 0 ) pT=fabs(1/q_over_pt);
00419 int charge_sm=1;
00420 if (q_over_pt<0) charge_sm=-1;
00421 TMBMuonType smear_muon(pT, Muon.Eta(),Muon.Phi(),
00422 Muon.err_pT(), Muon.err_eta(), Muon.err_phi(),
00423 charge_sm);
00424 _smearedMC = smear_muon;
00425 _best= kSmearedMC;
00426 this->SetPtEtaPhiM(pT,this->Eta(),this->Phi(),this->M());
00427 return;
00428
00429 }
00430
00431
00432 void TMBMuon::ActAsSmeared_pre()
00433 {
00434 float par[npar_TMBMuon];
00435
00436 par[I_par_A_TMBMuon+0]=0.0011;
00437 par[I_par_A_TMBMuon+1]=0.0000;
00438 par[I_par_A_TMBMuon+2]=0.0009;
00439 par[I_par_A_TMBMuon+3]=0.0009;
00440 par[I_par_B_TMBMuon+0]=0.013;
00441 par[I_par_B_TMBMuon+1]=0.000;
00442 par[I_par_B_TMBMuon+2]=0.018;
00443 par[I_par_B_TMBMuon+3]=0.018;
00444 par[I_par_Bpt_TMBMuon+0]=0.0;
00445 par[I_par_Bpt_TMBMuon+1]=0.0;
00446 par[I_par_Bpt_TMBMuon+2]=0.0;
00447 par[I_par_Bpt_TMBMuon+3]=0.0;
00448 par[I_scale_TMBMuon+0]=1;
00449 par[I_scale_TMBMuon+1]=1;
00450 par[I_scale_TMBMuon+2]=1;
00451 par[I_scale_TMBMuon+3]=1;
00452 par[I_smt_ncft_cut_TMBMuon]=0;
00453 par[I_nosmt_ncft_cut_TMBMuon]=0;
00454 par[I_smt_eta_cut_TMBMuon]=1.5;
00455 par[I_nosmt_eta_cut_TMBMuon]=1.5;
00456 par[I_smt_eta_cft_cut_TMBMuon]=0.;
00457 par[I_nosmt_eta_cft_cut_TMBMuon]=0.;
00458 ActAsSmeared(par,"dummy");
00459 return;
00460 }
00461
00462 void TMBMuon::ActAsSmeared_post()
00463 {
00464 float par[npar_TMBMuon];
00465
00466 par[I_par_A_TMBMuon+0]=0.0015;
00467 par[I_par_A_TMBMuon+1]=0.0016;
00468 par[I_par_A_TMBMuon+2]=0.0017;
00469 par[I_par_A_TMBMuon+3]=0.0017;
00470 par[I_par_B_TMBMuon+0]=0.018;
00471 par[I_par_B_TMBMuon+1]=0.019;
00472 par[I_par_B_TMBMuon+2]=0.034;
00473 par[I_par_B_TMBMuon+3]=0.034;
00474 par[I_par_Bpt_TMBMuon+0]=0.0;
00475 par[I_par_Bpt_TMBMuon+1]=0.0;
00476 par[I_par_Bpt_TMBMuon+2]=0.0;
00477 par[I_par_Bpt_TMBMuon+3]=0.0;
00478 par[I_scale_TMBMuon+0]=1;
00479 par[I_scale_TMBMuon+1]=1;
00480 par[I_scale_TMBMuon+2]=1;
00481 par[I_scale_TMBMuon+3]=1;
00482 par[I_smt_ncft_cut_TMBMuon]=0;
00483 par[I_nosmt_ncft_cut_TMBMuon]=0;
00484 par[I_smt_eta_cut_TMBMuon]=1.5;
00485 par[I_nosmt_eta_cut_TMBMuon]=1.5;
00486 par[I_smt_eta_cft_cut_TMBMuon]=0.;
00487 par[I_nosmt_eta_cft_cut_TMBMuon]=0.;
00488 ActAsSmeared(par,"dummy");
00489 return;
00490 }
00491
00492
00493
00494
00495 void TMBMuon:: FixMuonPt(){
00496 TMBMuonType* best;
00497 switch(_best) {
00498 case kLocalCorr: best= &_localcorr; break;
00499 case kCentralCorr: best=&_centralcorr; break;
00500 case kSmearedMC : best=&_smearedMC; break;
00501 default: Error("TMBMuon::FixMuonPt","bad best muon type");
00502 }
00503
00504
00505 SetPxPyPzE(best->X(),best->Y(),best->Z(),best->E());
00506
00507 }
00508
00509
00510
00511