]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/TPCLib/AliHLTTPCHWCFData.h
Qmax for merged clusters fixed
[u/mrichter/AliRoot.git] / HLT / TPCLib / AliHLTTPCHWCFData.h
index 7a5bf73eab719d6c79266e697e5296d371a3f74f..e4c03c8735d4485fe107b970af6de054ad3b1870 100644 (file)
@@ -1,3 +1,4 @@
+//-*- Mode: C++ -*-
 // $Id$
 #ifndef ALIHLTTPCHWCFDATA_H
 #define ALIHLTTPCHWCFDATA_H
@@ -14,6 +15,7 @@
 #include "AliHLTTPCRootTypes.h"
 #include "AliHLTDataTypes.h"
 #include "AliHLTLogging.h"
+#include "AliHLTErrorGuard.h"
 
 class TArrayC;
 
@@ -68,14 +70,34 @@ class AliHLTTPCHWCFData : public AliHLTLogging {
 
   int CheckVersion();
   bool CheckAssumption(int format, const AliHLTUInt8_t* pData, int size) const;
-  bool CheckBounds(int i) const;
-  int GetElementSize(int format) const;
+
+  // check if index is within bounds
+  bool CheckBounds(int i) const {
+    if (fVersion<0) {
+      ALIHLTERRORGUARD(1, "");
+      return false;
+    }
+    int elementsize=GetElementSize(fVersion);
+    if (elementsize<0) return false;
+    return ((i+1)*elementsize+fRCUTrailerSize<=fBufferSize);
+  }
+
+  // get the size of one element
+  int GetElementSize(int version) const {
+    switch (version) {
+    case 0: return sizeof(AliHLTTPCHWClusterV0);
+    case 1: return sizeof(AliHLTTPCHWClusterV1);
+    default:
+      ALIHLTERRORGUARD(1, "invalid format version %d", fVersion);
+    }
+    return -1;
+  }
 
   // pointer to RCU trailer
   const AliHLTUInt8_t*  GetRCUTrailer() const
   {
     if (fRCUTrailerSize<=0 || fpBuffer==NULL || fBufferSize<fRCUTrailerSize) return NULL;
-    return fpBuffer+fRCUTrailerSize;
+    return fpBuffer+(fBufferSize-fRCUTrailerSize);
   }
 
   // size of RCU trailer
@@ -100,10 +122,16 @@ class AliHLTTPCHWCFData : public AliHLTLogging {
     Float_t        fSigmaZ2;
 
     Int_t    GetPadRow()  const;
-    Float_t  GetPad()     const {return fPad;}
+    Float_t  GetPad()     const {return fPad+0.5;}
     Float_t  GetTime()    const {return fTime;}
-    Float_t  GetSigmaY2() const {return fSigmaY2;}
-    Float_t  GetSigmaZ2() const {return fSigmaZ2;}
+    Float_t  GetSigmaY2() const {
+      Float_t sy2 = fSigmaY2 - fPad*fPad;
+      return (sy2>0) ?sy2 :0.;
+    }
+    Float_t  GetSigmaZ2() const {
+      Float_t sz2 = fSigmaZ2 - fTime*fTime;
+      return (sz2>0) ?sz2 :0.;
+    }
     Int_t    GetCharge()  const;
     Int_t    GetQMax()    const {return -1;}
   };
@@ -117,10 +145,16 @@ class AliHLTTPCHWCFData : public AliHLTLogging {
     Float_t        fSigmaZ2;
 
     Int_t    GetPadRow()  const;
-    Float_t  GetPad()     const {return fPad;}
+    Float_t  GetPad()     const {return fPad+0.5;}
     Float_t  GetTime()    const {return fTime;}
-    Float_t  GetSigmaY2() const {return fSigmaY2;}
-    Float_t  GetSigmaZ2() const {return fSigmaZ2;}
+    Float_t  GetSigmaY2() const {
+      Float_t sy2 = fSigmaY2 - fPad*fPad;
+      return (sy2>0) ?sy2 :0.;
+    }
+    Float_t  GetSigmaZ2() const {
+      Float_t sz2 = fSigmaZ2 - fTime*fTime;
+      return (sz2>0) ?sz2 :0.;
+    }
     Int_t    GetCharge()  const;
     Int_t    GetQMax()    const;
   };
@@ -149,6 +183,107 @@ class AliHLTTPCHWCFData : public AliHLTLogging {
     int fEntries;            //! number of entries
   };
 
+  class iterator {
+  public:
+    iterator()
+      : fData(NULL), fVersion(-1), fElementSize(0) {}
+    iterator(const AliHLTUInt8_t* pData, int version, int elementSize)
+      : fData(pData), fVersion(version), fElementSize(elementSize) {}
+    iterator(const iterator& i)
+      : fData(i.fData), fVersion(i.fVersion), fElementSize(i.fElementSize) {}
+    iterator& operator=(const iterator& i) {
+      if (this==&i) return *this;
+      fData=i.fData; fVersion=i.fVersion; fElementSize=i.fElementSize; return *this;
+    }
+    ~iterator() {fData=NULL;}
+
+    bool operator==(const iterator& i) const  {return (fData!=NULL) && (fData==i.fData);}
+    bool operator!=(const iterator& i) const  {return (fData!=NULL) && (fData!=i.fData);}
+    // prefix operators
+    iterator& operator++() {fData+=fElementSize; return *this;}
+    iterator& operator--() {fData-=fElementSize; return *this;}
+    // postfix operators
+    iterator operator++(int) {iterator i(*this); fData+=fElementSize; return i;}
+    iterator operator--(int) {iterator i(*this); fData-=fElementSize; return i;}
+
+    iterator& operator+=(int step) {fData+=step*fElementSize; return *this;}
+
+    Int_t    GetPadRow()  const {
+      switch (fVersion) {
+      case 0: return reinterpret_cast<const AliHLTTPCHWClusterV0*>(fData)->GetPadRow();
+      case 1: return reinterpret_cast<const AliHLTTPCHWClusterV1*>(fData)->GetPadRow();
+      } return -1;
+    }
+    Float_t  GetPad()     const {
+      switch (fVersion) {
+      case 0: return reinterpret_cast<const AliHLTTPCHWClusterV0*>(fData)->GetPad();
+      case 1: return reinterpret_cast<const AliHLTTPCHWClusterV1*>(fData)->GetPad();
+      } return -10000.;
+    }
+    Float_t  GetTime()    const {
+      switch (fVersion) {
+      case 0: return reinterpret_cast<const AliHLTTPCHWClusterV0*>(fData)->GetTime();
+      case 1: return reinterpret_cast<const AliHLTTPCHWClusterV1*>(fData)->GetTime();
+      } return -10000.;
+    }
+    Float_t  GetSigmaY2() const {
+      switch (fVersion) {
+      case 0: return reinterpret_cast<const AliHLTTPCHWClusterV0*>(fData)->GetSigmaY2();
+      case 1: return reinterpret_cast<const AliHLTTPCHWClusterV1*>(fData)->GetSigmaY2();
+      } return -10000.;
+    }
+    Float_t  GetSigmaZ2() const {
+      switch (fVersion) {
+      case 0: return reinterpret_cast<const AliHLTTPCHWClusterV0*>(fData)->GetSigmaZ2();
+      case 1: return reinterpret_cast<const AliHLTTPCHWClusterV1*>(fData)->GetSigmaZ2();
+      } return -10000.;
+    }
+    Int_t    GetCharge()  const {
+      switch (fVersion) {
+      case 0: return reinterpret_cast<const AliHLTTPCHWClusterV0*>(fData)->GetCharge();
+      case 1: return reinterpret_cast<const AliHLTTPCHWClusterV1*>(fData)->GetCharge();
+      } return -1;
+    }
+    Int_t    GetQMax()    const {
+      switch (fVersion) {
+      case 0: return reinterpret_cast<const AliHLTTPCHWClusterV0*>(fData)->GetQMax();
+      case 1: return reinterpret_cast<const AliHLTTPCHWClusterV1*>(fData)->GetQMax();
+      } return -1;
+    }
+
+  protected:
+  private:
+    const AliHLTUInt8_t* fData; //! data
+    int fVersion; //! format version
+    int fElementSize; //! element size
+  };
+
+  // prepare iterator and end marker
+  iterator& begin() {
+    fIterator.~iterator();
+    new (&fIterator) iterator(fpBuffer, fVersion, GetElementSize(fVersion));
+    fIteratorEnd=fIterator;
+    fIteratorEnd+=GetNumberOfClusters();
+    return fIterator;
+  }
+
+  // get loop end marker
+  iterator& end() {
+    return fIteratorEnd;
+  }
+
+  // find one single element
+  iterator& find(int i) {
+    fIterator.~iterator();
+    fIteratorEnd.~iterator();
+    if (i>=GetNumberOfClusters()) return fIterator;
+    new (&fIterator) iterator(fpBuffer, fVersion, GetElementSize(fVersion));
+    fIterator+=i;
+    fIteratorEnd=fIterator;
+    fIteratorEnd+=1;
+    return fIterator;
+  }
+
   static const unsigned  fgkAliHLTTPCHWClusterSize;
  protected:
 
@@ -175,6 +310,9 @@ class AliHLTTPCHWCFData : public AliHLTLogging {
 
   TArrayC* fpFileBuffer; //! internal buffer for file content
 
+  iterator fIterator; //! iterator
+  iterator fIteratorEnd; //! end iterator
+
   ClassDef(AliHLTTPCHWCFData, 0)
 };
 #endif