Allocate 9 bits to cluster size and 7 to cl.usage (was 8,8). If cluster size
authorshahoian <ruben.shahoyan@cern.ch>
Wed, 6 Aug 2014 15:54:09 +0000 (17:54 +0200)
committershahoian <ruben.shahoyan@cern.ch>
Wed, 6 Aug 2014 15:56:06 +0000 (17:56 +0200)
(total or nx or nz) exceeds max size (511, 255, 255 resp), it is set to max
allowed value

ITS/UPGRADE/AliITSUClusterPix.h
ITS/UPGRADE/AliITSUClusterizer.cxx
ITS/UPGRADE/AliITSUClusterizer.h

index 06aa675..59242d1 100644 (file)
@@ -5,7 +5,8 @@
 #include <TMath.h>
 
 // uncomment this to have cluster topology in stored
-//#define _ClusterTopology_  
+
+#define _ClusterTopology_  
 
 #define CLUSTER_VERSION 2 
 
@@ -30,6 +31,8 @@ class AliITSUClusterPix : public AliCluster
     ,kSortIdTrkYZ = BIT(1)    // sort according to ID, then Y,Z of tracking frame
     ,kSortBits = kSortIdLocXZ|kSortIdTrkYZ
   };
+  enum {kOffsNZ=0,kMaskNZ=0xff,kOffsNX=8,kMaskNX=0xff,kOffsNPix=16,kMaskNPix=0x1ff,kOffsClUse=25,kMaskClUse=0x7f};
+  //
 #ifdef _ClusterTopology_
   enum {kMaxPatternBits=32*16, kMaxPatternBytes=kMaxPatternBits/8,
        kSpanMask=0x7fff,kTruncateMask=0x8000};
@@ -58,15 +61,15 @@ class AliITSUClusterPix : public AliCluster
   void    GetLocalXYZ(Float_t xyz[3])                       const;
   void    GetTrackingXYZ(Float_t xyz[3])                    const; 
   //
-  void    SetNxNzN(UChar_t nx,UChar_t nz,UShort_t n)              {fNxNzN = ( ((n&0xff)<<16)) + ((nx&0xff)<<8) + (nz&0xff);}
+  void    SetNxNzN(UChar_t nx,UChar_t nz,UShort_t n)              {fNxNzN = ((n&kMaskNPix)<<kOffsNPix) + ((nx&kMaskNX)<<kOffsNX) + ((nz&kMaskNZ)<<kOffsNZ);}
   void    SetClUsage(Int_t n);
   void    ModClUsage(Bool_t used=kTRUE)                           {used ? IncClUsage() : DecClUsage();}
   void    IncClUsage()                                            {SetClUsage(GetClUsage()+1); IncreaseClusterUsage();}
   void    DecClUsage();
-  Int_t   GetNx()                                           const {return (fNxNzN>>8)&0xff;}
-  Int_t   GetNz()                                           const {return fNxNzN&0xff;}
-  Int_t   GetNPix()                                         const {return (fNxNzN>>16)&0xff;}
-  Int_t   GetClUsage()                                      const {return (fNxNzN>>24)&0xff;}
+  Int_t   GetNx()                                           const {return (fNxNzN>>kOffsNX)&kMaskNX;}
+  Int_t   GetNz()                                           const {return (fNxNzN>>kOffsNZ)&kMaskNZ;}
+  Int_t   GetNPix()                                         const {return (fNxNzN>>kOffsNPix)&kMaskNPix;}
+  Int_t   GetClUsage()                                      const {return (fNxNzN>>kOffsClUse)&kMaskClUse;}
   //
   void    SetQ(UShort_t q)                                        {fCharge = q;}
   Int_t   GetQ()                                            const {return fCharge;}
@@ -108,6 +111,10 @@ class AliITSUClusterPix : public AliCluster
   void     ResetPattern();
   Bool_t   TestPixel(UShort_t row,UShort_t col)      const;
   void     SetPixel(UShort_t row,UShort_t col, Bool_t fired=kTRUE);
+  void     GetPattern(UChar_t patt[kMaxPatternBytes]) {for(Int_t i=0; i<kMaxPatternBytes; i++) patt[i]=fPattern[i];}
+  Int_t    GetPatternMinRow()                        const {return fPatternMinRow;}
+  Int_t    GetPatternMinCol()                        const {return fPatternMinCol;}
+
 #endif
   //
  protected:
