00001
00003
00004
00006 #include <stdio.h>
00007 #include <string.h>
00008 #include <sys/types.h>
00009 #include <sys/stat.h>
00010 #include <fcntl.h>
00012
00013
00014 #include "StTrsMaker/include/StTrsDetectorReader.hh"
00015 #include "StTrsMaker/include/StTrsZeroSuppressedReader.hh"
00016 #include "St_tpcdaq_Maker.h"
00017 #include "TDataSetIter.h"
00018 #include "TObjectSet.h"
00019 #include "TH1.h"
00020 #include "StDaqLib/TPC/trans_table.hh"
00021 #include "StSequence.hh"
00022
00023 #include "tables/St_raw_sec_m_Table.h"
00024 #include "tables/St_raw_row_Table.h"
00025 #include "tables/St_raw_pad_Table.h"
00026 #include "tables/St_raw_seq_Table.h"
00027 #include "tables/St_type_shortdata_Table.h"
00028 #include "tables/St_asic_thresholds_Table.h"
00029 #include "tables/St_noiseElim_Table.h"
00030 #include "tables/St_tpcGain_Table.h"
00031 #include "tables/St_daq100cl_Table.h"
00032
00033 ClassImp(St_tpcdaq_Maker)
00034
00035 #define PP printf
00036 #define HISTOGRAMS
00037
00038 enum myNUMB { NSECT=24, NROW =45,DEBUG_ACTIVE_ROW =33,MAXPADROWSPERBANK=50};
00039
00040 #include "StDAQMaker/StDAQReader.h"
00041 StDAQReader *victorPrelim=0;
00042 StTPCReader *victor;
00043 int gSector=-1;
00044 enum myCORR {kGainCorr=1, kNoiseElim=2, kAsicTHold=4};
00045 enum myDAQF {kPadRaw =1, kDAQ100 =2 };
00046
00047
00048
00049 int St_tpcdaq_Maker::GetCorrection(void) {
00050 return mCorrectionMask;
00051 }
00052
00053 void St_tpcdaq_Maker::SetCorrection(int mask) {
00054
00055
00056
00057
00058
00059 mCorrectionMask=mask;
00060 }
00061
00062 St_tpcdaq_Maker::St_tpcdaq_Maker(const char *name,char *daqOrTrs):StMaker(name),gConfig(daqOrTrs)
00063 {
00064 printf("This is St_tpcdaq_Maker, name = \"%s\".\n",name);
00065 alreadySet=0;
00066 daq_flag = 1;
00067 mCorrectionMask = kGainCorr | kNoiseElim | kAsicTHold;
00068 }
00069
00070 St_tpcdaq_Maker::~St_tpcdaq_Maker() {
00071 }
00072
00073 Int_t St_tpcdaq_Maker::Init() {
00074
00075 victorPrelim=0;
00076
00077 m_seq_startTimeBin = new TH1F("tpcdaq_startBin" ,
00078 "seq vs start bin" , 512 , 1.0 , 512.0 );
00079 m_seq_sequnceLength = new TH1F("tpcdaq_seqLen" ,
00080 "seq vs seq len" , 100 , 1.0 , 100.0 );
00081 m_seq_padNumber = new TH1F("tpcdaq_padNum" ,
00082 "seq vs pad num" , 188 , 1.0 , 188.0 );
00083 m_seq_padRowNumber = new TH1F("tpcdaq_padrowNum" ,
00084 "seq vs padrow num" , 45 , 1.0 , 45.0 );
00085 m_pad_numSeq = new TH1F("tpcdaq_numSeq" ,
00086 "pad vs num seq" , 40 , 1.0 , 40.0 );
00087 m_pix_AdcValue = new TH1F("tpcdaq_adcVal" ,
00088 "pix vs ADC value" , 255 , 1.0 , 255.0 );
00089 return StMaker::Init();
00090 }
00091
00092 Int_t St_tpcdaq_Maker::InitRun(Int_t RunNumber) {
00093 TDataSet *herb;
00094
00095 if(mCorrectionMask&kNoiseElim) { SetNoiseEliminationStuff(); }
00096 if(mCorrectionMask&kAsicTHold) {
00097 TDataSet *tpc_calib = GetDataBase("Calibrations/tpc");
00098 assert(tpc_calib);
00099 St_asic_thresholds *asic = (St_asic_thresholds *) tpc_calib->Find("asic_thresholds");
00100 assert(asic);
00101 St_asic_thresholds &kasic = *asic;
00102 mThreshLo = kasic[0].thresh_lo;
00103 mThreshHi = kasic[0].thresh_hi;
00104 mNseqLo = kasic[0].n_seq_lo;
00105 mNseqHi = kasic[0].n_seq_hi;
00106 }
00107
00108 if(m_Mode == 0 || m_Mode == 2) {
00109 herb=GetDataSet("StDAQReader");
00110 assert(herb);
00111 victorPrelim=(StDAQReader*)(herb->GetObject()); assert(victorPrelim);
00112 } else if(m_Mode == 1) {
00113 } else {
00114 PP("-----------------------------------------------------------------\n");
00115 PP("The second argument of St_tpcdaq_Maker::St_tpcdaq_Maker() must be\n");
00116 PP("either \"daq\" or \"trs\". Fatal error. Please fix bfc.C.\n");
00117 assert(0);
00118 }
00119 PP("end of St_tpcdaq_Maker::Init\n");
00120 return StMaker::InitRun(RunNumber);
00121 }
00122
00123 char *St_tpcdaq_Maker::NameOfSector(int isect) {
00124 static char rv[16];
00125 sprintf(rv,"Sector_%i",isect);
00126 return rv;
00127 }
00128
00129 void St_tpcdaq_Maker::MkTables(int isect,TDataSet *sector,
00130 St_raw_row **raw_row_in,St_raw_row **raw_row_out,
00131 St_raw_pad **raw_pad_in,St_raw_pad **raw_pad_out,
00132 St_raw_seq **raw_seq_in,St_raw_seq **raw_seq_out,
00133 St_type_shortdata **pixel_data_in,St_type_shortdata **pixel_data_out,
00134 St_type_shortdata **pixel_indx_in,St_type_shortdata **pixel_indx_out) {
00135
00136 TDataSetIter sect(sector);
00137
00138 *raw_row_in=(St_raw_row*) sect("raw_row_in");
00139 if (!(*raw_row_in)) {
00140 *raw_row_in=new St_raw_row("raw_row_in",13); sect.Add(*raw_row_in);
00141 }
00142
00143 *raw_row_out=(St_raw_row*) sect("raw_row_out");
00144 if (!(*raw_row_out)) {
00145 *raw_row_out=new St_raw_row("raw_row_out",32); sect.Add(*raw_row_out);
00146 }
00147
00148 *raw_pad_in=(St_raw_pad*) sect("raw_pad_in");
00149 if (!(*raw_pad_in)) {
00150 *raw_pad_in=new St_raw_pad("raw_pad_in",3); sect.Add(*raw_pad_in);
00151 }
00152
00153 *raw_pad_out=(St_raw_pad*) sect("raw_pad_out");
00154 if (!(*raw_pad_out)) {
00155 *raw_pad_out=new St_raw_pad("raw_pad_out",3); sect.Add(*raw_pad_out);
00156 }
00157
00158 *raw_seq_in=(St_raw_seq*) sect("raw_seq_in");
00159 if (!(*raw_seq_in)) {
00160 *raw_seq_in=new St_raw_seq("raw_seq_in",3); sect.Add(*raw_seq_in);
00161 }
00162
00163 *raw_seq_out=(St_raw_seq*) sect("raw_seq_out");
00164 if (!(*raw_seq_out)) {
00165 *raw_seq_out=new St_raw_seq("raw_seq_out",3); sect.Add(*raw_seq_out);
00166 }
00167
00168 *pixel_data_in=(St_type_shortdata*) sect("pixel_data_in");
00169 if (!(*pixel_data_in)) {
00170 *pixel_data_in=new St_type_shortdata("pixel_data_in",100);
00171 sect.Add(*pixel_data_in);
00172 }
00173 *pixel_indx_in=(St_type_shortdata*) sect("pixel_indx_in");
00174 if (!(*pixel_indx_in)) {
00175 *pixel_indx_in=new St_type_shortdata("pixel_indx_in",100);
00176 sect.Add(*pixel_indx_in);
00177 }
00178
00179 *pixel_data_out=(St_type_shortdata*) sect("pixel_data_out");
00180 if (!(*pixel_data_out)) {
00181 *pixel_data_out=new St_type_shortdata("pixel_data_out",100);
00182 sect.Add(*pixel_data_out);
00183 }
00184 *pixel_indx_out=(St_type_shortdata*) sect("pixel_indx_out");
00185 if (!(*pixel_indx_out)) {
00186 *pixel_indx_out=new St_type_shortdata("pixel_indx_out",100);
00187 sect.Add(*pixel_indx_out);
00188 }
00189 }
00190
00191 void St_tpcdaq_Maker::PadWrite(St_raw_pad *raw_pad_gen,int padR,int padOffset,
00192 int seqOffset,int nseq,int timeWhere,int pad)
00193 {
00194 raw_pad_st singlerow;
00195 singlerow.PadOffset=padOffset;
00196 singlerow.SeqOffset=seqOffset;
00197 singlerow.nseq=nseq;
00198 singlerow.SeqModBreak=timeWhere;
00199 singlerow.PadId=pad;
00200 assert(raw_pad_gen->GetNRows()==padR);
00201 raw_pad_gen->AddAt(&singlerow);
00202 }
00203
00204 inline void St_tpcdaq_Maker::PixelWrite(St_type_shortdata *pixel_data_gen,St_type_shortdata *pixel_indx_gen,
00205 int rownum,unsigned short datum, unsigned short id)
00206 {
00207 type_shortdata_st singlerow;
00208 singlerow.data=datum;
00209 type_shortdata_st singleid;
00210 singleid.data=id;
00211 assert(pixel_data_gen->GetNRows()==rownum);
00212 pixel_data_gen->AddAt(&singlerow);
00213 assert(pixel_indx_gen->GetNRows()==rownum);
00214 pixel_indx_gen->AddAt(&singleid);
00215 }
00216
00217 void St_tpcdaq_Maker::SeqWrite(St_raw_seq *raw_seq_gen,int rownumber,
00218 int startTimeBin,int numberOfBinsInSequence)
00219 {
00220 raw_seq_st singlerow;
00221 if(startTimeBin>=0x100) mErr=1;
00222 singlerow.m=startTimeBin;
00223 singlerow.i=numberOfBinsInSequence-1;
00224 assert(raw_seq_gen->GetNRows()==rownumber);
00225 raw_seq_gen->AddAt(&singlerow);
00226 }
00227
00228 void St_tpcdaq_Maker::RowWrite(St_raw_row *raw_row_gen,int rownumber,
00229 int pixSave, int iseqSave,int nPixelPreviousPadRow,
00230 int nSeqThisPadRow,int offsetIntoPadTable,
00231 int nPadsWithSignal,int pixTblWhere,int ipadrow) {
00232 raw_row_st singlerow;
00233 singlerow.ipixel=pixSave;
00234 singlerow.iseq=iseqSave;
00235 singlerow.nseq=nSeqThisPadRow;
00236 singlerow.npixel=nPixelPreviousPadRow;
00237 singlerow.ipad=offsetIntoPadTable;
00238 singlerow.PadFirst=1;
00239 singlerow.npad=nPadsWithSignal;
00240 singlerow.PadModBreak=pixTblWhere;
00241 singlerow.PadRef='L';
00242 singlerow.RowId=ipadrow+1;
00243 assert(raw_row_gen->GetNRows()==rownumber);
00244 raw_row_gen->AddAt(&singlerow);
00245 }
00246
00247 int St_tpcdaq_Maker::getSector(Int_t isect) {
00248 int rv=0;
00249 if(m_Mode != 1) {
00250 gSector=isect;
00251 } else {
00252 mZsr=mTdr->getZeroSuppressedReader(isect);
00253 if(!mZsr) rv=5;
00254 }
00255 return rv;
00256 }
00257
00258 int St_tpcdaq_Maker::getPadList(int whichPadRow,unsigned char **padlist) {
00259 int rv=0;
00260 if(m_Mode != 1) {
00261
00262 victor->SetSequenceMerging(mMergeSequences);
00263 rv=victor->getPadList(gSector,whichPadRow,*padlist);
00264 return rv;
00265 } else {
00266 assert(mZsr);
00267 rv=mZsr->getPadList(whichPadRow,padlist);
00268 }
00269 return rv;
00270 }
00271
00272 void St_tpcdaq_Maker::AsicThresholds(float gain,int *nseqOld,StSequence **lst,UShort_t ***idt)
00273 {
00274 static vector<StSequence, allocator<StSequence> > seqArr;
00275 static vector<UShort_t* , allocator<UShort_t* > > idtArr;
00276 if(mNseqLo<0) return;
00277 seqArr.resize(0);idtArr.resize(0);
00278
00279 for(int iseq=0;iseq<*nseqOld;iseq++) {
00280 StSequence seqNew; seqNew.length=0;
00281 StSequence *seqOld = (*lst)+iseq;
00282 int npix = seqOld->length;
00283 int inSeq=0,numberAboveThresh=0;
00284 UShort_t *idtNew=0;
00285 for(int ipix=0;ipix<=npix;ipix++) {
00286 float conversion = (ipix<npix)? gain*seqOld->firstAdc[ipix]:0;
00287 int kase = inSeq;
00288 if(conversion> mThreshLo) kase |= 2;
00289 if(conversion> mThreshHi) kase |= 4;
00290 switch (kase) {
00291 case 0: break;
00292
00293 case 0+2+0: ;
00294 case 4+2+0: inSeq=1;
00295 numberAboveThresh=0;
00296 seqNew.length=0;
00297 seqNew.firstAdc=seqOld->firstAdc+ipix;
00298 seqNew.startTimeBin=seqOld->startTimeBin+ipix;
00299 if (*idt) idtNew = (*idt)[iseq]+ipix;
00300 case 0+2+1:;
00301 case 4+2+1:;
00302 seqNew.length++;
00303 if (kase&4) numberAboveThresh++;
00304 break;
00305
00306 case 0+0+1: inSeq=0;
00307 if(seqNew.length<=mNseqLo) break;
00308 if(numberAboveThresh<=mNseqHi) break;
00309 seqArr.push_back(seqNew);
00310 if (*idt) idtArr.push_back(idtNew);
00311 break;
00312
00313 default: assert(0);
00314 }
00315 }
00316 }
00317 *nseqOld=seqArr.size(); *lst=&seqArr[0];
00318 if (*idt) *idt = &idtArr[0];
00319 }
00320
00321 int St_tpcdaq_Maker::getSequences(float gain,int row,int pad,int *nseq,StSequence **lst, UShort_t ***listOfIdt)
00322 {
00323 if(listOfIdt) *listOfIdt=0;
00324 int rv=0; TPCSequence *lstPrelim;
00325 if(m_Mode != 1) {
00326 rv=victor->getSequences(gSector,row,pad,*nseq,lstPrelim);
00327 *lst=(StSequence*)lstPrelim;
00328 } else {
00329 assert(sizeof(Sequence)==sizeof(StSequence));
00330 rv=mZsr->getSequences(row,pad,nseq,lst,listOfIdt);
00331 }
00332 if(mCorrectionMask&kAsicTHold) AsicThresholds(gain,nseq,lst,listOfIdt);
00333 return rv;
00334 }
00335
00336
00338 void St_tpcdaq_Maker::SetDAQFlag(Int_t mode)
00339 {
00340 daq_flag = mode;
00341 cout << "St_tpcdaq_Maker::SetDAQFlag : Setting mandatory DAQ flag to ";
00342 if (daq_flag == 0){
00343 cout << " no table filling ";
00344 } else if (daq_flag & kPadRaw ){
00345 cout << " Using pad_raw ";
00346 } else if (daq_flag & kDAQ100 ){
00347 cout << " Using Clusters (DAQ100) ";
00348 } else {
00349 cout << " Unknown option" << daq_flag << endl;
00350 assert(0);
00351 }
00352 cout << endl;
00353 }
00354
00355
00356 #include "StDetectorDbMaker/StDetectorDbTpcRDOMasks.h"
00357 #include "StDaqLib/TPC/fee_pin.h"
00358
00359 void St_tpcdaq_Maker::SetGainCorrectionStuff(int sector) {
00360 register int row,pad;
00361
00362 TDataSet *tpc_calib = GetDataBase("Calibrations/tpc"); assert(tpc_calib);
00363
00364 St_tpcGain *gainObj = (St_tpcGain*) tpc_calib->Find("tpcGain"); assert(gainObj);
00365
00366 assert(gainObj->GetNRows()==24);
00367
00368 tpcGain_st *gains = gainObj->GetTable(); assert(gains);
00369
00370 assert(sector>=1&§or<=24);
00371
00372 static StDetectorDbTpcRDOMasks* mask=0;
00373 static int tRDOFromRowAndPad[45][182];
00374 if(!mask) {
00375 mask = StDetectorDbTpcRDOMasks::instance();
00376 assert(mask);
00377 for(int tiFee=0;tiFee<182;tiFee++) {
00378 for(int tiPin=0;tiPin<32;tiPin++) {
00379 if(row_vs_fee[tiFee][tiPin]!=0 && pad_vs_fee[tiFee][tiPin]!=0) {
00380 tRDOFromRowAndPad[(row_vs_fee[tiFee][tiPin]-1)]
00381 [(pad_vs_fee[tiFee][tiPin]-1)]=
00382 rdo_vs_fee[tiFee][tiPin];
00383 }
00384 }
00385 }
00386 }
00387
00388 for(row=0;row<45;row++) {
00389 for(pad=0;pad<182;pad++) {
00390 fGain[row][pad]=
00391 (mask->isOn(sector,tRDOFromRowAndPad[row][pad]))?
00392 gains[sector-1].Gain[row][pad] : -1.;
00393 }
00394 }
00395 }
00396
00397 void St_tpcdaq_Maker::SetNoiseEliminationStuff() {
00398 int i,sector;
00399
00400 for(sector=0;sector<24;sector++) { noiseElim[sector].npad=0; noiseElim[sector].nbin=0; }
00401
00402 TDataSet *tpc_calib = GetDataBase("Calibrations/tpc"); assert(tpc_calib);
00403
00404 St_noiseElim *noiseObj = (St_noiseElim*) tpc_calib->Find("noiseElim"); assert(noiseObj);
00405
00406 assert(noiseObj->GetNRows()==24);
00407
00408 noiseElim_st *noise = noiseObj->GetTable(); assert(noise);
00409
00410 for(sector=0;sector<24;sector++) {
00411
00412 noiseElim[sector].npad=noise[sector].npad;
00413 assert(noise[sector].npad<=400);
00414 for(i=0;i<noise[sector].npad;i++) {
00415 noiseElim[sector].row[i]=noise[sector].row[i];
00416 noiseElim[sector].pad[i]=noise[sector].pad[i];
00417 }
00418
00419 if(!alreadySet) {
00420 noiseElim[sector].nbin=noise[sector].nbin;
00421 assert(noise[sector].nbin<=3);
00422 for(i=0;i<noise[sector].nbin;i++) {
00423 noiseElim[sector].low[i]=noise[sector].low[i];
00424 noiseElim[sector].up[i]=noise[sector].up[i];
00425 }
00426 }
00427
00428 }
00429 }
00430
00431 void St_tpcdaq_Maker::ExcludeTheseTimeBins(int lo1,int hi1,int lo2,int hi2,int lo3,int hi3) {
00432 int sector,nbin;
00433 assert(lo1<=hi1);
00434 assert(lo2<=hi2);
00435 assert(lo3<=hi3);
00436 alreadySet=7;
00437 nbin=3;
00438 if(lo3<0||hi3<0) nbin=2;
00439 if(lo2<0||hi2<0) nbin=1;
00440 if(lo1<0||hi1<0) nbin=0;
00441 for(sector=0;sector<24;sector++) {
00442 noiseElim[sector].nbin=nbin;
00443 noiseElim[sector].low[0]=lo1;
00444 noiseElim[sector].up [0]=hi1;
00445 noiseElim[sector].low[1]=lo2;
00446 noiseElim[sector].up [1]=hi2;
00447 noiseElim[sector].low[2]=lo3;
00448 noiseElim[sector].up [2]=hi3;
00449 }
00450 }
00451
00452 void St_tpcdaq_Maker::WriteStructToScreenAndExit() {
00453 int jj,ii;
00454 for(ii=0;ii<24;ii++) {
00455 PP("---------------------------------------------- sector %2d\n",ii+1);
00456 for(jj=0;jj<noiseElim[ii].nbin;jj++) {
00457 PP("Cut bins %3d to %3d.\n",noiseElim[ii].low[jj],noiseElim[ii].up[jj]);
00458 }
00459 for(jj=0;jj<noiseElim[ii].npad;jj++) {
00460 PP("Cut pad %3d of row %2d\n",noiseElim[ii].pad[jj],noiseElim[ii].row[jj]);
00461 }
00462 }
00463 assert(0);
00464 }
00466
00467
00468
00469
00470
00471
00472
00473
00475
00476 int St_tpcdaq_Maker::Output() {
00477 char skip; int hj,lgg;
00478 int pixCnt=0;
00479 St_raw_row *raw_row_in,*raw_row_out,*raw_row_gen;
00480 St_raw_pad *raw_pad_in,*raw_pad_out,*raw_pad_gen;
00481 St_raw_seq *raw_seq_in,*raw_seq_out,*raw_seq_gen;
00482 St_type_shortdata *pixel_data_in,*pixel_data_out,*pixel_data_gen;
00483 St_type_shortdata *pixel_indx_in,*pixel_indx_out,*pixel_indx_gen;
00484 unsigned char *padlist;
00485 unsigned char *pointerToAdc;
00486 unsigned short conversion;
00487 char dataOuter[NSECT],dataInner[NSECT];
00488 TDataSet *sector;
00489 TDataSetIter raw_data_tpc(m_DataSet);
00490 raw_sec_m_st singlerow;
00491 int pad=-1,sectorStatus,ipadrow,npad,ipad,seqStatus,iseq,nseq,startTimeBin,ibin;
00492 int numberOfUnskippedSeq,prevStartTimeBin,rowR,padR,seqR;
00493 int iseqSave,pixTblWhere,seqLen,timeOff,numPadsWithSignal,pixOffset;
00494 int seqOffset,timeWhere;
00495 int nPixelThisPad,nSeqThisPadRow,offsetIntoPadTable;
00496 int nPixelPreviousPadRow;
00497 int isect,pixSave,pixR;
00498 unsigned long int nPixelThisPadRow;
00499 StSequence *listOfSequences;
00500 UShort_t **listOfIdt = 0;
00501 St_raw_sec_m *raw_sec_m;
00502
00503 raw_sec_m = (St_raw_sec_m *) raw_data_tpc("raw_sec_m");
00504 if(!raw_sec_m) {
00505 raw_sec_m=new St_raw_sec_m("raw_sec_m",NSECT); raw_data_tpc.Add(raw_sec_m);
00506 }
00507
00508
00509
00510 for(isect=1;isect<=NSECT;isect++) {
00511 if(mCorrectionMask&kGainCorr) SetGainCorrectionStuff(isect);
00512 dataOuter[isect-1]=0; dataInner[isect-1]=0;
00513
00514 sector=raw_data_tpc(NameOfSector(isect));
00515 if(!sector) {
00516 raw_data_tpc.Mkdir(NameOfSector(isect));
00517 sector=raw_data_tpc(NameOfSector(isect));
00518 }
00519 MkTables(isect,sector,&raw_row_in,&raw_row_out,&raw_pad_in,&raw_pad_out,
00520 &raw_seq_in,&raw_seq_out,&pixel_data_in,&pixel_data_out,&pixel_indx_in,&pixel_indx_out);
00521 sectorStatus=getSector(isect);
00522 if(sectorStatus) continue;
00523 raw_row_gen=raw_row_out; raw_pad_gen=raw_pad_out; rowR=0; padR=0;
00524 raw_seq_gen=raw_seq_out; pixel_data_gen=pixel_data_out; pixel_indx_gen=pixel_indx_out;seqR=0; pixR=0;
00525 nPixelPreviousPadRow=0;
00526 for(ipadrow=NROW-1;ipadrow>=0;ipadrow--) {
00527 if(ipadrow==12) {
00528 raw_row_gen=raw_row_in; raw_pad_gen=raw_pad_in; rowR=0; padR=0;
00529 raw_seq_gen=raw_seq_in; pixel_data_gen=pixel_data_in; pixel_indx_gen=pixel_indx_in; seqR=0;
00530 pixR=0; nPixelPreviousPadRow=0;
00531 }
00532 pixSave=pixR; iseqSave=seqR; nPixelThisPadRow=0; nSeqThisPadRow=0;
00533 offsetIntoPadTable=padR; pixTblWhere=0; numPadsWithSignal=0;
00534 seqOffset=0; npad=getPadList(ipadrow+1,&padlist);
00535
00536 if(victorPrelim&&m_Mode!=1) {
00537 if(!(victorPrelim->TPCPresent())) { assert(pixCnt==0); return 4321; }
00538 }
00539
00540 if(npad<0) return 1;
00541
00542 pixOffset=0;
00543
00544 for( ipad=0 ; ipad<npad ; ipad++) {
00545 pad=padlist[ipad];
00546 if(mCorrectionMask&kNoiseElim) {
00547 skip=0;
00548 for(lgg=0;lgg<noiseElim[isect-1].npad;lgg++) {
00549 if(noiseElim[isect-1].row[lgg]==ipadrow+1&&noiseElim[isect-1].pad[lgg]==pad) { skip=7; break; }
00550 }
00551 if(skip) continue;
00552 }
00553 nPixelThisPad=0;
00554 Double_t gaincorrection = 1;
00555 if(mCorrectionMask&kGainCorr) {
00556 assert(pad>0&&pad<=182);
00557 if (fGain[ipadrow][pad-1] < 0.125 || fGain[ipadrow][pad-1] > 8.0) continue;
00558
00559 if (m_Mode == 0) gaincorrection = fGain[ipadrow][pad-1];
00560
00561 }
00562 seqStatus=getSequences(gaincorrection,ipadrow+1,pad,&nseq,&listOfSequences,&listOfIdt);
00563
00564 if(seqStatus<0) { Warning("Output","%d A",seqStatus); mErr=2; return 1; }
00565 if(!nseq) continue;
00566
00567 numPadsWithSignal++;
00568 if(ipadrow>=13) dataOuter[isect-1]=7; else dataInner[isect-1]=7;
00569 timeOff=0; timeWhere=0; prevStartTimeBin=-123;
00570 #ifdef HISTOGRAMS
00571 m_pad_numSeq->Fill((Float_t)nseq);
00572 #endif
00573 numberOfUnskippedSeq=0;
00574 for(iseq=0;iseq<nseq;iseq++) {
00575 startTimeBin=listOfSequences[iseq].startTimeBin;
00576 if(startTimeBin< 0) startTimeBin= 0;
00577 if(startTimeBin>511) startTimeBin=511;
00578 if(prevStartTimeBin>startTimeBin) { mErr=3; return 2; }
00579 prevStartTimeBin=startTimeBin; seqLen=listOfSequences[iseq].length;
00580 if(mCorrectionMask&kNoiseElim) {
00581 skip=0;
00582 for(lgg=0;lgg<noiseElim[isect-1].nbin;lgg++) {
00583 hj=startTimeBin;
00584 if(hj>=(noiseElim[isect-1].low[lgg])&&hj<=(noiseElim[isect-1].up[lgg])) { skip=7; break; }
00585 hj=startTimeBin+seqLen-1;
00586 if(hj>=(noiseElim[isect-1].low[lgg])&&hj<=(noiseElim[isect-1].up[lgg])) { skip=7; break; }
00587 }
00588 if(skip) continue;
00589 }
00590 if(startTimeBin<=255) timeWhere=numberOfUnskippedSeq+1; else timeOff=0x100;
00591 SeqWrite(raw_seq_gen,seqR,(startTimeBin-timeOff),seqLen);
00592 nSeqThisPadRow++;
00593 pointerToAdc=listOfSequences[iseq].firstAdc;
00594 #ifdef HISTOGRAMS
00595 m_seq_sequnceLength->Fill((Float_t)seqLen);
00596 m_seq_startTimeBin->Fill((Float_t)startTimeBin);
00597 m_seq_padNumber->Fill((Float_t)pad);
00598 m_seq_padRowNumber->Fill((Float_t)(ipadrow+1));
00599 #endif
00600 numberOfUnskippedSeq++;
00601 for(ibin=0;ibin<seqLen;ibin++) {
00602 pixCnt++; conversion=log8to10_table[*(pointerToAdc++)];
00603 UShort_t idt = (listOfIdt)? listOfIdt[iseq][ibin]:0;
00604 if(mCorrectionMask&kGainCorr) {
00605 if(fGain[ipadrow][pad-1]>22.0) {
00606 printf("Fatal error in %s, line %d.\n",__FILE__,__LINE__);
00607 printf("ipadrow=%d, pad-1=%d, fgain=%g\n",ipadrow,pad-1,fGain[ipadrow][pad-1]);
00608 assert(0);
00609 }
00610 conversion=(short unsigned int)(0.5+gaincorrection*conversion);
00611 }
00612 #ifdef HISTOGRAMS
00613 m_pix_AdcValue->Fill((double)(conversion));
00614 #endif
00615 PixelWrite(pixel_data_gen,pixel_indx_gen,pixR++,conversion,idt);
00616 nPixelThisPadRow++; nPixelThisPad++;
00617 }
00618 seqR++;
00619 }
00620 if(nPixelPreviousPadRow<0x10000) pixTblWhere++;
00621 PadWrite(raw_pad_gen,padR++,pixOffset,seqOffset,numberOfUnskippedSeq,timeWhere,pad);
00622 seqOffset+=numberOfUnskippedSeq; pixOffset+=nPixelThisPad;
00623 }
00624 RowWrite(raw_row_gen,rowR++,pixSave,
00625 iseqSave,nPixelPreviousPadRow,nSeqThisPadRow,offsetIntoPadTable,
00626 numPadsWithSignal,pixTblWhere,ipadrow);
00627 nPixelPreviousPadRow=nPixelThisPadRow;
00628 }
00629 }
00630 singlerow.tfirst=1;
00631 singlerow.tlast=512;
00632 singlerow.TimeRef='S';
00633 for(isect=1;isect<=NSECT;isect++) {
00634 singlerow.SectorId=isect;
00635 if(dataInner[isect-1]) singlerow.RowRefIn ='R'; else singlerow.RowRefIn ='N';
00636 if(dataOuter[isect-1]) singlerow.RowRefOut='R'; else singlerow.RowRefOut='N';
00637 raw_sec_m->AddAt(&singlerow,isect-1);
00638 }
00639 printf("Pixel count = %d\n",pixCnt);
00640 return 0;
00641 }
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651
00652 Int_t St_tpcdaq_Maker::GetEventAndDecoder() {
00653 if(m_Mode != 1) return 0;
00654 TObjectSet *trsEvent=(TObjectSet*)GetDataSet("Event"); if(!trsEvent) return 1;
00655 mEvent=(StTpcRawDataEvent*)(trsEvent->GetObject()); if(!mEvent) return 3;
00656 mTdr = new StTrsDetectorReader(mEvent);
00657 return 0;
00658 }
00659
00660 unsigned short int St_tpcdaq_Maker::Swap2(char doSwap,unsigned short int x) {
00661 char *hh,temp[2];
00662 if(!doSwap) return x;
00663 hh=(char*)(&x);
00664 temp[0]=hh[1]; temp[1]=hh[0];
00665 return *((unsigned short int*)temp);
00666 }
00667
00668 unsigned int St_tpcdaq_Maker::Swap4(char doSwap,unsigned int x) {
00669 char *hh,temp[4];
00670 if(!doSwap) return x;
00671 hh=(char*)(&x);
00672 temp[0]=hh[3]; temp[1]=hh[2]; temp[2]=hh[1]; temp[3]=hh[0];
00673 return *((unsigned int*)temp);
00674 }
00675
00676 char St_tpcdaq_Maker::WhetherToSwap(unsigned int x) {
00677 if(x==0x04030201) return 0;
00678 if(x==0x01020304) return 7;
00679 assert(0);
00680 return 0;
00681 }
00682
00683 void St_tpcdaq_Maker::DAQ100clTableOut(unsigned int receiverBoard,unsigned int mezzanine,
00684 unsigned int sectorCntsFrom1,char swap,
00685 const unsigned int *data) {
00686 unsigned int wordNumber[MAXPADROWSPERBANK],npadrow,ipadrow;
00687 unsigned int padrow,numClusters,icluster;
00688 unsigned int numberOfClustersInPreviousChunk,numberOfWordsInPreviousChunk;
00689 unsigned short int *pad,*time,*flag,*charge;
00690 static int totalRowCount=0;
00691
00692 npadrow=Swap4(swap,*(data+0));
00693 if(npadrow==0) return;
00694
00695
00696 daq100cl_st singlerow;
00697 TDataSetIter rootIterator(m_DataSet);
00698 St_daq100cl *daq100cl = (St_daq100cl*) rootIterator("daq100cl");
00699 if(!daq100cl) {
00700 daq100cl=new St_daq100cl("daq100cl",1000);
00701 rootIterator.Add(daq100cl); totalRowCount=0;
00702 }
00703
00704
00705
00706
00707 wordNumber[0]=1;
00708 assert(npadrow<=MAXPADROWSPERBANK);
00709 for(ipadrow=1;ipadrow<npadrow;ipadrow++) {
00710 numberOfClustersInPreviousChunk = Swap4(swap,*(data+wordNumber[ipadrow-1]+1));
00711 numberOfWordsInPreviousChunk = 2 * numberOfClustersInPreviousChunk + 2;
00712 wordNumber[ipadrow] = wordNumber[ipadrow-1] + numberOfWordsInPreviousChunk;
00713 }
00714
00715
00716 for(ipadrow=1;ipadrow<npadrow;ipadrow++) {
00717 padrow= Swap4(swap,*(data+wordNumber[ipadrow] ));
00718 numClusters=Swap4(swap,*(data+wordNumber[ipadrow]+1));
00719 assert(numClusters<=6000);
00720 for(icluster=0;icluster<numClusters;icluster++) {
00721 pad=(unsigned short int*)(data+wordNumber[ipadrow]+2*icluster+2);
00722 time=pad+1; flag=pad+2; charge=pad+3;
00723
00724
00725
00726 singlerow.sector=sectorCntsFrom1;
00727 singlerow.row=padrow;
00728 singlerow.pad=Swap2(swap,*pad);
00729 singlerow.timebucket=Swap2(swap,*time);
00730 singlerow.charge=Swap2(swap,*charge);
00731 singlerow.flag=Swap2(swap,*flag);
00732 singlerow.rb_mz=receiverBoard+100*mezzanine;
00733 assert(daq100cl->GetNRows()==totalRowCount);
00734 daq100cl->AddAt(&singlerow);
00735 totalRowCount++;
00736 }
00737 }
00738 }
00739
00740 void St_tpcdaq_Maker::PrepareSimulatedData(unsigned int sector,unsigned int *out) {
00741 static unsigned int cnt=0;
00742 unsigned short int *r;
00743 int ipadrow;
00744
00745 out[0]=3;
00746
00747 for(ipadrow=0;ipadrow<3;ipadrow++) {
00748 out[1+ipadrow*8]=sector+1;
00749 out[2+ipadrow*8]=3;
00750 r=(unsigned short*)&(out[3+ipadrow*8]); r[0]=(cnt++)%30; r[1]=sector+2; r[2]=123; r[3]=321;
00751 r=(unsigned short*)&(out[5+ipadrow*8]); r[0]=(cnt++)%30; r[1]=sector+2; r[2]=123; r[3]=321;
00752 r=(unsigned short*)&(out[7+ipadrow*8]); r[0]=(cnt++)%30; r[1]=sector+2; r[2]=123; r[3]=321;
00753 }
00754 }
00755
00756 void St_tpcdaq_Maker::DAQ100clOutput(const unsigned int *pTPCP) {
00757 char swapTPCRBCLP,swapTPCSECLP,swapTPCSECP,swapTPCP,swapTPCMZCLD;
00758 const unsigned int *pTPCSECP,*pTPCSECLP,*pTPCRBCLP,*pTPCMZCLD;
00759 unsigned int sector,map,imz,irb,format,offset,length,isec,numberOfPresentSectors=0;
00760 assert(sizeof(unsigned int)==4);
00761 assert(sizeof(unsigned short int)==2);
00762 swapTPCP=WhetherToSwap(*(pTPCP+5));
00763
00764
00765
00766 for(isec=0;isec<24;isec++) {
00767
00768
00769 offset=Swap4(swapTPCP,*(pTPCP+10+2*isec ));
00770 length=Swap4(swapTPCP,*(pTPCP+10+2*isec+1));
00771 if(length==0) continue;
00772 pTPCSECP=pTPCP+offset; assert(!strncmp((char*)pTPCSECP,"TPCSECP",7));
00773 swapTPCSECP=WhetherToSwap(*(pTPCSECP+5));
00774
00775
00776 #ifdef DEVELOPMENT
00777 unsigned int simulated[100];
00778 PrepareSimulatedData(isec+1,simulated);
00779 DAQ100clTableOut(isec+1,0,simulated);
00780 continue;
00781 #endif
00782 offset=Swap4(swapTPCSECP,*(pTPCSECP+8)); if(offset==0) continue;
00783 format=Swap4(swapTPCSECP,*(pTPCSECP+6)); if(format <2) continue;
00784 pTPCSECLP=pTPCSECP+offset; assert(!strncmp((char*)pTPCSECLP,"TPCSECLP",8));
00785 swapTPCSECLP=WhetherToSwap(*(pTPCSECLP+5));
00786 sector=Swap4(swapTPCSECLP,*(pTPCSECLP+3));
00787
00788
00789 for(irb=0;irb<12;irb++) {
00790 if(irb<6) map=0; else map=1;
00791 offset=Swap4(swapTPCSECLP,*(pTPCSECLP+10+2*irb ));
00792 length=Swap4(swapTPCSECLP,*(pTPCSECLP+10+2*irb+1));
00793 if(length==0) continue;
00794 pTPCRBCLP=pTPCSECLP+offset; assert(!strncmp((char*)pTPCRBCLP,"TPCRBCLP",8));
00795 swapTPCRBCLP=WhetherToSwap(*(pTPCRBCLP+5));
00796
00797 for(imz=0;imz<3;imz++) {
00798 offset=Swap4(swapTPCRBCLP,*(pTPCRBCLP+10+2*imz ));
00799 length=Swap4(swapTPCRBCLP,*(pTPCSECLP+10+2*imz+1));
00800 if(length==0) continue;
00801 pTPCMZCLD=pTPCRBCLP+offset; assert(!strncmp((char*)pTPCMZCLD,"TPCMZCLD",8));
00802 swapTPCMZCLD=WhetherToSwap(*(pTPCMZCLD+5));
00803 DAQ100clTableOut(irb,imz,
00804 sector+map,swapTPCMZCLD,pTPCMZCLD+10);
00805 }
00806 }
00807
00808 numberOfPresentSectors++;
00809
00810 }
00811
00812
00813
00814 }
00815
00816 Int_t St_tpcdaq_Maker::Make()
00817 {
00818 int output,errorCode; const char *pTPCP;
00819 printf("St_tpcdaq_Maker::Make() method called in Mode=%d DAQ=%d\n",m_Mode,daq_flag);
00820 #ifdef DEVELOPMENT
00821 char junk[10];
00822 PP("\007St_tpcdaq_Maker::Make: Please input a value for daq_flag: ");
00823 gets(junk); daq_flag=atoi(junk); PP("daq_flag = %d. Press return.\n",daq_flag);
00824 #endif
00825 mErr=0;
00826 errorCode=GetEventAndDecoder();
00827 if(m_Mode != 1) {
00828 victor=victorPrelim->getTPCReader();
00829 if(!victor){
00830 PP(" getTPCReader() did not return any data. Continuing anyway\n");
00831 return kStOk;
00832
00833
00834 }
00835 }
00836
00837 if(errorCode) {
00838 PP("Error: St_tpcdaq_Maker no event from TRS (%d).\n",errorCode);
00839 return kStErr;
00840 }
00841 assert(!m_DataSet->GetList());
00842 if(daq_flag & kPadRaw) {
00843
00844 output=Output();
00845 if(output==4321) printf("St_tpcdaq_Maker::Make() TPC data is missing this event, but do not skip event\n");
00846 else if( (output!=0) && (output!=4321) ) {
00847 PP("St_tpcdaq_Maker has detected .daq file corruption. Skip this event.\n");
00848 return kStErr;
00849 }
00850 }
00851 if(daq_flag & kDAQ100) {
00852 if(m_Mode != 1) {
00853 pTPCP=(const char*)(victor->ptrTPCP);
00854
00855
00856 assert(strncmp(pTPCP,"TPCP",4)==0);
00857 DAQ100clOutput((const unsigned int*)pTPCP);
00858 }
00859 }
00860 if(mErr) {
00861 PP("St_tpcdaq_Maker failed with error code %d.\n",mErr);
00862 return kStFatal;
00863 } else {
00864 PP("Got through St_tpcdaq_Maker OK.\n");
00865 }
00866 return kStOK;
00867 }
00868
00869
00870
00878
00879 char St_tpcdaq_Maker::SetSequenceMerging(char mergeSequences)
00880 {
00881 mMergeSequences=mergeSequences;
00882 (void) printf("St_tpcdaq_Maker::SetSequenceMerging: mMergeSequences is %s\n",(mMergeSequences?"ON":"OFF"));
00883 return mMergeSequences;
00884 }
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904
00905
00906
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935
00936
00937
00938
00939
00940
00941
00942
00943
00944
00945
00946
00947
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964
00965
00966
00967
00968
00969
00970
00971
00972
00973
00974
00975
00976
00977
00978
00979
00980
00981
00982
00983
00984
00985
00986
00987
00988
00989
00990
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001
01002
01003
01004
01005
01006
01007
01008
01009
01010
01011
01012
01013
01014
01015
01016
01017
01018
01019
01020
01021
01022
01023
01024
01025
01026
01027
01028
01029
01030
01031
01032
01033
01034
01035
01036
01037
01038
01039
01040
01041
01042
01043
01044
01045
01046
01047
01048
01049
01050
01051
01052
01053
01054
01055
01056
01057
01058
01059
01060
01061
01062
01063
01064
01065
01066
01067
01068
01069
01070
01071
01072
01073
01074
01075
01076
01077
01078
01079
01080
01081
01082
01083
01084
01085
01086
01087
01088
01089
01090
01091
01092
01093
01094
01095
01096
01097
01098
01099
01100
01101
01102
01103
01104
01105
01106
01107
01108
01109
01110
01111
01112
01113
01114
01115
01116
01117
01118
01119
01120
01121
01122
01123
01124
01125
01126
01127
01128
01129
01130
01131
01132
01133
01134
01135
01136
01137
01138
01139
01140
01141
01142
01143
01144
01145
01146
01147
01148
01149
01150