00001 #include "emcBadNormt.h"
00002 #include "emcCalibrationDataHelper.h"
00003 #include "emcTimeStamp.h"
00004 #include "emcDataManager.h"
00005 #include "PHTimeStamp.h"
00006 #include "EmcIndexer.h"
00007 #include "emcCalFEM.h"
00008 #include "emcRejectList.h"
00009 #include "TSystem.h"
00010 #include "TFile.h"
00011 #include "TH2.h"
00012 #include "TGraph.h"
00013 #include <iostream>
00014 #include <cassert>
00015 #include <sstream>
00016
00017
00018 emcBadNormt::emcBadNormt(const char* outputdir )
00019 : fOutputDir(gSystem->ExpandPathName(outputdir))
00020 {
00021 for ( size_t i = 0; i < 6; ++i )
00022 {
00023 fHistos.push_back(new TH2F(EmcIndexer::EmcSectorId(i),
00024 EmcIndexer::EmcSectorId(i),
00025 72,
00026 -0.5,71.5,
00027 36,
00028 -0.5,35.5));
00029 }
00030 }
00031
00032
00033 void
00034 emcBadNormt::initGainBaseLine(emcCalibrationDataHelper& cdh)
00035 {
00036
00037
00038
00039
00040 const float BL[] = { 147.85,
00041 155.23,
00042 142.10,
00043 127.58,
00044 131.15,
00045 129.74
00046 };
00047
00048 fGainBaseLineFactor.clear();
00049
00050 for ( size_t i = 0; i < 108; ++i )
00051 {
00052 int is,ism;
00053 EmcIndexer::PXSM144_iSiSM144(i,is,ism);
00054 fGainBaseLineFactor.push_back(cdh.getGainBaseLine(is,"value")/BL[is]);
00055 }
00056 }
00057
00058
00059 void
00060 emcBadNormt::print(std::ostream& os )
00061 {
00062 for (size_t i = 0; i < fRuns.size(); ++i )
00063 {
00064 os << fRuns[i];
00065 if ( i < fNbad.size() )
00066 {
00067 os << " " << fNbad[i];
00068 }
00069 else
00070 {
00071 os << " not computed.";
00072 }
00073 os << std::endl;
00074 }
00075 }
00076
00077
00078 void
00079 emcBadNormt::process(float normt_limit )
00080 {
00081 const time_t fTimeOffset=5;
00082
00083 emcTimeStamp ets;
00084 ets.SetSource(emcManageable::kDB_Objy);
00085 emcDataManager* dm = emcDataManager::GetInstance();
00086 PHTimeStamp ts;
00087
00088 emcRejectList globalRejectList;
00089 emcRejectList* first = 0;
00090
00091 for ( size_t i = 0; i < fRuns.size(); ++i )
00092 {
00093 int run = fRuns[i];
00094
00095 std::cout << "Working on run " << run << std::endl;
00096
00097 emcCalibrationDataHelper* cdh;
00098
00099 bool ok = dm->Read(ets,run);
00100 assert(ok==true);
00101 ts = ets.getTimeStamp();
00102 ts += fTimeOffset;
00103
00104 cdh = new emcCalibrationDataHelper(run,ts,
00105 false,
00106 emcManageable::kDB_Objy,
00107 "pbsc");
00108
00109 initGainBaseLine(*cdh);
00110
00111 emcRejectList rl;
00112 rl.SetDestination(emcManageable::kFile_ASCII);
00113
00114 for ( size_t ifem = 0; ifem < 108; ++ifem )
00115 {
00116 const emcCalFEM* calfem = cdh->getCalibration(ifem,"Gains");
00117 assert(calfem!=0);
00118 for ( size_t ichannel = 0; ichannel < 144; ++ichannel)
00119 {
00120 float normt = calfem->getValue(ichannel,ts.getTics());
00121
00122 normt /= fGainBaseLineFactor[ifem];
00123
00124 if ( normt <= normt_limit )
00125 {
00126 int towerid = EmcIndexer::PXSM144iCH_iPX(ifem,ichannel);
00127 rl.set(towerid,1,0,0,0);
00128 globalRejectList.set_or(towerid,1,0,0,0);
00129 int is,iz,iy;
00130 EmcIndexer::decodeTowerId(towerid,is,iz,iy);
00131 assert(is>=0 && is < (int)(fHistos.size()));
00132 fHistos[is]->Fill(iz,iy,1.0/fRuns.size());
00133 }
00134 }
00135 }
00136
00137 if (!first)
00138 {
00139 first = new emcRejectList(rl);
00140 }
00141
00142 std::cout << "Number of bad normt=" << rl.size() << std::endl;
00143
00144 fNbad.push_back(rl.size());
00145
00146 if ( rl.size() > 0 )
00147 {
00148 std::ostringstream str;
00149 str << fOutputDir << "/" << run;
00150 dm->SetDestinationDir(str.str().c_str());
00151 bool ok = dm->Write(rl);
00152 assert(ok==true);
00153 }
00154
00155 rl -= *first;
00156
00157 std::cout << "Diff to first=" << rl.size() << std::endl;
00158 }
00159
00160 std::ostringstream str;
00161 str << fOutputDir << "/all";
00162 dm->SetDestinationDir(str.str().c_str());
00163 globalRejectList.SetDestination(emcManageable::kFile_ASCII);
00164 bool ok = dm->Write(globalRejectList);
00165 assert(ok==true);
00166
00167 delete first;
00168
00169 size_t n = fRuns.size();
00170
00171 double* x = new double[n];
00172 double* y = new double[n];
00173
00174 for ( size_t i = 0; i < fRuns.size(); ++i )
00175 {
00176 x[i] = fRuns[i];
00177 y[i] = fNbad[i];
00178 }
00179
00180 TGraph g(n,x,y);
00181 g.SetName("NBADS");
00182
00183 std::ostringstream out;
00184 out << fOutputDir << "/histos.root";
00185 TFile f(out.str().c_str(),"RECREATE");
00186 for ( size_t i = 0; i < fHistos.size(); ++i )
00187 {
00188 fHistos[i]->Write();
00189 }
00190 g.Write();
00191 f.Write();
00192 f.Close();
00193 }