Report problems to ATLAS LXR Team (with time and IP address indicated)

The LXR Cross Referencer

source navigation ]
diff markup ]
identifier search ]
general search ]
 
 
Architecture: linux ]
Version: head ] [ nightly ] [ GaudiDev ]
  Links to LXR source navigation pages for stable releases [ 12.*.* ]   [ 13.*.* ]   [ 14.*.* ]   [ 15.*.* ] 

001 // MuonReconstructor.cxx
002 //
003 // Implementation of the Muon Smearer class
004 //
005 // Only the reconstruct() method is overridden
006 //
007 //
008 // Authors: H.T. Phillips, P.Clarke, E.Richter-Was, P.Sherwood, R.Steward
009 //
010 // Smearer - Reconstructor Conversion: Alexander Richards (UCL)
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   /** @brief Provides parameterised muon smearing.
026    *
027    * MuonReconstructor honours the IReconstructor interface and
028    * inherets implementation from DefaultReconstructor.
029    */
030 
031 namespace Atlfast {
032   using std::abs;
033   using std::pair;
034   
035 
036   // MuonReconstructor methods
037   
038   /** Constructor called from Athena code - instantiates TrackSmearer */
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     // Make a (default) TrackSmearer
046     int randSeed = 12345;
047     m_tracksmearer = new TrackSmearer(randSeed,log);
048   }
049   
050   /** Constructor that can be called from outside Athena - no TrackSmearer */
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   /** reconstruct method for ReconstructedParticle */ 
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       //std::cout << "Unsmeared muon: " << avec << ", smeared muon: " << bvec << std::endl;
128       
129     } ////end of if (m_smearParamSchema==1)
130     
131     ReconstructedParticle return_particle(particle);
132     return_particle.set_momentum(bvec);
133     return return_particle; // bvec is zeroes if m_smearParamSchema!=1
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   //cct: implement the setSmearParameters method
193   int MuonReconstructor::setSmearParameters (const std::vector<double>& smearValues){
194     m_smearParams=smearValues;
195     return 0;
196   }
197   //cct: implement the setSmearParamSchema method
198   int MuonReconstructor::setSmearParamSchema ( const int smearSchema){
199     m_smearParamSchema=smearSchema;
200     return 0;
201   }
202 
203   
204   
205 } // end of namespace bracket
206 

source navigation ] diff markup ] identifier search ] general search ]

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. Valid HTML 4.01!