@@ -115,7 +122,7 @@ class AliITSUClusterPix : public AliCluster
   UShort_t                fCharge;        //  charge (for MC studies only)
   UShort_t                fRecoInfo;      //! space reserved for reco time manipulations
   Int_t                   fNxNzN;         //  effective cluster size in X (1st byte) and Z (2nd byte) directions 
-                                          //  and total Npix(3d byte). 4th byte is used for clusters usage counter
+                                          //  and total Npix(next 9 bits). last 7 bits are used for clusters usage counter
   static UInt_t           fgMode;         //! general mode (sorting mode etc)
   static AliITSUGeomTGeo* fgGeom;         //! pointer on the geometry data
 
@@ -124,7 +131,7 @@ class AliITSUClusterPix : public AliCluster
   UShort_t fPatternNCols;                 // pattern span in columns
   UShort_t fPatternMinRow;                // pattern start row
   UShort_t fPatternMinCol;                // pattern start column
-  UChar_t  fPattern[kMaxPatternBytes];    //  cluster topology
+  UChar_t  fPattern[kMaxPatternBytes];    // cluster topology
   //
   ClassDef(AliITSUClusterPix,CLUSTER_VERSION+1)
 #else
@@ -143,8 +150,8 @@ inline void AliITSUClusterPix::DecClUsage() {
 //______________________________________________________
 inline void AliITSUClusterPix::SetClUsage(Int_t n) {
   // set cluster usage counter
-  fNxNzN &= 0x00ffffff;
-  fNxNzN |= (n&0xff)<<24;
+  fNxNzN &= ~(kMaskClUse<<kOffsClUse);
+  fNxNzN |= (n&kMaskClUse)<<kOffsClUse;
   if (n<2) SetBit(kShared,kFALSE);
   if (!n)  SetBit(kUsed,kFALSE);
 }
index c7d84f7..7302012 100644 (file)
@@ -205,7 +205,7 @@ void AliITSUClusterizer::Transform(AliITSUClusterPix *cluster,AliITSUClusterizer
     //
     ++n;
   }
-  UChar_t nx=1,nz=1;
+  Int_t nx=1,nz=1;
   double dx = xmx-xmn, dz = zmx-zmn;
   if (n>1) {
     double fac=1./n;
@@ -218,14 +218,22 @@ void AliITSUClusterizer::Transform(AliITSUClusterPix *cluster,AliITSUClusterizer
   }
   x -= fLorAngCorrection;  // LorentzAngle correction
   cluster->SetX(x);
-  cluster->SetZ(z);
+  cluster->SetZ(z);  
   cluster->SetY(0);
   cluster->SetSigmaZ2(nz>1 ? dz*dz*k1to12 : pz*pz*k1to12);
   cluster->SetSigmaY2(nx>1 ? dx*dx*k1to12 : px*px*k1to12);
   cluster->SetSigmaYZ(0);
   cluster->SetFrameLoc();
-  cluster->SetNxNzN(nx,nz,n);
+  if (n>AliITSUClusterPix::kMaskNPix) n = AliITSUClusterPix::kMaskNPix;
+  cluster->SetNxNzN(nx>AliITSUClusterPix::kMaskNX ? AliITSUClusterPix::kMaskNX : nx,
+                   nz>AliITSUClusterPix::kMaskNZ ? AliITSUClusterPix::kMaskNZ : nz,
+                   n>AliITSUClusterPix::kMaskNPix ? AliITSUClusterPix::kMaskNPix : n);             
   cluster->SetQ(charge); // note: this is MC info
+  //  if (cluster->GetNPix()!=n || cluster->GetNx()!=nx || cluster->GetNz()!=nz) {
+  //  printf("PROBLEM: %d %d %d -> %d %d %d\n",nx,nz,n,
+  //      cluster->GetNx(),cluster->GetNz(),cluster->GetNPix());
+  //  cluster->Dump();
+  //  }
   //
   if (!fRawData) {
     CheckLabels();
index d453d3d..956440c 100644 (file)
@@ -18,6 +18,7 @@ class AliITSUClusterizer : public TObject
   //
  public:
   enum {kDigitChunkSize=1024, kMaxLabels=20,kMaxLabInCluster=3};
+  enum {kMaskNZ=0xff,kMaskNX=0xff,kMaskNPix=0x1ff,kMaskClUse=0x7f};
   //
   AliITSUClusterizer(Int_t nrowInit=0);
   virtual ~AliITSUClusterizer();