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
00022
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
00033
00034
00035
00036
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 }
00165
00166
00167
00168
00169