+//-*- Mode: C++ -*-
// $Id$
#ifndef ALIHLTTPCHWCFDATA_H
#define ALIHLTTPCHWCFDATA_H
#include "AliHLTTPCRootTypes.h"
#include "AliHLTDataTypes.h"
#include "AliHLTLogging.h"
+#include "AliHLTErrorGuard.h"
class TArrayC;
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
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;}
};
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;
};
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:
TArrayC* fpFileBuffer; //! internal buffer for file content
+ iterator fIterator; //! iterator
+ iterator fIteratorEnd; //! end iterator
+
ClassDef(AliHLTTPCHWCFData, 0)
};
#endif