]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - RAW/AliAltroRawStream.cxx
In AliMUONVPainter:
[u/mrichter/AliRoot.git] / RAW / AliAltroRawStream.cxx
index 4159dc34a2067c474065c775058e03487ebe8aa9..581712a362a5fafde6ed520d63cb045359c3cd28 100644 (file)
 #include "AliAltroRawStream.h"
 #include "AliRawReader.h"
 #include "AliLog.h"
+#include "AliRawEventHeaderBase.h"
 
 ClassImp(AliAltroRawStream)
 
 
 //_____________________________________________________________________________
 AliAltroRawStream::AliAltroRawStream(AliRawReader* rawReader) :
-  fNoAltroMapping(kTRUE),
   fIsShortDataHeader(kFALSE),
   fDDLNumber(-1),
   fPrevDDLNumber(-1),
@@ -51,6 +51,7 @@ AliAltroRawStream::AliAltroRawStream(AliRawReader* rawReader) :
   fData(NULL),
   fPosition(0),
   fCount(0),
+  fChannelPayloadSize(-1),
   fBunchLength(0),
   fRCUTrailerData(NULL),
   fRCUTrailerSize(0),
@@ -65,13 +66,11 @@ AliAltroRawStream::AliAltroRawStream(AliRawReader* rawReader) :
   fAltroCFG2(0)
 {
 // create an object to read Altro raw digits
-  fSegmentation[0] = fSegmentation[1] = fSegmentation[2] = -1;
 }
 
 //_____________________________________________________________________________
 AliAltroRawStream::AliAltroRawStream(const AliAltroRawStream& stream) :
   TObject(stream),
-  fNoAltroMapping(stream.fNoAltroMapping),
   fIsShortDataHeader(stream.fIsShortDataHeader),
   fDDLNumber(stream.fDDLNumber),
   fPrevDDLNumber(stream.fPrevDDLNumber),
@@ -87,6 +86,7 @@ AliAltroRawStream::AliAltroRawStream(const AliAltroRawStream& stream) :
   fData(stream.fData),
   fPosition(stream.fPosition),
   fCount(stream.fCount),
+  fChannelPayloadSize(stream.fChannelPayloadSize),
   fBunchLength(stream.fBunchLength),
   fRCUTrailerData(stream.fRCUTrailerData),
   fRCUTrailerSize(stream.fRCUTrailerSize),
@@ -100,9 +100,6 @@ AliAltroRawStream::AliAltroRawStream(const AliAltroRawStream& stream) :
   fAltroCFG1(stream.fAltroCFG1),
   fAltroCFG2(stream.fAltroCFG2)
 {
-  fSegmentation[0]   = stream.fSegmentation[0];
-  fSegmentation[1]   = stream.fSegmentation[1];
-  fSegmentation[2]   = stream.fSegmentation[2];
 }
 
 //_____________________________________________________________________________
