emcRawDataAccessor.C

Go to the documentation of this file.
00001 // Implementation of class : emcRawDataAccessor
00002 //
00003 // Author: Laurent Aphecetche (laurent.aphecetche@subatech.in2p3.fr)
00004 //
00005 //-------------------------------------------------------------------------
00006 //
00007 // Some notes about this Singleton's destruction and initialization.
00008 // For convenience, initialization methods are also named GetInstance, but do have
00009 // some parameters.
00010 // In order to avoid (or at least to limit) dangling references,
00011 // we only allow those initialization methods to be called when the internal
00012 // instance is null, i.e. when nobody has such an instance in hand (this is inferred
00013 // using reference-counting, which is far from being fullproof - e.g. same user can
00014 // call ReleaseInstance twice...- , but that's better than
00015 // nothing).
00016 //
00017 // So, the correct way of using this class is :
00018 //
00019 // emcRawDataAccessor* rda; 
00020 // // Init
00021 // rda = emcRawDataAccessor::GetInstance(PHTimeStamp(2000,1,12,0,0,0));
00022 // // use it...
00023 // void f1(void) {
00024 //   emcRawDataAccessor* rda = emcRawDataAccessor::GetInstance();
00025 //   ...
00026 //   emcRawDataAccessor::ReleaseInstance();
00027 // }
00028 // void f2(void) {
00029 //   emcRawDataAccessor* rda = emcRawDataAccessor::GetInstance();
00030 //   ...
00031 // }
00032 //
00033 // // Try to re-initialize it
00034 // rda = emcRawDataAccessor::GetInstance(status,configfilename); // WRONG !
00035 // // WRONG because the f2() function still holds a reference count on the previous instance.
00036 // emcRawDataAccessor::ReleaseInstance(); // release last instance (fCount=0)
00037 // rda = e mcRawDataAccessor::GetInstance(status,configfilename); // OK now.
00038 //
00039 //
00040 
00041 #include "emcRawDataAccessor.h"
00042 #include "emcDataManager.h"
00043 #include "EmcDynamicData.h"
00044 #include "emcRawDataObject.h"
00045 #include "emcConfigurationFile.h"
00046 #include <cassert>
00047 #include <iostream>
00048 
00049 using std::string;
00050 using std::cout;
00051 using std::cerr;
00052 using std::endl;
00053 
00054 emcRawDataAccessor* emcRawDataAccessor::fInstance = 0;
00055 int emcRawDataAccessor::fCount = 0;
00056 emcRawDataObject* emcRawDataAccessor::fRDO = 0;
00057 EmcDynamicData* emcRawDataAccessor::fDynamicData = 0;
00058 EMCalFEE* emcRawDataAccessor::fDataExtractor = 0;
00059 Eventiterator* emcRawDataAccessor::fEventiterator = 0;
00060 #ifndef __CINT__
00061 string emcRawDataAccessor::fConfigFileName = ""; 
00062 #endif
00063 
00064 //_____________________________________________________________________________
00065 emcRawDataAccessor::emcRawDataAccessor(int& status, 
00066                      const char* configfilename)                  
00067                   
00068 {
00069   char* filename = const_cast<char*>(configfilename);
00070   fConfigFileName = configfilename;
00071   fDynamicData = new EmcDynamicData(status,filename,true);
00072   if (status==0) {
00073                 //    FEMlimits lim;
00074     lim.minAmp = 20;
00075     lim.maxAmp = 4080;
00076     fDataExtractor = new EMCalFEE(fDynamicData,&lim,status);
00077   }
00078 }
00079 
00080 //_____________________________________________________________________________
00081 emcRawDataAccessor::emcRawDataAccessor(int& status, emcConfigurationFile& configFile)
00082 {
00083   fConfigFileName = "";
00084   fDynamicData = new EmcDynamicData(status,configFile,true);
00085   if (status==0) {
00086                 //    FEMlimits lim;
00087     lim.minAmp = 5;
00088     lim.maxAmp = 4090;
00089     fDataExtractor = new EMCalFEE(fDynamicData,&lim,status);
00090   }
00091 }
00092 
00093 //_____________________________________________________________________________
00094 emcRawDataAccessor::~emcRawDataAccessor()
00095 {
00096   delete fDynamicData;
00097   fDynamicData = 0;
00098   delete fDataExtractor;
00099   fDataExtractor = 0;
00100   delete fRDO;
00101   fRDO = 0;
00102   //  delete fEventiterator;
00103   fEventiterator = 0;
00104   fConfigFileName = "" ;
00105   assert(fCount==0);
00106 }
00107 
00108 //_____________________________________________________________________________
00109 void emcRawDataAccessor::RemoveInstance(void)
00110 {
00111   if (!fCount) return; // no instance 
00112   fCount = 0;
00113   delete fInstance;
00114   fInstance = 0;
00115 }
00116 
00117 //_____________________________________________________________________________
00118 void emcRawDataAccessor::ReleaseInstance(void)
00119 {
00120   if (!fCount) return; // no instance 
00121 
00122   fCount--;
00123 
00124   if (fCount) return; // instance still in use
00125 
00126   delete fInstance;
00127 
00128   fInstance = 0;
00129 }
00130 
00131 //_____________________________________________________________________________
00132 emcRawDataAccessor* emcRawDataAccessor::GetInstance(void)
00133 {
00134   if (fInstance==0) {
00135     cout << "<E> Singleton emcRawDataAccessor object should be first created"
00136          << " by a call to one of the full GetInstance methods : "
00137          << " (int,const char*) or (PHTimeStamp&)."
00138          << endl;
00139     return 0;
00140   }
00141   else {
00142     fCount++;
00143     return fInstance;
00144   }
00145 }
00146 
00147 //_____________________________________________________________________________
00148 emcRawDataAccessor* emcRawDataAccessor::GetInstance(const PHTimeStamp& ts)
00149 {
00150   // Initialization using configuration file read from the DB.
00151 
00152   if (fCount) {
00153     cerr << "<E> emcRawDataAccessor::GetInstance(PHTimeStamp& ts) : reference count is not zero. Somebody is using one instance of this object. Release it before you can re-initialize it." << endl;
00154     return 0;
00155   }
00156 
00157   emcConfigurationFile config;
00158   emcConfigurationFile* configFile = 0;
00159 
00160   config.SetSource(emcManageable::kDB_Objy); 
00161 
00162   emcDataManager* dm = emcDataManager::GetInstance();
00163 
00164   configFile = static_cast<emcConfigurationFile*>(dm->Collect(config,ts));
00165 
00166   if (!configFile) {
00167     cerr << "<E> emcRawDataAccessor::GetInstance(...) : Cannot fetch configuration file for time stamp " 
00168          << ts << endl;
00169     return 0;
00170   }
00171   else {
00172     int status;
00173     assert(fInstance==0);
00174     fInstance = new emcRawDataAccessor(status,*configFile);
00175     fCount++;
00176   }
00177   return fInstance;
00178 }
00179 
00180 //_____________________________________________________________________________
00181 emcRawDataAccessor* emcRawDataAccessor::GetInstance(int& status, 
00182                      const char* configfilename)
00183                 
00184 {
00185   if (fCount) {
00186     cerr << "<E> emcRawDataAccessor::GetInstance(int&status,char* filename) : reference count is not zero. Somebody is using one instance of this object. Release it before you can re-initialize it." << endl;
00187     return 0;
00188   }
00189   assert (fInstance==0);
00190   fInstance = new emcRawDataAccessor(status,configfilename);
00191   fCount++;
00192 
00193   return fInstance;
00194 }
00195 
00196 //_____________________________________________________________________________
00197 int emcRawDataAccessor::GetNextEvent(void)
00198 {
00199   // Get the next event from the DataExtractor.
00200   // Note:
00201   // In case the RDO was already created, 
00202   // as soon as you have executed this method, the RDO is updated
00203 
00204   if (fEventiterator==0) {
00205     cerr << "<E> No data source selected." << endl;
00206     return false;
00207   }
00208   return fDataExtractor->getNextEvent(fEventiterator);
00209 }
00210 
00211 //_____________________________________________________________________________
00212 emcRawDataObject * emcRawDataAccessor::GetRawDataObject(void)
00213 {
00214   if (!fRDO) {
00215     cout << "<I> emcRawDataAccessor::GetRawDataObject : Allocating a new RDO" 
00216          << endl;
00217     fRDO = new emcRawDataObject(fDynamicData->getEmcSize(),
00218                                 fDynamicData->getEmcMap(),
00219                                 (fDynamicData->getEmcRaw())[0],
00220                                 (fDynamicData->getEmcRaw())[1],
00221                                 (fDynamicData->getEmcRaw())[2],
00222                                 (fDynamicData->getEmcRaw())[3],
00223                                 (fDynamicData->getEmcRaw())[4],
00224                                 fDataExtractor->getCells(),
00225                                 fDataExtractor->getDataErrors()
00226                                 );
00227    }
00228   return fRDO;
00229 }
00230 
00231 //_____________________________________________________________________________
00232 void emcRawDataAccessor::SetDataSource(Eventiterator* it)
00233 {
00234   fEventiterator = it;
00235 }