TMBMuon.cpp

Go to the documentation of this file.
00001 
00002 
00003 
00004 
00006 //                                                                      //
00007 //      TMBTree Muon class                                              //
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   //If muo does not have track do not try to correct
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     //change TMBMuon 4-vector
00172     SetPxPyPzE(corrpx,corrpy,corrpz,corrE);
00173     //change _centralcorr 4-vector & charge
00174     TMBMuonType new_centralcorr(pTcorr,Eta(),Phi(),err_pT(),err_eta(),err_phi(),q);
00175     _centralcorr = new_centralcorr;
00176     //Set best muon info to CentralCorr
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; // correction for bending in soleneoid
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    //see if we hit the forward or backward system:
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    //otherwise calculate x, y and z for central:
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 // Interface to apply Muon Smearing added 8 Feb 2006
00365 void TMBMuon::ActAsSmeared(Float_t * par, bool zjpsiparams) {
00366   float rndnum=MCsmearingRand();
00367  if ( rndnum>98 ) return; // random number not set
00368 //   if ( rndnum>98 ){
00369 //       rndnum=RandGauss::shoot();   // random number used for smearing
00370 //       SetMCsmearingRand(rndnum);
00371 //   }
00372   if ( !hasCentral() || GetChargedTrack() == NULL  ) return;
00373   int numSMTHits = GetChargedTrack()->nsmt();      // number of hits in the SMT
00374   int numCFTHits = GetChargedTrack()->ncft();       // number of hits in the CFT
00375   int ncft_cut=0;
00376   float eta_cut=100;
00377   float eta_cft_cut=100;
00378   int ipar_off=0;       // parameter offset +1 for large eta or few cft hit
00379                         //                  +2 for no smt hits
00380   TMBMuonType Muon;
00381   float q_over_pt;
00382   if (numSMTHits == 0 ) {                      // smear vertex corrected pt if no SMT hits
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     // cout << " numSMTHits=" << numSMTHits << ", det_etaCFT=" << det_etaCFT << ", par_A=" << par_A << ", par_B=" << par_B << endl;
00415   } // else name.find("zjpsi")
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 // smaring parameter for pre shutown data 
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 // smaring parameter for pre shutown data 
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 

Generated on Thu Apr 3 04:14:24 2008 for CAF by doxygen 1.3.4