00001 #include "AtlfastAlgs/ElectronBinData.h"
00002
00003 namespace Atlfast
00004 {
00005
00006
00007
00008
00009 ElectronBinData::ElectronBinData( BinID& id,
00010 vector< ParameterResolutions* > core,
00011 vector< ParameterResolutions* > tails,
00012 vector< ParameterResolutions* > fractions,
00013 vector< ParameterResolutions* > correlations,
00014 int randSeed
00015 ) :
00016 m_id(id),
00017 m_cores(core),
00018 m_tails(tails),
00019 m_fractions(fractions),
00020 m_correlations(correlations)
00021 {
00022 m_randomEngine = new HepJamesRandom(randSeed);
00023 }
00024
00025 ElectronBinData::~ElectronBinData()
00026 {
00027 for (size_t i = 0; i < m_cores.size(); i++)
00028 delete m_cores[i];
00029 for (size_t i = 0; i < m_tails.size(); i++)
00030 delete m_tails[i];
00031 for (size_t i = 0; i < m_fractions.size(); i++)
00032 delete m_fractions[i];
00033 for (size_t i = 0; i < m_correlations.size(); i++)
00034 delete m_correlations[i];
00035 delete m_randomEngine;
00036 }
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 HepSymMatrix ElectronBinData::getMatrix( const TrackTrajectory& traj ) const
00059 {
00060 HepSymMatrix Sigma(5,0);
00061
00062 double fraction, random[5];
00063
00064
00065 random[0] = m_randomEngine->flat();
00066 random[1] = m_randomEngine->flat();
00067 random[2] = m_randomEngine->flat();
00068 random[3] = m_randomEngine->flat();
00069 random[4] = m_randomEngine->flat();
00070
00071
00072 for ( int param = 0; param < 5; param++ )
00073 {
00074 fraction = m_fractions[param]->resolution(traj);
00075 if ( fraction > 1.0 ) fraction = 1.0;
00076 Sigma[param][param] = ( random[param] < fraction ) ?
00077 std::pow( m_cores[param]->resolution(traj), 2 ) :
00078 std::pow( m_tails[param]->resolution(traj), 2 );
00079 }
00080
00081
00082
00083
00084
00085
00086
00087 double rho13 = m_correlations[0]->resolution(traj);
00088 double rho15 = m_correlations[1]->resolution(traj);
00089 double rho35 = m_correlations[2]->resolution(traj);
00090
00091
00092
00093 double det3 = 1 - rho13 * rho13 - rho15 * rho15 - rho35 * rho35 - 2 * rho13 * rho15 * rho35;
00094 if ( det3 < 0 ) rho13 = rho15 = rho35 = 0;
00095
00096
00097 if ( std::abs(rho13) > 1 ) rho13 *= 0.99 / std::abs(rho13);
00098 if ( std::abs(rho15) > 1 ) rho15 *= 0.99 / std::abs(rho15);
00099 if ( std::abs(rho35) > 1 ) rho35 *= 0.99 / std::abs(rho35);
00100
00101 Sigma(1,3) = Sigma(3,1) = rho13 * std::sqrt( Sigma(1,1) * Sigma(3,3) );
00102 Sigma(1,5) = Sigma(5,1) = rho15 * std::sqrt( Sigma(1,1) * Sigma(5,5) );
00103 Sigma(3,5) = Sigma(5,3) = rho35 * std::sqrt( Sigma(3,3) * Sigma(5,5) );
00104
00105
00106 double rho24 = m_correlations[3]->resolution(traj);
00107
00108 if ( std::abs(rho24) > 1 ) rho24 *= 0.99 / std::abs(rho24);
00109 Sigma(2,4) = Sigma(4,2) = rho24 * std::sqrt( Sigma(2,2) * Sigma(4,4) );
00110
00111
00112 return Sigma;
00113
00114 }
00115
00116 }