treatment of MC labels added
authorsgorbuno <sgorbuno@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 2 Dec 2011 14:22:45 +0000 (14:22 +0000)
committersgorbuno <sgorbuno@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 2 Dec 2011 14:22:45 +0000 (14:22 +0000)
HLT/TPCLib/HWCFemulator/AliHLTTPCHWClusterMerger.cxx
HLT/TPCLib/HWCFemulator/AliHLTTPCHWClusterMerger.h

index cf92fd3..2981260 100644 (file)
@@ -209,7 +209,8 @@ int AliHLTTPCHWClusterMerger::AddCandidate(int slice,
                                           float sigmaZ2,
                                           unsigned short charge,
                                           unsigned short qmax,
-                                          AliHLTUInt32_t id
+                                          AliHLTUInt32_t id,
+                                          const AliHLTTPCClusterMCLabel &mc 
                                           )
 {
   /// add a candidate for merging and register in the index grid
@@ -251,7 +252,7 @@ int AliHLTTPCHWClusterMerger::AddCandidate(int slice,
   }
 
   fClusters.push_back(AliClusterRecord(slice, partition, iBorder, 0, id,
-                                      AliHLTTPCRawCluster(partitionrow, pad, time, sigmaY2, sigmaZ2, charge, qmax)));
+                                      AliHLTTPCRawCluster(partitionrow, pad, time, sigmaY2, sigmaZ2, charge, qmax), mc ));
 
   if( iBorder>=0 ){
     fBorderNClusters[iBorder]++;
@@ -388,7 +389,31 @@ sLeft+=n1;
       c1.Cluster().fPad  = w1*c1.Cluster().fPad + w2*c2.Cluster().fPad;
       c1.Cluster().fTime = w1*c1.Cluster().fTime + w2*c2.Cluster().fTime;
       
+      // merge MC labels
       
+      AliHLTTPCClusterMCWeight labels[6] = {
+       c1.GetMCLabel().fClusterID[0],
+       c1.GetMCLabel().fClusterID[1],
+       c1.GetMCLabel().fClusterID[2],
+       c2.GetMCLabel().fClusterID[0],
+       c2.GetMCLabel().fClusterID[1],
+       c2.GetMCLabel().fClusterID[2]
+      };
+
+      sort(labels, labels+6, CompareMCLabels);
+      for( unsigned int i=1; i<6; i++ ){
+       if(labels[i-1].fMCID==labels[i].fMCID ){
+         labels[i].fWeight+=labels[i-1].fWeight;
+         labels[i-1].fWeight = 0;
+       }
+      }
+
+      sort(labels, labels+6, CompareMCWeights );
+    
+      for( unsigned int i=0; i<3 && i<6; i++ ){
+       c1.MCLabel().fClusterID[i] = labels[i];
+      }
+
       // wipe c2
       fRemovedClusterIds.push_back(c2.GetId());
       HLTDebug("merging %d into %d", border2[ib2].fClusterRecordID, border1[ib1].fClusterRecordID);
index cb0a9e0..28dd45b 100644 (file)
@@ -14,6 +14,7 @@
 //          Handles merging of branch border clusters
 
 #include "AliHLTTPCRawCluster.h"
+#include "AliHLTTPCClusterMCData.h"
 #include "AliHLTLogging.h"
 #include <vector>
 #include "TObject.h"
@@ -69,6 +70,27 @@ class AliHLTTPCHWClusterMerger : public AliHLTLogging
                        );
   }
 
+  // cache cluster for later merging
+  template<typename T> 
+  int AddCandidate(int slice,
+                  int partition,
+                  AliHLTUInt32_t id,
+                  const T& c,
+                  const AliHLTTPCClusterMCLabel &mc) {
+    return AddCandidate(slice,
+                       partition,
+                       c.GetPadRow(),
+                       c.GetPad(),
+                       c.GetTime(),
+                       c.GetSigmaY2(),
+                       c.GetSigmaZ2(),
+                       c.GetCharge(),
+                       c.GetQMax(),
+                       id,
+                       mc
+                       );
+  }
+
   /// cache cluster for later merging
   int AddCandidate(int slice,
                   int partition,
@@ -79,7 +101,8 @@ class AliHLTTPCHWClusterMerger : public AliHLTLogging
                   float sigmaZ2,
                   unsigned short charge,
                   unsigned short qmax,
-                  AliHLTUInt32_t id=~AliHLTUInt32_t(0)
+                  AliHLTUInt32_t id=~AliHLTUInt32_t(0),
+                  const AliHLTTPCClusterMCLabel &mc=AliHLTTPCClusterMCLabel()
                   );
 
   /// merge clusters
