00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "AtlfastAlgs/JetSmearer.h"
00013 #include "AtlfastAlgs/PhotonSmearer.h"
00014 #include <cmath>
00015 #include <iostream>
00016
00017 #include "CLHEP/Vector/LorentzVector.h"
00018 #include "CLHEP/Random/JamesRandom.h"
00019 #include "CLHEP/Random/RandGauss.h"
00020
00021
00022 namespace Atlfast {
00023
00024 HepLorentzVector JetSmearer::smear (const HepLorentzVector& vec) {
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 float sigma=0.;
00036 HepLorentzVector smearedVec(vec);
00037
00038
00039
00040
00041
00042
00043 float epileup = 0;
00044 float aa, bb, cc, dd,pt;
00045 float sqrtene = sqrt(vec.e());
00046 float abseta = fabs(vec.pseudoRapidity());
00047 float rcone;
00048 pt = vec.perp();
00049 if (fabs(vec.pseudoRapidity()) <= m_BarrelForwardEta) {rcone=m_rconeb;}else{rcone=m_rconef;}
00050 if(rcone <= 0.4) epileup = 0.4;
00051 if(rcone == 0.4) epileup = 7.5;
00052 if(rcone > 0.4 && rcone <= 0.5) epileup = 12.0;
00053 if(rcone > 0.5 && rcone <= 0.7) epileup = 18.0;
00054 if(rcone > 0.7) epileup = 20.0;
00055
00056 if(m_lumi <= 1) {
00057 while(1) {
00058 aa=randGauss()->fire();
00059 bb=randGauss()->fire();
00060 if(abseta < m_BarrelForwardEta) sigma = aa*0.5/sqrtene + bb*0.03;
00061 else sigma = aa*1.0/sqrtene + bb*0.07;
00062 if(1.+sigma > .0) break;
00063 }
00064 } else if(m_lumi == 2) {
00065 while(1) {
00066 aa=randGauss()->fire();
00067 bb=randGauss()->fire();
00068 cc=randGauss()->fire();
00069 dd=randGauss()->fire();
00070 if(abseta < m_BarrelForwardEta) sigma = aa*0.5/sqrtene + bb*0.03 + cc*epileup/pt;
00071 else sigma = aa*1.0/sqrtene + bb*0.07 + cc*epileup/pt;
00072 if(1.+sigma > .0) break;
00073 }
00074
00075 }
00076 smearedVec.setPx(vec.px()*(1.0+sigma));
00077 smearedVec.setPy(vec.py()*(1.0+sigma));
00078 smearedVec.setPz(vec.pz()*(1.0+sigma));
00079 smearedVec.setE(vec.e()*(1.0+sigma));
00080
00081
00082 return smearedVec;
00083
00084 }
00085
00086 }
00087
00088
00089
00090
00091
00092
00093