001
002
003
004
005
006
007
008
009
010
011
012
013 #include "AtlfastAlgs/MuonReconstructor.h"
014 #include <cmath>
015
016 #include "CLHEP/Vector/LorentzVector.h"
017 #include "CLHEP/Units/SystemOfUnits.h"
018 #include "CLHEP/Random/JamesRandom.h"
019 #include "CLHEP/Random/RandGauss.h"
020 #include <iostream>
021
022 #include "PathResolver/PathResolver.h"
023
024
025
026
027
028
029
030
031 namespace Atlfast {
032 using std::abs;
033 using std::pair;
034
035
036
037
038
039 MuonReconstructor::MuonReconstructor(const int aseed, const int lumi, const int keymuo,
040 std::string &resolutionFile, MsgStream& log):
041 IDefaultReconstructor(), DefaultReconstructor(aseed), m_lumi(lumi), m_keymuo(keymuo)
042 {
043 makeResolutionCalculator(resolutionFile);
044
045
046 int randSeed = 12345;
047 m_tracksmearer = new TrackSmearer(randSeed,log);
048 }
049
050
051 MuonReconstructor::MuonReconstructor(const int aseed, const int lumi, const int keymuo,
052 std::string &resolutionFile):
053 IDefaultReconstructor(), DefaultReconstructor(aseed), m_lumi(lumi), m_keymuo(keymuo)
054 {
055 makeResolutionCalculator(resolutionFile);
056 }
057
058 MuonReconstructor::~MuonReconstructor()
059 {
060 delete m_muonResCalculator;
061 delete m_tracksmearer;
062 }
063
064 void MuonReconstructor::makeResolutionCalculator(std::string &resolutionFile){
065
066 std::string filename =
067 PathResolver::find_file(resolutionFile, "DATAPATH");
068 std::cout << "MuonReconstructor getting file " << filename << std::endl;
069
070 if (filename!="")
071 m_muonResCalculator = new MuonResolutionCalculator(filename.c_str());
072 else
073 std::cout << "Could not open muon resolution file!!" << std::endl;
074
075 return;
076
077 }
078
079
080 ReconstructedParticle MuonReconstructor::reconstruct( const ReconstructedParticle &particle )const{
081
082 if(!particle.truth() && m_keymuo>1){
083 std::cout << "No GenParticle in the ReconstructedParticle." << m_keymuo
084 << "ID smearing requested but no GenParticle - unsmeared particle returned." << std::endl;
085 return particle;
086 }
087
088 HepLorentzVector avec(particle.px(),particle.py(),particle.pz(),particle.e());
089
090 double sigmaMS;
091 double sigmamuon;
092 double sigmaID;
093 double sigmatrack;
094 double sigma=0.;
095 HepLorentzVector bvec(0,0,0,0);
096 pair<double, double> sigmapr;
097
098 if(m_smearParamSchema==1){
099 switch (m_keymuo) {
100 case 1:
101 while( ((sigmapr=resolMS(avec)).first) <-1.) {}
102 sigma = sigmapr.first;
103 break;
104 case 2:
105 while( ((sigmapr=resolID(*particle.truth())).first)<-1.) {}
106 sigma = sigmapr.first;
107 break;
108 case 3:
109 while( ((sigmapr=resolMS(avec)).first) <-1.) {}
110 sigmaMS = sigmapr.first;
111 sigmamuon = sigmapr.second;
112 while( ((sigmapr=resolID(*particle.truth())).first)<-1.) {}
113 sigmaID = sigmapr.first;
114 sigmatrack = sigmapr.second;
115
116 sigma=resol(sigmaMS, sigmamuon, sigmaID, sigmatrack);
117 break;
118 default:
119 std::cout << "Invalid value for MuonSmearKey: " << m_keymuo
120 << ", returning unsmearer muon particle" << std::endl;
121 return particle;
122 break;
123 }
124
125 bvec = avec/(1.0+sigma);
126
127
128
129 }
130
131 ReconstructedParticle return_particle(particle);
132 return_particle.set_momentum(bvec);
133 return return_particle;
134 }
135
136 pair<double, double> MuonReconstructor::resolMS(const HepLorentzVector& avec)const{
137
138 if (!m_muonResCalculator)
139 std::cout << "No MuonResolutionCalculator, resolution set to 0.0" << std::endl;
140
141 double sigmamuon = m_muonResCalculator ?
142 m_muonResCalculator->calculateResolution(avec) : 0.;
143 if (!sigmamuon){
144 std::cout << "Zero spectrometer resolution!!!" << std::endl;
145 pair<double, double> sigmapr(0,0);
146 return sigmapr;
147 }
148
149 double aa=m_randGauss->fire();
150 double sigmams = aa*sigmamuon;
151 pair<double, double> sigmapr(sigmams, sigmamuon);
152
153 return sigmapr;
154 }
155
156 pair<double, double> MuonReconstructor::resolID(const HepMC::GenParticle& particle)const{
157
158 if (!m_tracksmearer){
159 std::cout << "No TrackSmearer in MuonReconstructor, resolution set to 0.0" << std::endl;
160 std::cout << "To get inner detector resolutions, you must instantiate"
161 << " MuonReconstructor with a MsgStream" << std::endl;
162 }
163
164 double sigmatrack = m_tracksmearer ?
165 m_tracksmearer->getPtResolution(particle) : 0.;
166
167 if (!sigmatrack){
168 std::cout << "Zero inner detector resolution!!!" << std::endl;
169 pair<double, double> sigmapr(0,0);
170 return sigmapr;
171 }
172
173 double aa=m_randGauss->fire();
174 double sigmatr = aa*sigmatrack;
175 pair<double, double> sigmapr(sigmatr, sigmatrack);
176
177 return sigmapr;
178
179 }
180
181 double MuonReconstructor::resol ( double sigmams, double sigmamuon,
182 double sigmaid, double sigmatrack)const{
183 double wmuon = 1./(sigmamuon*sigmamuon);
184 double wtrack = 1./(sigmatrack*sigmatrack);
185 double wtot = wmuon+wtrack;
186 double corr = (wmuon*(1.0+sigmams)+wtrack*(1.0+sigmaid))/wtot;
187 double sigma = corr-1.0;
188
189 return sigma;
190 }
191
192
193 int MuonReconstructor::setSmearParameters (const std::vector<double>& smearValues){
194 m_smearParams=smearValues;
195 return 0;
196 }
197
198 int MuonReconstructor::setSmearParamSchema ( const int smearSchema){
199 m_smearParamSchema=smearSchema;
200 return 0;
201 }
202
203
204
205 }
206
| Due to the LXR bug, the updates fail sometimes to remove references to deleted files. The Saturday's full rebuilds fix these problems |
|
This page was automatically generated by the
LXR engine.
|
|