00001 #include "AtlfastAlgs/ElectronMatrixManager.h"
00002 #include "PathResolver/PathResolver.h"
00003 #include <iostream>
00004
00005 namespace Atlfast
00006 {
00007 using std::abs;
00008 using std::ifstream;
00009
00010
00011
00012
00013 ElectronMatrixManager::ElectronMatrixManager( string bremParamFile,
00014 string smearParamFile,
00015 int randSeed,
00016 MsgStream log ) :
00017 m_bremParamFile( bremParamFile ),
00018 m_smearParamFile( smearParamFile ),
00019 m_randSeed( randSeed )
00020 {
00021 m_log = &log;
00022 *m_log << MSG::INFO
00023 << "Constructing ElectronMatrixManager with parameter files "
00024 << m_bremParamFile
00025 << " "
00026 << m_smearParamFile
00027 << endreq;
00028
00029 m_smearParamFile = PathResolver::find_file( m_smearParamFile, "DATAPATH" );
00030 m_bremMgr = new BremMatrixManager( m_bremParamFile, m_randSeed, *m_log );
00031 m_correlatedData = new CorrelatedData( m_randSeed );
00032 this->initialise();
00033 *m_log << MSG::INFO << "Constructed ElectronMatrixManager" << endreq;
00034 }
00035
00036
00037
00038
00039
00040 ElectronMatrixManager::~ElectronMatrixManager()
00041 {
00042 delete m_bremMgr;
00043 delete m_correlatedData;
00044 map<BinID, IBinData*>::iterator iter = m_binData.begin();
00045 map<BinID, IBinData*>::iterator end = m_binData.end();
00046 for ( ; iter != end; ++iter )
00047 {
00048 delete ( iter->second );
00049 }
00050 }
00051
00052
00053
00054
00055 void ElectronMatrixManager::initialise()
00056 {
00057
00058 ifstream input;
00059 input.open( m_smearParamFile.c_str() );
00060
00061 if (input)
00062 {
00063 *m_log << MSG::INFO << "ElectronMatrixManager: File " << m_smearParamFile << " open." << endreq;
00064
00065 double pTMin, etaMin, etaMax, rtBoundary;
00066
00067
00068 input >> pTMin;
00069 input >> etaMin;
00070 input >> etaMax;
00071 input >> m_nEtaBins;
00072 input >> m_nRTBins;
00073
00074
00075 double etaStep = (etaMax - etaMin) / double(m_nEtaBins);
00076 for ( int i = 0; i < m_nEtaBins; i++ )
00077 {
00078 m_etaBoundaries.push_back( etaMin + etaStep/2. + double(i)*etaStep );
00079 }
00080
00081 for ( int i = 0; i < m_nRTBins + 1; i++ )
00082 {
00083 input >> rtBoundary;
00084 m_rTBoundaries.push_back(rtBoundary);
00085 }
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106 int iBin = 0;
00107
00108 for ( int rt = 0; rt < m_nRTBins; rt++ )
00109 {
00110
00111 vector<double> empty;
00112
00113 vector< vector<double> > coreC0( m_nEtaBins, empty );
00114 vector< vector<double> > coreC1( m_nEtaBins, empty );
00115 vector< vector<double> > coreC2( m_nEtaBins, empty );
00116 vector< vector<double> > coreC3( m_nEtaBins, empty );
00117 vector< vector<double> > coreC4( m_nEtaBins, empty );
00118
00119 vector< vector<double> > tailsC0( m_nEtaBins, empty );
00120 vector< vector<double> > tailsC1( m_nEtaBins, empty );
00121 vector< vector<double> > tailsC2( m_nEtaBins, empty );
00122 vector< vector<double> > tailsC3( m_nEtaBins, empty );
00123 vector< vector<double> > tailsC4( m_nEtaBins, empty );
00124
00125 vector< vector<double> > fractionsC0( m_nEtaBins, empty );
00126 vector< vector<double> > fractionsC1( m_nEtaBins, empty );
00127 vector< vector<double> > fractionsC2( m_nEtaBins, empty );
00128 vector< vector<double> > fractionsC3( m_nEtaBins, empty );
00129 vector< vector<double> > fractionsC4( m_nEtaBins, empty );
00130
00131 vector< vector<double> > correlationsC0( m_nEtaBins, empty );
00132 vector< vector<double> > correlationsC1( m_nEtaBins, empty );
00133 vector< vector<double> > correlationsC2( m_nEtaBins, empty );
00134 vector< vector<double> > correlationsC3( m_nEtaBins, empty );
00135 vector< vector<double> > correlationsC4( m_nEtaBins, empty );
00136
00137
00138
00139 fillVector( input, coreC0, 5 );
00140 fillVector( input, coreC1, 5 );
00141 fillVector( input, coreC2, 5 );
00142 fillVector( input, coreC3, 5 );
00143 fillVector( input, coreC4, 5 );
00144
00145
00146 fillVector( input, tailsC0, 5 );
00147 fillVector( input, tailsC1, 5 );
00148 fillVector( input, tailsC2, 5 );
00149 fillVector( input, tailsC3, 5 );
00150 fillVector( input, tailsC4, 5 );
00151
00152
00153 fillVector( input, fractionsC0, 5 );
00154 fillVector( input, fractionsC1, 5 );
00155 fillVector( input, fractionsC2, 5 );
00156 fillVector( input, fractionsC3, 5 );
00157 fillVector( input, fractionsC4, 5 );
00158
00159
00160 fillVector( input, correlationsC0, 4 );
00161 fillVector( input, correlationsC1, 4 );
00162 fillVector( input, correlationsC2, 4 );
00163 fillVector( input, correlationsC3, 4 );
00164 fillVector( input, correlationsC4, 4 );
00165
00166
00167
00168
00169 for ( int i = 0; i < m_nEtaBins - 1; ++i )
00170 {
00171 double etaLow = m_etaBoundaries[i];
00172 double etaHigh = m_etaBoundaries[i+1];
00173
00174
00175 BinID rTEtaBin( iBin, m_rTBoundaries[rt], m_rTBoundaries[rt+1], etaLow, etaHigh );
00176
00177
00178 vector<ParameterResolutions*> core;
00179 vector<ParameterResolutions*> tails;
00180 vector<ParameterResolutions*> fractions;
00181 vector<ParameterResolutions*> correlations;
00182 for ( int param = 0; param < 5; param++ )
00183 {
00184 vector<BinID> coreCoeffBins;
00185 coreCoeffBins.push_back( BinID( 0, coreC0[i][param], coreC0[i+1][param] ) );
00186 coreCoeffBins.push_back( BinID( 0, coreC1[i][param], coreC1[i+1][param] ) );
00187 coreCoeffBins.push_back( BinID( 0, coreC2[i][param], coreC2[i+1][param] ) );
00188 coreCoeffBins.push_back( BinID( 0, coreC3[i][param], coreC3[i+1][param] ) );
00189 coreCoeffBins.push_back( BinID( 0, coreC4[i][param], coreC4[i+1][param] ) );
00190 core.push_back( new ParameterResolutions( coreCoeffBins, etaLow, etaHigh ) );
00191
00192 vector<BinID> tailsCoeffBins;
00193 tailsCoeffBins.push_back( BinID( 0, tailsC0[i][param], tailsC0[i+1][param] ) );
00194 tailsCoeffBins.push_back( BinID( 0, tailsC1[i][param], tailsC1[i+1][param] ) );
00195 tailsCoeffBins.push_back( BinID( 0, tailsC2[i][param], tailsC2[i+1][param] ) );
00196 tailsCoeffBins.push_back( BinID( 0, tailsC3[i][param], tailsC3[i+1][param] ) );
00197 tailsCoeffBins.push_back( BinID( 0, tailsC4[i][param], tailsC4[i+1][param] ) );
00198 tails.push_back( new ParameterResolutions( tailsCoeffBins, etaLow, etaHigh ) );
00199
00200 vector<BinID> fractionsCoeffBins;
00201 fractionsCoeffBins.push_back( BinID( 0, fractionsC0[i][param], fractionsC0[i+1][param] ) );
00202 fractionsCoeffBins.push_back( BinID( 0, fractionsC1[i][param], fractionsC1[i+1][param] ) );
00203 fractionsCoeffBins.push_back( BinID( 0, fractionsC2[i][param], fractionsC2[i+1][param] ) );
00204 fractionsCoeffBins.push_back( BinID( 0, fractionsC3[i][param], fractionsC3[i+1][param] ) );
00205 fractionsCoeffBins.push_back( BinID( 0, fractionsC4[i][param], fractionsC4[i+1][param] ) );
00206 fractions.push_back( new ParameterResolutions( fractionsCoeffBins, etaLow, etaHigh ) );
00207 }
00208
00209 for ( int param = 0; param < 4; param++ )
00210 {
00211 vector<BinID> correlationsCoeffBins;
00212 correlationsCoeffBins.push_back( BinID( 0, correlationsC0[i][param], correlationsC0[i+1][param] ) );
00213 correlationsCoeffBins.push_back( BinID( 0, correlationsC1[i][param], correlationsC1[i+1][param] ) );
00214 correlationsCoeffBins.push_back( BinID( 0, correlationsC2[i][param], correlationsC2[i+1][param] ) );
00215 correlationsCoeffBins.push_back( BinID( 0, correlationsC3[i][param], correlationsC3[i+1][param] ) );
00216 correlationsCoeffBins.push_back( BinID( 0, correlationsC4[i][param], correlationsC4[i+1][param] ) );
00217 correlations.push_back( new ParameterResolutions( correlationsCoeffBins, etaLow, etaHigh ) );
00218 }
00219
00220
00221
00222 ElectronBinData* binData = new ElectronBinData( rTEtaBin, core, tails, fractions, correlations, m_randSeed );
00223
00224
00225 m_binData[rTEtaBin] = binData;
00226
00227
00228 iBin++;
00229
00230 }
00231 }
00232
00233
00234 input.close();
00235
00236 }
00237 else
00238 {
00239 *m_log << MSG::INFO
00240 << "ElectronMatrixManager: no data file ( " << m_smearParamFile << " )!!!!"
00241 << endreq;
00242 }
00243
00244 makeHeader();
00245
00246 }
00247
00248 void ElectronMatrixManager::makeHeader()
00249 {
00250 HeaderPrinter hp( "Atlfast ElectronTrack Smearer:", *m_log );
00251 hp.add( "Total number of Bins ", m_nRTBins * m_nEtaBins );
00252 hp.add( "rT Bin Min ", m_rTBoundaries.front() );
00253 hp.add( "rT Bin Max ", m_rTBoundaries.back() );
00254 hp.add( "Number of rT Bins ", m_nRTBins );
00255 hp.add( "Eta Bin Min ", m_etaBoundaries.front() );
00256 hp.add( "Eta Bin Max ", m_etaBoundaries.back() );
00257 hp.add( "Number of Eta Bins ", m_nEtaBins );
00258 hp.print();
00259 }
00260
00261
00262
00263
00264
00265 void ElectronMatrixManager::fillVector( ifstream& input,
00266 vector< vector<double> >& myVector,
00267 int M = 5 )
00268 {
00269 double res;
00270 for ( int param = 0; param < M; param++ )
00271 {
00272 vector< vector<double> >::iterator binIter = myVector.begin();
00273 for ( ; binIter != myVector.end(); binIter++ )
00274 {
00275 input >> res;
00276 binIter->push_back(res);
00277 }
00278
00279 }
00280 }
00281
00282
00283
00284
00285
00286
00287 vector<double> ElectronMatrixManager::getVariables( const TrackTrajectory& track,
00288 HepSymMatrix& returnSigma ) const
00289 {
00290 HepSymMatrix sigma;
00291 vector<double> variables;
00292
00293
00294 TrackTrajectory bremTrack = m_bremMgr->getBremTrack(track);
00295 TrackParameters bremTrkParam = bremTrack.parameters();
00296
00297
00298 IBinData* binData = getBinData(track);
00299 sigma = binData->getMatrix(track);
00300
00301
00302 variables = m_correlatedData->generate( m_correlatedData->root(sigma) );
00303
00304
00305 variables[0] += bremTrkParam.impactParameter();
00306 variables[2] += bremTrkParam.phi();
00307 variables[4] += bremTrkParam.invPtCharge();
00308
00309
00310
00311 sigma(1,3) = sigma(1,3) / std::sqrt( sigma(1,1) * sigma(3,3) )
00312 * std::abs( variables[0] * variables[2] );
00313
00314 sigma(1,5) = sigma(1,5) / std::sqrt( sigma(1,1) * sigma(5,5) )
00315 * std::abs( variables[0] * variables[4] ) ;
00316
00317 sigma(3,5) = sigma(3,5) / std::sqrt( sigma(3,3) * sigma(5,5) )
00318 * std::abs( variables[2] * variables[4] ) ;
00319 sigma(3,1) = sigma(1,3);
00320 sigma(5,1) = sigma(1,5);
00321 sigma(5,3) = sigma(3,5);
00322 sigma(1,1) = std::pow( variables[0], 2 );
00323 sigma(3,3) = std::pow( variables[2], 2 );
00324 sigma(5,5) = std::pow( variables[4], 2 );
00325
00326 returnSigma = sigma;
00327 return variables;
00328 }
00329
00330
00331
00332
00333
00334
00335 IBinData* ElectronMatrixManager::getBinData( const TrackTrajectory& traj ) const
00336 {
00337 TrackParameters track = traj.parameters();
00338
00339 vector<double> rTEta;
00340 double rT = abs( traj.radius() );
00341 double eta = abs( track.eta() );
00342
00343
00344 double rTLow = ( (m_binData.begin())->first ).low(0);
00345 double rTHigh = ( (m_binData.rbegin())->first ).high(0);
00346 double etaLow = ( (m_binData.begin())->first ).low(1);
00347 double etaHigh = ( (m_binData.rbegin())->first ).high(1);
00348
00349 if ( rT < rTLow ) rT = rTLow;
00350 if ( rT > rTHigh ) rT = rTHigh;
00351 if ( eta < etaLow ) eta = etaLow;
00352 if ( eta > etaHigh ) eta = etaHigh;
00353
00354
00355 rTEta.push_back(rT);
00356 rTEta.push_back(eta);
00357
00358 map<BinID, IBinData*>::const_iterator binIter = m_binData.begin();
00359 map<BinID, IBinData*>::const_iterator binEnd = m_binData.end();
00360
00361 for ( ; binIter != binEnd; ++binIter )
00362 {
00363 if ( binIter->first.isInBin(rTEta) )
00364 {
00365 return binIter->second;
00366 }
00367 }
00368
00369 *m_log << MSG::WARNING
00370 << "WARNING: ElectronMatrixManager - No bin; rT " << rT << ", eta " << eta
00371 << endreq;
00372
00373 return ( m_binData.begin() )->second;
00374 }
00375
00376
00377 }