@@ -110,7 +107,6 @@ AliAltroRawStream& AliAltroRawStream::operator = (const AliAltroRawStream& strea
 {
   if(&stream == this) return *this;
 
-  fNoAltroMapping    = stream.fNoAltroMapping;
   fIsShortDataHeader = stream.fIsShortDataHeader;
   fDDLNumber         = stream.fDDLNumber;
   fPrevDDLNumber     = stream.fPrevDDLNumber;
@@ -126,6 +122,7 @@ AliAltroRawStream& AliAltroRawStream::operator = (const AliAltroRawStream& strea
   fData              = stream.fData;
   fPosition          = stream.fPosition;
   fCount             = stream.fCount;
+  fChannelPayloadSize= stream.fChannelPayloadSize;
   fBunchLength       = stream.fBunchLength;
   fRCUTrailerData    = stream.fRCUTrailerData;
   fRCUTrailerSize    = stream.fRCUTrailerSize;
@@ -139,10 +136,6 @@ AliAltroRawStream& AliAltroRawStream::operator = (const AliAltroRawStream& strea
   fAltroCFG1         = stream.fAltroCFG1;
   fAltroCFG2         = stream.fAltroCFG2;
 
-  fSegmentation[0]   = stream.fSegmentation[0];
-  fSegmentation[1]   = stream.fSegmentation[1];
-  fSegmentation[2]   = stream.fSegmentation[2];
-
   return *this;
 }
 
@@ -159,6 +152,7 @@ void AliAltroRawStream::Reset()
 // reset altro raw stream params
 
   fPosition = fCount = fBunchLength = 0;
+  fChannelPayloadSize = -1;
 
   fRCUTrailerData = NULL;
   fRCUTrailerSize = 0;
@@ -168,8 +162,6 @@ void AliAltroRawStream::Reset()
   fDDLNumber = fPrevDDLNumber = fRCUId = fPrevRCUId = fHWAddress = fPrevHWAddress = fTime = fPrevTime = fSignal = fTimeBunch = -1;
 
   if (fRawReader) fRawReader->Reset();
-
-  fSegmentation[0] = fSegmentation[1] = fSegmentation[2] = -1;
 }
 
 //_____________________________________________________________________________
@@ -207,6 +199,54 @@ Bool_t AliAltroRawStream::Next()
   return kTRUE;
 }
 
+//_____________________________________________________________________________
+Bool_t AliAltroRawStream::NextDDL(UChar_t *data)
+{
+  if (!data) {
+    do {
+      if (!fRawReader->ReadNextData(fData)) return kFALSE;
+    } while (fRawReader->GetDataSize() == 0);
+  }
+  else {
+    fData = data;
+  }
+
+  fDDLNumber = fRawReader->GetDDLID();
+  fChannelPayloadSize = -1;
+  fPosition = GetPosition();
+
+  return kTRUE;
+}
+
+//_____________________________________________________________________________
+Bool_t AliAltroRawStream::NextChannel()
+{
+  if (fPosition <= 0) return kFALSE;
+
+  ReadTrailer();
+
+  return kTRUE;
+}
+
+//_____________________________________________________________________________
+Bool_t AliAltroRawStream::NextBunch(UShort_t *bunchData,
+                                   Int_t &bunchLength,
+                                   Int_t &startTimeBin)
+{
+  if (fCount == 0) return kFALSE;
+
+  ReadBunch();
+  bunchLength = fTimeBunch;
+  startTimeBin = fTime;
+
+  while (fBunchLength > 0) {
+    ReadAmplitude();
+    bunchData[bunchLength-fBunchLength-1] = fSignal;
+  }
+
+  return kTRUE;
+}
+
 //_____________________________________________________________________________
 void AliAltroRawStream::SelectRawData(Int_t detId)
 {
@@ -249,12 +289,6 @@ UShort_t AliAltroRawStream::GetNextWord()
 Bool_t AliAltroRawStream::ReadTrailer()
 {
   //Read a trailer of 40 bits in the backward reading mode
-  //In case of no mapping is provided, read a dummy trailer
-  if (fNoAltroMapping) {
-    AliError("No ALTRO mapping information is loaded! Reading a dummy trailer!");
-    return ReadDummyTrailer();
-  }
-
   //First reading filling words
   UShort_t temp;
   Int_t nFillWords = 0;
@@ -302,6 +336,7 @@ Bool_t AliAltroRawStream::ReadTrailer()
     return kFALSE;
   }
   fCount |= ((temp & 0x3FF) >> 6);
+  fChannelPayloadSize = fCount;
 
   if (fCount >= fPosition) {
     fRawReader->AddMajorErrorLog(kAltroTrailerErr,"invalid size");
@@ -318,26 +353,6 @@ Bool_t AliAltroRawStream::ReadTrailer()
   return kTRUE;
 }
 
-//_____________________________________________________________________________
-Bool_t AliAltroRawStream::ReadDummyTrailer()
-{
-  //Read a trailer of 40 bits in the backward reading mode
-  //In case of no mapping is provided, read a dummy trailer
-  UShort_t temp;
-  while ((temp = GetNextWord()) == 0x2AA) { };
-
-  fSegmentation[0] = temp;
-  fSegmentation[1] = GetNextWord();
-  fSegmentation[2] = GetNextWord();
-  fCount = GetNextWord();
-  if (fCount == 0) return kFALSE;
-  fHWAddress = -1;
-
-  fPosition -= (4 - (fCount % 4)) % 4;  // skip fill words
-
-  return kTRUE;
-}
-
 //_____________________________________________________________________________
 void AliAltroRawStream::ReadBunch()
 {
@@ -440,25 +455,33 @@ Int_t AliAltroRawStream::GetPosition()
     }
 
     Int_t position = ReadRCUTrailer(index,trailerSize);
-    // The size is specified in a number of 40bits
-    // Therefore we need to transform it to number of bytes
-    position *= 5;
+    if (fRawReader->GetType() != AliRawEventHeaderBase::kStartOfData) {
+      // The size is specified in a number of 40bits
+      // Therefore we need to transform it to number of bytes
+      position *= 5;
 
-    // Check the consistency of the header and trailer
-    if (((fRawReader->GetDataSize() - trailerSize*4) < position) ||
-       ((fRawReader->GetDataSize() - trailerSize*4) >= (position + 4))) {
-      fRawReader->AddMajorErrorLog(kRCUTrailerSizeErr,Form("h=%d tr=%d rcu=%d bytes",
-                                                          fRawReader->GetDataSize(),
-                                                          trailerSize*4,
-                                                          position));
-      AliWarning(Form("Inconsistent raw data size ! Raw data size - %d bytes (from the header), RCU trailer - %d bytes, raw data paylod - %d bytes !",
-                   fRawReader->GetDataSize(),
-                   trailerSize*4,
-                   position));
-      position = fRawReader->GetDataSize() - trailerSize*4;
-    }
+      // Check the consistency of the header and trailer
+      if (((fRawReader->GetDataSize() - trailerSize*4) < position) ||
+         ((fRawReader->GetDataSize() - trailerSize*4) >= (position + 4))) {
+       fRawReader->AddMajorErrorLog(kRCUTrailerSizeErr,Form("h=%d tr=%d rcu=%d bytes",
+                                                            fRawReader->GetDataSize(),
+                                                            trailerSize*4,
+                                                            position));
+       AliWarning(Form("Inconsistent raw data size ! Raw data size - %d bytes (from the header), RCU trailer - %d bytes, raw data paylod - %d bytes !",
+                       fRawReader->GetDataSize(),
+                       trailerSize*4,
+                       position));
+       position = fRawReader->GetDataSize() - trailerSize*4;
+      }
 
-    return position * 8 / 10;
+      return position * 8 / 10;
+    }
+    else {
+      // Special RCU payload in case of SOD events
+      // The decoding is left to the user code
+      // Here we just retrieve the payload size
+      return position;
+    }
   }
   else {
     // In case of the Old RCU trailer format
@@ -784,3 +807,16 @@ void AliAltroRawStream::AddMappingErrorLog(const char *message)
 
   if (fRawReader) fRawReader->AddMinorErrorLog(kBadAltroMapping,message);
 }
+
+//_____________________________________________________________________________
+Int_t AliAltroRawStream::GetRCUPayloadSizeInSOD() const
+{
+  // Get the size of the RCU data in case
+  // of SOD events
+  if (fRawReader) {
+    if (fRawReader->GetType() == AliRawEventHeaderBase::kStartOfData) {
+      return fPosition;
+    }
+  }
+  return -1;
+}