]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliCTPRawStream.cxx
Processing SPD Mean Vertex only in PHYSICS runs.
[u/mrichter/AliRoot.git] / STEER / AliCTPRawStream.cxx
index f6ed66cf1a36eda27794fae2edfe99bc6207008f..48b480b419f0c86e9f73216e3785587973c353e1 100644 (file)
 #include "AliRawReader.h"
 #include "AliLog.h"
 #include "AliDAQ.h"
+#include "AliTriggerIR.h"
 
 ClassImp(AliCTPRawStream)
 
 //_____________________________________________________________________________
 AliCTPRawStream::AliCTPRawStream(AliRawReader* rawReader) :
+  fIRArray("AliTriggerIR",3),
+  fOrbit(0),
+  fBC(0),
+  fL0TriggerInputs(0),
+  fL1TriggerInputs(0),
+  fL2TriggerInputs(0),
   fClassMask(0),
   fClusterMask(0),
   fRawReader(rawReader)
@@ -49,6 +56,12 @@ AliCTPRawStream::AliCTPRawStream(AliRawReader* rawReader) :
 //_____________________________________________________________________________
 AliCTPRawStream::AliCTPRawStream(const AliCTPRawStream& stream) :
   TObject(stream),
+  fIRArray("AliTriggerIR",3),
+  fOrbit(0),
+  fBC(0),
+  fL0TriggerInputs(0),
+  fL1TriggerInputs(0),
+  fL2TriggerInputs(0),
   fClassMask(0),
   fClusterMask(0),
   fRawReader(NULL)
@@ -69,12 +82,14 @@ AliCTPRawStream& AliCTPRawStream::operator = (const AliCTPRawStream&
 AliCTPRawStream::~AliCTPRawStream()
 {
   // destructor
+  fIRArray.Delete();
 }
 
 //_____________________________________________________________________________
 void AliCTPRawStream::Reset()
 {
   // reset raw stream params
+  fIRArray.Clear();
 
   fClassMask = fClusterMask = 0;
 
@@ -89,13 +104,29 @@ Bool_t AliCTPRawStream::Next()
 
   UChar_t *data = NULL;
 
-  if (!fRawReader->ReadNextData(data)) return kFALSE;
+  // CTP raw data does not contain CDH
+  fRawReader->RequireHeader(kFALSE);
 
-  if (fRawReader->GetDataSize() != 32) {
+  if (!fRawReader->ReadNextData(data)) {
+    fRawReader->RequireHeader(kTRUE);
+    return kFALSE;
+  }
+
+  if ((fRawReader->GetDataSize()) < 32 ||
+      ((fRawReader->GetDataSize() % 4) != 0)) {
     AliError(Form("Wrong CTP raw data size: %d",fRawReader->GetDataSize()));
+    fRawReader->RequireHeader(kTRUE);
     return kFALSE;
   }
 
+  fBC = data[0];
+  fBC |= (data[1] & 0xF) << 8;
+
+  fOrbit = data[4] << 12;
+  fOrbit |= (data[5] & 0xF) << 20;
+  fOrbit |= data[8];
+  fOrbit |= (data[9] & 0xF) << 8;
+
   fClusterMask = data[12] >> 2;
 
   fClassMask =  ((ULong64_t)data[12] & 0x3) << 48;
@@ -112,6 +143,101 @@ Bool_t AliCTPRawStream::Next()
   fClassMask |= (ULong64_t)data[28];
   fClassMask |= ((ULong64_t)data[29] & 0xF) << 8;
 
+  if (fRawReader->GetDataSize() == 32) {
+    AliDebug(1,"No trigger input and interaction records found");
+    fRawReader->RequireHeader(kTRUE);
+    return kTRUE;
+  }
+
+  // Read detector trigger inputs
+  if (fRawReader->GetDataSize() < 52) {
+    AliError(Form("Wrong CTP raw data size: %d",fRawReader->GetDataSize()));
+    fRawReader->RequireHeader(kTRUE);
+    return kFALSE;
+  }
+
+  fL0TriggerInputs = data[32] << 12;
+  fL0TriggerInputs |= (data[33] & 0xF) << 20;
+  fL0TriggerInputs |= data[36];
+  fL0TriggerInputs |= (data[37] & 0xF) << 8;
+
+  fL1TriggerInputs = data[40] << 12;
+  fL1TriggerInputs |= (data[41] & 0xF) << 20;
+  fL1TriggerInputs |= data[44];
+  fL1TriggerInputs |= (data[45] & 0xF) << 8;
+
+  fL2TriggerInputs = data[48] << 12;
+  fL2TriggerInputs |= (data[49] & 0xF) << 20;
+
+  if (fRawReader->GetDataSize() == 52) {
+    AliDebug(1,"No interaction records found");
+    fRawReader->RequireHeader(kTRUE);
+    return kTRUE;
+  }
+
+  // Read IRs
+  Int_t iword = 52;
+  UChar_t level = 0;
+  UInt_t *irdata = NULL;
+  UInt_t irsize = 0;
+  UInt_t orbit = 0;
+  Bool_t incomplete = kFALSE, transerr = kFALSE;
+  while (iword < fRawReader->GetDataSize()) {
+    if (data[iword+1] & 0x80) {
+      UChar_t flag = ((data[iword+1] >> 4) & 0x3);
+      if (flag == 0) {
+       if (irdata) {
+         new (fIRArray[fIRArray.GetEntriesFast()])
+           AliTriggerIR(orbit,irsize,irdata,incomplete,transerr);
+         irdata = NULL; irsize = 0;
+       }
+       level = 1;
+       orbit = data[iword] << 12;
+       orbit |= (data[iword+1] & 0xF) << 20;
+       transerr = ((data[iword+1] >> 6) & 0x1);
+       iword += 4;
+       continue;
+      }
+      else if (flag == 3) {
+       if (level == 1) {
+         level = 2;
+         orbit |= data[iword];
+         orbit |= ((data[iword+1] & 0xF) << 8);
+         iword += 4;
+         continue;
+       }
+      }
+      UShort_t bc = data[iword];
+      bc |= ((data[iword] & 0xF) << 8);
+      if (bc == 0xFFF) {
+       incomplete = kTRUE;
+      }
+      else {
+       if (level == 2) {
+         level = 3;
+         irdata = (UInt_t *)&data[iword];
+         irsize = 0;
+       }
+       if (level == 3) {
+         irsize++;
+       }
+      }
+    }
+    else
+      AliWarning(Form("Invalid interaction record (%d %d)",iword,fRawReader->GetDataSize()));
+
+    iword += 4;
+  }
+
+  if (irdata) {
+    new (fIRArray[fIRArray.GetEntriesFast()])
+      AliTriggerIR(orbit,irsize,irdata,incomplete,transerr);
+    irdata = NULL; irsize = 0;
+  }
+
+  // Restore the raw-reader state!!
+  fRawReader->RequireHeader(kTRUE);
+
   return kTRUE;
 }