00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127 #include "StBemcRaw.h"
00128 #include "Stiostream.h"
00129 #include "StEmcUtil/others/emcDetectorName.h"
00130 #include "StEmcUtil/geometry/StEmcGeom.h"
00131 #include "TString.h"
00132 #include "StEventTypes.h"
00133 #include "StEvent.h"
00134
00135 #include "StDaqLib/GENERIC/EventReader.hh"
00136 #include "StDaqLib/EMC/EMC_Reader.hh"
00137 #include "StDAQMaker/StDAQReader.h"
00138 #include "DAQ_READER/daq_det.h"
00139 #include "DAQ_BTOW/daq_btow.h"
00140 #include "DAQ_BSMD/daq_bsmd.h"
00141 #include "DAQ_ETOW/daq_etow.h"
00142 #include "DAQ_ESMD/daq_esmd.h"
00143 #include "DAQ_EMC/daq_emc.h"
00144 #include "StEmcUtil/database/StEmcDecoder.h"
00145 #include "StEmcRawMaker.h"
00146 #include "StMessMgr.h"
00147 #include "TGenericTable.h"
00148
00149 #include "StChain/StRtsTable.h"
00150
00151 ClassImp(StBemcRaw)
00152
00153
00154
00155
00156
00157 StBemcRaw::StBemcRaw():TObject()
00158 {
00159 mSaveAllStEvent = kFALSE;
00160 mPsdMapBug = kFALSE;
00161 mPsdMapBug2 = kFALSE;
00162 mTowerMapBug = kFALSE;
00163 mSmdMapBug = kFALSE;
00164 mProdVer = "";
00165 mDecoder = 0;
00166 mDate = 0;
00167 mTime = 0;
00168 mTables = new StBemcTables();
00169 mControlADCtoE = new controlADCtoE_st();
00170 Int_t calib[] = {1, 1, 1, 1, 0, 0, 0, 0};
00171 Int_t pedSub[] = {1, 0, 0, 0, 0, 0, 0, 0};
00172 Float_t cut[] = {-1, -1, 1.5, 1.5, -1, -1, -1, -1};
00173
00174
00175 Int_t cutType[] = {0, 1, 1, 1, 0, 0, 0, 0};
00176 Int_t onlyCal[] = {0, 0, 0, 0, 0, 0, 0, 0};
00177 Int_t status[] = {0, 0, 0, 0, 0, 0, 0, 0};
00178 Int_t crate[] = {1, 1, 1, 1, 0, 0, 0, 0};
00179
00180 mCrateVeto = 0;
00181 mAnyCorrupted = kFALSE;
00182
00183 for(Int_t i=0; i<MAXDETBARREL; i++)
00184 {
00185 mControlADCtoE->Calibration[i]=calib[i];
00186 mControlADCtoE->DeductPedestal[i]=pedSub[i];
00187 mControlADCtoE->CutOff[i]=cut[i];
00188 mControlADCtoE->CutOffType[i]=cutType[i];
00189 mControlADCtoE->OnlyCalibrated[i]=onlyCal[i];
00190 mControlADCtoE->CheckStatus[i]=status[i];
00191 mControlADCtoE->CheckCrate[i]=crate[i];
00192 mBarrelQAHisto[i] = 0;
00193 for(int j = 0; j < 4; j++){
00194 mCheckStatus[i][j]=0;
00195 }
00196 }
00197 assert(mControlADCtoE->CutOffType[2]==mControlADCtoE->CutOffType[3]);
00198
00199 }
00200
00204 StBemcRaw::~StBemcRaw()
00205 {
00206 if(mTables)
00207 delete mTables;
00208 if(mDecoder)
00209 delete mDecoder;
00210 if(mControlADCtoE)
00211 delete mControlADCtoE;
00212 }
00213 void StBemcRaw::printConf()
00214 {
00215 LOG_INFO <<"Configuration for BEMC hit reconstruction "<<endm;
00216 for(Int_t i=0;i<MAXDETBARREL;i++)
00217 {
00218 LOG_INFO <<" Configuration for detector "<<detname[i].Data()<<endm;
00219 LOG_INFO <<" switch for deducting pedestal = "<<mControlADCtoE->DeductPedestal[i]<<endm;
00220 LOG_INFO <<" switch for calibration = "<<mControlADCtoE->Calibration[i]<<endm;
00221 LOG_INFO <<" cutoff type = "<<mControlADCtoE->CutOffType[i]<<endm;
00222 LOG_INFO <<" cutoff value = "<<mControlADCtoE->CutOff[i]<<endm;
00223 LOG_INFO <<" save only calibrated hits = "<<mControlADCtoE->OnlyCalibrated[i]<<endm;
00224 LOG_INFO <<" save only if status is ok = "<<mControlADCtoE->CheckStatus[i]<<endm;
00225 LOG_INFO <<" save only if crate is ok = "<<mControlADCtoE->CheckCrate[i]<<endm;
00226 LOG_INFO <<" SAVE ALL FLAG (overwrites above) = "<<(Int_t)mSaveAllStEvent<<endm;
00227 }
00228 }
00229 void StBemcRaw::createDecoder(Int_t date, Int_t time)
00230 {
00231 if(mDecoder)
00232 delete mDecoder;
00233 mDecoder = new StEmcDecoder(date,time);
00234 mDate = date;
00235 mTime = time;
00236 }
00237 void StBemcRaw::initHisto()
00238 {
00239 mBarrelNHitHist = new TH2F("BarrelNHit","BarrelNHit",500,0.0,18000.0,4,0.5,4.5);
00240 mBarrelEtotHist = new TH2F("BarrelEtot","BarrelEtot",500,0.0,10000.0,4,0.5,4.5);
00241 mBarrelAdcSumHist = new TH2F("BarrelAdcSum","BarrelAdcSum",500,0.0,1000000.0,4,0.5,4.5);
00242 mBarrelNCratesHist = new TH2F("BarrelNCrates","BarrelNCrates",31,0.0,31.0,4,0.5,4.5);
00243 mBarrelCrateStatusHist = new TH2F("BarrelCrateStatus","BarrelCrateStatus",6,-0.5,5.5,30,0.5,30.5);
00244 }
00245 void StBemcRaw::initQAHisto()
00246 {
00247 for(Int_t det = 1;det<=MAXDETBARREL; det++)
00248 {
00249 Int_t N = BTOWCH;
00250 if(det>2)
00251 N= BSMDCH;
00252 mBarrelQAHisto[det-1] = new TH2F(detname[det-1].Data(),detname[det-1].Data(),N,0.5,(Float_t)N+0.5,250,-0.5,249.5);
00253 }
00254 }
00255 void StBemcRaw::fillHisto()
00256 {
00257 for(Int_t det = 1;det<=MAXDETBARREL; det++)
00258 {
00259 mBarrelNHitHist->Fill(getTotalSaved(det),det);
00260 mBarrelEtotHist->Fill(getTotalE(det),det);
00261 mBarrelAdcSumHist->Fill(getTotalADC(det),det);
00262 mBarrelNCratesHist->Fill(getNCratesOK(det),det);
00263 }
00264 for(Int_t crate = 1;crate<=MAXCRATES; crate++)
00265 {
00266 mBarrelCrateStatusHist->Fill(getCrateStatus(BTOW,crate),crate);
00267 }
00268 }
00269 Bool_t StBemcRaw::make(StEmcRawMaker * TheData, StEvent* event)
00270 {
00271 if(!TheData)
00272 return kFALSE;
00273 if(!event)
00274 return kFALSE;
00275 StEmcCollection* emc = event->emcCollection();
00276 if(!emc)
00277 return kFALSE;
00278 StEmcRawData *bemcRaw = emc->bemcRawData();
00279 if(!bemcRaw)
00280 return kFALSE;
00281 if(!convertFromDaq(TheData,bemcRaw))
00282 return kFALSE;
00283 return make(bemcRaw,event);
00284 }
00285 Bool_t StBemcRaw::convertFromDaq(StEmcRawMaker * DAQ, StEmcRawData* RAW)
00286 {
00287 if(!DAQ)
00288 {
00289 LOG_ERROR <<"Could not find DAQ DataSet "<<endm;
00290 return kFALSE;
00291 }
00292 if(!RAW)
00293 {
00294 LOG_ERROR <<"Could not find StEmcRawData pointer for BEMC"<<endm;
00295 return kFALSE;
00296 }
00297
00298 StRtsTable* btow = DAQ->GetDaqElement("btow/adc");
00299 if(btow){
00300 btow_t* btowdata = (btow_t*)*btow->begin();
00301 if(RAW->header(BTOWBANK))
00302 RAW->deleteBank(BTOWBANK);
00303 RAW->createBank(0,BTOWHEADER,BTOWSIZE);
00304
00305 for(int i = 0; i < BTOW_MAXFEE; i++){
00306 for(int j = 0; j < BTOW_DATSIZE; j++){
00307 int id = -1;
00308 int daqid = -1;
00309 mDecoder->GetTowerIdFromTDC(i,j,id);
00310 mDecoder->GetDaqIdFromTowerId(id,daqid);
00311
00312 RAW->setData(BTOWBANK,daqid,btowdata->adc[i][j]);
00313 }
00314 for(int j = 0; j < BTOW_PRESIZE; j++){
00315 RAW->setHeader(BTOWBANK,i+j*30,btowdata->preamble[i][j]);
00316 int crate;
00317 mDecoder->GetTowerCrateFromTDC(i,crate);
00318
00319 }
00320 }
00321 }else{
00322 LOG_ERROR<<"BTOW Structure not found"<<endm;
00323 }
00324
00325 while(DAQ->GetDaqElement("bsmd/adc")){
00326 if(mDate < 20081101)continue;
00327 int rdo = DAQ->Rdo();
00328 int use = 0;
00329 if(rdo < 9 && mControlADCtoE->CutOffType[2])use=1;
00330 if(rdo >=9 && mControlADCtoE->CutOffType[1])use=1;
00331 bsmd_t* bsmddata = (bsmd_t*)*DAQ->Dta()->begin();
00332 if(use){
00333 if(RAW->header(rdo))
00334 RAW->deleteBank(rdo);
00335 RAW->createBank(rdo,1,BSMD_DATSIZE);
00336 RAW->setHeader(rdo,0,(unsigned short)bsmddata->cap);
00337 for(int j = 0; j < BSMD_DATSIZE; j++){
00338 RAW->setData(rdo,j,bsmddata->adc[j]);
00339 }
00340 }
00341 }
00342
00343 while(DAQ->GetDaqElement("bsmd/adc_non_zs")){
00344 int rdo = DAQ->Rdo();
00345 int use = 0;
00346 if((rdo < 9 && !mControlADCtoE->CutOffType[2]) || mDate < 20081101)use=1;
00347 if((rdo >= 9 && !mControlADCtoE->CutOffType[1]) || mDate < 20081101)use=1;
00348 if(use){
00349
00350 bsmd_t* bsmddata = (bsmd_t*)*DAQ->Dta()->begin();
00351 if(RAW->header(rdo))
00352 RAW->deleteBank(rdo);
00353 RAW->createBank(rdo,1,BSMD_DATSIZE);
00354 RAW->setHeader(rdo,0,(unsigned short)bsmddata->cap);
00355
00356 for(int j = 0; j < BSMD_DATSIZE; j++){
00357 RAW->setData(rdo,j,bsmddata->adc[j]);
00358
00359 }
00360 }
00361 }
00362 return kTRUE;
00363 }
00364
00365 Bool_t StBemcRaw::make(StEmcRawData* bemcRaw, StEvent* event)
00366 {
00367 if(!bemcRaw)
00368 return kFALSE;
00369 if(!event)
00370 return kFALSE;
00371 StEmcCollection* emc = event->emcCollection();
00372 if(!emc)
00373 return kFALSE;
00374
00375 checkHeaders(bemcRaw, event);
00376 emptyEmcCollection(emc);
00377
00378 Int_t cap=0,crate=0;
00379 Int_t ADC=0;
00380 Float_t E=0;
00381
00382 for(Int_t det = 1; det<=MAXDETBARREL; det++)
00383 {
00384 Int_t nch = BTOWCH;
00385 if(det>2)
00386 nch=BSMDCH;
00387
00388 clearStats(det);
00389 for(Int_t id = 1; id<=nch; id++)
00390 {
00391 ADC = getBemcADCRaw(det,id,bemcRaw,crate,cap);
00392 Int_t S = makeHit(emc,det,id,ADC,crate,cap,E);
00393 updateStats(det,S,ADC,E);
00394 }
00395 printStats(det);
00396 StDetectorId did = static_cast<StDetectorId>(det+kBarrelEmcTowerId-1);
00397 StEmcDetector* detector=emc->detector(did);
00398 if(detector)
00399 {
00400 for(Int_t crate = 1;crate<=MAXCRATES;crate++)
00401 detector->setCrateStatus(crate,(StEmcCrateStatus)mCrateStatus[det-1][crate-1]);
00402 }
00403 }
00404
00405 return kTRUE;
00406 }
00407
00408 void StBemcRaw::checkHeaders(StEmcRawData* RAW, StEvent* event)
00409 {
00410 for(Int_t det=1;det<=MAXDETBARREL; det++)
00411 {
00412 for(Int_t crate = 1; crate<=MAXCRATES;crate++)
00413 mCrateStatus[det-1][crate-1] = crateUnknown;
00414 mIsCorrupted[det-1] = kFALSE;
00415 }
00416 checkBtowCrates(RAW,event);
00417
00418 mNCRATESOK[BPRS-1]=mNCRATESOK[BSMDE-1]=mNCRATESOK[BSMDP-1]=0;
00419
00420 for(Int_t i = 0; i<MAXSMDCRATES; i++)
00421 {
00422 UShort_t *header = RAW->header(i+BSMDOFFSET);
00423 if(header)
00424 {
00425 mCrateStatus[BSMDE-1][i] = crateOK;
00426 mCrateStatus[BSMDP-1][i] = crateOK;
00427 mNCRATESOK[BSMDE-1]++;
00428 mNCRATESOK[BSMDP-1]++;
00429 }
00430 }
00431
00432 for(Int_t i = 0; i<MAXBPRSCRATES; i++)
00433 {
00434 UShort_t *header = RAW->header(i+BPRSOFFSET);
00435 if(header)
00436 {
00437 mCrateStatus[BPRS-1][i] = crateOK;
00438 mNCRATESOK[BPRS-1]++;
00439 }
00440 }
00441 for(Int_t i = 0; i < MAXDETBARREL; i++){
00442 if(mIsCorrupted[i])mAnyCorrupted = kTRUE;
00443 }
00444 }
00445 void StBemcRaw::emptyEmcCollection(StEmcCollection *emc)
00446 {
00447 if(!emc)
00448 return;
00449 StSPtrVecEmcPoint& pvec = emc->barrelPoints();
00450 if(pvec.size()>0)
00451 pvec.clear();
00452
00453 for(Int_t i=0; i<MAXDETBARREL; i++)
00454 {
00455 StDetectorId id = static_cast<StDetectorId>(i+kBarrelEmcTowerId);
00456 StEmcDetector* detector=emc->detector(id);
00457 if(detector)
00458 {
00459 if(detector->cluster())
00460 {
00461 StSPtrVecEmcCluster& cluster=detector->cluster()->clusters();
00462 if(cluster.size()>0)
00463 cluster.clear();
00464 }
00465 for(UInt_t j=1;j<=detector->numberOfModules() ;j++)
00466 {
00467 StEmcModule *module = detector->module(j);
00468 if(module)
00469 {
00470 StSPtrVecEmcRawHit& hits=module->hits();
00471 hits.clear();
00472 }
00473 }
00474 }
00475 }
00476 return;
00477 }
00478
00482 void StBemcRaw::checkBtowCrates(StEmcRawData* RAW, StEvent* event)
00483 {
00484 if(!RAW)
00485 return;
00486 if(!mDecoder)
00487 return;
00488 UShort_t *header = RAW->header(BTOWBANK);
00489 if(!header)
00490 return;
00491 mNCRATESOK[0] = 0;
00492 int trgtoken = event->l0Trigger()->triggerToken();
00493 for(Int_t crate = 1;crate<=MAXCRATES;crate++)
00494 {
00495 Int_t TDC;
00496 mDecoder->GetTowerTDCFromCrate(crate,TDC);
00497 Int_t sum = header[TDC];
00498 Int_t token = header[TDC+BTOWTOKENOFFSET];
00499 Int_t err = header[TDC+BTOWTDCERROFFSET];
00500 Int_t crateFromHeader = header[TDC+BTOWCRATEOFFSET]& 0x0FF;
00501 mCrateStatus[BTOW-1][crate-1] = crateUnknown;
00502 if(sum==BTOWBYTESUM && err == BTOWERRFLAG && crate==crateFromHeader && token == trgtoken)
00503 mCrateStatus[BTOW-1][crate-1] = crateOK;
00504 else
00505 mCrateStatus[BTOW-1][crate-1] = crateHeaderCorrupt;
00506
00507 if(sum==BTOWNOTPRESENT && err == BTOWNOTPRESENT)
00508 mCrateStatus[BTOW-1][crate-1] = crateNotPresent;
00509
00510 if(mCrateStatus[BTOW-1][crate-1]==crateOK)
00511 mNCRATESOK[BTOW-1]++;
00512
00513 if(mCrateStatus[BTOW-1][crate-1]==crateHeaderCorrupt)
00514 mIsCorrupted[BTOW-1] = kTRUE;
00515 }
00516 return;
00517 }
00518 void StBemcRaw::clearStats(Int_t det)
00519 {
00520 mNZ[det-1] = 0;
00521 mNCRATE[det-1] = 0;
00522 mNSTATUS[det-1] = 0;
00523 mNRMS[det-1] = 0;
00524 mNPED[det-1] = 0;
00525 mNOK[det-1] = 0;
00526 mNTOTAL[det-1] = 0;
00527 mADCSUM[det-1] = 0;
00528 mTOTALE[det-1] = 0;
00529 }
00530 void StBemcRaw::updateStats(Int_t det,Int_t S,Int_t ADC, Float_t E)
00531 {
00532 if(S==kZero)
00533 mNZ[det-1]++;
00534 else if(S==kCrate)
00535 mNCRATE[det-1]++;
00536 else if(S==kStatus)
00537 mNSTATUS[det-1]++;
00538 else if(S==kRms)
00539 mNRMS[det-1]++;
00540 else if(S==kPed)
00541 mNPED[det-1]++;
00542 else if(S==kOK)
00543 mNOK[det-1]++;
00544 mNTOTAL[det-1]++;
00545 if(S==kOK)
00546 {
00547 mADCSUM[det-1]+=ADC;
00548 mTOTALE[det-1]+=E;
00549 }
00550 }
00551 void StBemcRaw::printStats(Int_t det)
00552 {
00553 LOG_DEBUG <<"Statistics for detector "<<detname[det-1].Data()<<endm;
00554 LOG_DEBUG <<" Total number of crates with header ok = "<<mNCRATESOK[det-1]<<endm;
00555 LOG_DEBUG <<" Total number of hits = "<<mNTOTAL[det-1]<<endm;
00556 LOG_DEBUG <<" Total hits removed because of crates = "<<mNCRATE[det-1]<<endm;
00557 LOG_DEBUG <<" Total hits removed because ADC = 0 = "<<mNZ[det-1]<<endm;
00558 LOG_DEBUG <<" Total hits removed by Pedestal = "<<mNPED[det-1]+mNRMS[det-1]<<endm;
00559 LOG_DEBUG <<" Total hits removed by Status = "<<mNSTATUS[det-1]<<endm;
00560 LOG_DEBUG <<" Total number of hits saved = "<<mNOK[det-1]<<endm;
00561 LOG_DEBUG <<" Total ADCSUM of valid hits = "<<mADCSUM[det-1]<<endm;
00562 LOG_DEBUG <<" Total Energy of valid hits = "<<mTOTALE[det-1]<<endm;
00563 }
00564
00568 Int_t StBemcRaw::getBemcADCRaw(Int_t det, Int_t softId, StEmcRawData* RAW, Int_t& CRATE, Int_t& CAP)
00569 {
00570 CAP = 0;
00571 CRATE = 0;
00572 if(!RAW)
00573 {
00574 LOG_WARN <<"Could not find StEmcRawData pointer for BEMC det: " << det << " softId: " << softId <<endm;
00575 return 0;
00576 }
00577 if(!mDecoder)
00578 {
00579 LOG_WARN <<"Could not find StEmcDecoder pointer for BEMC det: " << det << " softId: " << softId <<endm;
00580 return 0;
00581 }
00582 if(det==BTOW)
00583 {
00584 Int_t daq;
00585 if(mDecoder->GetDaqIdFromTowerId(softId,daq)==1 && RAW->header(BTOWBANK))
00586 {
00587 Int_t CR,INDEX;
00588 mDecoder->GetTowerCrateFromDaqId(daq,CR,INDEX);
00589 CRATE = CR;
00590 CAP = 0;
00591 return RAW->data(BTOWBANK,daq);
00592 }
00593 return 0;
00594 }
00595 else if(det==BPRS)
00596 {
00597 Int_t RDO=0,index=0;
00598 Int_t S = mDecoder->GetPsdRDO(softId,RDO,index);
00599 CRATE = RDO+1;
00600
00601 if(RDO<0 || RDO>=MAXBPRSCRATES)
00602 return 0;
00603 if(S==1 && RAW->header(RDO+BPRSOFFSET))
00604 {
00605 if(mDate < 20081101)CAP = RAW->header(RDO+BPRSOFFSET,SMDCAPACITOR);
00606 else CAP = RAW->header(RDO+BPRSOFFSET,0);
00607 while(CAP>127)
00608 CAP-=128;
00609 return RAW->data(RDO+BPRSOFFSET,index);
00610 }
00611 return 0;
00612 }
00613 else if(det==BSMDE)
00614 {
00615 StEmcGeom *geo = StEmcGeom::instance("bsmde");
00616 Int_t m=0,e=0,s=0;
00617 if(geo->getBin(softId,m,e,s)==1)
00618 return 0;
00619 Int_t RDO=0,index=0;
00620 Int_t S = mDecoder->GetSmdRDO(BSMDE,m,e,s,RDO,index);
00621 CRATE = RDO+1;
00622 if(S==1 && RAW->header(RDO+BSMDOFFSET) && RDO>=0 && RDO<MAXSMDCRATES)
00623 {
00624 if(mDate < 20081101)CAP = RAW->header(RDO+BSMDOFFSET,SMDCAPACITOR);
00625 else CAP = RAW->header(RDO+BSMDOFFSET,0);
00626 while(CAP>127)
00627 CAP-=128;
00628 return RAW->data(RDO+BSMDOFFSET,index);
00629 }
00630 return 0;
00631 }
00632 else if(det==BSMDP)
00633 {
00634 StEmcGeom *geo = StEmcGeom::instance("bsmdp");
00635 Int_t m=0,e=0,s=0;
00636 if(geo->getBin(softId,m,e,s)==1)
00637 return 0;
00638 Int_t RDO=0,index=0;
00639 Int_t S = mDecoder->GetSmdRDO(BSMDP,m,e,s,RDO,index);
00640 CRATE = RDO+1;
00641 if(S==1 && RAW->header(RDO+BSMDOFFSET) && RDO>=0 && RDO<MAXSMDCRATES)
00642 {
00643 if(mDate < 20081101)CAP = RAW->header(RDO+BSMDOFFSET,SMDCAPACITOR);
00644 else CAP = RAW->header(RDO+BSMDOFFSET,0);
00645 while(CAP>127)
00646 CAP-=128;
00647 return RAW->data(RDO+BSMDOFFSET,index);
00648 }
00649 return 0;
00650 }
00651 return 0;
00652 }
00653
00658 Int_t StBemcRaw::makeHit(StEmcCollection* emc, Int_t det, Int_t id, Int_t ADC, Int_t CRATE, Int_t CAP,Float_t& E)
00659 {
00660 E=0;
00661
00662 if(det==BTOW && mTowerMapBug && mDate<20060101)
00663 {
00664 Int_t shift = 0;
00665 mDecoder->GetTowerBugCorrectionShift(id,shift);
00666 id+=shift;
00667 }
00668 if(det==BPRS && mPsdMapBug2 && mDate<20071101)
00669 {
00670 Int_t shift = 0;
00671 mDecoder->GetPreshowerBugCorrectionShift(id,shift);
00672 id+=shift;
00673 }
00674 if(det==BSMDE && mSmdMapBug && mDate>=20100101 && mDate<20110101 && (!mProdVer.compare("SL10h") || !mProdVer.compare("SL10i") || !mProdVer.compare("SL10j")))
00675 {
00676 Int_t shift = 0;
00677 mDecoder->GetSmdBugCorrectionShift(id,shift);
00678 if(id+shift < 0) return kZero;
00679 id+=shift;
00680 }
00681 if(CRATE>0 && CRATE<=MAXCRATES && mControlADCtoE->CheckCrate[det-1]==1)
00682 if((mCrateStatus[det-1][CRATE-1]!=crateOK &&
00683 mCrateStatus[det-1][CRATE-1]!=crateUnknown) &&
00684 !mSaveAllStEvent)
00685 return kCrate;
00686
00687 if(!mSaveAllStEvent && mCrateVeto && mAnyCorrupted)
00688 return kCrate;
00689
00690 if(ADC==0 && !mSaveAllStEvent)
00691 return kZero;
00692
00693 if(mControlADCtoE->CheckStatus[det-1]==1)
00694 {
00695 if(mCheckStatus[det-1][0]==1 && !mSaveAllStEvent){
00696 Int_t STATUS;
00697 mTables->getStatus(det,id,STATUS);
00698 if(STATUS!=STATUS_OK && !mSaveAllStEvent)
00699 return kStatus;
00700 }
00701 if(mCheckStatus[det-1][1]==1 && !mSaveAllStEvent){
00702 Int_t pedSTATUS;
00703 mTables->getStatus(det,id,pedSTATUS,"pedestal");
00704 if(pedSTATUS!=STATUS_OK && !mSaveAllStEvent)return kStatus;
00705 }
00706 if(mCheckStatus[det-1][2]==1 && !mSaveAllStEvent){
00707 Int_t calibSTATUS;
00708 mTables->getStatus(det,id,calibSTATUS,"calib");
00709 if(calibSTATUS!=STATUS_OK && !mSaveAllStEvent)return kStatus;
00710 }
00711 if(mCheckStatus[det-1][3]==1 && !mSaveAllStEvent){
00712 Int_t gainSTATUS;
00713 mTables->getStatus(det,id,gainSTATUS,"gain");
00714 if(gainSTATUS!=STATUS_OK && !mSaveAllStEvent)return kStatus;
00715 }
00716
00717 }
00718
00719 Float_t PEDESTAL = 0,RMS = 0;
00720 mTables->getPedestal(det,id,CAP,PEDESTAL,RMS);
00721
00722 if(mControlADCtoE->DeductPedestal[det-1]>0)
00723 {
00724
00725
00726
00727 if(mControlADCtoE->DeductPedestal[det-1]==1)
00728 if(det>=BPRS && !mSaveAllStEvent)
00729 if(CAP==CAP1 || CAP==CAP2)
00730 return kPed;
00731 }
00732
00733 if(mControlADCtoE->CutOffType[det-1]==1 && !mSaveAllStEvent && mControlADCtoE->DeductPedestal[det-1] > 0)
00734 {
00735 if(RMS<=0)
00736 return kRms;
00737 Float_t x = (ADC-PEDESTAL)/RMS;
00738 if(x<=mControlADCtoE->CutOff[det-1])
00739 return kPed;
00740 }
00741
00742 if(mControlADCtoE->Calibration[det-1]==1)
00743 {
00744 Float_t ADCP = 1;
00745 Float_t C;
00746 for(Int_t i=0;i<5;i++)
00747 {
00748 mTables->getCalib(det,id,i,C);
00749 E+=ADCP*C;
00750 ADCP*=(Float_t)(ADC-PEDESTAL);
00751 }
00752 mTables->getGain(det,id,C);
00753 E*=C;
00754
00755 if(mControlADCtoE->CutOffType[det-1]==2 && !mSaveAllStEvent)
00756 {
00757 if(E<mControlADCtoE->CutOff[det-1])
00758 return kEn;
00759 }
00760 }
00761
00762 if(mControlADCtoE->OnlyCalibrated[det-1]>0 && E==0 && !mSaveAllStEvent)
00763 return kCalib;
00764
00765 StDetectorId did = static_cast<StDetectorId>(det+kBarrelEmcTowerId-1);
00766 StEmcDetector* detector=emc->detector(did);
00767 StEmcGeom *geo = StEmcGeom::instance(det);
00768 if(!detector)
00769 {
00770 detector = new StEmcDetector(did,BEMCMODULES);
00771 emc->setDetector(detector);
00772 }
00773 if(det==BPRS && mPsdMapBug && mDate<20060101)
00774 {
00775 Int_t PsdOffset_bug[40] = {20,21,22,23,0,1,2,3,24,25,26,27,4,5,6,7,28,29,30,31,
00776 8,9,10,11,32,33,34,35,12,13,14,15,36,37,38,39,16,17,18,19};
00777 Int_t PsdOffset_ok[40] = {36,37,38,39,16,17,18,19,32,33,34,35,12,13,14,15,28,29,30,31,
00778 8,9,10,11,24,25,26,27,4,5,6,7,20,21,22,23,0,1,2,3};
00779 Int_t RDO,index,PMT,wire,A_value;
00780 mDecoder->GetPsdRDO(id,RDO,index);
00781 mDecoder->GetPsdId(RDO,index,id,PMT,wire,A_value);
00782
00783 id-=PsdOffset_bug[wire-1];
00784 id+=PsdOffset_ok[wire-1];
00785
00786 }
00787 Int_t m,e,s;
00788 geo->getBin(id,m,e,s);
00789 StEmcRawHit* hit=new StEmcRawHit(did,m,e,s,(UInt_t)ADC);
00790 if(mBarrelQAHisto[det-1] && !isCorrupted(det))
00791 mBarrelQAHisto[det-1]->Fill((Float_t)id,(Float_t)ADC);
00792 hit->setEnergy(E);
00793 hit->setCalibrationType(CAP);
00794 detector->addHit(hit);
00795 return kOK;
00796 }
00797
00798 void StBemcRaw::setCheckStatus(Int_t det, Int_t flag, const char* option)
00799 {
00800
00801 if(!strcmp(option,"status")){
00802 mCheckStatus[det][0]=flag;
00803 return;
00804 }
00805 if(!strcmp(option,"pedestal")){
00806 mCheckStatus[det][1]=flag;
00807 return;
00808 }
00809 if(!strcmp(option,"calib")){
00810 mCheckStatus[det][2]=flag;
00811 return;
00812 }
00813 if(!strcmp(option,"gain")){
00814 mCheckStatus[det][3]=flag;
00815 return;
00816 }
00817
00818 if(strcmp(option,"")){
00819 LOG_WARN<<option<<" is not a valid option to setCheckStatus"<<endm;
00820 return;
00821 }
00822
00823
00824 for(int i = 0; i < 4; i++){
00825 mCheckStatus[det][i]=flag;
00826 }
00827
00828 getControlTable()->CheckStatus[det] = flag;
00829 return;
00830
00831 }
00832 void StBemcRaw::setCrateVeto(Int_t flag)
00833 {
00834 if(flag != 0 && flag != 1){
00835 LOG_ERROR<<"Invalid flag passed to StBemcRaw::setCrateVeto, only 0 and 1 accepted"<<endm;
00836 return;
00837 }
00838 mCrateVeto = flag;
00839 }
00840 Bool_t StBemcRaw::make(TDataSet* TheData, StEvent* event)
00841 {
00842 LOG_WARN<<"StBemcRaw::make(TDataSet*,StEvent*) is OBSOLETE for data in Run 9 or later"<<endm;
00843 if(!TheData)
00844 return kFALSE;
00845 if(!event)
00846 return kFALSE;
00847 StEmcCollection* emc = event->emcCollection();
00848 if(!emc)
00849 return kFALSE;
00850 StEmcRawData *bemcRaw = emc->bemcRawData();
00851 if(!bemcRaw)
00852 return kFALSE;
00853 if(!convertFromDaq(TheData,bemcRaw))
00854 return kFALSE;
00855 return make(bemcRaw,event);
00856 }
00857 Bool_t StBemcRaw::convertFromDaq(TDataSet* DAQ, StEmcRawData* RAW)
00858 {
00859 LOG_WARN<<"StBemcRaw::convertFromDaq(TDataSet*,StEmcRawData*) is OBSOLETE for data in Run 9 or later"<<endm;
00860 if(!DAQ)
00861 {
00862 LOG_ERROR <<"Could not find DAQ DataSet "<<endm;
00863 return kFALSE;
00864 }
00865 if(!RAW)
00866 {
00867 LOG_ERROR <<"Could not find StEmcRawData pointer for BEMC"<<endm;
00868 return kFALSE;
00869 }
00870
00871 StDAQReader* TheDataReader=(StDAQReader*)(DAQ->GetObject());
00872 if(!TheDataReader || !TheDataReader->EMCPresent())
00873 {
00874 LOG_ERROR <<"Data Reader is not present "<<endm;
00875 return kFALSE;
00876 }
00877
00878 StEMCReader* TheEmcReader=TheDataReader->getEMCReader();
00879 if(!TheEmcReader)
00880 {
00881 LOG_ERROR <<"Could not find BEMC Reader "<<endm;
00882 return kFALSE;
00883 }
00884
00885 EMC_Reader* reader = TheEmcReader->getBemcReader();
00886 if(!reader)
00887 {
00888 LOG_ERROR <<"Could not find Barrel Reader "<<endm;
00889 return kFALSE;
00890 }
00891
00892 if(reader->isTowerPresent())
00893 {
00894 Bank_BTOWERADCR& tower = reader->getBTOWERADCR();
00895 if(RAW->header(BTOWBANK))
00896 RAW->deleteBank(BTOWBANK);
00897 RAW->createBank(0,BTOWHEADER,BTOWSIZE);
00898 for(Int_t i = 0; i<BTOWSIZE ;i++){
00899 int crate,sequence,tdc;
00900 int id;
00901 mDecoder->GetTowerIdFromDaqId(i,id);
00902 mDecoder->GetCrateFromTowerId(id,crate,sequence);
00903 mDecoder->GetTDCFromTowerId(id,tdc);
00904 RAW->setData(BTOWBANK,i,tower.TowerADCArray[i]);
00905
00906 }
00907 for(Int_t i = 0; i<BTOWHEADER ;i++){
00908 RAW->setHeader(BTOWBANK,i,tower.TDCHeader[i]);
00909
00910 }
00911 }
00912
00913 if(reader->isSmdPresent())
00914 {
00915 Bank_BSMDADCR& smd = reader->getSMD_ADCR();
00916 Int_t NSMD = MAXSMDCRATES;
00917
00918
00919
00920
00921 if(mDate<20040701)
00922 NSMD = 4;
00923
00924 for(Int_t i = 0; i<NSMD; i++)
00925 {
00926 if(smd.HasData[i]==1)
00927 {
00928 Int_t bank = i+BSMDOFFSET;
00929 if(RAW->header(bank))
00930 RAW->deleteBank(bank);
00931 RAW->createBank(bank,BSMDHEADER,BSMDSIZE);
00932 for(Int_t j=0; j<BSMDHEADER; j++)
00933 RAW->setHeader(bank,j,smd.SmdHeader[i][j]);
00934
00935
00936 for(Int_t j=0; j<BSMDSIZE; j++){
00937 RAW->setData(bank,j,smd.SMDADCArray[i][j]);
00938
00939 }
00940 }
00941 }
00943
00944
00945
00946
00947
00948
00949
00950
00951
00952
00953
00954 if(mDate>20040101)
00955 {
00956 for(Int_t RDO = 0; RDO<4; RDO++)
00957 {
00958 Int_t SMDRDO = RDO+NSMD;
00959 if(smd.HasData[SMDRDO]==1)
00960 {
00961 Int_t bank = RDO+BPRSOFFSET;
00962 if(RAW->header(bank))
00963 RAW->deleteBank(bank);
00964 RAW->createBank(bank,BPRSHEADER,BPRSSIZE);
00965 for(Int_t i = 0; i<BPRSHEADER; i++)
00966 RAW->setHeader(bank,i,smd.SmdHeader[SMDRDO][i]);
00967
00968
00969 for(Int_t i = 0; i<BPRSSIZE; i++){
00970 RAW->setData(bank,i,smd.SMDADCArray[SMDRDO][i]);
00971
00972 }
00973 }
00974 }
00975 }
00977 }
00978 return kTRUE;
00979 }