00001 #include "AtlfastAlgs/TrackSmearer.h"
00002 #include <cmath>
00003 #include <iostream>
00004
00005 #include "AtlfastAlgs/PionMatrixManager.h"
00006 #include "AtlfastAlgs/ElectronMatrixManager.h"
00007 #include "AtlfastAlgs/MuonMatrixManager.h"
00008
00009 namespace Atlfast {
00010 using std::abs;
00011
00012
00013
00014
00015
00016 TrackSmearer::TrackSmearer(const string& config,
00017 int randSeed,
00018 MsgStream& log):
00019 m_log(log), m_muConfig(config){
00020 m_electronMatrixManager = new ElectronMatrixManager(randSeed, log);
00021 m_muonMatrixManager = new MuonMatrixManager(m_muConfig, randSeed, log);
00022 m_pionMatrixManager = new PionMatrixManager(randSeed, log);
00023 log << MSG::INFO << "TrackSmearer constructed"<<endreq;
00024 }
00025
00026
00027
00028
00029
00030
00031 TrackSmearer::~TrackSmearer(){
00032 if (m_pionMatrixManager) delete m_pionMatrixManager;
00033 if (m_electronMatrixManager) delete m_electronMatrixManager;
00034 if (m_muonMatrixManager) delete m_muonMatrixManager;
00035 }
00036
00037
00038
00039
00040 Track TrackSmearer::smear(const Track& track)const{
00041 vector<double> smearVariables ;
00042
00043 IMatrixManager* correctManager = NULL;
00044 int pdg = abs( track.pdg_id() );
00045
00046 if (pdg == 11) {correctManager = m_electronMatrixManager;}
00047 if (pdg == 13) {correctManager = m_muonMatrixManager;}
00048 if (pdg == 211) {correctManager = m_pionMatrixManager;}
00049 if(correctManager == NULL) {
00050 correctManager = m_pionMatrixManager;
00051 }
00052
00053 TrackTrajectory originalTrajectory = track.trajectory();
00054 HepMatrix sigma;
00055 TrackParameters parameters = originalTrajectory.parameters();
00056 smearVariables = correctManager->getVariables(originalTrajectory, sigma);
00057
00058
00059 double impactParameter = parameters.impactParameter() + smearVariables[0] ;
00060 double zPerigee = parameters.zPerigee() + smearVariables[1] ;
00061 Phi phi = parameters.phi() + smearVariables[2] ;
00062 double cotTheta = parameters.cotTheta() + smearVariables[3] ;
00063 double invPtCharge = parameters.invPtCharge() + smearVariables[4];
00064
00065 double curvature = originalTrajectory.curvature();
00066 double pT = abs( 1. / invPtCharge ) ;
00067 Hep3Vector vec;
00068 vec.setX( pT*cos(phi) );
00069 vec.setY( pT*sin(phi) );
00070 vec.setZ( pT*cotTheta );
00071
00072 TrackTrajectory smearedTrajectory( TrackParameters(vec.pseudoRapidity(),
00073 phi, pT, impactParameter,
00074 zPerigee, cotTheta,
00075 invPtCharge),
00076 originalTrajectory.startPoint(),
00077 curvature
00078 ) ;
00079
00080
00081
00082
00083
00084
00085 Track newTrack(originalTrajectory, smearedTrajectory, track.truth(), sigma);
00086
00087
00088
00089
00090 return newTrack ;
00091
00092 }
00093 }