00001 #include "StBemcData.h"
00002 #include "StEmcUtil/database/StEmcDecoder.h"
00003 #include "StEmcUtil/geometry/StEmcGeom.h"
00004 #include "StEventTypes.h"
00005 #include "StEvent.h"
00006 #include "StMuDSTMaker/COMMON/StMuDstMaker.h"
00007 #include "StMuDSTMaker/COMMON/StMuDst.h"
00008
00009 ClassImp(StBemcData)
00010
00011
00012
00013
00014
00015 StBemcData::StBemcData():StBemcRaw()
00016 {
00017 Int_t calib[] = {1, 1, 1, 1, 0, 0, 0, 0};
00018 Int_t pedSub[] = {1, 1, 1, 1, 0, 0, 0, 0};
00019 Float_t cut[] = {-1, 1.5, 1.5, 1.5, -1, -1, -1, -1};
00020 Int_t cutType[] = {0, 1, 1, 1, 0, 0, 0, 0};
00021 Int_t onlyCal[] = {0, 0, 0, 0, 0, 0, 0, 0};
00022 Int_t status[] = {1, 1, 1, 1, 0, 0, 0, 0};
00023 Int_t crate[] = {1, 1, 1, 1, 0, 0, 0, 0};
00024
00025 for(Int_t i=0; i<MAXDETBARREL; i++)
00026 {
00027 mControlADCtoE->Calibration[i]=calib[i];
00028 mControlADCtoE->DeductPedestal[i]=pedSub[i];
00029 mControlADCtoE->CutOff[i]=cut[i];
00030 mControlADCtoE->CutOffType[i]=cutType[i];
00031 mControlADCtoE->OnlyCalibrated[i]=onlyCal[i];
00032 mControlADCtoE->CheckStatus[i]=status[i];
00033 mControlADCtoE->CheckCrate[i]=crate[i];
00034 }
00035
00036 mPsdMapBug2 = kTRUE;
00037 mTowerMapBug = kTRUE;
00038 mSmdMapBug = kTRUE;
00039
00040
00041 delete mTables;
00042 mTables = new StBemcTables(kTRUE, kTRUE);
00043
00044 }
00045
00049 StBemcData::~StBemcData()
00050 {}
00051 Bool_t StBemcData::make(StEmcRawData* emcraw, StEvent* event)
00052 {
00053 return StBemcRaw::make(emcraw,event);
00054 }
00055 Bool_t StBemcData::make(TDataSet* DS, StEvent* event)
00056 {
00057 return StBemcRaw::make(DS,event);
00058 }
00059 Bool_t StBemcData::make(StEmcCollection* emc, StEvent* event)
00060 {
00061 if(!emc)
00062 return kFALSE;
00063 if(!event)
00064 return kFALSE;
00065 StEmcCollection *emcN = event->emcCollection();
00066 if(!emcN)
00067 {
00068 emcN = emc;
00069 event->setEmcCollection(emcN);
00070 }
00071
00072 Int_t ADC[MAXDETBARREL][BSMDCH];
00073 Int_t CRATE[MAXDETBARREL][BSMDCH];
00074 Int_t CAP[MAXDETBARREL][BSMDCH];
00075 Int_t ID[MAXDETBARREL][BSMDCH];
00076 Int_t NH[MAXDETBARREL];
00077 Int_t Crate,RDO,Index,Daq;
00078 Int_t S;
00079 Float_t E;
00080 for(Int_t det=1;det<=MAXDETBARREL;det++)
00081 {
00082 StDetectorId id = static_cast<StDetectorId>(det+kBarrelEmcTowerId-1);
00083 NH[det-1] = 0;
00084 StEmcDetector* detector=emc->detector(id);
00085 mNCRATESOK[det-1]=0;
00086 if(detector)
00087 {
00088 mIsCorrupted[det-1]=kFALSE;
00089 for(Int_t crate=1;crate<=MAXCRATES;crate++)
00090 {
00091 mCrateStatus[det-1][crate-1] = (Int_t)detector->crateStatus(crate);
00092 if(mCrateStatus[det-1][crate-1]==crateOK)
00093 mNCRATESOK[det-1]++;
00094 if(mCrateStatus[det-1][crate-1]==crateHeaderCorrupt)
00095 mIsCorrupted[det-1] = kTRUE;
00096 }
00097
00098 StEmcGeom* geo = StEmcGeom::instance(det);
00099 for(UInt_t j=1;j<=BEMCMODULES;j++)
00100 {
00101 StEmcModule* module = detector->module(j);
00102 if(module)
00103 {
00104 StSPtrVecEmcRawHit& rawHit=module->hits();
00105 for(UInt_t k=0;k<rawHit.size();k++)
00106 {
00107 Int_t m=rawHit[k]->module();
00108 Int_t e=rawHit[k]->eta();
00109 Int_t s=abs(rawHit[k]->sub());
00110 Int_t adc=rawHit[k]->adc();
00111 Int_t cap=rawHit[k]->calibrationType();
00112 while(cap>127)
00113 cap-=128;
00114 Int_t id;
00115 geo->getId(m,e,s,id);
00116 ID[det-1][NH[det-1]] = id;
00117 ADC[det-1][NH[det-1]] = adc;
00118 CAP[det-1][NH[det-1]] = cap;
00119 if(det==BTOW)
00120 {
00121 mDecoder->GetDaqIdFromTowerId(id,Daq);
00122 mDecoder->GetTowerCrateFromDaqId(Daq,Crate,Index);
00123 }
00124 else if(det==BPRS)
00125 {
00126 mDecoder->GetPsdRDO(id,RDO,Index);
00127 Crate = RDO+1;
00128 }
00129 else if(det==BSMDE || det == BSMDP)
00130 {
00131 mDecoder->GetSmdRDO(det,m,e,s,RDO,Index);
00132 Crate = RDO+1;
00133 }
00134 CRATE[det-1][NH[det-1]] = Crate;
00135 NH[det-1]++;
00136 }
00137 }
00138 }
00139 }
00140 }
00141 emptyEmcCollection(emcN);
00142 for(Int_t det=1;det<=MAXDETBARREL;det++)
00143 {
00144 clearStats(det);
00145 for(Int_t i = 0;i<NH[det-1];i++)
00146 {
00147 S = makeHit(emcN,det,ID[det-1][i],ADC[det-1][i],CRATE[det-1][i],CAP[det-1][i],E);
00148 updateStats(det,S,ADC[det-1][i],E);
00149 }
00150 printStats(det);
00151 }
00152 return kTRUE;
00153 }
00154 Bool_t StBemcData::make(StMuEmcCollection* muEmc, StEvent* event)
00155 {
00156 if(!muEmc)
00157 return kFALSE;
00158 if(!event)
00159 return kFALSE;
00160 StEmcCollection *emc = event->emcCollection();
00161 if(!emc)
00162 return kFALSE;
00163 emptyEmcCollection(emc);
00164
00165 for(Int_t det=1;det<=MAXDETBARREL;det++)
00166 {
00167 clearStats(det);
00168 mNCRATESOK[det-1]=0;
00169 StDetectorId did = static_cast<StDetectorId>(det+kBarrelEmcTowerId-1);
00170 StEmcDetector* detector=emc->detector(did);
00171 mIsCorrupted[det-1]=kFALSE;
00172 for(Int_t crate = 1;crate<=MAXCRATES;crate++)
00173 {
00174 mCrateStatus[det-1][crate-1] = (Int_t)muEmc->getCrateStatus(crate,det);
00175 if(mCrateStatus[det-1][crate-1]==crateOK)
00176 mNCRATESOK[det-1]++;
00177 if(mCrateStatus[det-1][crate-1]==crateHeaderCorrupt)
00178 mIsCorrupted[det-1] = kTRUE;
00179 if(detector)
00180 detector->setCrateStatus(crate,(StEmcCrateStatus)mCrateStatus[det-1][crate-1]);
00181 }
00182 StEmcGeom* geo = StEmcGeom::instance(det);
00183 Int_t nh=0;
00184 Int_t ADC=0,ID=0,CRATE=0,RDO=0,INDEX=0,CAP=0,DAQ=0;
00185 Int_t m=0,e=0,s=0;
00186 Float_t E=0;
00187 Int_t S=0;
00188 if (det==BTOW)
00189 nh = BTOWCH;
00190 if (det==BPRS)
00191 nh=muEmc->getNPrsHits(det);
00192 if (det==BSMDE || det==BSMDP)
00193 nh=muEmc->getNSmdHits(det);
00194 for(Int_t j=0;j<nh;j++)
00195 {
00196 ADC = 0;
00197 if(det==BTOW)
00198 {
00199 ID = j+1;
00200 ADC = muEmc->getTowerADC(ID,det);
00201 mDecoder->GetDaqIdFromTowerId(ID,DAQ);
00202 mDecoder->GetTowerCrateFromDaqId(DAQ,CRATE,INDEX);
00203 CAP = 0;
00204 }
00205 if(det==BPRS)
00206 {
00207 StMuEmcHit* hit=muEmc->getPrsHit(j,det);
00208 ID = hit->getId();
00209 ADC = hit->getAdc();
00210 CAP = hit->getCalType();
00211 mDecoder->GetPsdRDO(ID,RDO,INDEX);
00212 CRATE = RDO+1;
00213 }
00214 if(det==BSMDE || det==BSMDP)
00215 {
00216 StMuEmcHit* hit=muEmc->getSmdHit(j,det);
00217 ID = hit->getId();
00218 ADC = hit->getAdc();
00219 CAP = hit->getCalType();
00220 geo->getBin(ID,m,e,s);
00221 mDecoder->GetSmdRDO(det,m,e,s,RDO,INDEX);
00222 CRATE = RDO+1;
00223 }
00224 S = makeHit(emc,det,ID,ADC,CRATE,CAP,E);
00225 updateStats(det,S,ADC,E);
00226 }
00227 printStats(det);
00228 }
00229 return kTRUE;
00230 }