Introduction of the Altro mapping
authorcvetan <cvetan@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 16 Mar 2006 11:15:05 +0000 (11:15 +0000)
committercvetan <cvetan@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 16 Mar 2006 11:15:05 +0000 (11:15 +0000)
RAW/AliAltroBuffer.cxx
RAW/AliAltroBuffer.h
RAW/AliAltroMapping.cxx [new file with mode: 0644]
RAW/AliAltroMapping.h [new file with mode: 0644]
RAW/RAWLinkDef.h
RAW/libRAWData.pkg

index 5635b730d7c80dd0c5d7e146ee4b1d18fa7b88ad..33a3263719bca574793b0c66a97fd3661a373929 100644 (file)
 // Author: D.Favretto
 
 #include "AliAltroBuffer.h"
+#include "AliAltroMapping.h"
 #include "AliRawDataHeader.h"
+#include "AliLog.h"
 #include <Riostream.h>
 #include <stdlib.h>
 
 
 ClassImp(AliAltroBuffer)
 
-
 //_____________________________________________________________________________
-AliAltroBuffer::AliAltroBuffer(const char* fileName, Int_t flag):
+AliAltroBuffer::AliAltroBuffer(const char* fileName, Int_t flag, const AliAltroMapping *mapping):
   fShift(0),
   fCurrentCell(0),
   fFreeCellBuffer(0),
@@ -42,7 +43,8 @@ AliAltroBuffer::AliAltroBuffer(const char* fileName, Int_t flag):
   fFilePosition(0),
   fFileEnd(0),
   fDataHeaderPos(0),
-  fEndingFillWords(0)
+  fEndingFillWords(0),
+  fMapping(mapping)
 {
 //if flag = 1 the actual object is used in the write mode
 //if flag = 0 the actual object is used in the read mode
@@ -77,6 +79,7 @@ AliAltroBuffer::AliAltroBuffer(const char* fileName, Int_t flag):
     fFileEnd = fFilePosition;
     fFile->seekg(0);
   }
+
 }
 
 //_____________________________________________________________________________
@@ -91,6 +94,7 @@ AliAltroBuffer::~AliAltroBuffer()
   }//end if
   fFile->close();
   delete fFile;
+
 }
 
 //_____________________________________________________________________________
@@ -106,7 +110,8 @@ AliAltroBuffer::AliAltroBuffer(const AliAltroBuffer& source):
   fFilePosition(source.fFilePosition),
   fFileEnd(source.fFileEnd),
   fDataHeaderPos(source.fDataHeaderPos),
-  fEndingFillWords(source.fEndingFillWords)
+  fEndingFillWords(source.fEndingFillWords),
+  fMapping(source.fMapping)
 {
 // Copy Constructor
 
@@ -259,20 +264,55 @@ void AliAltroBuffer::FillBuffer(Int_t val)
 }
 
 
