faster data access through iterators added to HWCF decoder, used in cluster transform...
authorrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 10 Aug 2011 06:18:21 +0000 (06:18 +0000)
committerrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 10 Aug 2011 06:18:21 +0000 (06:18 +0000)
HLT/TPCLib/AliHLTTPCHWCFData.cxx
HLT/TPCLib/AliHLTTPCHWCFData.h
HLT/TPCLib/AliHLTTPCHWClusterTransformComponent.cxx

index 54e772a..3ce7bff 100644 (file)
@@ -39,6 +39,8 @@ AliHLTTPCHWCFData::AliHLTTPCHWCFData(int forceVersion)
  , fForcedVersion(forceVersion)
  , fRCUTrailerSize(0)
  , fpFileBuffer(NULL)
+ , fIterator()
+ , fIteratorEnd()
 {
   // constructor
 }
@@ -251,7 +253,7 @@ Int_t    AliHLTTPCHWCFData::GetCharge(int i)  const
       ALIHLTERRORGUARD(1, "invalid format version %d", fVersion);
     }
   }
-  return -10000.;
+  return -1;
 }
 
 Int_t    AliHLTTPCHWCFData::GetQMax(int i)    const
@@ -265,7 +267,7 @@ Int_t    AliHLTTPCHWCFData::GetQMax(int i)    const
       ALIHLTERRORGUARD(1, "invalid format version %d", fVersion);
     }
   }
-  return -10000.;
+  return -1;
 }
 
 void AliHLTTPCHWCFData::Print(const char* option)
index 7a5bf73..d0b93b3 100644 (file)
@@ -149,6 +149,93 @@ 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)
+      { fData=i.fData; fVersion=i.fVersion; fElementSize=i.fElementSize; return *this;}
+    ~iterator() {}
+
+    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;
+  }
+
   static const unsigned  fgkAliHLTTPCHWClusterSize;
  protected:
 
@@ -175,6 +262,9 @@ class AliHLTTPCHWCFData : public AliHLTLogging {
 
   TArrayC* fpFileBuffer; //! internal buffer for file content
 
+  iterator fIterator; //! iterator
+  iterator fIteratorEnd; //! end iterator
+
   ClassDef(AliHLTTPCHWCFData, 0)
 };
 #endif
