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
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158 #include "StRtsReaderMaker.h"
00159 #include "StRtsTable.h"
00160 #include "TROOT.h"
00161 #include "StDAQMaker/StDAQReader.h"
00162
00163 #include "TDataSetIter.h"
00164
00165 #if !defined(OLD_EVP_READER) && !defined(NEW_DAQ_READER)
00166 # include "RTS/src/RTS_READER/daq_det.h"
00167 # include "RTS/src/RTS_READER/daq_dta.h"
00168 # include "RTS/src/RTS_READER/daq_dta_structs.h"
00169 typedef unsigned int UINT32;
00170 # include "RTS/include/evp.h"
00171 # include "RTS/src/EVP_READER/cfgutil.h"
00172 # include "RTS/src/EVP_READER/evpReaderClass.h"
00173 # include "RTS/src/RTS_READER/rts_reader.h"
00174 #elif defined(NEW_DAQ_READER)
00175 # include "RTS/src/DAQ_READER/daq_det.h"
00176 # include "RTS/src/DAQ_READER/daq_dta.h"
00177 # include "RTS/src/DAQ_READER/daq_dta_structs.h"
00178 typedef unsigned int UINT32;
00179 # include "RTS/include/evp.h"
00180 # include "RTS/src/DAQ_READER/cfgutil.h"
00181 # include "RTS/src/DAQ_READER/daqReader.h"
00182 #endif
00183
00184 #include "StStreamFile.h"
00185
00186
00187 ClassImp(StRtsReaderMaker);
00188
00189
00190 StRtsReaderMaker::StRtsReaderMaker(const char *name):StMaker(name)
00191 ,fRtsReader(0),fDatReader(0),fRtsTable(0),fBank(0)
00192 {
00193
00194 }
00195
00196
00197 StRtsReaderMaker::~StRtsReaderMaker()
00198 {
00199 delete fRtsReader;
00200 fRtsReader = 0;
00201
00202 fRtsTable = 0;
00203 }
00204
00205 Int_t StRtsReaderMaker::Init() {
00206 return StMaker::Init();
00207 }
00208
00209
00210 daqReader *StRtsReaderMaker::InitReader()
00211 {
00212
00213 if (!fRtsReader && !fDatReader) {
00214 StDAQReader *daqReader = 0;
00215
00216 TDataSet *dr = GetDataSet("StDAQReader");
00217 if(dr) daqReader = (StDAQReader *)(dr->GetObject());
00218
00219 if(daqReader == NULL) {
00220 LOG_INFO << "StRtsReaderMaker::InitReader No daqReader available..." << endm;
00221 } else {
00222 evpReader *daqEvp = daqReader->getFileReader();
00223 if(daqEvp == NULL) {
00224 LOG_INFO << "StRtsReaderMaker::InitReader No evpReader available..." << endm;
00225 } else {
00226 LOG_INFO << "StRtsReaderMaker::InitReader: evpReader was found: " << daqEvp << endm;
00227 fRtsReader = daqEvp->rts();
00228 if (!fRtsReader) {
00229 LOG_ERROR << "StRtsReaderMaker::InitReader: no daqReader was found!" << endm;
00230 }
00231 }
00232 }
00233 }
00234 return fRtsReader;
00235 }
00236
00237
00238 void StRtsReaderMaker::Clear(Option_t *option)
00239 {
00240 fRtsTable = 0;
00241 fBank = 0;
00242 fLastQuery = "";
00243
00244 StMaker::Clear(option);
00245 }
00246
00247 void StRtsReaderMaker::SetDaqReader(daqReader *reader)
00248 {
00249 if (reader) {
00250 assert(reader && !fDatReader && "Can not use two readers simultaneously");
00251 }
00252 fRtsReader = reader;
00253 }
00254
00255 void StRtsReaderMaker::SetDatReader(StStreamFile *reader)
00256 {
00257 if (reader) {
00258 assert(reader && !fRtsReader && "Can not use two readers simultaneously");
00259 }
00260 fDatReader = reader;
00261 }
00262
00263 #if 0
00264
00265 static const char*RtsDataTypeByBankName(const char *bankName)
00266 {
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277 TString bn = bankName;
00278 if (bn == "cld" ) return "daq_cld";
00279 if (bn == "raw" ) {
00280 static const char *str = 0;
00281 if (!str) {
00282 gROOT->ProcessLine("struct intstruct { int a;}");
00283 }
00284 return "intstruct";
00285 }
00286 return 0;
00287 }
00288 #endif
00289
00290
00291 StRtsTable *StRtsReaderMaker::InitTable(const char *detName,const char *bankName)
00292 {
00293
00294 if (fRtsTable) {
00295
00296 if (fBank && !fBank->is_empty())
00297 {
00298 if (Debug()) {
00299 LOG_DEBUG << " You are going to use \"" << detName << "/" << bankName << "\" RTS bank" << endm;
00300 LOG_DEBUG << " even though you did not use all information from the previous RTS bank: \""
00301 << fLastQuery << "\" yet" << endm;
00302 }
00303 }
00304 delete fRtsTable;
00305 fRtsTable = 0;
00306 }
00307 size_t dtBankSize = 0;
00308 if (fBank) { dtBankSize = fBank->get_size_t(); }
00309 else if (fDatReader) { dtBankSize = fDatReader->Length() ; }
00310 if ( dtBankSize ) {
00311
00312 fRtsTable = new StRtsTable(dtBankSize,2);
00313 if (Debug() > 3 ) fRtsTable->Print();
00314 AddData(fRtsTable);
00315 }
00316 return fRtsTable;
00317 }
00318
00319 void StRtsReaderMaker::FillDaqHeader()
00320 {
00321 if (fRtsReader) {
00322 fRtsTable->SetToken (fRtsReader->token );
00323 fRtsTable->SetTrgcmd (fRtsReader->trgcmd );
00324 fRtsTable->SetDaqcmd (fRtsReader->daqcmd );
00325 fRtsTable->SetTrgword (fRtsReader->trgword);
00326 fRtsTable->SetPhyword (fRtsReader->phyword);
00327 fRtsTable->SetDaqbits (fRtsReader->daqbits);
00328 fRtsTable->SetDaqbits_l1 (fRtsReader->daqbits_l1);
00329 fRtsTable->SetDaqbits_l2 (fRtsReader->daqbits_l2);
00330 fRtsTable->SetEvpgroups (fRtsReader->evpgroups);
00331 fRtsTable->SetDetectors (fRtsReader->detectors);
00332 }
00333 }
00334
00335
00336 TDataSet *StRtsReaderMaker::FillTable()
00337 {
00338 assert(fRtsTable);
00339 if (fBank && fBank->iterate()) {
00340 fRtsTable->SetAll( fBank->sec
00341 , fBank->pad
00342 , fBank->rdo
00343 , fBank->row);
00344
00345 fRtsTable->SetNRows(0);
00346 if (Debug()) {
00347 LOG_DEBUG <<" StRtsReaderMaker::FillTable(): the bank size is "
00348 << fBank->ncontent << " row" << ((fBank->ncontent>1)?"s ":" ")
00349 << fRtsTable->GetRowSize() << " bytes each" << endm;
00350 }
00351 fRtsTable->AppendRows(fBank->Byte,fBank->ncontent);
00352 fRtsTable->SetNRows(fBank->ncontent);
00353 } else if (fDatReader) {
00354 fRtsTable->SetAll(0,0,0,0);
00355 fRtsTable->SetNRows(0);
00356 fRtsTable->AppendRows(fDatReader->Record(),1);
00357 fRtsTable->SetNRows(1);
00358 } else {
00359 #ifdef HARD_DEBUG
00360 if (!fLastQuery.IsNull() && Debug()) {
00361 LOG_DEBUG <<" StRtsReaderMaker::FillTable(): No data has been found for \""
00362 << fLastQuery << "\" to fill the table"
00363 << endm;
00364 }
00365 #endif
00366 if (fRtsTable && Debug() > 3 ) fRtsTable->Print(0,5);
00367 delete fRtsTable;
00368 fRtsTable = 0;
00369 fLastQuery = "";
00370 }
00371 return fRtsTable;
00372 }
00373
00374
00375 TDataSet *StRtsReaderMaker::FindDataSet (const char* logInput,const StMaker *uppMk,
00376 const StMaker *dowMk) const
00377 {
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389 if ( !(logInput && logInput[0]) )
00390 return StMaker::FindDataSet(logInput,uppMk,dowMk);
00391
00392 TString rtsRequest = logInput;
00393 Bool_t rtsSystem = false;
00394 TDataSet *ds = 0;
00395 StRtsReaderMaker *thisMaker = (StRtsReaderMaker *)this;
00396
00397 if (fLastQuery == rtsRequest) {
00398 rtsSystem = true;
00399 } else if (fRtsReader || fDatReader) {
00400 TObjArray *tokens = rtsRequest.Tokenize("/[],");
00401 Int_t nItems = tokens->GetEntries();
00402 if ( !strcmp(tokens->At(0)->GetName(),"RTS") ) {
00403
00404 TString detName = tokens->At(1)->GetName();
00405
00406 char *detNameBuf = new char[detName.Length()+1];
00407 strncpy(detNameBuf,detName.Data(),detName.Length());
00408 detNameBuf[detName.Length()]=0;
00409 daq_det *rts_det = fRtsReader ? fRtsReader->det(detNameBuf) : 0;
00410 delete [] detNameBuf;
00411 if (rts_det) {
00412
00413 StRtsReaderMaker *thisMaker = (StRtsReaderMaker *)this;
00414 switch (nItems-2) {
00415 case 1:
00416 thisMaker->fBank = rts_det->get( tokens->At(2)->GetName() );
00417 break;
00418 case 2:
00419 thisMaker->fBank = rts_det->get( tokens->At(2)->GetName()
00420 ,atoi(tokens->At(3)->GetName()));
00421 if (Debug()) {
00422 LOG_DEBUG <<" StRtsReaderMaker::FindDataSet det(\"" <<
00423 detName << "\")->get(\""<<tokens->At(2)->GetName()
00424 << "\"," << atoi(tokens->At(3)->GetName())
00425 << ") "
00426 << "fBank = "<< thisMaker->fBank << endm;
00427 }
00428 break;
00429 case 3:
00430 thisMaker->fBank = rts_det->get( tokens->At(2)->GetName()
00431 ,atoi(tokens->At(3)->GetName())
00432 ,atoi(tokens->At(4)->GetName()));
00433 break;
00434 case 4:
00435 thisMaker->fBank = rts_det->get( tokens->At(2)->GetName()
00436 ,atoi(tokens->At(3)->GetName())
00437 ,atoi(tokens->At(4)->GetName())
00438 ,atoi(tokens->At(5)->GetName()));
00439 break;
00440 default: thisMaker->fBank = 0; break;
00441 };
00442 if (fBank) {
00443 thisMaker->InitTable(detName,tokens->At(2)->GetName());
00444 rtsSystem = true;
00445 thisMaker->fLastQuery = rtsRequest;
00446 } else {
00447 thisMaker->fLastQuery = "";
00448 }
00449 } else if (fDatReader && detName=="trg" && TString("raw") == tokens->At(2)->GetName()) {
00450 thisMaker->InitTable(detName,tokens->At(2)->GetName());
00451 thisMaker->fLastQuery = rtsRequest;
00452 rtsSystem = fDatReader->Record();
00453 if (Debug()) {
00454 LOG_DEBUG << " StRtsReaderMaker::FindDataSet: DAT request was found: "
00455 << fDatReader->Length() << (void *)fDatReader->Record() << endm;
00456 }
00457 }
00458 }
00459 delete tokens;
00460 }
00461
00462 if (rtsSystem) {
00463 thisMaker->FillDaqHeader();
00464 ds = thisMaker->FillTable();
00465 } else {
00466 ds = StMaker::FindDataSet(logInput,uppMk,dowMk);
00467 }
00468 return ds;
00469 }
00470
00471
00472 Int_t StRtsReaderMaker::InitRun(int run)
00473 {
00474 return StMaker::InitRun(run);
00475 }
00476
00477
00478 Int_t StRtsReaderMaker::Make()
00479 {
00480
00481 int res = kStOk;
00482 InitReader();
00483 return res;
00484 }