ROOT logo
#ifndef ALITRDCLUSTER_H
#define ALITRDCLUSTER_H
/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

/* $Id$ */

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//  TRD cluster                                                              //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

#include "AliCluster.h"

class AliTRDtrackletWord;

class AliTRDcluster : public AliCluster {
  friend class AliHLTTRDCluster;
  friend class AliTRDtrackletOflHelper;

public:
  enum ETRDclusterStatus { 
    kInChamber = BIT(16) // Out of fiducial volume of chamber (signal tails)
   ,kFivePad   = BIT(17) // Deconvoluted clusters
   ,kLUT       = BIT(18)
   ,kGAUS      = BIT(19)
   ,kCOG       = BIT(20)
   ,kXcorr     = BIT(21)  // steer efficient vd corrections
   ,kRawSignals= BIT(22)  // toggle raw digits storage
  };
  enum ETRDclusterMask { 
    kMaskedLeft   = 0
   ,kMaskedCenter = 1
   ,kMaskedRight  = 2
  };

  AliTRDcluster();
  AliTRDcluster(Int_t det, UChar_t col, UChar_t row, UChar_t time, const Short_t *sig, UShort_t volid);
  AliTRDcluster(Int_t det, Float_t q, const Float_t *pos, const Float_t *sig
	      , const Int_t *tracks, Char_t npads, Short_t * const signals
	      , UChar_t col, UChar_t row, UChar_t time
	      , Char_t timebin, Float_t center, UShort_t volid);
  AliTRDcluster(const AliTRDtrackletWord *const tracklet, Int_t det, UShort_t volid);
  AliTRDcluster(const AliTRDcluster &c);
  virtual ~AliTRDcluster() {};
  AliTRDcluster    &operator=(const AliTRDcluster &c);

  virtual void      AddTrackIndex(const Int_t * const i); 
          void      Clear(Option_t *o="");
  
          Bool_t    IsEqual(const TObject *otherCluster) const;
          Bool_t    IsInChamber() const             { return TestBit(kInChamber);  }
          Bool_t    IsMasked() const                { return fClusterMasking ? kTRUE : kFALSE; }
          Bool_t    IsShared() const                { return IsClusterShared();    }
          Bool_t    IsUsed() const                  { return IsClusterUsed();      }
          Bool_t    IsFivePad() const               { return TestBit(kFivePad);    }
  inline  Bool_t    IsRPhiMethod(ETRDclusterStatus m) const;
  inline  Bool_t    IsMCcluster() const;
          Bool_t    HasXcorr() const                { return TestBit(kXcorr);      }
          Bool_t    HasRawSignals() const           { return TestBit(kRawSignals); }

          UChar_t   GetPadMaskedPosition() const    { return fClusterMasking & 7;  }
          UChar_t   GetPadMaskedStatus() const      { return fClusterMasking >> 3; }
          Int_t     GetDetector() const             { return fDetector;            }
          Int_t     GetLocalTimeBin() const         { return fLocalTimeBin;        }
          Float_t   GetQ() const                    { return fQ;                   }
          Short_t   GetRawQ() const                 { return TestBit(kRawSignals)?(Short_t)GetSumS():0;}
          Int_t     GetNPads() const                { return fNPads;               }
          Float_t   GetCenter() const               { return fCenter;              }
          Int_t     GetPadCol() const               { return fPadCol;              }
          Int_t     GetPadRow() const               { return fPadRow;              }
          Int_t     GetPadTime() const              { return fPadTime;             }
          Short_t  *GetSignals()                    { return fSignals;             }
          Float_t   GetSumS() const;

  static  Double_t  GetSX(Int_t tb, Double_t z=-1);
  static  Double_t  GetSYdrift(Int_t tb, Int_t ly=0, Double_t z=-1);
  static  Double_t  GetSYcharge(Float_t q);
  static  Double_t  GetSYprf(Int_t ly, Double_t center, Double_t s2);
  static  Double_t  GetXcorr(Int_t tb, Double_t z=-1);
  static  Double_t  GetYcorr(Int_t ly, Float_t y);
          Float_t   GetXloc(Double_t t0, Double_t vd
                          , const Double_t *const q = 0x0
                          , const Double_t *const xq = 0x0
                          , Double_t z = 0.2);
          Float_t   GetYloc(Double_t y0, Double_t s2, Double_t W, Double_t *const y1=0x0, Double_t *const y2=0x0);

  void        Print(Option_t* o="") const;

