00001
00002
00003
00004
00005
00006
00007
00008
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
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
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
00073
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;
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
00127
00128 }
00129
00130 return bvec;
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
00190 int MuonSmearer::setSmearParameters (const std::vector<double>& smearValues){
00191 m_smearParams=smearValues;
00192 return 0;
00193 }
00194
00195 int MuonSmearer::setSmearParamSchema ( const int smearSchema){
00196 m_smearParamSchema=smearSchema;
00197 return 0;
00198 }
00199
00200
00201
00202 }