Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  

PionMatrixManager.cxx

Go to the documentation of this file.
00001 #include "AtlfastAlgs/PionMatrixManager.h"
00002 #include <iostream>
00003 
00004 namespace Atlfast{
00005   using std::abs;
00006   using std::ifstream;
00007 
00008   //-----------------------------------------------------------
00009   // PUBLIC: Constructor
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   // PUBLIC: Destructor
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   // PRIVATE: initialise : read file and construct data bins
00039   //------------------------------------------------------------
00040   
00041   void PionMatrixManager::initialise(){
00042     // open file
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       // read some parameters
00054       input >> pTMin;
00055       input >> etaMin;
00056       input >> etaMax;
00057       input >> nEtaBoundaries;
00058       input >> m_nRTBins;
00059       m_nEtaBins = nEtaBoundaries - 1;
00060       
00061       // construct vector<binboundaries>
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       // parameters are stored in rT bin blocks----
00071       // with parameters in format:
00072       // Core: C0(d0, z0, phi, cotTheta, 1/qPT), C1(d0, z0, phi, cotTheta, 1/qPT) etc.
00073       // Tails: C0(d0, z0, phi, cotTheta, 1/qPT), C1(d0, z0, phi, cotTheta, 1/qPT) etc.
00074       // Fractions: C0(d0, z0, phi, cotTheta, 1/qPT), C1(d0, z0, phi, cotTheta, 1/qPT) etc.
00075       // Correlations: C0(1,2,3,4), C1(1,2,3,4) etc.
00076 
00077       //start bin id ints at zero
00078       int iBin=0; 
00079       
00080       for ( int rt = 0; rt < m_nRTBins; rt++){
00081         
00082         // make vectors to hold all resolution parameters for this rt bin
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         //read eta bin number of values for each C and parameter
00097         // read core data
00098         fillVector(input, coreC0, 5);
00099         fillVector(input, coreC1, 5);
00100         fillVector(input, coreC2, 5);
00101         // read tail data
00102         fillVector(input, tailsC0, 5);
00103         fillVector(input, tailsC1, 5);
00104         fillVector(input, tailsC2, 5);
00105         // read fractions data
00106         fillVector(input, fractionsC0, 5);
00107         fillVector(input, fractionsC1, 5);
00108         // read correlations data
00109         fillVector(input, correlationsC0, 4);
00110         fillVector(input, correlationsC1, 4);
00111         fillVector(input, correlationsC3, 4);
00112         
00113         // DATA READING FINISHED FOR THIS RT BIN
00114         // got all values, now make RT/Eta Bins and Resolution objects
00115         for (int i=0; i<m_nEtaBins; ++i) {        
00116           double etaLow = m_etaBoundaries[i];
00117           double etaHigh = m_etaBoundaries[i+1];
00118           // make bin id with rt and eta boundaries
00119           BinID rTEtaBin(iBin, m_rTBoundaries[rt], m_rTBoundaries[rt+1],
00120                          etaLow, etaHigh);
00121           //make parameter resolutions for each parameter
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           // Now make a bin data with edges rt and eta, containing the 
00154           // correlation data
00155           PionBinData* binData =  new PionBinData(rTEtaBin,
00156                                                   core,
00157                                                   tails,
00158                                                   fractions,
00159                                                   correlations,
00160                                                   m_randSeed);
00161           
00162           // enter bin data into map
00163           m_binData[rTEtaBin] = binData;
00164           
00165           //increment bin ID
00166           iBin++;
00167           
00168         }//end of eta bin loop
00169       } //end of rt bin loop
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   // PRIVATE: fillVector
00193   //             reads n x M parameters into member variable
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   // PUBLIC: getMatrix : returns the sigma matrix corresponding
00212   //                     to a given track trajectory
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     // do Dcorset and Dcorgen to get smear parameters
00224     variables = m_correlatedData->generate(m_correlatedData->root(sigma));
00225     returnSigma = sigma;
00226     return variables;
00227     
00228   }
00229   
00230   //-----------------------------------------------------------
00231   // Private: getBinData : returns the IBinData of bin corresponding
00232   //                     to a given track trajectory
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     // validity check
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     // find BinID
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     // OOPS! couldn't fin bin
00265     cout << "WARNING: PionMatrixManager - No bin; rT "<< rT <<", eta "<<eta<<endl;
00266     return (m_binData.begin())->second;
00267   }
00268   
00269   
00270 }// namespace

Generated on Tue Mar 18 11:18:24 2003 for AtlfastAlgs by doxygen1.3-rc1