@@ -102,11 +125,14 @@ class AliHLTTPCHWClusterMerger : public AliHLTLogging
   class AliClusterRecord {
   public:
     AliClusterRecord()
-      : fSlice(-1), fPartition(-1), fBorder(-1), fMergedFlag(0), fId(~AliHLTUInt32_t(0)), fCluster() {}
-    AliClusterRecord(int slice, int partition, int border,bool merged, AliHLTUInt32_t id, AliHLTTPCRawCluster cluster)
-      : fSlice(slice), fPartition(partition), fBorder(border), fMergedFlag(merged), fId(id), fCluster(cluster) {}
+      : fSlice(-1), fPartition(-1), fBorder(-1), fMergedFlag(0), fId(~AliHLTUInt32_t(0)), fCluster(), fMC() {}
+    AliClusterRecord(int slice, int partition, int border,bool merged, AliHLTUInt32_t id, const AliHLTTPCRawCluster &cluster)
+      : fSlice(slice), fPartition(partition), fBorder(border), fMergedFlag(merged), fId(id), fCluster(cluster), fMC() {}
+    AliClusterRecord(int slice, int partition, int border,bool merged, AliHLTUInt32_t id, const AliHLTTPCRawCluster &cluster, const AliHLTTPCClusterMCLabel &mc)
+      : fSlice(slice), fPartition(partition), fBorder(border), fMergedFlag(merged), fId(id), fCluster(cluster), fMC(mc) {}
+
     AliClusterRecord(const AliClusterRecord& other)
-      : fSlice(other.fSlice), fPartition(other.fPartition), fBorder(other.fBorder), fMergedFlag(other.fMergedFlag), fId(other.fId), fCluster(other.fCluster) {}
+      : fSlice(other.fSlice), fPartition(other.fPartition), fBorder(other.fBorder), fMergedFlag(other.fMergedFlag), fId(other.fId), fCluster(other.fCluster), fMC(other.fMC) {}
     AliClusterRecord& operator=(const AliClusterRecord& other) {
       if (this==&other) return *this;
       this->~AliClusterRecord();
@@ -128,8 +154,10 @@ class AliHLTTPCHWClusterMerger : public AliHLTLogging
     AliHLTUInt32_t GetId() const {return fId;}
     operator AliHLTTPCRawCluster() const {return fCluster;}
     const AliHLTTPCRawCluster& GetCluster() const {return fCluster;}
+    const AliHLTTPCClusterMCLabel& GetMCLabel() const {return fMC;}
     void SetMergedFlag(bool v ){ fMergedFlag = v;}
     AliHLTTPCRawCluster &Cluster(){ return fCluster; }
+    AliHLTTPCClusterMCLabel& MCLabel(){ return fMC; }
   private:
     int fSlice; //!
     int fPartition; //!
@@ -137,6 +165,7 @@ class AliHLTTPCHWClusterMerger : public AliHLTLogging
     bool fMergedFlag; //!
     AliHLTUInt32_t fId; //!
     AliHLTTPCRawCluster fCluster; //!
+    AliHLTTPCClusterMCLabel fMC; //!
   };
 
   //////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -234,6 +263,12 @@ class AliHLTTPCHWClusterMerger : public AliHLTLogging
     return b1.fTimeBin > b2.fTimeBin;
   }
  
+  static bool CompareMCWeights(const AliHLTTPCClusterMCWeight &a, const AliHLTTPCClusterMCWeight &b){
+    return a.fWeight > b.fWeight;
+  }
+  static bool CompareMCLabels(const AliHLTTPCClusterMCWeight &a, const AliHLTTPCClusterMCWeight &b){
+    return a.fMCID < b.fMCID;
+  }
 
   AliHLTInt16_t *fMapping;//!
   int fNRows;//!