]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/TPCLib/AliHLTTPCMapping.cxx
minor update of documentation
[u/mrichter/AliRoot.git] / HLT / TPCLib / AliHLTTPCMapping.cxx
index 90560173c82adff4119d9b51a8b77b9e2f0bb4f2..64b853df0c373143b120445a5d428327a6e69bf3 100644 (file)
@@ -32,15 +32,18 @@ using namespace std;
 #endif
 #include <cassert>
 #include "AliHLTTPCMapping.h"
+#include "AliHLTTPCTransform.h"
 
 ClassImp(AliHLTTPCMapping)
 
 AliHLTTPCMapping::AliHLTTPCMapping(UInt_t patch)
   :
+  fPatch(patch),
   fCurrentRowMapping(NULL),
   fCurrentPadMapping(NULL),
-  fNHWAdd(0),
-  fMaxHWAdd(0)
+  fNofRows(0),
+  fMaxHWAdd(0),
+  fRowOffset(0)
 {
   // see header file for class documentation
   // or
@@ -48,82 +51,92 @@ AliHLTTPCMapping::AliHLTTPCMapping(UInt_t patch)
   // or
   // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
 
-  switch(patch){
-  case 0:
-    if(!fgMapping0IsDone){
-      memset(fgRowMapping0, 0, fgkMapping0Size*sizeof(UInt_t));
-      memset(fgPadMapping0, 0, fgkMapping0Size*sizeof(UInt_t));
-      InitializeMap(patch);
-    }
-    fCurrentRowMapping=fgRowMapping0;
-    fCurrentPadMapping=fgPadMapping0;
-    break;
-  case 1:
-    if(!fgMapping1IsDone){
-      memset(fgRowMapping1, 0, fgkMapping1Size*sizeof(UInt_t));
-      memset(fgPadMapping1, 0, fgkMapping1Size*sizeof(UInt_t));
-      InitializeMap(patch);
-    }
-    fCurrentRowMapping=fgRowMapping1;
-    fCurrentPadMapping=fgPadMapping1;
-    break;
-  case 2:
-    if(!fgMapping2IsDone){
-      memset(fgRowMapping2, 0, fgkMapping2Size*sizeof(UInt_t));
-      memset(fgPadMapping2, 0, fgkMapping2Size*sizeof(UInt_t));
-      InitializeMap(patch);
-    }
-    fCurrentRowMapping=fgRowMapping2;
-    fCurrentPadMapping=fgPadMapping2;
-    break;
-  case 3:
-    if(!fgMapping3IsDone){
-      memset(fgRowMapping3, 0, fgkMapping3Size*sizeof(UInt_t));
-      memset(fgPadMapping3, 0, fgkMapping3Size*sizeof(UInt_t));
-      InitializeMap(patch);
-    }
-    fCurrentRowMapping=fgRowMapping3;
-    fCurrentPadMapping=fgPadMapping3;
-    break;
-  case 4:
-    if(!fgMapping4IsDone){
-      memset(fgRowMapping4, 0, fgkMapping4Size*sizeof(UInt_t));
-      memset(fgPadMapping4, 0, fgkMapping4Size*sizeof(UInt_t));
-      InitializeMap(patch);
-    }
-    fCurrentRowMapping=fgRowMapping4;
-    fCurrentPadMapping=fgPadMapping4;
-    break;
-  case 5:
-    if(!fgMapping5IsDone){
-      memset(fgRowMapping5, 0, fgkMapping5Size*sizeof(UInt_t));
-      memset(fgPadMapping5, 0, fgkMapping5Size*sizeof(UInt_t));
-      InitializeMap(patch);
-    }
-    fCurrentRowMapping=fgRowMapping5;
-    fCurrentPadMapping=fgPadMapping5;
-    break;
+  assert(patch<fgkNofPatches);
+  if (patch>=fgkNofPatches) fPatch=0; // just to avoid boundary overflow
+
+  // Get the row offset.
+  // we have several possibilities to count the rows:
+  // - A: absolute number: 0 to 158 over all partitions
+  // - B: sectorwise: 0 to 62 for inner, 0 to 95 for outer sector
+  // - C: within a partition: the mappping class is designed to return the
+  //   mapping within a partition.
+  // The mapping files use scheme B. We have to subtract the first row.
+  // AliHLTTPCTransform::GetFirstRow returns first row in scheme A.
+  fNofRows=AliHLTTPCTransform::GetNRows(patch);
+  fRowOffset=AliHLTTPCTransform::GetFirstRow(patch);
+
+  if(!fgMappingIsDone[patch]){
+    ReadArray(patch, fgkMappingSize[patch], fgRowMapping[patch], fgPadMapping[patch], fgkMappingHwaSize, fgHwaMapping[patch]);
+    fgMappingIsDone[patch]=kTRUE;
   }
+  fCurrentRowMapping=fgRowMapping[patch];
+  fCurrentPadMapping=fgPadMapping[patch];
+  fMaxHWAdd=fgkMappingSize[patch];
 }
 
-Bool_t AliHLTTPCMapping::fgMapping0IsDone=kFALSE;
-Bool_t AliHLTTPCMapping::fgMapping1IsDone=kFALSE;
-Bool_t AliHLTTPCMapping::fgMapping2IsDone=kFALSE;
-Bool_t AliHLTTPCMapping::fgMapping3IsDone=kFALSE;
-Bool_t AliHLTTPCMapping::fgMapping4IsDone=kFALSE;
-Bool_t AliHLTTPCMapping::fgMapping5IsDone=kFALSE;
+Bool_t AliHLTTPCMapping::fgMappingIsDone[fgkNofPatches]={
+  kFALSE,
+  kFALSE,
+  kFALSE,
+  kFALSE,
+  kFALSE,
+  kFALSE
+};
+
+const UInt_t AliHLTTPCMapping::fgkMappingSize[fgkNofPatches]={
+  AliHLTTPCMapping::fgkMapping0Size,
+  AliHLTTPCMapping::fgkMapping1Size,
+  AliHLTTPCMapping::fgkMapping2Size,
+  AliHLTTPCMapping::fgkMapping3Size,
+  AliHLTTPCMapping::fgkMapping4Size,
+  AliHLTTPCMapping::fgkMapping5Size
+};
+
 UInt_t AliHLTTPCMapping::fgRowMapping0[fgkMapping0Size];
 UInt_t AliHLTTPCMapping::fgPadMapping0[fgkMapping0Size];
+UInt_t AliHLTTPCMapping::fgHwaMapping0[fgkMappingHwaSize];
 UInt_t AliHLTTPCMapping::fgRowMapping1[fgkMapping1Size];
 UInt_t AliHLTTPCMapping::fgPadMapping1[fgkMapping1Size];
+UInt_t AliHLTTPCMapping::fgHwaMapping1[fgkMappingHwaSize];
 UInt_t AliHLTTPCMapping::fgRowMapping2[fgkMapping2Size];
 UInt_t AliHLTTPCMapping::fgPadMapping2[fgkMapping2Size];
+UInt_t AliHLTTPCMapping::fgHwaMapping2[fgkMappingHwaSize];
 UInt_t AliHLTTPCMapping::fgRowMapping3[fgkMapping3Size];
 UInt_t AliHLTTPCMapping::fgPadMapping3[fgkMapping3Size];
+UInt_t AliHLTTPCMapping::fgHwaMapping3[fgkMappingHwaSize];
 UInt_t AliHLTTPCMapping::fgRowMapping4[fgkMapping4Size];
 UInt_t AliHLTTPCMapping::fgPadMapping4[fgkMapping4Size];
+UInt_t AliHLTTPCMapping::fgHwaMapping4[fgkMappingHwaSize];
 UInt_t AliHLTTPCMapping::fgRowMapping5[fgkMapping5Size];
 UInt_t AliHLTTPCMapping::fgPadMapping5[fgkMapping5Size];
+UInt_t AliHLTTPCMapping::fgHwaMapping5[fgkMappingHwaSize];
+
+UInt_t* AliHLTTPCMapping::fgRowMapping[fgkNofPatches]={
+  AliHLTTPCMapping::fgRowMapping0,
+  AliHLTTPCMapping::fgRowMapping1,
+  AliHLTTPCMapping::fgRowMapping2,
+  AliHLTTPCMapping::fgRowMapping3,
+  AliHLTTPCMapping::fgRowMapping4,
+  AliHLTTPCMapping::fgRowMapping5
+};
+
+UInt_t* AliHLTTPCMapping::fgPadMapping[fgkNofPatches]={
+  AliHLTTPCMapping::fgPadMapping0,
+  AliHLTTPCMapping::fgPadMapping1,
+  AliHLTTPCMapping::fgPadMapping2,
+  AliHLTTPCMapping::fgPadMapping3,
+  AliHLTTPCMapping::fgPadMapping4,
+  AliHLTTPCMapping::fgPadMapping5
+};
+
+UInt_t* AliHLTTPCMapping::fgHwaMapping[fgkNofPatches]={
+  AliHLTTPCMapping::fgHwaMapping0,
+  AliHLTTPCMapping::fgHwaMapping1,
+  AliHLTTPCMapping::fgHwaMapping2,
+  AliHLTTPCMapping::fgHwaMapping3,
+  AliHLTTPCMapping::fgHwaMapping4,
+  AliHLTTPCMapping::fgHwaMapping5
+};
 
 AliHLTTPCMapping::~AliHLTTPCMapping(){
   // see header file for class documentation
@@ -132,6 +145,7 @@ AliHLTTPCMapping::~AliHLTTPCMapping(){
 void AliHLTTPCMapping::InitializeMap(UInt_t patch)
 {
   // see header file for class documentation
+  // method is deprecated, just kept as history for a while
 
   UInt_t fNRowsToSubtract=0;
   //The row numbers returned by digit readers used are not from zero always
@@ -168,16 +182,16 @@ void AliHLTTPCMapping::InitializeMap(UInt_t patch)
     HLTFatal("Unable to open file: %s      This means no mapping is provided.", filename.Data());
   }
   else{
-    fNHWAdd=0;
-    if(inFile >> fNHWAdd){
+    UInt_t nHWAdd=0;
+    if(inFile >> nHWAdd){
       if(inFile >> fMaxHWAdd){
         UInt_t hwAdd=0;
         UInt_t row=0;
         UInt_t pad=0;
        switch(patch){
        case 0:
-         if(fgkMapping0Size<fMaxHWAdd){
-           HLTFatal("Max hardware address exceeded for patch %d, max number is %d, number from mapping file is %d.",patch,fgkMapping0Size ,fMaxHWAdd);
+         if(fgkMappingSize[patch]<fMaxHWAdd){
+           HLTFatal("Max hardware address exceeded for patch %d, max number is %d, number from mapping file is %d.",patch,fgkMappingSize[patch] ,fMaxHWAdd);
            break;
          }
          while(inFile>>hwAdd && inFile>>row && inFile>>pad){
@@ -188,11 +202,11 @@ void AliHLTTPCMapping::InitializeMap(UInt_t patch)
            fgRowMapping0[hwAdd]=row-fNRowsToSubtract;
            fgPadMapping0[hwAdd]=pad;
          }
-         fgMapping0IsDone=kTRUE;
+         fgMappingIsDone[patch]=kTRUE;
          break;
        case 1:
-         if(fgkMapping1Size<fMaxHWAdd){
-           HLTFatal("Max hardware address exceeded for patch %d, max number is %d, number from mapping file is %d.",patch,fgkMapping1Size ,fMaxHWAdd);
+         if(fgkMappingSize[patch]<fMaxHWAdd){
+           HLTFatal("Max hardware address exceeded for patch %d, max number is %d, number from mapping file is %d.",patch,fgkMappingSize[patch] ,fMaxHWAdd);
            break;
          }
          while(inFile>>hwAdd && inFile>>row && inFile>>pad){
@@ -203,11 +217,11 @@ void AliHLTTPCMapping::InitializeMap(UInt_t patch)
            fgRowMapping1[hwAdd]=row-fNRowsToSubtract;
            fgPadMapping1[hwAdd]=pad;
          }
-         fgMapping1IsDone=kTRUE;
+         fgMappingIsDone[patch]=kTRUE;
          break;
        case 2:
-         if(fgkMapping2Size<fMaxHWAdd){
-           HLTFatal("Max hardware address exceeded for patch %d, max number is %d number from mapping file is %d.",patch,fgkMapping2Size ,fMaxHWAdd);
+         if(fgkMappingSize[patch]<fMaxHWAdd){
+           HLTFatal("Max hardware address exceeded for patch %d, max number is %d number from mapping file is %d.",patch,fgkMappingSize[patch] ,fMaxHWAdd);
            break;
          }
          while(inFile>>hwAdd && inFile>>row && inFile>>pad){
@@ -218,11 +232,11 @@ void AliHLTTPCMapping::InitializeMap(UInt_t patch)
            fgRowMapping2[hwAdd]=row-fNRowsToSubtract;
            fgPadMapping2[hwAdd]=pad;
          }
-         fgMapping2IsDone=kTRUE;
+         fgMappingIsDone[patch]=kTRUE;
          break;
        case 3:
-         if(fgkMapping3Size<fMaxHWAdd){
-           HLTFatal("Max hardware address exceeded for patch %d, max number is %d number from mapping file is %d.",patch,fgkMapping3Size ,fMaxHWAdd);
+         if(fgkMappingSize[patch]<fMaxHWAdd){
+           HLTFatal("Max hardware address exceeded for patch %d, max number is %d number from mapping file is %d.",patch,fgkMappingSize[patch] ,fMaxHWAdd);
            break;
          }
          while(inFile>>hwAdd && inFile>>row && inFile>>pad){
@@ -233,11 +247,11 @@ void AliHLTTPCMapping::InitializeMap(UInt_t patch)
            fgRowMapping3[hwAdd]=row-fNRowsToSubtract;
            fgPadMapping3[hwAdd]=pad;
          }
-         fgMapping3IsDone=kTRUE;
+         fgMappingIsDone[patch]=kTRUE;
          break;
        case 4:
-         if(fgkMapping4Size<fMaxHWAdd){
-           HLTFatal("Max hardware address exceeded for patch %d, max number is %d number from mapping file is %d.",patch,fgkMapping4Size ,fMaxHWAdd);
+         if(fgkMappingSize[patch]<fMaxHWAdd){
+           HLTFatal("Max hardware address exceeded for patch %d, max number is %d number from mapping file is %d.",patch,fgkMappingSize[patch] ,fMaxHWAdd);
            break;
          }
          while(inFile>>hwAdd && inFile>>row && inFile>>pad){
@@ -248,11 +262,11 @@ void AliHLTTPCMapping::InitializeMap(UInt_t patch)
            fgRowMapping4[hwAdd]=row-fNRowsToSubtract;
            fgPadMapping4[(UInt_t)hwAdd]=(UInt_t)pad;
          }
-         fgMapping4IsDone=kTRUE;
+         fgMappingIsDone[patch]=kTRUE;
          break;
        case 5:
-         if(fgkMapping5Size<fMaxHWAdd){
-           HLTFatal("Max hardware address exceeded for patch %d, max number is %d number from mapping file is %d.",patch,fgkMapping5Size ,fMaxHWAdd);
+         if(fgkMappingSize[patch]<fMaxHWAdd){
+           HLTFatal("Max hardware address exceeded for patch %d, max number is %d number from mapping file is %d.",patch,fgkMappingSize[patch] ,fMaxHWAdd);
            break;
          }
          while(inFile>>hwAdd && inFile>>row && inFile>>pad){
@@ -263,7 +277,7 @@ void AliHLTTPCMapping::InitializeMap(UInt_t patch)
            fgRowMapping5[hwAdd]=row-fNRowsToSubtract;
            fgPadMapping5[hwAdd]=pad;
          }
-         fgMapping5IsDone=kTRUE;
+         fgMappingIsDone[patch]=kTRUE;
          break;
        }
       }
@@ -276,9 +290,8 @@ UInt_t AliHLTTPCMapping::GetRow(UInt_t hwadd) const
 {
   // see header file for class documentation
   assert(fCurrentRowMapping);
-  //  assert(hwadd<=fMaxHWAdd);
   if (!fCurrentRowMapping) return 0;
-  if (hwadd>fMaxHWAdd) return 1000;
+  if (hwadd>fMaxHWAdd) return 0;
   return fCurrentRowMapping[hwadd];
 }
 
@@ -286,8 +299,90 @@ UInt_t AliHLTTPCMapping::GetPad(UInt_t hwadd) const
 {
   // see header file for class documentation
   assert(fCurrentPadMapping);
-  //  assert(hwadd<=fMaxHWAdd);
   if (!fCurrentPadMapping) return 0;
-  if (hwadd>fMaxHWAdd) return 1000;
+  if (hwadd>fMaxHWAdd) return 0;
   return fCurrentPadMapping[hwadd];
 }
+
+UInt_t AliHLTTPCMapping::GetHwAddress(UInt_t row, UInt_t pad) const
+{
+  // see header file for class documentation
+  assert(fPatch<fgkNofPatches);
+  assert(fgHwaMapping[fPatch]);
+  UInt_t hwaIndex=(row<<fgkMappingHwaRowBitShift) + pad;
+  if (hwaIndex<fgkMappingHwaSize) {
+    return (fgHwaMapping[fPatch])[hwaIndex];
+  }
+  return ~((UInt_t)0);
+}
+
+Bool_t AliHLTTPCMapping::ReadArray(UInt_t patch, UInt_t arraySize, UInt_t rowArray[], UInt_t padArray[], UInt_t hwaMappingSize, UInt_t hwaArray[]) const
+{
+  // see header file for class documentation
+  //Making mapping arrays for the given patch
+  Bool_t result=kTRUE;
+
+  assert(rowArray!=NULL || padArray!=NULL || hwaArray!=NULL);
+  if (!rowArray || !padArray || !hwaArray) return kFALSE;
+
+  memset(rowArray, -1, arraySize*sizeof(rowArray[0]));
+  memset(padArray, -1, arraySize*sizeof(padArray[0]));
+  memset(hwaArray, -1, hwaMappingSize*sizeof(padArray[0]));
+
+  ifstream inFile;
+  TString filename;
+  const char* basePath=getenv("ALICE_ROOT");
+  if (basePath) {
+    filename.Form("%s/TPC/mapping/Patch%d.data", basePath,patch);
+  }
+  inFile.open(filename.Data());
+  if (!inFile) {
+    HLTFatal("Unable to open file: %s      This means no mapping is provided.", filename.Data());
+    return kFALSE;
+  }
+
+  UInt_t nHWAdd=0;
+  UInt_t maxHWAdd=0;
+  if(inFile >> nHWAdd){
+    if(inFile >> maxHWAdd){
+      if(arraySize<maxHWAdd){
+       HLTFatal("Max hardware address exceeded for patch %d, max number is %d, number from mapping file is %d.",patch, arraySize ,fMaxHWAdd);
+       result=kFALSE;
+      }
+      UInt_t hwAdd=0;
+      UInt_t row=0;
+      UInt_t pad=0;
+      while(result && inFile>>hwAdd && inFile>>row && inFile>>pad){
+       if (hwAdd>maxHWAdd) {
+         HLTFatal("hardware address exceeds max hwAddress %d, mapping file %s corrupted?", maxHWAdd);
+         result=kFALSE;
+         break;
+       }
+       Int_t dummy=0;
+       // AliHLTTPCTransform::GetFirstRow returns first row in scheme A.
+       // We have to transform to scheme B by AliHLTTPCTransform::Slice2Sector.
+       Int_t offsetSchemeB=0;
+       AliHLTTPCTransform::Slice2Sector(0, fRowOffset, dummy, offsetSchemeB);
+       rowArray[hwAdd]=row-offsetSchemeB;
+       padArray[hwAdd]=pad;
+       UInt_t hwaIndex=(rowArray[hwAdd]<<fgkMappingHwaRowBitShift) + padArray[hwAdd];
+       assert(hwaIndex<hwaMappingSize);
+       if (hwaIndex<hwaMappingSize) {
+         hwaArray[hwaIndex]=hwAdd;
+       }
+      }
+    }
+  }
+  inFile.close();
+  return result;
+}
+
+Bool_t AliHLTTPCMapping::IsValidHWAddress(UInt_t hwadd) const
+{
+  if (hwadd>fMaxHWAdd){
+    return kFALSE;
+  }
+  else{
+    return kTRUE;
+  }
+}