  void        SetLocalTimeBin(Char_t t)                   { fLocalTimeBin   = t;                }
  void        SetNPads(Int_t n)                           { fNPads          = n;                }
  void        SetPadCol(UChar_t inPadCol)                 { fPadCol         = inPadCol;         }
  void        SetPadRow(UChar_t inPadRow)                 { fPadRow         = inPadRow;         }
  void        SetPadTime(UChar_t inPadTime)               { fPadTime        = inPadTime;        }
  void        SetDetector(Short_t inDetector)             { fDetector       = inDetector;       }
  void        SetQ(Float_t inQ)                           { fQ              = inQ;              }
  void        SetClusterMasking(UChar_t inClusterMasking) { fClusterMasking = inClusterMasking; }
  void        SetShared(Bool_t sh  = kTRUE)               { SetBit(AliCluster::kShared,sh);     }
  void        SetFivePad(Bool_t b = kTRUE)                { SetBit(kFivePad,b);                 }
  void        SetInChamber(Bool_t in = kTRUE)             { SetBit(kInChamber,in);              }
  void        SetPadMaskedPosition(UChar_t position);
  void        SetPadMaskedStatus(UChar_t status);
  void        SetSigmaY2(Float_t s2, Float_t dt, Float_t exb, Float_t x0, Float_t z=-1., Float_t tgp=0.);
  void        SetSignals(Short_t sig[7], Bool_t raw=kTRUE){ memcpy(fSignals, sig, 7*sizeof(Short_t)); SetBit(kRawSignals, raw);}
  inline void SetRPhiMethod(ETRDclusterStatus m);
  void        SetXcorr(Bool_t xc = kTRUE)                 { SetBit(kXcorr,xc);                  }

  void        Use(Int_t u = 1)                            { SetBit(AliCluster::kUsed, u ? kTRUE : kFALSE); }

protected:

  UChar_t fPadCol;         //  Central pad number in column direction
  UChar_t fPadRow;         //  Central pad number in row direction
  UChar_t fPadTime;        //  Uncalibrated time bin number
  Char_t  fLocalTimeBin;   //  T0-calibrated time bin number
  UChar_t fNPads;          //  Number of pads in cluster
  UChar_t fClusterMasking; //  Bit field containing cluster status information;
  Short_t fDetector;       //  TRD detector number
  Short_t fSignals[7];     //  Raw signals if HasRawSignals() returns true. Otherwise calibrated.
  Float_t fQ;              //  Calibrated cluster charge
  Float_t fCenter;         //  Center of the cluster relative to the pad 

private:

         Float_t   GetDYcog(const Double_t *const y1=0x0, const Double_t *const y2=0x0);
         Float_t   GetDYlut(const Double_t *const y1=0x0, const Double_t *const y2=0x0);
         Float_t   GetDYgauss(Double_t sw, Double_t *const y1=0x0, Double_t *const y2=0x0);
  static void      FillLUT();

  static const Int_t   fgkNlut;              //!  Number of bins of the LUT
  static Double_t     *fgLUT;                //! The lookup table

  ClassDef(AliTRDcluster, 7)                 //  Cluster for the TRD

};

//________________________________________________
inline  Bool_t AliTRDcluster::IsMCcluster() const
{
  if( GetLabel(0) == fPadRow &&
      GetLabel(1) == fPadCol &&
      GetLabel(2) == fPadTime) return kFALSE;
  return kTRUE;
}

//________________________________________________
inline Bool_t AliTRDcluster::IsRPhiMethod(ETRDclusterStatus m) const
{
  if(m==kLUT && TestBit(kLUT)) return kTRUE;
  else if(m==kGAUS && TestBit(kGAUS)) return kTRUE;
  else if(m==kCOG && (!TestBit(kLUT)&&!TestBit(kGAUS))) return kTRUE;

  return kFALSE;
}

//________________________________________________
inline void AliTRDcluster::SetRPhiMethod(ETRDclusterStatus m)
{
  SetBit(kCOG,0);SetBit(kLUT,0);SetBit(kGAUS,0);
  switch(m){
  case kCOG: SetBit(kCOG); break;
  case kLUT: SetBit(kLUT); break;
  case kGAUS: SetBit(kGAUS); break;
  default: SetBit(kLUT); break;
  }
}

