00001 #include "StEmcADCtoEMaker.h"
00002 #include "StEventTypes.h"
00003 #include "StEvent.h"
00004 #include "Stiostream.h"
00005 #include <math.h>
00006 #include "StEmcUtil/others/emcDetectorName.h"
00007 #include "StEmcUtil/geometry/StEmcGeom.h"
00008 #include "TStopwatch.h"
00009 #include "TString.h"
00010
00011 #include "StDaqLib/GENERIC/EventReader.hh"
00012 #include "StDaqLib/EMC/EMC_Reader.hh"
00013 #include "StDAQMaker/StDAQReader.h"
00014 #include "StDaqLib/EMC/StEmcDecoder.h"
00015 #include "StMessMgr.h"
00016 #include "StMuDSTMaker/COMMON/StMuDst.h"
00017 #include "StMuDSTMaker/COMMON/StMuDebug.h"
00018 #include "StMuDSTMaker/COMMON/StMuEmcUtil.h"
00019 #include "StMuDSTMaker/COMMON/StMuEvent.h"
00020 #include "StEnumerations.h"
00021
00022
00023 ClassImp(StEmcADCtoEMaker)
00024
00025
00026
00027
00028
00029 StEmcADCtoEMaker::StEmcADCtoEMaker(const char *name):StMaker(name)
00030 {
00031 mEvent = 0;
00032 mEmbed = kFALSE;
00033 mBemcData = new StBemcData();
00034 mBemcData->towerMapBug(kTRUE);
00035 mBemcData->psdMapBug2(kTRUE);
00036 mBemcData->smdMapBug(kTRUE);
00037 mBemcData->setCrateVeto(1);
00038
00039 StDetectorId bemcid = static_cast<StDetectorId>(kBarrelEmcTowerId);
00040 setCheckStatus(bemcid,1);
00041 StDetectorId bprsid = static_cast<StDetectorId>(kBarrelEmcPreShowerId);
00042 setCheckStatus(bprsid,1);
00043 StDetectorId bsmdeid = static_cast<StDetectorId>(kBarrelSmdEtaStripId);
00044 setCheckStatus(bsmdeid, 1);
00045 StDetectorId bsmdpid = static_cast<StDetectorId>(kBarrelSmdPhiStripId);
00046 setCheckStatus(bsmdpid, 1);
00047 }
00048
00052 StEmcADCtoEMaker::~StEmcADCtoEMaker()
00053 {}
00054
00059 Int_t StEmcADCtoEMaker::Init()
00060 {
00061 mBemcData->initHisto();
00062 mBemcData->printConf();
00063 return StMaker::Init();
00064 }
00065 Int_t StEmcADCtoEMaker::InitRun(Int_t run)
00066 {
00067
00068 LOG_INFO <<"Getting database tables for the BEMC detector "<<endm;
00069
00070 StMuDst* muDst = (StMuDst*)GetInputDS("MuDst");
00071 if(muDst)
00072 mBemcData->setProdVer(muDst->event()->runInfo().productionVersion().Data());
00073 else
00074 mBemcData->setProdVer("");
00075
00076 mBemcData->createDecoder(GetDate(),GetTime());
00077 mBemcData->getTables()->loadTables((StMaker*)this);
00078
00079 return StMaker::InitRun(run);
00080 }
00081
00085 Int_t StEmcADCtoEMaker::Finish()
00086 {
00087 return kStOk;
00088 }
00089
00093 Int_t StEmcADCtoEMaker::Make()
00094 {
00095 TStopwatch clock;
00096 clock.Start();
00097 LOG_DEBUG <<"StEmcADCtoEMaker::Make()******************************************************************"<<endm;
00098 mTestedCorruption = kFALSE;
00099 if(!prepareEnvironment())
00100 LOG_WARN <<"Could not prepare the proper environment"<<endm;
00101 if(!makeBemc())
00102 LOG_WARN <<"Could not make BEMC detector"<<endm;
00103 fillHistograms();
00104 clock.Stop();
00105 LOG_DEBUG <<"Time to run StEmcADCtoEMaker::Make() real = "<<clock.RealTime()<<" cpu = "<<clock.CpuTime()<<endm;
00106 LOG_DEBUG <<"*******************************************************************************************"<<endm;
00107
00108 return kStOK;
00109 }
00110
00114 Bool_t StEmcADCtoEMaker::prepareEnvironment()
00115 {
00116 mEvent = 0;
00117 LOG_DEBUG <<"Get StEvent pointer and make it ready for filling"<<endm;
00119
00120
00121 mEvent = (StEvent*)GetInputDS("StEvent");
00122 StEmcCollection *emc = NULL;
00123 mMyStEvent = kFALSE;
00124
00125 if(mEvent)
00126 emc = mEvent->emcCollection();
00127 else
00128 {
00129 mEvent = new StEvent();
00130 AddData(mEvent);
00131 emc = mEvent->emcCollection();
00132 mMyStEvent = kTRUE;
00133 }
00134 if(!emc)
00135 {
00136 emc = new StEmcCollection();
00137 mEvent->setEmcCollection(emc);
00138 }
00139 if(mMyStEvent)
00140 {
00141 StEmcRawData *BemcData = emc->bemcRawData();
00142 if(!BemcData)
00143 {
00144 BemcData = new StEmcRawData();
00145 emc->setBemcRawData(BemcData);
00146 }
00147 }
00148
00150
00151 return kTRUE;
00152 }
00153
00154
00158 Bool_t StEmcADCtoEMaker::makeBemc()
00159 {
00160 mBemcData->setDate(GetDate());
00161 mBemcData->getTables()->loadTables((StMaker*)this);
00162
00163
00164 TDataSet* TheData = GetDataSet("StDAQReader");
00165 if(TheData)
00166 {
00167 LOG_DEBUG <<"Copying EMC information from DAQ structure "<<endm;
00168 return mBemcData->make(TheData,mEvent);
00169 }
00170
00171 if(mEvent && !mMyStEvent)
00172 {
00173 StEmcCollection *emc = mEvent->emcCollection();
00174 if(emc)
00175 {
00176 LOG_DEBUG <<"Copying EMC information from StEmcCollection "<<endm;
00177 return mBemcData->make(emc,mEvent);
00178 }
00179 }
00180
00181
00182 StMuDst* muDst = (StMuDst*)GetInputDS("MuDst");
00183 if(muDst)
00184 {
00185 StMuEmcCollection *muEmc = muDst->muEmcCollection();
00186 if(muEmc)
00187 {
00188 LOG_DEBUG <<"Copying EMC information from StEmcCollection "<<endm;
00189 Bool_t ok = mBemcData->make(muEmc,mEvent);
00190 if(ok)
00191 {
00192 StEmcCollection *emc = mEvent->emcCollection();
00193 muDst->setEmcCollection(emc);
00194 }
00195 else
00196 muDst->setEmcCollection(NULL);
00197 return ok;
00198 }
00199 }
00200 return kFALSE;
00201 }
00202
00206 void StEmcADCtoEMaker::fillHistograms()
00207 {
00208 if(mBemcData)
00209 mBemcData->fillHisto();
00210 }
00211 void StEmcADCtoEMaker::setPrint(Bool_t a)
00212 {
00213 LOG_INFO << "::setPrint() is obsolete. Use logger config file to set verbosity instead." << endm;
00214 }
00215 void StEmcADCtoEMaker::printMap(Int_t detector,char*file)
00216 {
00217 if(!mBemcData->getDecoder())
00218 return;
00219 ofstream f(file);
00220 if(detector==BTOW)
00221 mBemcData->getDecoder()->PrintTowerMap(&f);
00222 if(detector==BPRS)
00223 mBemcData->getDecoder()->PrintPsdMap(&f);
00224 if(detector==BSMDE)
00225 mBemcData->getDecoder()->PrintSmdMap(&f);
00226 if(detector==BSMDP)
00227 mBemcData->getDecoder()->PrintSmdMap(&f);
00228 f.close();
00229 return;
00230 }
00231 StEmcCollection* StEmcADCtoEMaker::getEmcCollection()
00232 {
00233 if(mEvent)
00234 return mEvent->emcCollection();
00235 return 0;
00236 }
00237 Bool_t StEmcADCtoEMaker::isCorrupted()
00238 {
00239 if(!mTestedCorruption)
00240 testCorruption();
00241 return mIsCorrupted;
00242 }
00243 void StEmcADCtoEMaker::testCorruption()
00244 {
00245 mIsCorrupted = kFALSE;
00246 mTestedCorruption = kTRUE;
00247
00248 StEmcCollection *emc = mEvent->emcCollection();
00249 if(!emc)
00250 return;
00251
00252 StEmcDetector* det = emc->detector(kBarrelEmcTowerId);
00253 if(!det)
00254 {
00255 mIsCorrupted = kTRUE;
00256 return;
00257 }
00258
00259 Bool_t flagsAreOk = kFALSE;
00260
00261
00262 for(int crate = 1; crate<=MAXCRATES; crate++)
00263 {
00264 StEmcCrateStatus crateStatus = det->crateStatus(crate);
00265 if (crateStatus==crateHeaderCorrupt)
00266 mIsCorrupted = kTRUE;
00267 if (crateStatus==crateHeaderCorrupt || crateStatus==crateOK)
00268 flagsAreOk = kTRUE;
00269 }
00270 if(flagsAreOk)
00271 return;
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291 StBemcTables* tables = this->getBemcData()->getTables();
00292 StEmcGeom* geom = StEmcGeom::instance("bemc");
00293
00294 Int_t nModulesWithNoHits = 0;
00295 Int_t nModulesOff = 0;
00296
00297 for(UInt_t imod = 1; imod <= det->numberOfModules(); ++imod)
00298 {
00299 StEmcModule* module = det->module(imod);
00300 Int_t NADCZero = 0;
00301 StSPtrVecEmcRawHit& hits = module->hits();
00302 for(UInt_t i = 0;i<hits.size();i++)
00303 if(hits[i]->adc()==0)
00304 NADCZero++;
00305 if(NADCZero >=20)
00306 {
00307 nModulesWithNoHits += 1;
00308
00309 Int_t nTowersNoGood = 0;
00310 for(Int_t eta = 1; eta<=20; eta++)
00311 {
00312 for(Int_t sub = 1; sub<=2; sub++)
00313 {
00314 Int_t tower_id;
00315 geom->getId(imod, eta, sub, tower_id);
00316 Int_t status;
00317 tables->getStatus(BTOW, tower_id, status);
00318 if(status!=1)
00319 nTowersNoGood += 1;
00320 }
00321 }
00322 if(nTowersNoGood>=20)
00323 nModulesOff += 1;
00324 }
00325 }
00326 if(nModulesWithNoHits != nModulesOff)
00327 mIsCorrupted = kTRUE;
00328 return;
00329 }
00330
00331 void StEmcADCtoEMaker::setCheckStatus(StDetectorId det, int flag, const char* option)
00332 {
00333 mBemcData->setCheckStatus(det-kBarrelEmcTowerId, flag, option);
00334 return;
00335 }