ROOT logo
#ifndef ALIITSUAUX
#define ALIITSUAUX

#include <TObject.h>
#include <TMath.h>

///////////////////////////////////////////////////////////////////////
//                                                                   //
//  Namespace AliITSUAux                                             //
//  Set of utilities for the ITSU classes                            //
//                                                                   //
///////////////////////////////////////////////////////////////////////

#define _ITSU_TUNING_MODE_
//#define _ITSU_DEBUG_

class AliITSUGeomTGeo;
class AliITSsegmentation;
using namespace TMath;



namespace AliITSUAux {
  template<typename F>
  void   BringTo02Pi(F &phi);
  Bool_t OKforPhiMin(double phiMin,double phi);
  Bool_t OKforPhiMax(double phiMax,double phi);
  Double_t MeanPhiSmall(double phi0, double phi1);
  Double_t DeltaPhiSmall(double phi0, double phi1);
  UInt_t PackCluster(Int_t lr, Int_t clID);
  Int_t  UnpackCluster(UInt_t p, Int_t &lr);
  Int_t  UnpackLayer(UInt_t p);
  Int_t  UnpackCluster(UInt_t p);
  Bool_t IsCluster(UInt_t p);
  Int_t  NumberOfBitsSet(UInt_t x);
  void   PrintBits(ULong64_t patt, Int_t maxBits);
  //
  const Double_t kNominalBz = 5.01;           // nominal field
  const Double_t kPionMass  = 1.3957e-01;
  const UInt_t   kLrBitLow  = 28;             // layer mask lowest bit
  const UInt_t   kLrMask    = 0xf0000000;     // layer mask
  const UInt_t   kClMask    = 0x0fffffff;     // cluster mask
  const UInt_t   kMaxLayers = 15;             // max number of active layers
  const UInt_t   kMaxLrMask = 0x7fff;         // bitmask for allowed layers
}

//_________________________________________________________________________________
template<typename F>
inline void AliITSUAux::BringTo02Pi(F &phi) {
  // bring phi to 0-2pi range
  if (phi<0) phi+=TwoPi(); else if (phi>TwoPi()) phi-=TwoPi();
}

//_________________________________________________________________________________
inline Bool_t AliITSUAux::OKforPhiMin(double phiMin,double phi) {
  // check if phi is above the phiMin, phi's must be in 0-2pi range
  double dphi = phi-phiMin;
  return ((dphi>0 && dphi<Pi()) || dphi<-Pi()) ? kTRUE:kFALSE;
}

//_________________________________________________________________________________
inline Bool_t AliITSUAux::OKforPhiMax(double phiMax,double phi) {
  // check if phi is below the phiMax, phi's must be in 0-2pi range
  double dphi = phi-phiMax;
  return ((dphi<0 && dphi>-Pi()) || dphi>Pi()) ? kTRUE:kFALSE;
}

//_________________________________________________________________________________
inline UInt_t AliITSUAux::PackCluster(Int_t lr, Int_t clID) {
  // pack layer/cluster into single uint
  UInt_t p = (clID<0 ? 0 : clID+1) + (lr<<=kLrBitLow);
  return p;
}

//_________________________________________________________________________________
inline Int_t AliITSUAux::UnpackCluster(UInt_t p, Int_t &lr) {
  // unpack layer/cluster
  lr = (p&kLrMask)>>kLrBitLow;
  p &= kClMask;
  return int(p)-1;
}

//_________________________________________________________________________________
inline Int_t AliITSUAux::UnpackLayer(UInt_t p) {
  // unpack layer
  return (p&kLrMask)>>kLrBitLow;
}

//_________________________________________________________________________________
inline Int_t AliITSUAux::UnpackCluster(UInt_t p) {
  // unpack cluster
  return int(p&kClMask)-1;
}

//_________________________________________________________________________________
inline Bool_t AliITSUAux::IsCluster(UInt_t p) {
  // does it correspond to cluster?
  return (p&kClMask);
}