+//_____________________________________________________________________________
+void AliAltroBuffer::WriteDummyTrailer(Int_t wordsNumber, Int_t padNumber,
+                                      Int_t rowNumber, Int_t secNumber)
+{
+//Writes a trailer of 40 bits
+
+   Int_t num = fFreeCellBuffer % 4;
+   for(Int_t i = 0; i < num; i++) {
+     FillBuffer(0x2AA);
+   }//end for
+   FillBuffer(wordsNumber);
+   FillBuffer(padNumber);
+   FillBuffer(rowNumber);
+   FillBuffer(secNumber);
+}
+
 //_____________________________________________________________________________
 void AliAltroBuffer::WriteTrailer(Int_t wordsNumber, Int_t padNumber,
                                  Int_t rowNumber, Int_t secNumber)
 {
 //Writes a trailer of 40 bits
 
+  if (!fMapping) {
+    AliError("No ALTRO mapping information is loaded! Filling a dummy trailer!");
+    return WriteDummyTrailer(wordsNumber,padNumber,
+                            rowNumber,secNumber);
+  }
+
   Int_t num = fFreeCellBuffer % 4;
   for(Int_t i = 0; i < num; i++) {
     FillBuffer(0x2AA);
   }//end for
-  FillBuffer(wordsNumber);
-  FillBuffer(padNumber);
-  FillBuffer(rowNumber);
-  FillBuffer(secNumber);
+  Int_t temp;
+  temp = 0x2AA;
+  FillBuffer(temp);
+  temp = 0xA << 6;
+  temp |= (wordsNumber >> 4);
+  FillBuffer(temp);
+  temp = (wordsNumber << 6) & 0x3FF;
+  temp |= (0xA << 2);
+
+  Short_t hwAdress = fMapping->GetHWAdress(rowNumber,padNumber);
+  if (hwAdress == -1)
+    AliFatal(Form("No hardware (ALTRO) adress found for these pad-row (%d) and pad (%d) indeces !",rowNumber,padNumber));
+      
+  temp |= (hwAdress >> 10) & 0x3;
+  FillBuffer(temp);
+  temp = hwAdress & 0x3FF;
+  FillBuffer(temp);
 }
 
 //_____________________________________________________________________________
@@ -394,3 +434,4 @@ Bool_t AliAltroBuffer::ReadDataHeader()
   fFile->seekp(currentPos);
   return header.TestAttribute(0);
 }
+
index f7e8cfa5f0b34e1d0bfb0f871edece99eb66a15d..5f08b91f961d8e52c05d9dce861a126e53371e77 100644 (file)
@@ -24,10 +24,11 @@ class fstream;
 #include "Riostream.h"
 #endif
 
