emcBadNormt.C

Go to the documentation of this file.
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 /* = "/tmp" */ )
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   // BaseLines at end of Run3. Obtained with trim.C to be found in
00037   // cvs:offline/packages/emc-calib/Calib
00038   // details="0:xmax:-3:-9:-15
00039 
00040   const float BL[] = { 147.85, // W0 w/o FEM 3,9,15
00041                        155.23, // W1
00042                        142.10,   // W2
00043                        127.58, // W3
00044                        131.15, // E2
00045                        129.74  // E3
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 /* = std::cout */)
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 /* = 47.84 */ )
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 }