00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "StSvtOnlineSeqAdjSimMaker.h"
00014 #include "StSvtClassLibrary/StSvtHybridPixelsC.hh"
00015 #include "StSvtClassLibrary/StSvtHybridPixelsD.hh"
00016 #include "StSvtClassLibrary/StSvtHybridCollection.hh"
00017 #include "StSvtClassLibrary/StSvtData.hh"
00018 #include "StSvtClassLibrary/StSvtHybridBadAnodes.hh"
00019 #include "StSvtClassLibrary/StSvtHybridData.hh"
00020 #include "StSvtClassLibrary/StSvtConfig.hh"
00021 #include "StSvtClassLibrary/StSvtDaq.hh"
00022 #include "StSequence.hh"
00023 #include "StMCTruth.h"
00024 #include "StMessMgr.h"
00025 #include "StSvtConversionTable.h"
00026
00027
00028 ClassImp(StSvtOnlineSeqAdjSimMaker)
00029
00030 StSvtOnlineSeqAdjSimMaker::StSvtOnlineSeqAdjSimMaker(const char* name):StMaker(name)
00031 {
00032 mRawData=NULL;
00033 m8bitPixelColl=NULL;
00034 mPixelColl=NULL;
00035 mSvtBadAnodes=NULL;
00036 mCurrentPixelData=NULL;
00037 mCurrent8bitPixelData=NULL;
00038 mPedOffsetAdjustment=2;
00039
00040
00041 GetConfig();
00042 SetRawData();
00043 }
00044
00045
00046 StSvtOnlineSeqAdjSimMaker::~StSvtOnlineSeqAdjSimMaker()
00047 {
00048 }
00049
00050
00051 Int_t StSvtOnlineSeqAdjSimMaker::GetConfig()
00052 {
00053 mConfig=NULL;
00054 St_DataSet *dataSet = NULL;
00055 dataSet = GetDataSet("StSvtConfig");
00056 if (!dataSet)
00057 {
00058 gMessMgr->Warning() << " No SvtConfig data set" << endm;
00059 dataSet = new St_ObjectSet("StSvtConfig");
00060 AddConst(dataSet);
00061 }
00062 else mConfig=((StSvtConfig*)(dataSet->GetObject()));
00063
00064 if (!mConfig) {
00065 gMessMgr->Warning() << "SvtConfig data set is empty- seting default full configuration" << endm;
00066 mConfig=new StSvtConfig();
00067 mConfig->setConfiguration("FULL");
00068 mConfig->setNumberOfAnodes(240);
00069 mConfig->setNumberOfTimeBins(128);
00070 dataSet->SetObject(mConfig);
00071 }
00072
00073 return kStOk;
00074 }
00075
00076
00077 Int_t StSvtOnlineSeqAdjSimMaker::GetDaqParams()
00078 {
00079 mDaq=NULL;
00080
00081 St_DataSet* dataSet;
00082 dataSet = GetDataSet("StSvtDaq");
00083 if (dataSet==NULL){
00084 gMessMgr->Error()<<"BIG TROUBLE:No DAQ parameters from database!!!!"<<endm;
00085 return kStFatal;
00086 }
00087
00088 mDaq = (StSvtDaq*)dataSet->GetObject();
00089 if (mDaq==NULL){
00090 gMessMgr->Error()<<"BIG TROUBLE:No DAQ parameters are empty!!!!"<<endm;
00091 return kStFatal;
00092 }
00093
00094 SetNumberTBinsToClear(mDaq->getClearedTimeBins());
00095 SetExtraPixelsBefore(mDaq->getPixelsBefore());
00096 SetExtraPixelsAfter(mDaq->getPixelsAfter());
00097 SetPedOffset(mDaq->getPedOffset());
00098 Set_n_seq_lo(mDaq->getSeqLo());
00099 Set_n_seq_hi(mDaq->getSeqHi());
00100 Set_thresh_lo(mDaq->getThreshLo());
00101 Set_thresh_hi(mDaq->getThreshHi());
00102
00103 return kStOk;
00104 }
00105
00106
00108 Int_t StSvtOnlineSeqAdjSimMaker::GetPixelData()
00109 {
00110 St_DataSet* dataSet=NULL;
00111 dataSet = GetDataSet("StSvtPixelData");
00112 if (!dataSet) {
00113 gMessMgr->Error()<<"no StSvtPixelData dataset"<<endm;
00114 return kStErr;
00115 }
00116
00117 mPixelColl=(StSvtData*)dataSet->GetObject();
00118 if (!mPixelColl){
00119 gMessMgr->Error()<<"StSvtPixelData is empty"<<endm;
00120 return kStErr;
00121 }
00122
00123 dataSet=NULL;
00124
00125 dataSet = GetDataSet("StSvt8bitPixelData");
00126 if (!dataSet) {
00127 gMessMgr->Error()<<"no StSvt8bitPixelData dataset"<<endm;
00128 return kStErr;
00129 }
00130 m8bitPixelColl=(StSvtData*)dataSet->GetObject();
00131 if (!m8bitPixelColl){
00132 gMessMgr->Error()<<"StSvt8bitPixelData is empty"<<endm;
00133 return kStErr;
00134 }
00135
00136 return kStOk;
00137 }
00138
00139
00141 void StSvtOnlineSeqAdjSimMaker::GetBadAnodes()
00142 {
00143 St_DataSet *dataSet;
00144
00145 dataSet = GetDataSet("StSvtBadAnodes");
00146 if( !dataSet) {
00147 gMessMgr->Warning() << "StSvtOnlineSeqAdjSimMaker: No Svt Bad Anodes data set" << endm;
00148 return;
00149 }
00150
00151 mSvtBadAnodes = (StSvtHybridCollection*)(dataSet->GetObject());
00152 if( !mSvtBadAnodes) {
00153 gMessMgr->Warning() << "StSvtOnlineSeqAdjSimMaker: No Svt Bad Anodes data " << endm;
00154 return;
00155 }
00156
00157 gMessMgr->Info()<<"StSvtOnlineSeqAdjSimMaker:Svt Bad Anode list found"<<endm;
00158 }
00159
00160
00161
00162 void StSvtOnlineSeqAdjSimMaker::SetRawData()
00163 {
00164
00165 St_ObjectSet* set=(St_ObjectSet*)GetDataSet("StSvtRawData");
00166
00167 if (!set) {
00168 set = new St_ObjectSet("StSvtRawData");
00169 AddData(set);
00170 }
00171 mRawData = new StSvtData(mConfig->getConfiguration());
00172 set->SetObject(mRawData);
00173 }
00174
00175
00176 Int_t StSvtOnlineSeqAdjSimMaker::Init()
00177 {
00178 return StMaker::Init();
00179 }
00180
00181
00183 Int_t StSvtOnlineSeqAdjSimMaker::InitRun(int runumber)
00184 {
00185 if (Debug()) gMessMgr->Info()<<"StSvtOnlineSeqAdjSimMaker::InitRun"<<endm;
00186 GetConfig();
00187 GetBadAnodes();
00188 Int_t res;
00189 if ((res=GetDaqParams())!=kStOk) return res;
00190
00191 gMessMgr->Info()<< " DAQ parameters used for simulation:"<<endm;
00192 gMessMgr->Info() << " PedOffSet = "<<mPedOffset<<endm;
00193 gMessMgr->Info() << " thresh_lo = "<<m_thresh_lo <<endm;
00194 gMessMgr->Info() << " thresh_hi = "<<m_thresh_hi <<endm;
00195 gMessMgr->Info() << " n_seq_lo = "<<m_n_seq_lo <<endm;
00196 gMessMgr->Info() << " n_seq_hi = "<< m_n_seq_hi <<endm;
00197
00198
00199 if (Debug()) gMessMgr->Info()<<"StSvtOnlineSeqAdjSimMaker::InitRun...END"<<endm;
00200 return StMaker::InitRun(runumber);
00201 }
00202
00203
00204 Int_t StSvtOnlineSeqAdjSimMaker::Finish()
00205 {
00206 return kStOK;
00207 }
00208
00209
00210 void StSvtOnlineSeqAdjSimMaker::Clear(const char*)
00211 {
00212 mRawData=NULL;
00213 StMaker::Clear();
00214 }
00215
00216
00217 void StSvtOnlineSeqAdjSimMaker::SetAdjParams(int thresh_lo,int n_seq_lo,int thresh_hi,int n_seq_hi)
00218 {
00219 m_thresh_lo =thresh_lo;
00220 m_n_seq_lo =n_seq_lo;
00221 m_thresh_hi =thresh_hi;
00222 m_n_seq_hi =n_seq_hi;
00223 }
00224
00225
00227 Int_t StSvtOnlineSeqAdjSimMaker::Make()
00228 {
00229 if (Debug()) gMessMgr->Info()<<"StSvtOnlineSeqAdjSimMaker::Make"<<endm;
00230 SetRawData();
00231 Int_t res;
00232 if ((res=GetPixelData())!= kStOk) return res;
00233
00234 for(int Barrel = 1;Barrel <= mPixelColl->getNumberOfBarrels();Barrel++) {
00235 for (int Ladder = 1;Ladder <= mPixelColl->getNumberOfLadders(Barrel);Ladder++) {
00236 for (int Wafer = 1;Wafer <= mPixelColl->getNumberOfWafers(Barrel);Wafer++) {
00237 for( int Hybrid = 1;Hybrid <= mPixelColl->getNumberOfHybrids();Hybrid++){
00238
00239 mCurrentIndex = mPixelColl->getHybridIndex(Barrel,Ladder,Wafer,Hybrid);
00240 if( mCurrentIndex < 0) continue;
00241
00242
00243 mCurrentPixelData = (StSvtHybridPixelsD*)mPixelColl->at(mCurrentIndex);
00244 mCurrent8bitPixelData = (StSvtHybridPixelsC*)m8bitPixelColl->at(mCurrentIndex);
00245
00246 if(!mCurrent8bitPixelData) {
00247 mCurrent8bitPixelData = new StSvtHybridPixelsC(Barrel, Ladder, Wafer, Hybrid);
00248 m8bitPixelColl->put_at(mCurrent8bitPixelData,mCurrentIndex);
00249 }
00250
00251 if(!mCurrentPixelData) {
00252 mCurrent8bitPixelData->Reset();
00253 }
00254
00255
00256
00257
00258 Conversion10to8bit();
00259 ClearMask();
00260 if (mKillBadAnodes) KillBadAnodes();
00261 if (mNumberTBinsToClear>0) ClearFirstTbins();
00262 RawAnodes();
00263 SequenceSearch();
00264 WriteMask();
00265 FillRawData();
00266
00267 }
00268 }
00269 }
00270 }
00271
00272 if (Debug()) gMessMgr->Info()<<"StSvtOnlineSeqAdjSimMaker::Make...END"<<endm;
00273 return kStOK;
00274 }
00275
00276
00277 void StSvtOnlineSeqAdjSimMaker::Conversion10to8bit()
00278 {
00279 double *fromArray=mCurrentPixelData->GetArray();
00280 Char_t *toArray=mCurrent8bitPixelData->GetArray();
00281
00282 for (int i=0;i<mCurrentPixelData->getTotalNumberOfPixels();i++)
00283 {
00284 double adc=fromArray[i];
00285 if (adc<=0) adc=0.;
00286 if (adc>=1023) adc=1023.;
00287 unsigned int adc1=(unsigned int)adc;
00288 toArray[i]=(Char_t)StSvt10to8ConversionTable[adc1];
00289 }
00290 }
00291
00292
00293 void StSvtOnlineSeqAdjSimMaker::FillRawData()
00294 {
00295 StSvtHybridData *hybridData;
00296 hybridData = new StSvtHybridData(mCurrentPixelData->getBarrelID(), mCurrentPixelData->getLadderID(), mCurrentPixelData->getWaferID(),mCurrentPixelData->getHybridID());
00297 mRawData->put_at(hybridData,mCurrentIndex);
00298
00299 int anodes=0;
00300
00301
00302 StSvtHybridBadAnodes* badAnode =NULL;
00303 if (mKillBadAnodes && mSvtBadAnodes) badAnode = (StSvtHybridBadAnodes*)mSvtBadAnodes->at(mCurrentIndex);
00304
00305 Char_t *mAdcArray=mCurrent8bitPixelData->GetArray();
00306
00307 StSequence tmpSeq[128];
00308 StMCTruth tmpTru[128];
00309 for (int ianode=0;ianode<240;ianode++)
00310 {
00311 int seqCount=0;
00312
00313
00314 int an=ianode+1;
00315 if ((an==mDaq->getSavedBlackAnodes(0))||(an==mDaq->getSavedBlackAnodes(1))||(an==mDaq->getSavedBlackAnodes(2))||(an==mDaq->getSavedBlackAnodes(3)))
00316 {
00317 if (badAnode->isBadAnode(an)) continue;
00318 tmpSeq[0].startTimeBin =0;
00319 tmpSeq[0].firstAdc=(unsigned char*)(mAdcArray+ianode*128);
00320 tmpSeq[0].length = 128;
00321 tmpTru[0] = 0;
00322 seqCount=1;
00323 hybridData->setListSequences(anodes, an, seqCount, tmpSeq);
00324 anodes++;
00325 continue;
00326 }
00327
00328 int pixCount=0;
00329 StMCPivotTruth pivo;
00330 for(int tim = 0; tim <= 128; tim++)
00331 {
00332 unsigned char adc;
00333 if (tim==128) adc=0;
00334 else adc= (unsigned char)mAdcArray[ianode*128 + tim];
00335
00336 if (adc>0)
00337 {
00338 StMCTruth tru =mCurrentPixelData->getTrackId(ianode*128 + tim);
00339 if (pixCount==0){
00340 pivo.Reset();
00341 tmpSeq[seqCount].startTimeBin = tim;
00342 tmpSeq[seqCount].firstAdc=(unsigned char*)(mAdcArray+ianode*128 + tim);
00343 }
00344 if(int(tru)) pivo.Add(tru,adc);
00345 pixCount++;
00346 }
00347 else
00348 {
00349 if(pixCount>0){
00350 tmpSeq[seqCount].length = pixCount;
00351 tmpTru[seqCount] = pivo.Get();
00352 seqCount++;
00353 pixCount=0;
00354 }
00355 }
00356
00357
00358 }
00359
00360 if(seqCount>0){
00361
00362 hybridData->setListSequences(anodes,ianode+1, seqCount, tmpSeq);
00363 hybridData->setListTruth (anodes,ianode+1, seqCount, tmpTru);
00364 anodes++;
00365 }
00366
00367
00368 }
00369
00370 hybridData->setAnodeList();
00371 }
00372
00373
00374 void StSvtOnlineSeqAdjSimMaker::WriteSequence(int anode,int begins, int ends, int NumOfHigh)
00375 {
00376
00377
00378
00379 if (NumOfHigh<=m_n_seq_hi) return;
00380 if ((ends-begins+1)<=m_n_seq_lo) return;
00381
00382
00383 begins= begins-mExtraBefore;
00384 if (begins<0) begins=0;
00385
00386 ends=ends+mExtraAfter;
00387 if (ends>127) ends=127;
00388
00389 for (int i=begins;i<=ends;i++) mMask[anode*128 + i]=kTRUE;
00390 }
00391
00392
00393 void StSvtOnlineSeqAdjSimMaker::SequenceSearch()
00394 {
00395 unsigned char adc;
00396 int loCount;
00397 int hiCount;
00398 int SeqBegins=0;
00399
00400 int HiTresh=mPedOffset+m_thresh_hi+mPedOffsetAdjustment;
00401 int LoTresh=mPedOffset+m_thresh_lo+mPedOffsetAdjustment;
00402
00403
00404 Char_t *mAdcArray=mCurrent8bitPixelData->GetArray();
00405
00406 for(int an = 0; an < 240; an++){
00407
00408 loCount=0;hiCount=0;
00409
00410 for(int tim = 0; tim <= 128; tim++)
00411 {
00412
00413 if (tim==128) adc=0;
00414 else adc=(unsigned char)mAdcArray[an*128 + tim];
00415
00416 if (adc>HiTresh) hiCount++;
00417
00418 if (adc>LoTresh)
00419 {
00420 if (loCount==0) SeqBegins=tim;
00421 loCount++;
00422 }
00423 else
00424 {
00425 if(loCount!=0)
00426 {
00427 WriteSequence(an,SeqBegins,tim-1,hiCount);
00428 loCount=0;hiCount=0;
00429 }
00430 }
00431
00432
00433 }
00434 }
00435
00436 }
00437
00438
00439
00440
00441 void StSvtOnlineSeqAdjSimMaker::KillBadAnodes()
00442 {
00443
00444 if (!mSvtBadAnodes){
00445 cout<<"Warning: cannot simulate bad anodes in online sequence adjusting - no anode list"<<endl;
00446 return;
00447 }
00448 StSvtHybridBadAnodes* BadAnode = (StSvtHybridBadAnodes*)mSvtBadAnodes->at(mCurrentIndex);
00449 if (!BadAnode) return;
00450
00451 Char_t *mAdcArray=mCurrent8bitPixelData->GetArray();
00452
00453 for (int an=0;an<240;an++)
00454 if (BadAnode->isBadAnode(an+1))
00455 {
00456 for(int tim = 0; tim < 128; tim++) mAdcArray[an*128 + tim]=0;
00457 }
00458
00459 }
00460
00461
00462
00463 void StSvtOnlineSeqAdjSimMaker::RawAnodes()
00464 {
00465
00466 for (int i=0 ; i<4 ; i++)
00467 {
00468 int an=mDaq->getSavedBlackAnodes(i);
00469 if ((an<=0)||(an>240)) continue;
00470 for(int tb = 0; tb < 128; tb++) mMask[an*128 + tb]=kTRUE;
00471 }
00472
00473 }
00474
00475
00476 void StSvtOnlineSeqAdjSimMaker::ClearMask()
00477 {
00478 memset(mMask,0,128*240*sizeof(mMask[0]));
00479 }
00480
00481
00482 void StSvtOnlineSeqAdjSimMaker::ClearFirstTbins()
00483 {
00484 Char_t *mAdcArray=mCurrent8bitPixelData->GetArray();
00485
00486 for(int tim = 0; tim < mNumberTBinsToClear; tim++){
00487 for(int an = 0; an < 240; an++){
00488 mAdcArray[an*128 + tim]=0;
00489
00490 }
00491 }
00492 }
00493
00494
00495 void StSvtOnlineSeqAdjSimMaker::WriteMask()
00496 {
00497 Char_t *mAdcArray=mCurrent8bitPixelData->GetArray();
00498
00499 for(int tim = 0; tim < 128; tim++){
00500 for(int an = 0; an < 240; an++){
00501 if (mMask[an*128 + tim]==kFALSE) mAdcArray[an*128 + tim]=0;
00502 }
00503 }
00504 }
00505
00506