X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=FMD%2FAliFMDRawStream.cxx;h=34337e67d9956892c6fb5d489024e340e0c833d8;hb=576638100a2c7e4d1f0fe77910aefc6b7ac23392;hp=1bf8c5c0a5abad0efd7ccf13fc715f910b6a046f;hpb=925e65709851bc55cacc40068515d4c5a80fc419;p=u%2Fmrichter%2FAliRoot.git diff --git a/FMD/AliFMDRawStream.cxx b/FMD/AliFMDRawStream.cxx index 1bf8c5c0a5a..34337e67d99 100644 --- a/FMD/AliFMDRawStream.cxx +++ b/FMD/AliFMDRawStream.cxx @@ -26,36 +26,97 @@ // and the sample rate should be set explicitly. // #include "AliFMDRawStream.h" // ALIFMDRAWSTREAM_H -#include // ALIRAWREADER_H +// #include // ALIRAWREADER_H +#include "AliFMDParameters.h" +// #include +#include "AliFMDDebug.h" // Better debug macros +// #include +// #include +#include "AliRawReader.h" +#include //____________________________________________________________________ ClassImp(AliFMDRawStream) +#if 0 + ; // This is here to keep Emacs for indenting the next line +#endif //____________________________________________________________________ -AliFMDRawStream::AliFMDRawStream(AliRawReader* reader, UShort_t sampleRate) - : AliAltroRawStream(reader), - fSampleRate(sampleRate), - fPrevTime(-1), - fExplicitSampleRate(kFALSE) +AliFMDRawStream::AliFMDRawStream(AliRawReader* reader) + : AliAltroRawStream(reader) { - if (fSampleRate > 0) fExplicitSampleRate = kTRUE; + // CTOR + reader->Reset(); + // Select FMD DDL's + SelectRawData("FMD"); } //_____________________________________________________________________________ Bool_t -AliFMDRawStream::Next() +AliFMDRawStream::ReadChannel(UInt_t& ddl, UInt_t& addr, + UInt_t& len, volatile UShort_t* data) { - // read the next raw digit - // returns kFALSE if there is no digit left - fPrevTime = fTime; - if (AliAltroRawStream::Next()) { - if (!fExplicitSampleRate && fPrevPad != fPad) - fSampleRate = fTimeBunch / 128; - return kTRUE; - } - return kFALSE; + // 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) { + AliFMDDebug(30, ("Last is 0x%x, so reading a new word", last)); + next = Next(); + 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) { + AliFMDDebug(15, ("New hardware address, was 0x%x, now 0x%x", + GetPrevHWAddress(), GetHWAddress())); + addr = GetPrevHWAddress(); + 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; } + //_____________________________________________________________________________ // // EOF