+class AliAltroMapping;
 
 class AliAltroBuffer: public TObject {
  public:
-  AliAltroBuffer(const char* fileName, Int_t flag);
+  AliAltroBuffer(const char* fileName, Int_t flag, const AliAltroMapping *mapping = NULL);
   virtual ~AliAltroBuffer();
 
   void  FillBuffer(Int_t val);
@@ -42,6 +43,9 @@ class AliAltroBuffer: public TObject {
   void  WriteTrailer(Int_t wordsNumber, Int_t padNumber, 
                     Int_t rowNumber, Int_t secNumber);
   //this method is used to write the trailer
+  void  WriteDummyTrailer(Int_t wordsNumber, Int_t padNumber, 
+                         Int_t rowNumber, Int_t secNumber);
+  //this method is used to write a dummy trailer
   Bool_t ReadTrailer(Int_t& wordsNumber, Int_t& padNumber, 
                     Int_t& rowNumber, Int_t &secNumber);
   //this method is used to read the trailer when the file is read forward
@@ -89,6 +93,9 @@ class AliAltroBuffer: public TObject {
   UInt_t fDataHeaderPos;//Data header position
   Int_t  fEndingFillWords;//Few words at the end of the stream
 
+  // Now the parameters for the mapping
+  const AliAltroMapping*    fMapping;      // Pointer to the mapping handler
+
   ClassDef(AliAltroBuffer,0)  // Interface to the Altro format
 };
 
diff --git a/RAW/AliAltroMapping.cxx b/RAW/AliAltroMapping.cxx
new file mode 100644 (file)
index 0000000..54bc0d0
--- /dev/null
@@ -0,0 +1,227 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+// This class handles the mapping of the Altro channels
+// The mapping is read from an external mapping files
+// The class is used by TPC,PHOS and FMD
+// Author: C.Cheshkov
+
+#include "AliAltroMapping.h"
+#include "AliLog.h"
+#include <Riostream.h>
+//#include <stdlib.h>
+
+
+ClassImp(AliAltroMapping)
+
+//_____________________________________________________________________________
+AliAltroMapping::AliAltroMapping(const char *mappingFile):
+  fNumberOfChannels(0),
+  fMaxHWAdress(0),
+  fMinPadRow(0),
+  fMaxPadRow(0),
+  fMaxPad(0),
+  fMapping(NULL),
+  fInvMapping(NULL)
+{
+  // Constructor
+  // Reads the mapping from an external file
+  if (mappingFile)
+    ReadMapping(mappingFile);
+  else
+    AliFatal("Mapping file not specified !");
+}
+
+//_____________________________________________________________________________
+AliAltroMapping::~AliAltroMapping()
+{
+  // destructor
+  if (fMapping) {
+    for (Int_t i = 0; i <= fMaxHWAdress; i++) delete [] fMapping[i];
+    delete [] fMapping;
+  }
+
+  if (fInvMapping) {
+    for (Int_t i = 0; i <= (fMaxPadRow - fMinPadRow); i++)
+      delete [] fInvMapping[i];
+    delete [] fInvMapping;
+  }
+
+}
+
+//_____________________________________________________________________________
+AliAltroMapping::AliAltroMapping(const AliAltroMapping& mapping):
+  TObject(mapping),
+  fNumberOfChannels(mapping.fNumberOfChannels),
+  fMaxHWAdress(mapping.fMaxHWAdress),
+  fMinPadRow(mapping.fMinPadRow),
+  fMaxPadRow(mapping.fMaxPadRow),
+  fMaxPad(mapping.fMaxPad),
+  fMapping(mapping.fMapping),
+  fInvMapping(mapping.fInvMapping)
+{
+// Copy Constructor
+
+  Fatal("AliAltroMapping", "copy constructor not implemented");
+}
+
+//_____________________________________________________________________________
+AliAltroMapping& AliAltroMapping::operator = (const AliAltroMapping& /*mapping*/)
+{
+//Assigment operator
+
+  Fatal("operator =", "assignment operator not implemented");
+  return *this;
+}
+
+//_____________________________________________________________________________
+Bool_t AliAltroMapping::ReadMapping(const char *mappingFile)
+{
+  // Initalizes the ALTRO mapping from a file
+  // Look at the TPC module for the format of
+  // the mapping file
+  ifstream in(mappingFile);
+  if (!in) {
+    AliFatal(Form("Missing mapping file (%s) !",mappingFile));
+    return kFALSE;
+  }
+  if (!(in >> fNumberOfChannels)) {
+    AliFatal(Form("Syntax of the mapping file is wrong (%s) !",mappingFile));
+    return kFALSE;
+  }
+  if (!(in >> fMaxHWAdress)) {
+    AliFatal(Form("Syntax of the mapping file is wrong (%s) !",mappingFile));
+    return kFALSE;
+  }
+//   if (!(in >> fMinPadRow >> fMaxPadRow)) {
+//     AliFatal(Form("Syntax of the mapping file is wrong (%s) !",mappingFile));
+//     return kFALSE;
+//   }
+//   if (!(in >> fMaxPad)) {
+//     AliFatal(Form("Syntax of the mapping file is wrong (%s) !",mappingFile));
+//     return kFALSE;
+//   }
+
+  fMinPadRow = 0x7fffffff;
+  fMaxPadRow = 0;
+  fMaxPad = 0;
+  fMapping = new Short_t*[fMaxHWAdress+1];
+  for (Int_t i = 0; i <= fMaxHWAdress; i++) {
+    fMapping[i] = new Short_t[2];
+    fMapping[i][0] = fMapping[i][1] = -1;
+  }
+  for(Int_t i = 0; i < fNumberOfChannels ; i++) { //5504 is size of irorc mapping at ther moment only for irorc
+    Int_t hwAdress;
+    if (!(in >> hwAdress)) {
+      AliFatal(Form("Syntax of the mapping file is wrong (%s) !",mappingFile));
+      return kFALSE;
+    }
+    if (hwAdress > fMaxHWAdress) {
+      AliFatal(Form("Hardware (ALTRO) adress (%d) outside the range (0 -> %d) !",hwAdress,fMaxHWAdress));
+      return kFALSE;
+    }
+    Int_t padrow,pad;
+    if (!(in >> padrow >> pad)) {
+      AliFatal(Form("Syntax of the mapping file is wrong (%s) !",mappingFile));
+      return kFALSE;
+    }
+    fMapping[hwAdress][0] = padrow;
+    fMapping[hwAdress][1] = pad;
+
+    if (padrow > fMaxPadRow) fMaxPadRow = padrow;
+    if (padrow < fMinPadRow) fMinPadRow = padrow;
+    if (pad > fMaxPad) fMaxPad = pad;
+  }
+
+  fInvMapping = new Short_t*[fMaxPadRow - fMinPadRow + 1];
+  for (Int_t i = 0; i <= (fMaxPadRow - fMinPadRow); i++) {
+    fInvMapping[i] = new Short_t[fMaxPad + 1];
+    for (Int_t j = 0; j <= fMaxPad; j++) fInvMapping[i][j] = -1;
+  }
+
+  for(Int_t i = 0; i <= fMaxHWAdress; i++) {
+    Int_t padrow = fMapping[i][0];
+    Int_t pad = fMapping[i][1];
+    if(padrow != -1 && pad != -1)
+      fInvMapping[padrow-fMinPadRow][pad] = i;
+  }
+
+  in.close();
+  return kTRUE;
+}
+
+//_____________________________________________________________________________
+Int_t AliAltroMapping::GetHWAdress(Int_t padrow, Int_t pad) const
+{
+  // Get the content of the mapping array
+  // return -1 in case there is no hardware
+  // adress defined for these pad-row and pad
+  if (!fInvMapping) {
+    AliWarning("Mapping array was not initalized correctly !");
+    return -1;
+  }
+  if (padrow < fMinPadRow || padrow > fMaxPadRow) {
+    AliWarning(Form("Index of pad-row (%d) outside the range (%d -> %d) !",padrow,fMinPadRow,fMaxPadRow));
+    return -1;
+  }
+  if (pad > fMaxPad) {
+    AliWarning(Form("Index of pad (%d) outside the range (0 -> %d) !",pad,fMaxPad));
+    return -1;
+  }
+  Int_t hwAdress = fInvMapping[padrow-fMinPadRow][pad];
+  if (hwAdress == -1)
+    AliWarning(Form("Hardware (ALTRO) adress is not defined for these pad-row (%d) and pad (%d) !",padrow,pad));
+
+  return hwAdress;
+}
+
+//_____________________________________________________________________________
+Int_t AliAltroMapping::GetPadRow(Int_t hwAdress) const
+{
+  if (!fMapping) {
+    AliWarning("Mapping array was not initalized correctly !");
+    return -1;
+  }
+  if (hwAdress > fMaxHWAdress) {
+    AliWarning(Form("Hardware (ALTRO) adress (%d) outside the range (0 -> %d) !",hwAdress,fMaxHWAdress));
+    return -1;
+  }
+  Int_t padrow = fMapping[hwAdress][0];
+  if (padrow == -1)
+    AliWarning(Form("Hardware (ALTRO) adress (%d) is not defined !",hwAdress));
+
+  return padrow;
+}
+
+//_____________________________________________________________________________
+Int_t AliAltroMapping::GetPad(Int_t hwAdress) const
+{
+  if (!fMapping) {
+    AliWarning("Mapping array was not initalized correctly !");
+    return -1;
+  }
+  if (hwAdress > fMaxHWAdress) {
+    AliWarning(Form("Hardware (ALTRO) adress (%d) outside the range (0 -> %d) !",hwAdress,fMaxHWAdress));
+    return -1;
+  }
+  Int_t pad = fMapping[hwAdress][1];
+  if (pad == -1)
+    AliWarning(Form("Hardware (ALTRO) adress (%d) is not defined !",hwAdress));
+
+  return pad;
+}
diff --git a/RAW/AliAltroMapping.h b/RAW/AliAltroMapping.h
new file mode 100644 (file)
index 0000000..cdaabc7
--- /dev/null
@@ -0,0 +1,41 @@
+#ifndef AliALTROMAPPING_H
+#define AliALTROMAPPING_H
+/* Copyright(c) 1998-2003, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+//////////////////////////////////////////////////////////
+// Class used to setup the mapping of hardware adresses //
+// in ALTRO to pad-rows and pad indeces.                //
+// The mapping is defined in an external mapping files  //
+// separately for TPC,PHOS and FMD.                     //
+//////////////////////////////////////////////////////////
+
+#include <TObject.h>
+
+class AliAltroMapping: public TObject {
+ public:
+  AliAltroMapping(const char *mappingFile);
+  virtual ~AliAltroMapping();
+
+  AliAltroMapping(const AliAltroMapping& mapping);
+  AliAltroMapping& operator = (const AliAltroMapping& mapping);
+
+  Int_t GetHWAdress(Int_t padrow, Int_t pad) const;
+  Int_t GetPadRow(Int_t hwAdress) const;
+  Int_t GetPad(Int_t hwAdress) const;
+
+ private:
+  Bool_t ReadMapping(const char *mappingFile);
+
+  Int_t     fNumberOfChannels; // Number of ALTRO channels
+  Int_t     fMaxHWAdress;      // Maximum HW adress
+  Int_t     fMinPadRow;        // Minimum Index of pad-row
+  Int_t     fMaxPadRow;        // Maximum Index of pad-row
+  Int_t     fMaxPad;           // Maximum Index of pad inside row
+  Short_t **fMapping;          // Array which connects hardware adresses to pad and pad-row indeces
+  Short_t **fInvMapping;       // Inverse of fMapping
+
+  ClassDef(AliAltroMapping,0)  // Altro mapping handler class
+};
+
+#endif
index 2c55f5529ca66fd7fa6010ba7fb547aeea31a8a8..665406fb2b73c62c66f2d62d22457c5411524360 100644 (file)
@@ -20,6 +20,7 @@
 #pragma link C++ class AliRawReaderMemory+;
 #pragma link C++ class AliBitPacking+;
 #pragma link C++ class AliAltroBuffer+;
+#pragma link C++ class AliAltroMapping+;
 #pragma link C++ class AliTPCCompression+;
 #pragma link C++ class AliTPCHNode+;
 #pragma link C++ class AliTPCHTable+;
index 77dd2feb88393852a56f0676db41c3c4cab2a426..04546403746c937578aed79d790f3d56f9047205 100644 (file)
@@ -13,7 +13,7 @@ SRCS:=  AliRawEventHeaderBase.cxx AliRawEquipmentHeader.cxx \
        AliRawReader.cxx AliRawReaderFile.cxx AliRawReaderRoot.cxx \
        AliRawReaderDate.cxx AliRawReaderDateV3.cxx \
        AliRawReaderMemory.cxx \
-       AliBitPacking.cxx AliAltroBuffer.cxx \
+       AliBitPacking.cxx AliAltroBuffer.cxx AliAltroMapping.cxx \
        AliTPCCompression.cxx AliTPCHNode.cxx AliTPCHTable.cxx \
        AliAltroRawStream.cxx AliTPCRawStream.cxx \
        AliVMERawStream.cxx
@@ -32,4 +32,4 @@ ifdef DATE_ROOT
 EINCLUDE+= ${DATE_COMMON_DEFS}
 endif
 
-EXPORT:=AliRawReader.h AliRawDataHeader.h AliAltroRawStream.h AliAltroBuffer.h AliBitPacking.h AliFilter.h
+EXPORT:=AliRawReader.h AliRawDataHeader.h AliAltroRawStream.h AliAltroBuffer.h AliAltroMapping.h AliBitPacking.h AliFilter.h