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
00149
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
00201 while ( ( bank = it->next() ) )
00202 {
00203 starts.push_back(bank->getStartValTime());
00204 }
00205
00206 delete it;
00207
00208
00209 std::sort(starts.begin(),starts.end());
00210
00211
00212 starts.erase(std::unique(starts.begin(),starts.end()),starts.end());
00213
00214
00215
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 }
00264 }
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 }