AliAltroBufferV3: Allow for setting the fields of the RCU trailer. This is needed...
authorcvetan <cvetan@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 26 Aug 2011 12:29:18 +0000 (12:29 +0000)
committercvetan <cvetan@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 26 Aug 2011 12:29:18 +0000 (12:29 +0000)
RAW/AliAltroBufferV3.cxx
RAW/AliAltroBufferV3.h
RAW/AliAltroRawStreamV3.cxx
RAW/AliAltroRawStreamV3.h

index 9dd5786..e47dcac 100644 (file)
@@ -28,7 +28,17 @@ ClassImp(AliAltroBufferV3)
 //_____________________________________________________________________________
 AliAltroBufferV3::AliAltroBufferV3(const char* fileName, AliAltroMapping *mapping):
 AliAltroBuffer(fileName,mapping),
-  fN(0)
+  fN(0),
+  fFECERRA(0), 
+  fFECERRB(0), 
+  fERRREG2(0), 
+  fERRREG3(0), 
+  fActiveFECsA(0xffff),
+  fActiveFECsB(0xffff),
+  fALTROCFG1(0),       
+  fALTROCFG2(0),       
+  fTSample(0), 
+  fL1Phase(0)
 {
   // Constructor
   memset(fArray, 0, kMaxWords*sizeof(UShort_t));
@@ -43,7 +53,17 @@ AliAltroBufferV3::~AliAltroBufferV3()
 //_____________________________________________________________________________
 AliAltroBufferV3::AliAltroBufferV3(const AliAltroBufferV3& source):
   AliAltroBuffer(source),
-  fN(source.fN)
+  fN(source.fN),
+  fFECERRA(source.fFECERRA),   
+  fFECERRB(source.fFECERRB),   
+  fERRREG2(source.fERRREG2),   
+  fERRREG3(source.fERRREG3),   
+  fActiveFECsA(source.fActiveFECsA),
+  fActiveFECsB(source.fActiveFECsB),
+  fALTROCFG1(source.fALTROCFG1),       
+  fALTROCFG2(source.fALTROCFG2),       
+  fTSample(source.fTSample),   
+  fL1Phase(source.fL1Phase)
 {
 // Copy Constructor
 
@@ -54,6 +74,18 @@ AliAltroBufferV3::AliAltroBufferV3(const AliAltroBufferV3& source):
 AliAltroBufferV3& AliAltroBufferV3::operator = (const AliAltroBufferV3& /*source*/)
 {
 //Assigment operator
+#if 0
+  fFECERRA     = source.fFECERRA;      
+  fFECERRB     = source.fFECERRB;      
+  fERRREG2     = source.fERRREG2;      
+  fERRREG3     = source.fERRREG3;      
+  fActiveFECsA = source.fActiveFECsA;
+  fActiveFECsB = source.fActiveFECsB;
+  fALTROCFG1   = source.fALTROCFG1;    
+  fALTROCFG2   = source.fALTROCFG2;    
+  fTSample     = source.fTSample;      
+  fL1Phase      = source.fL1Phase;
+#endif
 
   Fatal("operator =", "assignment operator not implemented");
   return *this;
@@ -92,6 +124,16 @@ void AliAltroBufferV3::WriteTrailer(Int_t wordsNumber, Short_t hwAddress)
 }
 
 //_____________________________________________________________________________
+UInt_t AliAltroBufferV3::SetField(UInt_t& input, UShort_t start, UInt_t mask, UInt_t val) const
+{
+  UInt_t out = (mask << start);
+  UInt_t fld = (val << start) & out;
+  input &= ~out;
+  input |= fld;
+  return input;
+}
+
+//_____________________________________________________________________________
 void AliAltroBufferV3::ReverseAndWrite()
 {
   // Reverse the altro data order and
@@ -147,29 +189,34 @@ UChar_t AliAltroBufferV3::WriteRCUTrailer(Int_t rcuId)
   buffer  = (0x1U << 26);
   buffer |= (0x1U << 31);
   fFile->WriteBuffer((char *)(&buffer),sizeof(UInt_t));
-  
-  buffer  = (0x2U << 26);
+
+  buffer =  (fERRREG2 & 0x3FFFFFF);
+  buffer |= (0x2U << 26);
   buffer |= (0x1U << 31);
   fFile->WriteBuffer((char *)(&buffer),sizeof(UInt_t));
   
-  buffer  = (0x3U << 26);
+  buffer =  (fERRREG3 & 0x3FFFFFF);
+  buffer |= (0x3U << 26);
   buffer |= (0x1U << 31);
   fFile->WriteBuffer((char *)(&buffer),sizeof(UInt_t));
 
-  buffer  = 0x3FFFFFF;
+  buffer  = (fActiveFECsA & 0x3FFFFFF);
   buffer |= (0x4U << 26);
   buffer |= (0x1U << 31);
-  fFile->WriteBuffer((char *)(&buffer),sizeof(UInt_t));
-  buffer  = 0x3FFFFFF;
+  fFile->WriteBuffer((char *)(&buffer),sizeof(UInt_t)); 
+
+  buffer  = (fActiveFECsB & 0x3FFFFFF);
   buffer |= (0x5U << 26);
   buffer |= (0x1U << 31);
   fFile->WriteBuffer((char *)(&buffer),sizeof(UInt_t));
 
-  buffer  = (0x6U << 26);
+  buffer  = (fALTROCFG1 & 0x3FFFFFF);
+  buffer |= (0x6U << 26);
   buffer |= (0x1U << 31);
   fFile->WriteBuffer((char *)(&buffer),sizeof(UInt_t));
   
-  buffer  = (0x7U << 26);
+  buffer  = (fALTROCFG2 & 0x3FFFFFF);
+  buffer |= (0x7U << 26);
   buffer |= (0x1U << 31);
   fFile->WriteBuffer((char *)(&buffer),sizeof(UInt_t));
   
index 930dc0d..c234b12 100644 (file)
@@ -33,9 +33,39 @@ class AliAltroBufferV3: public AliAltroBuffer {
   virtual UChar_t WriteRCUTrailer(Int_t rcuId);
   //this method is used to write the RCU trailer
 
+  void  SetFECERRA(UInt_t v) { fFECERRA = v; }
+  void  SetFECERRB(UInt_t v) { fFECERRB = v; }
+  void  SetERRREG2(UInt_t v) { fERRREG2 = v; }
+  void  SetERRREG3(UInt_t v) { fERRREG3 = v; }
+  void  SetActiveFECsA(UShort_t m) { fActiveFECsA = m; }
+  void  SetActiveFECsB(UShort_t m) { fActiveFECsB = m; }
+  void  SetALTROCFG1(UInt_t cfg1) { fALTROCFG1 = cfg1; }
+  void  SetALTROCFG2(UInt_t cfg2) { fALTROCFG2 = cfg2; }
+  void  SetTSample(Double_t v) { fTSample = v; }
+  void  SetL1Phase(Double_t v) { fL1Phase = v; }
+
+  void SetNChAddrMismatch(UShort_t v) { SetField(fERRREG3, 0, 0xFFF, v); }
+  void SetNChLengthMismatch(UShort_t v) { SetField(fERRREG3, 12, 0x1FFF, v); }
+  
+  void SetBaselineCorr(UChar_t v) { SetField(fALTROCFG1, 0, 0xF, v); }
+  void SetPolarity(Bool_t v) { SetField(fALTROCFG1, 4, 0x1, v); }
+  void SetNPresamples(UChar_t v) { SetField(fALTROCFG1, 5, 0x3, v); }
+  void SetNPostsamples(UChar_t v) { SetField(fALTROCFG1, 7, 0xF, v); }
+  void SetSecondBaselineCorr(Bool_t v) { SetField(fALTROCFG1, 11, 0x1, v); }
+  void SetGlitchFilter(UChar_t v) { SetField(fALTROCFG1, 12, 0x3, v); }
+  void SetNNonZSPostsamples(UChar_t v) { SetField(fALTROCFG1, 14, 0x7, v); }
+  void SetNNonZSPresamples(UChar_t v) { SetField(fALTROCFG1, 17, 0x3, v); }
+  void SetZeroSupp(Bool_t v) { SetField(fALTROCFG1, 19, 0x1, v); }
+  void SetNAltroBuffers(Bool_t v) { SetField(fALTROCFG2, 24, 0x1, v); }
+  void SetNPretriggerSamples(UChar_t  v) { SetField(fALTROCFG2, 20, 0xF, v); }
+  void SetNSamplesPerCh(UShort_t v) { SetField(fALTROCFG2, 10, 0x3FF, v); }
+  void SetSparseRO(Bool_t v) { SetField(fALTROCFG2, 9, 0x1, v); }
+
+
   enum { kMaxWords = 1024 };
 
  protected:
+  UInt_t        SetField(UInt_t& input, UShort_t start, UInt_t mask, UInt_t val) const;
   void          ReverseAndWrite();
   //this method reverse the altro data order and write the buffer to the file
 
@@ -44,6 +74,16 @@ class AliAltroBufferV3: public AliAltroBuffer {
 
   UShort_t fArray[kMaxWords]; // Temporary array needed in reverting data order
   Int_t    fN;                // Size of the temporary array
+  UInt_t   fFECERRA;   // FECERRA
+  UInt_t   fFECERRB;   // FECERRB
+  UInt_t   fERRREG2;   // ERRREG2
+  UInt_t   fERRREG3;   // ERRREG3
+  UShort_t fActiveFECsA;// ActiveFECsA
+  UShort_t fActiveFECsB;// ActiveFECsB
+  UInt_t   fALTROCFG1; // ALTROCFG1
+  UInt_t   fALTROCFG2; // ALTROCFG2
+  Double_t fTSample;   // TSample
+  Double_t fL1Phase;   // L1Phase
 
   ClassDef(AliAltroBufferV3,0)  // Interface to the Altro format
 };
index 35aad3d..cf5d80d 100644 (file)
@@ -64,7 +64,8 @@ AliAltroRawStreamV3::AliAltroRawStreamV3(AliRawReader* rawReader) :
   fAltroCFG1(0),
   fAltroCFG2(0),
   fOldStream(NULL),
-  fCheckAltroPayload(kTRUE)
+  fCheckAltroPayload(kTRUE),
+  fFormatVersion(0)
 {
   // Constructor
   // Create an object to read Altro raw digits in
@@ -110,7 +111,8 @@ AliAltroRawStreamV3::AliAltroRawStreamV3(const AliAltroRawStreamV3& stream) :
   fAltroCFG1(stream.fAltroCFG1),
   fAltroCFG2(stream.fAltroCFG2),
   fOldStream(NULL),
-  fCheckAltroPayload(stream.fCheckAltroPayload)
+  fCheckAltroPayload(stream.fCheckAltroPayload),
+  fFormatVersion(0)
 {
   // Copy constructor
   // Copy the bunch data array
@@ -153,6 +155,7 @@ AliAltroRawStreamV3& AliAltroRawStreamV3::operator = (const AliAltroRawStreamV3&
   fActiveFECsB       = stream.fActiveFECsB;
   fAltroCFG1         = stream.fAltroCFG1;
   fAltroCFG2         = stream.fAltroCFG2;
+  fFormatVersion     = stream.fFormatVersion;
 
   for(Int_t i = 0; i < kMaxNTimeBins; i++) fBunchData[i] = stream.fBunchData[i];
 
@@ -199,7 +202,7 @@ Bool_t AliAltroRawStreamV3::NextDDL()
 // Read the next DDL payload (CDH + RCU trailer)
 // Updates the information which is coming from these
 // two sources
-
+  fFormatVersion = 0;
   fPosition = 0;
   // Get next DDL payload
   // return wtih false in case no more data payloads
@@ -212,14 +215,14 @@ Bool_t AliAltroRawStreamV3::NextDDL()
   fChannelPayloadSize = -1;
   fChannelStartPos = -1;
 
-  UChar_t rcuVer = fRawReader->GetBlockAttributes();
+  fFormatVersion = fRawReader->GetBlockAttributes();
 
-  if (rcuVer < 2) {
+  if (fFormatVersion < 2) {
     // old altro format data
     if (!fOldStream) {
       fOldStream = new AliAltroRawStream(fRawReader);
       AliInfo(Form("RCU firmware verion %d detected. Using AliAltroRawStream to decode the data.",
-                  rcuVer));
+                  fFormatVersion));
     }
     Bool_t status = fOldStream->NextDDL(fData);
     if (status) {
@@ -241,7 +244,7 @@ Bool_t AliAltroRawStreamV3::NextDDL()
     return status;
   }
 
-  return ReadRCUTrailer(rcuVer);
+  return ReadRCUTrailer(fFormatVersion);
 }
 
 //_____________________________________________________________________________
@@ -609,25 +612,31 @@ void AliAltroRawStreamV3::PrintRCUTrailer() const
 {
   // Prints the contents of
   // the RCU trailer data
-  printf("RCU trailer:\n===========\n");
-  printf("FECERRA: 0x%x\nFECERRB: 0x%x\n",fFECERRA,fFECERRB);
-  printf("ERRREG2: 0x%x\n",fERRREG2);
+  printf("RCU trailer (Format version %d):\n"
+        "==================================================\n",  GetFormatVersion());
+  printf("FECERRA:                                   0x%x\n", fFECERRA);
+  printf("FECERRB:                                   0x%x\n", fFECERRB);
+  printf("ERRREG2:                                   0x%x\n", fERRREG2);
   printf("#channels skipped due to address mismatch: %d\n",GetNChAddrMismatch());
   printf("#channels skipped due to bad block length: %d\n",GetNChLengthMismatch());
-  printf("Active FECs (branch A): 0x%x\nActive FECs (branch B): 0x%x\n",fActiveFECsA,fActiveFECsB);
-  printf("Baseline corr: 0x%x\n",GetBaselineCorr());
-  printf("Number of presamples: %d\nNumber of postsamples: %d\n",GetNPresamples(),GetNPostsamples());
-  printf("Second baseline corr: %d\n",GetSecondBaselineCorr());
-  printf("GlitchFilter: %d\n",GetGlitchFilter());
-  printf("Number of non-ZS postsamples: %d\nNumber of non-ZS presamples: %d\n",GetNNonZSPostsamples(),GetNNonZSPresamples());
-  printf("Number of ALTRO buffers: %d\n",GetNAltroBuffers());
-  printf("Number of pretrigger samples: %d\n",GetNPretriggerSamples());
-  printf("Number of samples per channel: %d\n",GetNSamplesPerCh());
-  printf("Sparse readout: %d\n",GetSparseRO());
-  printf("Sampling time: %e s\n",GetTSample());
-  printf("L1 Phase: %e s\n",GetL1Phase());
-  printf("AltroCFG1: 0x%x\nAltroCFG2: 0x%x\n",GetAltroCFG1(),GetAltroCFG2());
-  printf("===========\n");
+  printf("Active FECs (branch A):                    0x%x\n", fActiveFECsA);
+  printf("Active FECs (branch B):                    0x%x\n", fActiveFECsB);
+  printf("Baseline corr:                             0x%x\n",GetBaselineCorr());
+  printf("Number of presamples:                      %d\n", GetNPresamples());
+  printf("Number of postsamples:                     %d\n",GetNPostsamples());
+  printf("Second baseline corr:                      %d\n",GetSecondBaselineCorr());
+  printf("GlitchFilter:                              %d\n",GetGlitchFilter());
+  printf("Number of non-ZS postsamples:              %d\n",GetNNonZSPostsamples());
+  printf("Number of non-ZS presamples:               %d\n",GetNNonZSPresamples());
+  printf("Number of ALTRO buffers:                   %d\n",GetNAltroBuffers());
+  printf("Number of pretrigger samples:              %d\n",GetNPretriggerSamples());
+  printf("Number of samples per channel:             %d\n",GetNSamplesPerCh());
+  printf("Sparse readout:                            %d\n",GetSparseRO());
+  printf("Sampling time:                             %e s\n",GetTSample());
+  printf("L1 Phase:                                  %e s\n",GetL1Phase());
+  printf("AltroCFG1:                                 0x%x\n",GetAltroCFG1());
+  printf("AltroCFG2:                                 0x%x\n",GetAltroCFG2());
+  printf("==================================================\n");
 }
 
 //_____________________________________________________________________________
index ce84929..16f14b2 100644 (file)
@@ -90,6 +90,8 @@ class AliAltroRawStreamV3: public TObject {
     Double_t GetTSample() const;
     Double_t GetL1Phase() const;
     void     PrintRCUTrailer() const;
+    Bool_t   IsOldStream() const { return fOldStream != 0; }
+    UChar_t  GetFormatVersion() const { return fFormatVersion; }
  
     void  SetShortDataHeader(Bool_t flag) { fIsShortDataHeader = flag; } // Specify whenever to assume or not a short CDH format
 
@@ -159,6 +161,7 @@ class AliAltroRawStreamV3: public TObject {
     AliAltroRawStream* fOldStream;  // streamer for old altro format
 
     Bool_t           fCheckAltroPayload; // check altro payload correctness or not?
+    UChar_t          fFormatVersion;
 
     ClassDef(AliAltroRawStreamV3, 0)  // base class for reading Altro raw digits
 };