index f8b55a1..bb05446 100644 (file)
@@ -241,8 +241,7 @@ int AliHLTTPCHWClusterTransformComponent::DoEvent(const AliHLTComponentEventData
      UInt_t bufferSize32 = ((Int_t)iter->fSize - sizeof(AliRawDataHeader) )/sizeof(AliHLTUInt32_t);
 
      if (fpDecoder->Init(reinterpret_cast<AliHLTUInt8_t*>(buffer), bufferSize32*sizeof(AliHLTUInt32_t))>=0 && fpDecoder->CheckVersion()>=0) {
-       UInt_t nofClusters=fpDecoder->GetNumberOfClusters();
-       for (UInt_t cl=0; cl<nofClusters; cl++) {
+       for (AliHLTTPCHWCFData::iterator cl=fpDecoder->begin(); cl!=fpDecoder->end(); ++cl) {
         if(outPtr->fSpacePointCnt>=maxPoints){
           HLTWarning("No more space to add clusters, exiting!");
           iResult  = -ENOSPC;
@@ -250,23 +249,23 @@ int AliHLTTPCHWClusterTransformComponent::DoEvent(const AliHLTComponentEventData
         }
 
         AliHLTTPCSpacePointData& c=outPtr->fSpacePoints[outPtr->fSpacePointCnt];
-        int padrow=fpDecoder->GetPadRow(cl);
+        int padrow=cl.GetPadRow();
         if (padrow<0) {
           // something wrong here, padrow is stored in the cluster header
           // word which has bit pattern 0x3 in bits bit 30 and 31 which was
           // not recognized
-          ALIHLTERRORGUARD(1, "can not read cluster header word, skipping %d of %d cluster(s)", nofClusters-cl, nofClusters);
+          ALIHLTERRORGUARD(1, "can not read cluster header word");
           break;
         }
         padrow+=AliHLTTPCTransform::GetFirstRow(minPartition);
-        AliHLTUInt32_t charge=fpDecoder->GetCharge(cl);
+        AliHLTUInt32_t charge=cl.GetCharge();
         // skip clusters below threshold  
         if( charge<fChargeThreshold ) continue;  
 
-        float pad=fpDecoder->GetPad(cl);
-        float time=fpDecoder->GetTime(cl);
-        float sigmaY2=fpDecoder->GetSigmaY2(cl);
-        float sigmaZ2=fpDecoder->GetSigmaZ2(cl);
+        float pad=cl.GetPad();
+        float time=cl.GetTime();
+        float sigmaY2=cl.GetSigmaY2();
+        float sigmaZ2=cl.GetSigmaZ2();
         sigmaY2-=pad*pad;
         sigmaY2*=padpitch*padpitch;
         sigmaZ2-=time*time;
@@ -275,7 +274,7 @@ int AliHLTTPCHWClusterTransformComponent::DoEvent(const AliHLTComponentEventData
         c.SetCharge(charge);
         c.SetSigmaY2(sigmaY2);
         c.SetSigmaZ2(sigmaZ2);
-        c.SetQMax(fpDecoder->GetQMax(cl));
+        c.SetQMax(cl.GetQMax());
 
         Float_t xyz[3];
         fTransform.Transform( minSlice, padrow, pad + 0.5, time, xyz );
@@ -327,15 +326,17 @@ int AliHLTTPCHWClusterTransformComponent::DoEvent(const AliHLTComponentEventData
         outputRaw->fVersion = 0;
         outputRaw->fCount = 0;
 
-        UInt_t nofClusters=fpDecoder->GetNumberOfClusters();
-        for (UInt_t cl=0; cl<nofClusters; cl++) {
+        // check if there are clusters available, if not the format might
+        // not even been decoded at that moment 
+        if (fpDecoder->GetNumberOfClusters()>0) {
+        for (AliHLTTPCHWCFData::iterator cl=fpDecoder->begin(); cl!=fpDecoder->end(); ++cl) {
           if(outputRaw->fCount>=maxRawClusters){
             HLTWarning("No more space to add clusters, exiting!");
             iResult  = -ENOSPC;
             break;
           }
           AliHLTTPCRawCluster &c = outputRaw->fClusters[outputRaw->fCount];
-          int padrow=fpDecoder->GetPadRow(cl);
+          int padrow=cl.GetPadRow();
           if (padrow<0) {
             // something wrong here, padrow is stored in the cluster header
             // word which has bit pattern 0x3 in bits bit 30 and 31 which was
@@ -343,14 +344,14 @@ int AliHLTTPCHWClusterTransformComponent::DoEvent(const AliHLTComponentEventData
             break;
           }
           padrow+=AliHLTTPCTransform::GetFirstRow(minPartition);
-          AliHLTUInt32_t charge= fpDecoder->GetCharge(cl);
+          AliHLTUInt32_t charge= cl.GetCharge();
           // skip clusters below threshold  
           if( charge<fChargeThreshold ) continue;  
 
-          float pad =fpDecoder->GetPad(cl);
-          float time =fpDecoder->GetTime(cl);
-          float sigmaP2=fpDecoder->GetSigmaY2(cl);
-          float sigmaT2=fpDecoder->GetSigmaZ2(cl);
+          float pad =cl.GetPad();
+          float time =cl.GetTime();
+          float sigmaP2=cl.GetSigmaY2();
+          float sigmaT2=cl.GetSigmaZ2();
           sigmaP2-=pad*pad;
           sigmaT2-=time*time;
           c.SetPadRow(padrow);
@@ -359,11 +360,12 @@ int AliHLTTPCHWClusterTransformComponent::DoEvent(const AliHLTComponentEventData
           c.SetTime(time);
           c.SetSigmaY2(sigmaP2);
           c.SetSigmaZ2(sigmaT2);
-          c.SetQMax(fpDecoder->GetQMax(cl));
+          c.SetQMax(cl.GetQMax());
 
           // store cluster and continue
           outputRaw->fCount++;
         }
+        }
 
         // fill into HLT output data
         AliHLTComponentBlockData bdRawClusters;