X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=FMD%2FAliFMDRawStream.cxx;h=34337e67d9956892c6fb5d489024e340e0c833d8;hb=1937171a8f174895dd3ee337adf145f612527f95;hp=7c47e9591b704c83df5d060c6e50f2d9eed9d3f0;hpb=55f0ce5bd59918d51e411fc6d213065e37adf08c;p=u%2Fmrichter%2FAliRoot.git diff --git a/FMD/AliFMDRawStream.cxx b/FMD/AliFMDRawStream.cxx index 7c47e9591b7..34337e67d99 100644 --- a/FMD/AliFMDRawStream.cxx +++ b/FMD/AliFMDRawStream.cxx @@ -26,11 +26,14 @@ // and the sample rate should be set explicitly. // #include "AliFMDRawStream.h" // ALIFMDRAWSTREAM_H -#include // ALIRAWREADER_H +// #include // ALIRAWREADER_H #include "AliFMDParameters.h" -#include -#include -#include +// #include +#include "AliFMDDebug.h" // Better debug macros +// #include +// #include +#include "AliRawReader.h" +#include //____________________________________________________________________ ClassImp(AliFMDRawStream) @@ -42,40 +45,73 @@ ClassImp(AliFMDRawStream) AliFMDRawStream::AliFMDRawStream(AliRawReader* reader) : AliAltroRawStream(reader) { - fNoAltroMapping = kFALSE; + // CTOR + reader->Reset(); // Select FMD DDL's - SelectRawData(AliFMDParameters::kBaseDDL>>8); + SelectRawData("FMD"); } //_____________________________________________________________________________ Bool_t AliFMDRawStream::ReadChannel(UInt_t& ddl, UInt_t& addr, - UInt_t& len, UShort_t* data) + UInt_t& len, volatile UShort_t* data) { + // Read one channel and return. Returns 0 when there's no more + // data. Int_t l = 0; static Int_t last = 0xFFFF; // 0xFFFF means signal is used Bool_t next = kTRUE; do { Int_t signal = last; if (last > 0x3FF) { - AliDebug(30, Form("Last is 0x%x, so reading a new word", last)); + AliFMDDebug(30, ("Last is 0x%x, so reading a new word", last)); next = Next(); - if (!next) break; + if(!next){ + AliFMDDebug(15, ("Read word # %d (!next)", l)); + addr = GetPrevHWAddress(); + ddl = (GetPrevDDLNumber() < 0 ? UINT_MAX: GetPrevDDLNumber()); + len = l+1; // Need to add one - l points to last valid index + last = signal; + break; + } signal = GetSignal(); if (GetHWAddress() != GetPrevHWAddress() && GetPrevHWAddress() >= 0) { - AliDebug(15, Form("New hardware address, was 0x%x, now 0x%x", + AliFMDDebug(15, ("New hardware address, was 0x%x, now 0x%x", GetPrevHWAddress(), GetHWAddress())); addr = GetPrevHWAddress(); - ddl = AliFMDParameters::kBaseDDL + GetPrevDDLNumber(); + ddl = (GetPrevDDLNumber() < 0 ? UINT_MAX : GetPrevDDLNumber()); len = l+1; // Need to add one - l points to last valid index last = signal; break; } } + // Sanity check - if the total bunch length is less than 1, then + // read until we get the next bunch. + Int_t b = GetTimeLength(); + if (b < 1) { + AliWarning(Form("Bunch length %0d is less than 0 for " + "DDL %4d address 0x%03x", + b, ddl, addr)); + last = 0xFFFF; + continue; + } + + // Sanity check - if the current time is less than 0, then read + // until we get a new bunch. Int_t t = GetTime(); + if (t < 0) { + AliWarning(Form("Time %0d is less than 0 for DDL %4d address 0x%03x", + t, ddl, addr)); + last = 0xFFFF; + continue; + } l = TMath::Max(l, t); data[t] = signal; last = 0xFFFF; +#if 0 + AliFMDDebug(signal > 512 ? 1 : 0, ("Signal @ %d (%d) is %d", + time, t, data[t])); +#endif } while (next); return next; }