00001 #include "AtlfastAlgs/PionMatrixManager.h"
00002 #include <iostream>
00003
00004 namespace Atlfast{
00005 using std::abs;
00006 using std::ifstream;
00007
00008
00009
00010
00011
00012 PionMatrixManager::PionMatrixManager(int randSeed, MsgStream log):m_randSeed(randSeed){
00013 log<< MSG::INFO << "Constructing PionMatrixManager"<< endreq;
00014 m_file = "Atlfast_PionResParam.dat";
00015 m_correlatedData = new CorrelatedData(randSeed);
00016 m_log = &log;
00017 this->initialise();
00018 *m_log << MSG::INFO << "Constructed PionMatrixManager"<< endreq;
00019 }
00020
00021
00022
00023
00024
00025
00026 PionMatrixManager::~PionMatrixManager(){
00027
00028 delete m_correlatedData;
00029 map<BinID, IBinData*>::iterator iter = m_binData.begin();
00030 map<BinID, IBinData*>::iterator end = m_binData.end();
00031 for (; iter!=end;++iter)
00032 {
00033 delete (iter->second);
00034 }
00035 }
00036
00037
00038
00039
00040
00041 void PionMatrixManager::initialise(){
00042
00043 ifstream input;
00044 input.open( m_file.c_str() );
00045
00046 if (input) {
00047
00048 *m_log << MSG::INFO <<"PionMatrixManager: File "<<m_file<<" open."<<endreq;
00049
00050 double pTMin, etaMin, etaMax, rtBoundary;
00051 int nEtaBoundaries;
00052
00053
00054 input >> pTMin;
00055 input >> etaMin;
00056 input >> etaMax;
00057 input >> nEtaBoundaries;
00058 input >> m_nRTBins;
00059 m_nEtaBins = nEtaBoundaries - 1;
00060
00061
00062 double etaStep = (etaMax - etaMin)/double(nEtaBoundaries);
00063 for (int i=0; i<m_nEtaBins+1; i++)
00064 { m_etaBoundaries.push_back(etaMin + etaStep/2. + double(i)*etaStep);}
00065 for (int i=0; i<m_nRTBins+1; i++){
00066 input >> rtBoundary;
00067 m_rTBoundaries.push_back(rtBoundary);
00068 }
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078 int iBin=0;
00079
00080 for ( int rt = 0; rt < m_nRTBins; rt++){
00081
00082
00083 vector<double> empty;
00084 vector< vector<double> > coreC0(nEtaBoundaries, empty);
00085 vector< vector<double> > coreC1(nEtaBoundaries, empty);
00086 vector< vector<double> > coreC2(nEtaBoundaries, empty);
00087 vector< vector<double> > tailsC0(nEtaBoundaries, empty);
00088 vector< vector<double> > tailsC1(nEtaBoundaries, empty);
00089 vector< vector<double> > tailsC2(nEtaBoundaries, empty);
00090 vector< vector<double> > fractionsC0(nEtaBoundaries, empty);
00091 vector< vector<double> > fractionsC1(nEtaBoundaries, empty);
00092 vector< vector<double> > correlationsC0(nEtaBoundaries, empty);
00093 vector< vector<double> > correlationsC1(nEtaBoundaries, empty);
00094 vector< vector<double> > correlationsC3(nEtaBoundaries, empty);
00095
00096
00097
00098 fillVector(input, coreC0, 5);
00099 fillVector(input, coreC1, 5);
00100 fillVector(input, coreC2, 5);
00101
00102 fillVector(input, tailsC0, 5);
00103 fillVector(input, tailsC1, 5);
00104 fillVector(input, tailsC2, 5);
00105
00106 fillVector(input, fractionsC0, 5);
00107 fillVector(input, fractionsC1, 5);
00108
00109 fillVector(input, correlationsC0, 4);
00110 fillVector(input, correlationsC1, 4);
00111 fillVector(input, correlationsC3, 4);
00112
00113
00114
00115 for (int i=0; i<m_nEtaBins; ++i) {
00116 double etaLow = m_etaBoundaries[i];
00117 double etaHigh = m_etaBoundaries[i+1];
00118
00119 BinID rTEtaBin(iBin, m_rTBoundaries[rt], m_rTBoundaries[rt+1],
00120 etaLow, etaHigh);
00121
00122 vector<ParameterResolutions*> core;
00123 vector<ParameterResolutions*> tails;
00124 vector<ParameterResolutions*> fractions;
00125 vector<ParameterResolutions*> correlations;
00126 for (int param=0; param < 5; param++) {
00127 vector<BinID> coreCoeffBins;
00128 coreCoeffBins.push_back(BinID(0, coreC0[i][param], coreC0[i+1][param]) );
00129 coreCoeffBins.push_back(BinID(0, coreC1[i][param], coreC1[i+1][param]) );
00130 coreCoeffBins.push_back(BinID(0, coreC2[i][param], coreC2[i+1][param]) );
00131 core.push_back(new ParameterResolutions(coreCoeffBins,etaLow, etaHigh ));
00132
00133 vector<BinID> tailsCoeffBins;
00134 tailsCoeffBins.push_back(BinID(0, tailsC0[i][param], tailsC0[i+1][param]) );
00135 tailsCoeffBins.push_back(BinID(0, tailsC1[i][param], tailsC1[i+1][param]) );
00136 tailsCoeffBins.push_back(BinID(0, tailsC2[i][param], tailsC2[i+1][param]) );
00137 tails.push_back(new ParameterResolutions(tailsCoeffBins,etaLow, etaHigh));
00138
00139 vector<BinID> fractionsCoeffBins;
00140 fractionsCoeffBins.push_back(BinID(0, fractionsC0[i][param], fractionsC0[i+1][param]) );
00141 fractionsCoeffBins.push_back(BinID(0, fractionsC1[i][param], fractionsC1[i+1][param]) );
00142 fractions.push_back(new ParameterResolutions(fractionsCoeffBins,etaLow, etaHigh));
00143 }
00144 for (int param=0; param < 4; param++) {
00145 vector<BinID> correlationsCoeffBins;
00146 correlationsCoeffBins.push_back(BinID(0, correlationsC0[i][param], correlationsC0[i+1][param]) );
00147 correlationsCoeffBins.push_back(BinID(0, correlationsC1[i][param], correlationsC1[i+1][param]) );
00148 correlationsCoeffBins.push_back(BinID(0, 0, 0) );
00149 correlationsCoeffBins.push_back(BinID(0, correlationsC3[i][param], correlationsC3[i+1][param]) );
00150 correlations.push_back(new ParameterResolutions(correlationsCoeffBins,etaLow, etaHigh));
00151 }
00152
00153
00154
00155 PionBinData* binData = new PionBinData(rTEtaBin,
00156 core,
00157 tails,
00158 fractions,
00159 correlations,
00160 m_randSeed);
00161
00162
00163 m_binData[rTEtaBin] = binData;
00164
00165
00166 iBin++;
00167
00168 }
00169 }
00170
00171 }
00172 else { *m_log << MSG::INFO << "PionMatrixManager: no data file ( "
00173 <<m_file<<" )!!!!" << endreq;}
00174
00175 makeHeader();
00176
00177 }
00178
00179 void PionMatrixManager::makeHeader(){
00180 HeaderPrinter hp("Atlfast PionTrack Smearer:", *m_log);
00181 hp.add("Total number of Bins ", int(m_binData.size()) );
00182 hp.add("rT Bin Min ", m_rTBoundaries.front());
00183 hp.add("rT Bin Max ", m_rTBoundaries.back());
00184 hp.add("Number of rT Bins ", m_nRTBins);
00185 hp.add("Eta Bin Min ", m_etaBoundaries.front());
00186 hp.add("Eta Bin Max ", m_etaBoundaries.back());
00187 hp.add("Number of Eta Bins ", m_nEtaBins);
00188 hp.print();
00189 }
00190
00191
00192
00193
00194
00195 void PionMatrixManager::fillVector(ifstream& input,
00196 vector< vector<double> >& myVector,
00197 int M=5){
00198 double res;
00199 for (int param=0; param<M; param++) {
00200 vector< vector<double> >::iterator binIter = myVector.begin();
00201 for (;binIter != myVector.end(); binIter++){
00202 input >> res;
00203 binIter->push_back(res);
00204 }
00205
00206 }
00207 }
00208
00209
00210
00211
00212
00213
00214
00215 vector<double> PionMatrixManager::getVariables(const TrackTrajectory& track,
00216 HepMatrix& returnSigma) const{
00217 HepMatrix sigma;
00218 vector<double> variables;
00219
00220 IBinData* binData = getBinData(track);
00221
00222 sigma = binData->getMatrix(track);
00223
00224 variables = m_correlatedData->generate(m_correlatedData->root(sigma));
00225 returnSigma = sigma;
00226 return variables;
00227
00228 }
00229
00230
00231
00232
00233
00234 IBinData* PionMatrixManager::getBinData(const TrackTrajectory& traj) const{
00235 TrackParameters track = traj.parameters();
00236
00237 vector<double> rTEta;
00238 double rT = abs( traj.radius() );
00239 double eta = abs( track.eta() );
00240
00241
00242 double rTLow = ( (m_binData.begin())->first ).low(0);
00243 double rTHigh = ( (m_binData.rbegin())->first ).high(0);
00244 double etaLow = ( (m_binData.begin())->first ).low(1);
00245 double etaHigh = ( (m_binData.rbegin())->first ).high(1);
00246
00247 if ( rT < rTLow ) rT = rTLow;
00248 if ( rT > rTHigh) rT = rTHigh;
00249 if ( eta < etaLow ) eta = etaLow;
00250 if ( eta > etaHigh) eta = etaHigh;
00251
00252
00253 rTEta.push_back( rT );
00254 rTEta.push_back( eta );
00255
00256 map<BinID, IBinData*>::const_iterator binIter = m_binData.begin();
00257 map<BinID, IBinData*>::const_iterator binEnd = m_binData.end();
00258
00259 for (; binIter != binEnd; ++binIter){
00260 if (binIter->first.isInBin(rTEta)) {
00261 return binIter->second;
00262 }
00263 }
00264
00265 cout << "WARNING: PionMatrixManager - No bin; rT "<< rT <<", eta "<<eta<<endl;
00266 return (m_binData.begin())->second;
00267 }
00268
00269
00270 }