00001 #include "AtlfastAlgs/BremBinData.h"
00002
00003 namespace Atlfast
00004 {
00005
00006
00007
00008
00009 BremBinData::BremBinData( BinID& id,
00010 vector< ParameterResolutions* > startPoints,
00011 vector< ParameterResolutions* > slopes,
00012 vector< ParameterResolutions* > sigmas,
00013 int randSeed
00014 ) :
00015 m_id(id),
00016 m_startPoints(startPoints),
00017 m_slopes(slopes),
00018 m_sigmas(sigmas)
00019 {
00020 m_randomEngine = new HepJamesRandom(randSeed);
00021 }
00022
00023
00024
00025
00026
00027 BremBinData::~BremBinData()
00028 {
00029 for (size_t i = 0; i < m_startPoints.size(); i++)
00030 delete m_startPoints[i];
00031 for (size_t i = 0; i < m_slopes.size(); i++)
00032 delete m_slopes[i];
00033 for (size_t i = 0; i < m_sigmas.size(); i++)
00034 delete m_sigmas[i];
00035 delete m_randomEngine;
00036 }
00037
00038
00039
00040
00041
00042
00043 TrackTrajectory BremBinData::getBremTrack( const TrackTrajectory& traj ) const
00044 {
00045
00046 double x0[3], lambda[3], sigma[3];
00047 for ( int i = 0; i < 3; i++ )
00048 {
00049 x0[i] = std::abs( m_startPoints[i]->resolution(traj) );
00050 lambda[i] = std::abs( m_slopes[i]->resolution(traj) );
00051 sigma[i] = m_sigmas[i]->resolution(traj);
00052 }
00053
00054
00055 double xMax[3] = { 90 * sigma[0], 90 * sigma[1], 1.0 / (0.5*GeV) };
00056
00057 double charge = double( traj.signOfCharge() );
00058
00059 double sign[3] = { -charge, charge, charge };
00060
00061 double random[3];
00062 random[0] = m_randomEngine->flat();
00063 random[1] = random[0];
00064 random[2] = random[0];
00065
00066 double var[3];
00067 for ( int i = 0; i < 3; i++ )
00068 {
00069 double denom = 1 - random[i] * ( 1 - std::pow( x0[i] / xMax[i], lambda[i] - 1 ) );
00070 denom = std::pow( denom, 1.0 / ( lambda[i] - 1 ) );
00071 var[i] = sign[i] * x0[i] / denom;
00072 }
00073
00074
00075
00076 TrackParameters trkParam = traj.parameters();
00077
00078 double impactParameter = var[0];
00079 double zPerigee = trkParam.zPerigee();
00080 Phi phi = var[1];
00081 double cotTheta = trkParam.cotTheta();
00082 double invPtCharge = var[2];
00083
00084 double curvature = traj.curvature();
00085 double pT = std::abs( 1. / invPtCharge );
00086 Hep3Vector vec;
00087 vec.setX( pT * std::cos(phi) );
00088 vec.setY( pT * std::sin(phi) );
00089 vec.setZ( pT * cotTheta );
00090
00091
00092 TrackTrajectory newTrajectory( TrackParameters( vec.pseudoRapidity(),
00093 phi, pT, impactParameter,
00094 zPerigee, cotTheta,
00095 invPtCharge ),
00096 traj.startPoint(),
00097 curvature );
00098 return newTrajectory;
00099 }
00100
00101 }