//_________________________________________________________________________________
inline Int_t AliITSUAux::NumberOfBitsSet(UInt_t x) {
  // count number of non-0 bits in 32bit word
  x = x - ((x >> 1) & 0x55555555);
  x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
  return (((x + (x >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
}

//_________________________________________________________________________________
inline Double_t AliITSUAux::MeanPhiSmall(double phi0, double phi1) {
  // return mean phi, assume phis in 0:2pi
  double phi;
  if (!OKforPhiMin(phi0,phi1)) {phi=phi0; phi0=phi1; phi1=phi;}
  if (phi0>phi1) phi = (phi1 - (TwoPi()-phi0))/2; // wrap
  else           phi = (phi0+phi1)/2;
  BringTo02Pi(phi);
  return phi;
}

//_________________________________________________________________________________
inline Double_t AliITSUAux::DeltaPhiSmall(double phi0, double phi1) {
  // return delta phi, assume phis in 0:2pi
  double del;
  if (!OKforPhiMin(phi0,phi1)) {del=phi0; phi0=phi1; phi1=del;}
  del = phi1 - phi0;
  if (del<0) del += TwoPi();
  return del;
}


#endif
 AliITSUAux.h:1
 AliITSUAux.h:2
 AliITSUAux.h:3
 AliITSUAux.h:4
 AliITSUAux.h:5
 AliITSUAux.h:6
 AliITSUAux.h:7
 AliITSUAux.h:8
 AliITSUAux.h:9
 AliITSUAux.h:10
 AliITSUAux.h:11
 AliITSUAux.h:12
 AliITSUAux.h:13
 AliITSUAux.h:14
 AliITSUAux.h:15
 AliITSUAux.h:16
 AliITSUAux.h:17
 AliITSUAux.h:18
 AliITSUAux.h:19
 AliITSUAux.h:20
 AliITSUAux.h:21
 AliITSUAux.h:22
 AliITSUAux.h:23
 AliITSUAux.h:24
 AliITSUAux.h:25
 AliITSUAux.h:26
 AliITSUAux.h:27
 AliITSUAux.h:28
 AliITSUAux.h:29
 AliITSUAux.h:30
 AliITSUAux.h:31
 AliITSUAux.h:32
 AliITSUAux.h:33
 AliITSUAux.h:34
 AliITSUAux.h:35
 AliITSUAux.h:36
 AliITSUAux.h:37
 AliITSUAux.h:38
 AliITSUAux.h:39
 AliITSUAux.h:40
 AliITSUAux.h:41
 AliITSUAux.h:42
 AliITSUAux.h:43
 AliITSUAux.h:44
 AliITSUAux.h:45
 AliITSUAux.h:46
 AliITSUAux.h:47
 AliITSUAux.h:48
 AliITSUAux.h:49
 AliITSUAux.h:50
 AliITSUAux.h:51
 AliITSUAux.h:52
 AliITSUAux.h:53
 AliITSUAux.h:54
 AliITSUAux.h:55
 AliITSUAux.h:56
 AliITSUAux.h:57
 AliITSUAux.h:58
 AliITSUAux.h:59
 AliITSUAux.h:60
 AliITSUAux.h:61
 AliITSUAux.h:62
 AliITSUAux.h:63
 AliITSUAux.h:64
 AliITSUAux.h:65
 AliITSUAux.h:66
 AliITSUAux.h:67
 AliITSUAux.h:68
 AliITSUAux.h:69
 AliITSUAux.h:70
 AliITSUAux.h:71
 AliITSUAux.h:72
 AliITSUAux.h:73
 AliITSUAux.h:74
 AliITSUAux.h:75
 AliITSUAux.h:76
 AliITSUAux.h:77
 AliITSUAux.h:78
 AliITSUAux.h:79
 AliITSUAux.h:80
 AliITSUAux.h:81
 AliITSUAux.h:82
 AliITSUAux.h:83
 AliITSUAux.h:84
 AliITSUAux.h:85
 AliITSUAux.h:86
 AliITSUAux.h:87
 AliITSUAux.h:88
 AliITSUAux.h:89
 AliITSUAux.h:90
 AliITSUAux.h:91
 AliITSUAux.h:92
 AliITSUAux.h:93
 AliITSUAux.h:94
 AliITSUAux.h:95
 AliITSUAux.h:96
 AliITSUAux.h:97
 AliITSUAux.h:98
 AliITSUAux.h:99
 AliITSUAux.h:100
 AliITSUAux.h:101
 AliITSUAux.h:102
 AliITSUAux.h:103
 AliITSUAux.h:104
 AliITSUAux.h:105
 AliITSUAux.h:106
 AliITSUAux.h:107
 AliITSUAux.h:108
 AliITSUAux.h:109
 AliITSUAux.h:110
 AliITSUAux.h:111
 AliITSUAux.h:112
 AliITSUAux.h:113
 AliITSUAux.h:114
 AliITSUAux.h:115
 AliITSUAux.h:116
 AliITSUAux.h:117
 AliITSUAux.h:118
 AliITSUAux.h:119
 AliITSUAux.h:120
 AliITSUAux.h:121
 AliITSUAux.h:122
 AliITSUAux.h:123
 AliITSUAux.h:124
 AliITSUAux.h:125
 AliITSUAux.h:126
 AliITSUAux.h:127
 AliITSUAux.h:128
 AliITSUAux.h:129
 AliITSUAux.h:130
 AliITSUAux.h:131