emcChannelEvolution.C

Go to the documentation of this file.
00001 #include "emcChannelEvolution.h"
00002 
00003 #include <iostream>
00004 #include <cassert>
00005 #include "EmcIndexer.h"
00006 #include "emcTimeStamp.h"
00007 #include "emcDataManager.h"
00008 #include "emcCalibrationDataHelper.h"
00009 #include "emcTracedValue.h"
00010 #include "emcTracedFEM.h"
00011 #include "emcGainFEM.h"
00012 #include "emcTracedFEMMerger.h"
00013 #include "emcTracedFEMPlotter.h"
00014 #include "phool.h"
00015 #include "TGraph.h"
00016 #include <sstream>
00017 #include <iomanip>
00018 #include <iterator>
00019 #include <algorithm>
00020 #include "PdbBankManagerFactory.hh"
00021 #include "PdbCalBankIterator.hh"
00022 #include "PdbCalBank.hh"
00023 
00024 namespace
00025 {
00026   void dump(const emcTracedFEM& tfem, int channel)
00027   {
00028     tfem.FirstItem(channel);
00029     emcTracedValue* tv = 0;
00030     while ( ( tv = tfem.NextItem() ) )
00031       {
00032         std::cout << (*tv);
00033       }
00034   }
00035 
00036   void scale(emcTracedFEM& tfem, float BL)
00037   {
00038     for ( int channel = 0; channel < 144; ++channel)
00039       {
00040         tfem.FirstItem(channel);
00041         emcTracedValue* tv = 0;
00042         while ( ( tv = tfem.NextItem() ) )
00043           {
00044             tv->Set(tv->GetX(), tv->GetConstant() / BL, tv->GetSlope() / BL,
00045                     tv->isConstant());
00046           }
00047       }
00048   }
00049 
00050   static const int nfems = 108;
00051 }
00052 
00053 
00054 
00055 //_____________________________________________________________________________
00056 emcChannelEvolution::emcChannelEvolution(emcManageable::EStorage ds)
00057   :
00058   fCDH(0),
00059   fDataSource(ds)
00060 {
00061   fGains.resize(nfems, 0);
00062 }
00063 
00064 //_____________________________________________________________________________
00065 emcChannelEvolution::~emcChannelEvolution()
00066 {
00067   for ( size_t i = 0; i < fGains.size(); ++i )
00068     {
00069       delete fGains[i];
00070     }
00071   delete fCDH;
00072 }
00073 
00074 //_____________________________________________________________________________
00075 void
00076 emcChannelEvolution::dump(int ifem, int channel)
00077 {
00078   if ( ifem >= 0 && ifem < static_cast<int>(fGains.size()) )
00079     {
00080       emcTracedFEM* g = fGains[ifem];
00081       if (g)
00082         {
00083 	  ::dump(*g,channel);
00084         }
00085       else
00086         {
00087           std::cout << PHWHERE << "Do not have this gain object"
00088                     << std::endl;
00089         }
00090     }
00091   else
00092     {
00093       std::cout << PHWHERE << "Do not know this fem/channel" << std::endl;
00094     }
00095 }
00096 
00097 //_____________________________________________________________________________
00098 TGraph*
00099 emcChannelEvolution::graph(int ifem, int channel)
00100 {
00101   if ( ifem >= 0 && ifem < static_cast<int>(fGains.size()) )
00102     {
00103       emcTracedFEM* g = fGains[ifem];
00104       if (!g)
00105         {
00106           g = read(ifem);
00107         }
00108       if (g)
00109         {
00110           return graph(ifem,channel,g->GetXmin());
00111         }
00112     }
00113   return 0;
00114 }
00115 
00116 //_____________________________________________________________________________
00117 TGraph*
00118 emcChannelEvolution::graph(int ifem, int channel, time_t tics0)
00119 {
00120   if ( ifem >= 0 && ifem < static_cast<int>(fGains.size()) )
00121     {
00122       emcTracedFEM* g = fGains[ifem];
00123       if (!g)
00124         {
00125           g = read(ifem);
00126         }
00127 
00128       if (g)
00129         {
00130           emcTracedFEMPlotter plot(*g,tics0);
00131           TGraph* graph = plot.CopyGraph(channel);
00132           std::ostringstream name;
00133           name << "FEM" << std::setw(3) << std::setfill('0') << ifem
00134                << "CH" << std::setw(3) << std::setfill('0') << channel;
00135           graph->SetName(name.str().c_str());
00136           return graph;
00137         }
00138     }
00139   return 0;
00140 }
00141 
00142 //_____________________________________________________________________________
00143 void
00144 emcChannelEvolution::produce(int run1, int run2, const char* femdetails)
00145 {
00146   assert(run1<=run2);
00147 
00148   // First goals is to get, from [run1,run2] range, the list
00149   // of validity periods as they stand in the database.
00150 
00151   PdbBankManager* bm = PdbBankManagerFactory::instance().create(emcManageable::GetStorageName(fDataSource));
00152   
00153   if (!bm) 
00154     {
00155       std::cerr << PHWHERE << "Could not get bank manager" << std::endl;
00156       return;
00157     }
00158 
00159   PdbCalBankIterator* it = bm->getIterator();
00160   if (!it)
00161     {
00162       std::cerr << PHWHERE << "Could not get calbank iterator" << std::endl;
00163       return;
00164     }
00165 
00166   it->init("calib.emc.Gains",0);
00167 
00168   emcDataManager* dm = emcDataManager::GetInstance();
00169   emcTimeStamp ets;
00170   ets.SetSource(fDataSource);
00171   
00172   bool ok = dm->Read(ets,run1);
00173   if (!ok)
00174     {
00175       std::cerr << "Could not find time stamp for run" << run1
00176                 << std::endl;
00177       return;
00178     }
00179 
00180   PHTimeStamp t1 = ets.getTimeStamp();
00181 
00182   ok = dm->Read(ets,run2);
00183   if (!ok)
00184     {
00185       std::cerr << "Could not find time stamp for run" << run2
00186                 << std::endl;
00187       return;
00188     }
00189 
00190   PHTimeStamp t2 = ets.getTimeStamp();
00191 
00192   it->setStartValTimeLimits(t1,t2);
00193 
00194   it->print();
00195 
00196   PdbCalBank* bank = 0;
00197 
00198   std::vector<PHTimeStamp> starts;
00199 
00200   // From the validity periods, we only keep the starts.
00201   while ( ( bank = it->next() ) )
00202     {
00203       starts.push_back(bank->getStartValTime());
00204     }
00205 
00206   delete it;
00207 
00208   // Sort the starttimes
00209   std::sort(starts.begin(),starts.end());
00210 
00211   // Remove duplicates, if any
00212   starts.erase(std::unique(starts.begin(),starts.end()),starts.end());
00213 
00214   // Now loop over all startvaltimes, and collect the gains, and
00215   // merged them.
00216 
00217   for ( size_t i = 0; i < starts.size(); ++i )
00218     {
00219       PHTimeStamp ts = starts[i];
00220 
00221       std::cout << "Collecting CDH @ " << ts << std::endl;
00222       delete fCDH;
00223       int dummy=0;
00224       fCDH = new emcCalibrationDataHelper(dummy,ts,
00225                                           false,
00226                                           fDataSource);
00227       
00228       for ( int ifem = 0; ifem < nfems; ++ifem )
00229         {
00230           const emcTracedFEM* gains =
00231             dynamic_cast<const emcTracedFEM*>
00232             (fCDH->getCalibration(ifem, "Gains"));
00233           assert(gains != 0);
00234           
00235           int isector, ism144;
00236           
00237           EmcIndexer::PXSM144_iSiSM144(ifem, isector, ism144);
00238           
00239           float BL = fCDH->getGainBaseLine(isector,"value",femdetails);
00240           
00241           if (ifem==0)
00242             {
00243               std::cout << ifem << " gains= (xmax="
00244                         << PHTimeStamp(gains->GetXmax())
00245                         << " (tics=" << gains->GetXmax() << "))" << std::endl;
00246             }
00247           
00248           if ( !fGains[ifem] )
00249             {
00250               fGains[ifem] = gains->clone();
00251               scale(*(fGains[ifem]), BL);
00252             }
00253           else
00254             {
00255               emcTracedFEM* tmp = fGains[ifem]->clone();
00256               delete fGains[ifem];
00257               emcTracedFEM* cgains = gains->clone();
00258               scale(*cgains, BL);
00259               fGains[ifem] = emcTracedFEMMerger::merge(*tmp, *cgains);
00260               delete tmp;
00261               delete cgains;
00262             }
00263         } // loop over fems
00264     } // loop over validity periods
00265 }
00266 
00267 //_____________________________________________________________________________
00268 emcTracedFEM*
00269 emcChannelEvolution::read(int ifem)
00270 {
00271   emcDataManager* dm = emcDataManager::GetInstance();
00272   std::string ddir = dm->GetSourceDir();
00273   dm->SetSourceDir(fSourceDir.c_str());
00274 
00275   PHTimeStamp dummy;
00276 
00277   emcTracedFEM* g = new emcGainFEM(ifem);
00278 
00279   g->SetSource(emcManageable::kFile_ASCII);
00280   bool ok = dm->Read(*g,dummy);
00281   if (!ok)
00282     {
00283       std::cerr << PHWHERE << " Cannot read gains for fem " << ifem
00284                 << std::endl;
00285       return 0;
00286     }
00287 
00288   fGains[ifem] = g;
00289 
00290   dm->SetSourceDir(ddir.c_str());
00291   return g;
00292 }
00293 
00294 //_____________________________________________________________________________
00295 bool
00296 emcChannelEvolution::read(const char* inputdir)
00297 {
00298   fSourceDir = inputdir;
00299 
00300   for ( size_t i = 0; i < fGains.size(); ++i ) 
00301     {
00302       delete fGains[i];      
00303     }
00304 
00305   fGains.resize(nfems,0);
00306 
00307   return true;
00308 }
00309 
00310 //_____________________________________________________________________________
00311 bool
00312 emcChannelEvolution::save(const char* outputdir)
00313 {
00314   emcDataManager* dm = emcDataManager::GetInstance();
00315   std::string ddir = dm->GetDestinationDir();
00316   dm->SetDestinationDir(outputdir);
00317   for ( size_t i = 0; i < fGains.size(); ++i ) 
00318     {
00319       emcTracedFEM* g = fGains[i];
00320       if (g)
00321         {
00322           g->SetDestination(emcManageable::kFile_ASCII);
00323           bool ok = dm->Write(*g);
00324           if (!ok)
00325             {
00326               std::cerr << PHWHERE << " Cannot save gains "
00327                         << std::endl;
00328               return false;
00329             }
00330         }
00331     }
00332   dm->SetDestinationDir(ddir.c_str());
00333   return true;
00334 }