00001
00002
00003
00004
00005
00006
00007
00008
00009
00011
00012 #include "RawData/RawVaTimingMonitorBlock.h"
00013
00014 enum EDebugDigitDataBlock {
00015 dbg_DumpHeaderOnUnpack = 0x0001,
00016 dbg_DumpCrateOnUnpack = 0x0002,
00017 dbg_DumpDigitOnUnpack = 0x0004
00018 };
00019 UInt_t RawVaTimingMonitorBlock::fgDebugFlags = 0;
00020
00021 #include "RawData/RawCrateStatus.h"
00022 #include "RawData/RawVaMCDigit.h"
00023 #include "RawData/RawQieMCDigit.h"
00024
00025 #include "MessageService/MsgStream.h"
00026 #include "MessageService/MsgFormat.h"
00027
00028 #include "MessageService/MsgService.h"
00029 CVSID("$Id: RawVaTimingMonitorBlock.cxx,v 1.5 2005/08/26 19:04:53 rhatcher Exp $");
00030
00031 #include "RawData/RawBlockRegistry.h"
00032 REGISTERRAWBLOCK(RawVaTimingMonitorBlock,kMdBlockVaTimingMonitor,0);
00033
00034 ClassImp(RawVaTimingMonitorBlock)
00035
00036 enum EVaTimingMonitorBlkPos {
00037 indx_size = 0,
00038 indx_checksum = 1,
00039 indx_blockid = 2,
00040 indx_run = 3,
00041 indx_subrun = 4,
00042 indx_runtype = indx_subrun,
00043 indx_loadsec = 5,
00044 indx_loadnsec = 6,
00045 indx_crateid = 7,
00046 indx_tf = 8,
00047 indx_ndigits = -1,
00048 zzzz_last = 9
00049 };
00050
00051
00052 RawVaTimingMonitorBlock::RawVaTimingMonitorBlock()
00053 : fRawCrateStatus(0), fRawDigits(0)
00054 {
00055
00056 }
00057
00058
00059 RawVaTimingMonitorBlock::RawVaTimingMonitorBlock(const Int_t *block)
00060 : RawDataBlock(block), fRawCrateStatus(0), fRawDigits(0)
00061 {
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077 }
00078
00079
00080 RawVaTimingMonitorBlock::~RawVaTimingMonitorBlock()
00081 {
00082
00083 if ( fRawDigits ) {
00084 fRawDigits->Delete();
00085 delete fRawDigits;
00086 fRawDigits = 0;
00087 }
00088 if ( fRawCrateStatus ) {
00089 delete fRawCrateStatus;
00090 fRawCrateStatus = 0;
00091 }
00092
00093 }
00094
00095
00096 RawVaTimingMonitorBlock& RawVaTimingMonitorBlock::operator=(const RawVaTimingMonitorBlock& rhs)
00097 {
00098
00099 if (this != &rhs) {
00100 RawDataBlock::operator=(rhs);
00101 if (fRawCrateStatus) { delete fRawCrateStatus; fRawCrateStatus = 0; }
00102 if (fRawDigits) {
00103 fRawDigits->Delete();
00104 delete fRawDigits;
00105 fRawDigits = 0;
00106 }
00107 }
00108 return *this;
00109 }
00110
00111
00112 std::ostream& RawVaTimingMonitorBlock::FormatToOStream(std::ostream& os,
00113 Option_t *option) const
00114 {
00115 RawDataBlock::FormatToOStream(os,option);
00116 if (option[0] == 'X') return os;
00117
00118
00119
00120 os << " TimeStamp " << GetTimeStamp().AsString("c") << endl;
00121 os << " Run " << GetRun()
00122 << " SubRun " << GetSubRun()
00123 << " RunType " << GetRunType()
00124 << " TimeFrame " << GetTimeFrameNum()
00125 << " with " << GetNumberOfDigits() << " digits "
00126 << endl;
00127 os << " " << *GetCrateStatus() << endl;
00128
00129 if (strchr(option,'q') != 0) return os;
00130
00131 TIter iter = GetDatumIter();
00132 TObject *tobj;
00133 RawDigit *udigit;
00134 while ( ( tobj = iter.Next() ) ) {
00135 udigit = dynamic_cast<RawDigit *>(tobj);
00136 if (udigit) os << " " << (*udigit) << endl;
00137 }
00138 os << endl;
00139 return os;
00140 }
00141
00142
00143 Int_t RawVaTimingMonitorBlock::GetRun() const
00144 {
00145
00146 if (fSize > indx_run) return fRawBlock[indx_run];
00147 return -1;
00148 }
00149
00150
00151 Short_t RawVaTimingMonitorBlock::GetSubRun() const
00152 {
00153
00154 if (fSize > indx_subrun) return (fRawBlock[indx_subrun]>>16)&0xffff;
00155 return -1;
00156 }
00157
00158
00159 Short_t RawVaTimingMonitorBlock::GetRunType() const
00160 {
00161
00162 if (fSize > indx_runtype) return fRawBlock[indx_runtype]&0xffff;
00163 return -1;
00164 }
00165
00166
00167 VldTimeStamp RawVaTimingMonitorBlock::GetTimeStamp() const
00168 {
00169
00170 if (fSize >= zzzz_last)
00171 return VldTimeStamp(fRawBlock[indx_loadsec],fRawBlock[indx_loadnsec]);
00172
00173 return VldTimeStamp((time_t)0,(Int_t)0);
00174 }
00175
00176
00177 VldContext RawVaTimingMonitorBlock::GetVldContext() const
00178 {
00179
00180
00181 RawBlockId rbid = GetBlockId();
00182 return VldContext(rbid.GetDetector(),rbid.GetSimFlag(),GetTimeStamp());
00183 }
00184
00185
00186 Int_t RawVaTimingMonitorBlock::GetTimeFrameNum() const
00187 {
00188
00189 if (fSize >= zzzz_last) return fRawBlock[indx_tf];
00190 return -1;
00191 }
00192
00193
00194 const RawDigitCrateStatus* RawVaTimingMonitorBlock::GetCrateStatus() const
00195 {
00196
00197 if ( ! fRawDigits ) FillRawDigits();
00198 return fRawCrateStatus;
00199
00200 }
00201
00202
00203 Int_t RawVaTimingMonitorBlock::GetNumberOfDigits() const
00204 {
00205
00206 if ( ! fRawDigits ) FillRawDigits();
00207 return fRawDigits->GetEntriesFast();
00208 }
00209
00210
00211 const RawDigit* RawVaTimingMonitorBlock::At(Int_t idx) const
00212 {
00213
00214
00215
00216 if ( ! fRawDigits ) FillRawDigits();
00217 return (RawDigit*) fRawDigits->At(idx);
00218 }
00219
00220
00221 TIter RawVaTimingMonitorBlock::GetDatumIter(Bool_t dir) const
00222 {
00223
00224
00225
00226 if ( ! fRawDigits ) FillRawDigits();
00227 return TIter(fRawDigits,dir);
00228 }
00229
00230
00231 Int_t RawVaTimingMonitorBlock::IndexOf(RawDigit *rawdigit) const
00232 {
00233
00234
00235
00236 if ( ! fRawDigits ) FillRawDigits();
00237 return fRawDigits->IndexOf(rawdigit);
00238 }
00239
00240
00241 void RawVaTimingMonitorBlock::FillRawDigits() const
00242 {
00243
00244
00245 if ( fRawDigits ) return;
00246 if ( fSize <= 0 || fRawBlock == 0) {
00247 MSG("RawData",Msg::kWarning)
00248 << "RawVaTimingMonitorBlock::FillRawDigits empty block? "
00249 << fSize << " " << fRawBlock << endl;
00250 return;
00251 }
00252
00253 fRawDigits = new TObjArray();
00254 RawDigit *rawdigit = 0;
00255 const Int_t *p = fRawBlock;
00256 const Int_t *end = fRawBlock + fSize;
00257
00258 RawBlockId rbid = GetBlockId();
00259 p += indx_crateid;
00260
00261 if (fgDebugFlags&dbg_DumpHeaderOnUnpack) {
00262 MSG("RawData",Msg::kInfo)
00263 << "RawVaTimingMonitorBlock::FillRawDigits "
00264 << " fSize " << fSize
00265 << " id " << rbid.AsString()
00266 << endl;
00267 }
00268
00269
00270
00271 fRawCrateStatus = new RawDigitCrateStatus(rbid,p,GetTimeStamp(),true);
00272 Int_t npairs = fRawCrateStatus->GetEntries();
00273
00274 if (fgDebugFlags&dbg_DumpCrateOnUnpack) fRawCrateStatus->Print();
00275
00276 while (p<end) {
00277
00278 for (Int_t ipair = 0; ipair < npairs; ipair++) {
00279
00280
00281 ElecType::Elec_t etype = fRawCrateStatus->GetElecType();
00282
00283
00284
00285 switch (rbid.GetSimFlag()) {
00286 case SimFlag::kData:
00287 case SimFlag::kDaqFakeData:
00288 switch (etype) {
00289 case ElecType::kVA:
00290 rawdigit = new RawVaDigit(p,fRawCrateStatus);
00291 break;
00292 case ElecType::kQIE:
00293 rawdigit = new RawQieDigit(p,fRawCrateStatus);
00294 break;
00295 default:
00296 rawdigit = new RawDigit(p,fRawCrateStatus);
00297 break;
00298 }
00299 break;
00300 case SimFlag::kMC:
00301 case SimFlag::kReroot:
00302 switch (etype) {
00303 case ElecType::kVA:
00304 rawdigit = new RawVaMCDigit(p,fRawCrateStatus);
00305 break;
00306 case ElecType::kQIE:
00307 rawdigit = new RawQieMCDigit(p,fRawCrateStatus);
00308 break;
00309 case ElecType::kReroot:
00310 {
00311 if (rbid.GetDetector() == Detector::kNear) {
00312 static int nmsg = 10;
00313 if (nmsg) {
00314 MSG("RawData",Msg::kWarning)
00315 << "RawVaTimingMonitorBlock::FillRawDigits SimFlag "
00316 << SimFlag::AsString(rbid.GetSimFlag())
00317 << " ElecType " << ElecType::AsString(etype)
00318 << " in Detector "
00319 << Detector::AsString(rbid.GetDetector())
00320 << endl
00321 << " treat as kQIE for RawQieMCDigit creation"
00322 << endl;
00323 if (nmsg) {
00324 if (--nmsg == 0)
00325 MSG("RawData",Msg::kWarning)
00326 << " ... last warning of this type" << endl;
00327 }
00328 }
00329 rawdigit = new RawQieMCDigit(p,fRawCrateStatus);
00330 break;
00331 }
00332 else
00333 MSG("RawData",Msg::kError)
00334 << "RawVaTimingMonitorBlock::FillRawDigits SimFlag "
00335 << SimFlag::AsString(rbid.GetSimFlag())
00336 << " ElecType " << ElecType::AsString(etype)
00337 << endl << " attempt to move past problem " << endl;
00338 p += 3;
00339 break;
00340 }
00341 default:
00342 MSG("RawData",Msg::kError)
00343 << "RawVaTimingMonitorBlock::FillRawDigits SimFlag "
00344 << SimFlag::AsString(rbid.GetSimFlag())
00345 << " ElecType " << ElecType::AsString(etype)
00346 << endl << " attempt to move past problem " << endl;
00347 p += 3;
00348 break;
00349 }
00350 break;
00351 case SimFlag::kUnknown:
00352 MSG("RawData",Msg::kError)
00353 << "RawVaTimingMonitorBlock::FillRawDigits SimFlag "
00354 << SimFlag::AsString(rbid.GetSimFlag())
00355 << endl << " attempt to move past problem " << endl;
00356 p += 2;
00357 break;
00358 }
00359
00360 fRawDigits->Add(rawdigit);
00361
00362 if (fgDebugFlags&dbg_DumpDigitOnUnpack) {
00363 rawdigit->Print(); cout << endl;
00364 }
00365 if (p>end) {
00366 MSG("RawData",Msg::kWarning)
00367 << "RawVaTimingMonitorBlock::FillRawDigits crate info seems trashed"
00368 << endl << " SimFlag " << SimFlag::AsString(rbid.GetSimFlag())
00369 << " ElecType " << ElecType::AsString(etype)
00370 << endl;
00371 break;
00372 }
00373 }
00374 }
00375
00376 }
00377
00378
00379