Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  

MuonSmearer.cxx

Go to the documentation of this file.
00001 // MuonSmearer.cxx
00002 //
00003 // Implementation of the Muon Smearer class
00004 //
00005 // Only the smear() method is overridden
00006 //
00007 //
00008 // Authors: H.T. Phillips, P.Clarke, E.Richter-Was, P.Sherwood, R.Steward
00009 //
00010 //
00011 
00012 #include "AtlfastAlgs/MuonSmearer.h"
00013 #include <cmath>
00014 
00015 #include "CLHEP/Vector/LorentzVector.h"
00016 #include "CLHEP/Units/SystemOfUnits.h"  
00017 #include "CLHEP/Random/JamesRandom.h"
00018 #include "CLHEP/Random/RandGauss.h"
00019 #include <iostream>
00020 
00021 //-------------------------------------------------------------
00022 // allow call to muon spectrometer fortran resolution function
00023 extern "C" { 
00024   void resolumu_(float*, float*, float*, float*);
00025 }
00026 //-------------------------------------------------------------
00027 namespace Atlfast {
00028   using std::abs;
00029   using std::pair;
00030 
00031   HepLorentzVector MuonSmearer::smear (const HepLorentzVector& avec) {
00032     // ATLFAST fortran routines   
00033     //        RESMUO(KEYMUO,KEYFUN,PT,ETA,PHI)
00034     //        RESOMU (this had been reduced to merely converting radians to degrees)
00035     // have been converted to C++ here, after restructuring the code.
00036     //        RESOLUMU (in Atlfast/mu_atlfast/resmuo.F) is left in fortran.
00037 
00038     float eta      = avec.pseudoRapidity();
00039     float pt       = avec.perp();
00040     float phi      = avec.phi()*deg;
00041     float sigmams;
00042     float sigmamuon;
00043     float sigmaid;
00044     float sigmatrack;
00045     float sigma=0.;
00046     pair<float, float> sigmapr;
00047     switch (m_keymuo) {
00048     case 1:
00049       while( ((sigmapr=resolms(pt, eta, phi)).first) <-1.) {}
00050       sigma=sigmapr.first;
00051       break;
00052     case 2:
00053       while( (sigma=resolid1(pt, eta))               <-1.) {}
00054       break;
00055     case 3:
00056       while( ((sigmapr=resolms(pt, eta, phi)).first) <-1.) {}
00057       sigmams    = sigmapr.first;
00058       sigmamuon  = sigmapr.second;
00059       while( ((sigmapr=resolid2(pt, eta)).first)     <-1.) {}
00060       sigmaid    = sigmapr.first;
00061       sigmatrack = sigmapr.second;
00062 
00063       sigma=resol1(sigmams, sigmamuon, sigmaid, sigmatrack);
00064       break;
00065     case 4:
00066       while( ((sigmapr=resolms(pt, eta, phi)).first) <-1.) {}
00067       sigmams    = sigmapr.first;
00068       sigmamuon  = sigmapr.second;
00069       while( ((sigmapr=resolid2(pt, eta)).first)     <-1.) {}
00070       sigmaid    = sigmapr.first;
00071       sigmatrack = sigmapr.second;
00072 
00073       sigma=resol2(sigmamuon, sigmatrack);
00074       break;
00075     case 5:
00076       sigma=resol3();
00077       break;
00078     case 6:
00079       sigma=resol4();
00080       
00081     }
00082 
00083     HepLorentzVector bvec(avec.px()/(1.0+sigma), avec.py()/(1.0+sigma), 
00084                           avec.pz()/(1.0+sigma), avec.e() /(1.0+sigma));
00085     return bvec;
00086   }
00087 
00088   pair<float, float> MuonSmearer::resolms (float pt, float eta, float phi) {
00089     float cpt=pt;
00090     float ceta=eta;
00091     float cphi=phi;
00092     float resol;
00093     resolumu_(&cpt, &ceta, &cphi, &resol);
00094     double aa=randGauss()->fire();
00095     float sigmamuon    = m_percent*resol;
00096     float sigmams      = aa*sigmamuon;
00097     pair<float, float>   sigmapr(sigmams, sigmamuon);
00098 
00099     return sigmapr;
00100   }
00101 
00102   float MuonSmearer::resolid1 (float pt, float eta) {
00103     double aa=randGauss()->fire();
00104     double bb=randGauss()->fire();
00105     float factor = 1. + pow(fabs(eta),m_magic2);
00106     float atrack = m_magic1*factor;
00107     float sigma = atrack*pt*aa + m_magic3*bb;
00108     sigma = sigma*factor;
00109       
00110     return sigma;
00111   }
00112 
00113   pair<float, float> MuonSmearer::resolid2 (float pt, float eta) {
00114     double aa=randGauss()->fire();
00115     double bb=randGauss()->fire();
00116     double factor = 1. + pow(fabs(eta),m_magic2);
00117     float atrack = m_magic1*factor;
00118     float sigmatr    = atrack*pt*aa + m_magic3*bb;
00119     float sigmatrack = sqrt( (atrack*pt)*(atrack*pt) + m_magic3*m_magic3);
00120     pair<float, float> sigmapr(sigmatr, sigmatrack);
00121       
00122     return sigmapr;
00123   }
00124 
00125   float MuonSmearer::resol1 ( float sigmams, float sigmamuon, 
00126                               float sigmaid, float sigmatrack) {
00127     double wmuon  = 1./(sigmamuon*sigmamuon);
00128     double wtrack = 1./(sigmatrack*sigmatrack);
00129     double wtot   = wmuon+wtrack;
00130     double corr   = (wmuon*(1.0+sigmams)+wtrack*(1.0+sigmaid))/wtot;
00131     float sigma   = corr-1.0;
00132       
00133     return sigma;
00134   }
00135 
00136   float MuonSmearer::resol2 (float sigmamuon, float sigmatrack) {
00137     double wmuon  = 1./(sigmamuon*sigmamuon);
00138     double wtrack = 1./(sigmatrack*sigmatrack);
00139     double wtot   = wmuon+wtrack;
00140     double aa     = randGauss()->fire();
00141     float sigma   = aa/sqrt(wtot);
00142       
00143     return sigma;
00144   }
00145 
00146   float MuonSmearer::resol3 () {
00147     float sigma  = m_magic4*randGauss()->fire();
00148       
00149     return sigma;
00150   }
00151 
00152   float MuonSmearer::resol4 () {
00153     float sigmams = m_magic4;
00154     float sigmaid = m_magic4;
00155     float wmuon   = 1.0/(sigmams*sigmams);
00156     float wtrak   = 1.0/(sigmaid*sigmaid);
00157     float wtot    = wmuon + wtrak;
00158     double aa     = randGauss()->fire();
00159     float sigma   = aa/sqrt(wtot);
00160       
00161     return sigma;
00162   }
00163 
00164 } // end of namespace bracket
00165 
00166 
00167 
00168 
00169 

Generated on Tue Mar 18 11:18:24 2003 for AtlfastAlgs by doxygen1.3-rc1