#endif
 AliTRDcluster.h:1
 AliTRDcluster.h:2
 AliTRDcluster.h:3
 AliTRDcluster.h:4
 AliTRDcluster.h:5
 AliTRDcluster.h:6
 AliTRDcluster.h:7
 AliTRDcluster.h:8
 AliTRDcluster.h:9
 AliTRDcluster.h:10
 AliTRDcluster.h:11
 AliTRDcluster.h:12
 AliTRDcluster.h:13
 AliTRDcluster.h:14
 AliTRDcluster.h:15
 AliTRDcluster.h:16
 AliTRDcluster.h:17
 AliTRDcluster.h:18
 AliTRDcluster.h:19
 AliTRDcluster.h:20
 AliTRDcluster.h:21
 AliTRDcluster.h:22
 AliTRDcluster.h:23
 AliTRDcluster.h:24
 AliTRDcluster.h:25
 AliTRDcluster.h:26
 AliTRDcluster.h:27
 AliTRDcluster.h:28
 AliTRDcluster.h:29
 AliTRDcluster.h:30
 AliTRDcluster.h:31
 AliTRDcluster.h:32
 AliTRDcluster.h:33
 AliTRDcluster.h:34
 AliTRDcluster.h:35
 AliTRDcluster.h:36
 AliTRDcluster.h:37
 AliTRDcluster.h:38
 AliTRDcluster.h:39
 AliTRDcluster.h:40
 AliTRDcluster.h:41
 AliTRDcluster.h:42
 AliTRDcluster.h:43
 AliTRDcluster.h:44
 AliTRDcluster.h:45
 AliTRDcluster.h:46
 AliTRDcluster.h:47
 AliTRDcluster.h:48
 AliTRDcluster.h:49
 AliTRDcluster.h:50
 AliTRDcluster.h:51
 AliTRDcluster.h:52
 AliTRDcluster.h:53
 AliTRDcluster.h:54
 AliTRDcluster.h:55
 AliTRDcluster.h:56
 AliTRDcluster.h:57
 AliTRDcluster.h:58
 AliTRDcluster.h:59
 AliTRDcluster.h:60
 AliTRDcluster.h:61
 AliTRDcluster.h:62
 AliTRDcluster.h:63
 AliTRDcluster.h:64
 AliTRDcluster.h:65
 AliTRDcluster.h:66
 AliTRDcluster.h:67
 AliTRDcluster.h:68
 AliTRDcluster.h:69
 AliTRDcluster.h:70
 AliTRDcluster.h:71
 AliTRDcluster.h:72
 AliTRDcluster.h:73
 AliTRDcluster.h:74
 AliTRDcluster.h:75
 AliTRDcluster.h:76
 AliTRDcluster.h:77
 AliTRDcluster.h:78
 AliTRDcluster.h:79
 AliTRDcluster.h:80
 AliTRDcluster.h:81
 AliTRDcluster.h:82
 AliTRDcluster.h:83
 AliTRDcluster.h:84
 AliTRDcluster.h:85
 AliTRDcluster.h:86
 AliTRDcluster.h:87
 AliTRDcluster.h:88
 AliTRDcluster.h:89
 AliTRDcluster.h:90
 AliTRDcluster.h:91
 AliTRDcluster.h:92
 AliTRDcluster.h:93
 AliTRDcluster.h:94
 AliTRDcluster.h:95
 AliTRDcluster.h:96
 AliTRDcluster.h:97
 AliTRDcluster.h:98
 AliTRDcluster.h:99
 AliTRDcluster.h:100
 AliTRDcluster.h:101
 AliTRDcluster.h:102
 AliTRDcluster.h:103
 AliTRDcluster.h:104
 AliTRDcluster.h:105
 AliTRDcluster.h:106
 AliTRDcluster.h:107
 AliTRDcluster.h:108
 AliTRDcluster.h:109
 AliTRDcluster.h:110
 AliTRDcluster.h:111
 AliTRDcluster.h:112
 AliTRDcluster.h:113
 AliTRDcluster.h:114
 AliTRDcluster.h:115
 AliTRDcluster.h:116
 AliTRDcluster.h:117
 AliTRDcluster.h:118
 AliTRDcluster.h:119
 AliTRDcluster.h:120
 AliTRDcluster.h:121
 AliTRDcluster.h:122
 AliTRDcluster.h:123
 AliTRDcluster.h:124
 AliTRDcluster.h:125
 AliTRDcluster.h:126
 AliTRDcluster.h:127
 AliTRDcluster.h:128
 AliTRDcluster.h:129
 AliTRDcluster.h:130
 AliTRDcluster.h:131
 AliTRDcluster.h:132
 AliTRDcluster.h:133
 AliTRDcluster.h:134
 AliTRDcluster.h:135
 AliTRDcluster.h:136
 AliTRDcluster.h:137
 AliTRDcluster.h:138
 AliTRDcluster.h:139
 AliTRDcluster.h:140
 AliTRDcluster.h:141
 AliTRDcluster.h:142
 AliTRDcluster.h:143
 AliTRDcluster.h:144
 AliTRDcluster.h:145
 AliTRDcluster.h:146
 AliTRDcluster.h:147
 AliTRDcluster.h:148
 AliTRDcluster.h:149
 AliTRDcluster.h:150
 AliTRDcluster.h:151
 AliTRDcluster.h:152
 AliTRDcluster.h:153
 AliTRDcluster.h:154
 AliTRDcluster.h:155
 AliTRDcluster.h:156
 AliTRDcluster.h:157
 AliTRDcluster.h:158
 AliTRDcluster.h:159
 AliTRDcluster.h:160
 AliTRDcluster.h:161
 AliTRDcluster.h:162
 AliTRDcluster.h:163
 AliTRDcluster.h:164
 AliTRDcluster.h:165
 AliTRDcluster.h:166
 AliTRDcluster.h:167
 AliTRDcluster.h:168
 AliTRDcluster.h:169