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 #include "PathResolver/PathResolver.h"
00022 
00023 //-------------------------------------------------------------
00024 namespace Atlfast {
00025   using std::abs;
00026   using std::pair;
00027   
00028 
00029   // MuonSmearer methods
00030 
00031   MuonSmearer::MuonSmearer(const int aseed, const int lumi, const int keymuo,
00032                            std::string &resolutionFile, MsgStream& log): 
00033     ISmearer(), DefaultSmearer(aseed), m_lumi(lumi), m_keymuo(keymuo)
00034   {    
00035     makeResolutionCalculator(resolutionFile);
00036    
00037     // Make a (default) TrackSmearer
00038     int randSeed = 12345;
00039     m_tracksmearer = new TrackSmearer(randSeed,log);
00040   }
00041   
00042   MuonSmearer::MuonSmearer(const int aseed, const int lumi, const int keymuo,
00043                            std::string &resolutionFile): 
00044     ISmearer(), DefaultSmearer(aseed), m_lumi(lumi), m_keymuo(keymuo)
00045   {    
00046     makeResolutionCalculator(resolutionFile);
00047   }
00048 
00049   MuonSmearer::~MuonSmearer()
00050   {
00051     delete m_muonResCalculator;
00052     delete m_tracksmearer;
00053   }
00054   
00055   void MuonSmearer::makeResolutionCalculator(std::string &resolutionFile){
00056     
00057     std::string filename =
00058       PathResolver::find_file(resolutionFile, "DATAPATH");
00059     std::cout << "MuonSmearer getting file " << filename << std::endl;
00060     
00061     if (filename!="")
00062       m_muonResCalculator = new MuonResolutionCalculator(filename.c_str());
00063     else
00064       std::cout << "Could not open muon resolution file!!" << std::endl;
00065 
00066     return;
00067     
00068   }
00069   
00070   HepLorentzVector MuonSmearer::smear(const HepLorentzVector& avec) {
00071 
00072     // ID smearing requires a GenParticle so this method is called for
00073     // spectrometer standalone muons only
00074     
00075     HepLorentzVector bvec(0,0,0,0);
00076     pair<double, double> sigmapr;
00077     if(m_smearParamSchema==1){
00078       while( ((sigmapr=resolMS(avec)).first) <-1.) {}
00079       double sigma = sigmapr.first;
00080       bvec = avec/(1.0+sigma);
00081     }
00082     return bvec; // bvec is zeroes if m_smearParamSchema!=1
00083   }
00084 
00085   HepLorentzVector MuonSmearer::smear(const HepMC::GenParticle& particle){
00086     
00087     HepLorentzVector avec = particle.momentum();
00088     
00089     double sigmaMS;
00090     double sigmamuon;
00091     double sigmaID;
00092     double sigmatrack;
00093     double sigma=0.;
00094     HepLorentzVector bvec(0,0,0,0);
00095     pair<double, double> sigmapr;
00096 
00097     if(m_smearParamSchema==1){
00098       switch (m_keymuo) {
00099       case 1:
00100         while( ((sigmapr=resolMS(avec)).first) <-1.) {}
00101         sigma = sigmapr.first;
00102         break;
00103       case 2:
00104         while( ((sigmapr=resolID(particle)).first)<-1.) {}
00105         sigma = sigmapr.first;
00106         break;
00107       case 3:
00108         while( ((sigmapr=resolMS(avec)).first) <-1.) {}
00109         sigmaMS    = sigmapr.first;
00110         sigmamuon  = sigmapr.second;
00111         while( ((sigmapr=resolID(particle)).first)<-1.) {}
00112         sigmaID    = sigmapr.first;
00113         sigmatrack = sigmapr.second;
00114         
00115         sigma=resol(sigmaMS, sigmamuon, sigmaID, sigmatrack);
00116         break;
00117       default:
00118         std::cout << "Invalid value for MuonSmearKey: " << m_keymuo 
00119                   << ", returning unsmeared muon vector" << std::endl;
00120         return avec;
00121         break;      
00122       }
00123       
00124       bvec = avec/(1.0+sigma);
00125       
00126       //std::cout << "Unsmeared muon: " << avec << ", smeared muon: " << bvec << std::endl;
00127       
00128     } 
00129     
00130     return bvec; // bvec is zeroes if m_smearParamSchema!=1
00131   }
00132   
00133   pair<double, double> MuonSmearer::resolMS(const HepLorentzVector& avec) {
00134     
00135     if (!m_muonResCalculator)
00136       std::cout << "No MuonResolutionCalculator, resolution set to 0.0" << std::endl;
00137     
00138     double sigmamuon = m_muonResCalculator ?
00139       m_muonResCalculator->calculateResolution(avec) : 0.;
00140     if (!sigmamuon){
00141       std::cout << "Zero spectrometer resolution!!!" << std::endl;
00142       pair<double, double>  sigmapr(0,0);
00143       return sigmapr;
00144     }
00145     
00146     double aa=randGauss()->fire();
00147     double sigmams   = aa*sigmamuon;
00148     pair<double, double> sigmapr(sigmams, sigmamuon);
00149     
00150     return sigmapr;
00151   }
00152   
00153   pair<double, double> MuonSmearer::resolID(const HepMC::GenParticle& particle) {
00154 
00155     if (!m_tracksmearer){
00156       std::cout << "No TrackSmearer in MuonSmearer, resolution set to 0.0" << std::endl;
00157       std::cout << "To get inner detector resolutions, you must instantiate"
00158                 << " MuonSmearer with a MsgStream" << std::endl;
00159     }
00160 
00161     double sigmatrack = m_tracksmearer ? 
00162       m_tracksmearer->getPtResolution(particle) : 0.;
00163 
00164     if (!sigmatrack){
00165       std::cout << "Zero inner detector resolution!!!" << std::endl;
00166       pair<double, double>  sigmapr(0,0);
00167       return sigmapr;
00168     }
00169 
00170     double aa=randGauss()->fire();
00171     double sigmatr = aa*sigmatrack;
00172     pair<double, double> sigmapr(sigmatr, sigmatrack);
00173       
00174     return sigmapr;
00175 
00176   }
00177 
00178   double MuonSmearer::resol ( double sigmams, double sigmamuon, 
00179                               double sigmaid, double sigmatrack) {
00180     double wmuon  = 1./(sigmamuon*sigmamuon);
00181     double wtrack = 1./(sigmatrack*sigmatrack);
00182     double wtot   = wmuon+wtrack;
00183     double corr   = (wmuon*(1.0+sigmams)+wtrack*(1.0+sigmaid))/wtot;
00184     double sigma   = corr-1.0;
00185     
00186     return sigma;
00187   }
00188   
00189   //cct: implement the setSmearParameters method
00190   int MuonSmearer::setSmearParameters (const std::vector<double>& smearValues){
00191     m_smearParams=smearValues;
00192     return 0;
00193   }
00194   //cct: implement the setSmearParamSchema method
00195   int MuonSmearer::setSmearParamSchema ( const int smearSchema){
00196     m_smearParamSchema=smearSchema;
00197     return 0;
00198   }
00199 
00200   
00201   
00202 } // end of namespace bracket

Generated on Mon Sep 24 14:19:12 2007 for AtlfastAlgs by  doxygen 1.5.1