ROOT logo
#include "AliITSUMatLUT.h"
#include "AliLog.h"
#include "AliTrackerBase.h"
#include <TString.h>
#include <TH1.h>
#include <TMath.h>
#include <TRandom.h>


//___________________________________________________________
AliITSUMatLUT::AliITSUMatLUT() 
  :fRMin(0)
  ,fRMax(0)
  ,fDRInv(-1)
  ,fDR(0)
  ,fNBins(0) 
{
  // def c-tor
  for (int i=kNParTypes;i--;) fData[i]=0;
}

//___________________________________________________________
AliITSUMatLUT::~AliITSUMatLUT() 
{
  // d-tor
  for (int i=kNParTypes;i--;) delete fData[i];
}

//___________________________________________________________
AliITSUMatLUT::AliITSUMatLUT(Double_t rmin,Double_t rmax,Int_t nbin)
  :fRMin(rmin)
  ,fRMax(rmax)
  ,fDRInv(0)
  ,fDR(0)
  ,fNBins(nbin)
{
  //
  if (rmin<0 || rmax-rmin<1e-4 || nbin<1) AliFatal(Form("Illegal parameters Rmin:%f Rmax:%f Nbins:%d",rmin,rmax,nbin));
  fDRInv = fNBins/(fRMax-fRMin);
  fDR    = (fRMax-fRMin)/fNBins;
  for (int i=kNParTypes;i--;) {
    fData[i] = new Double_t[fNBins];
    memset(fData[i],0,fNBins*sizeof(Double_t));
  }
  //
}

//___________________________________________________________
AliITSUMatLUT::AliITSUMatLUT(const AliITSUMatLUT& src)
  :TObject(src)
  ,fRMin(src.fRMin)
  ,fRMax(src.fRMax)
  ,fDRInv(src.fDRInv)
  ,fDR(src.fDR)
  ,fNBins(src.fNBins)
{
  //
  for (int i=kNParTypes;i--;) {
    if (src.fData[i]) {
      fData[i] = new Double_t[fNBins];
      memcpy(fData[i],src.fData[i],fNBins*sizeof(Double_t));
    }
  }
  //
}

//___________________________________________________________
AliITSUMatLUT & AliITSUMatLUT::operator=(const AliITSUMatLUT& src)
{
  // copy 
  if (this == &src) return *this;
  this->~AliITSUMatLUT();
  new(this) AliITSUMatLUT(src);
  return *this;
  //  
}

//___________________________________________________________
void AliITSUMatLUT::FillData(Int_t ntest, Double_t zmin,Double_t zmax)
{
  // filla material data 
  double start[3],stop[3],parStep[7];
  if (fNBins<1) AliFatal("Limits are not set");
  if (ntest<1 || zmin>zmax) AliFatal(Form("Wrong parameters Ntest:%d Zmin:%f Zmax:%f",ntest,zmin,zmax));
  double dr = (fRMax-fRMin)/fNBins;
  AliInfo(Form("Building material table for %.3f<R<%.3f %.3f<Z<%.3f in %d bins using %d tracks",fRMin,fRMax,zmin,zmax,fNBins,ntest));
  const double kAngEps = 1e-4; // tiny slope to avoid tracks strictly normal to Z axis
  double *tmpAcc = new double[fNBins*kNParTypes];
  for (int itst=ntest;itst--;) {
    double parInt[kNParTypes]={0};
    double r   = fRMin;
    double phi = gRandom->Rndm()*TMath::Pi()*2;
    double cs  = TMath::Cos(phi);
    double sn  = TMath::Sin(phi);
    double angz = 2*(gRandom->Rndm()-0.5)*kAngEps;
    stop[0] = r*cs;
    stop[1] = r*sn;
    stop[2] = zmin + gRandom->Rndm()*(zmax-zmin);
    Bool_t fail = kFALSE;
    for (int ir=0;ir<fNBins;ir++) {
      r += dr;
      for (int i=3;i--;) start[i] = stop[i];
      stop[0] = r*cs;
      stop[1] = r*sn;
      stop[2] += dr*angz; // to avoid tracks normal to axis
      AliTrackerBase::MeanMaterialBudget(start,stop, parStep);
      if (parStep[1]>999) {fail = kTRUE; printf("fail\n"); break;}
      //
      parInt[kParX2X0] += parStep[1];
      parInt[kParRhoL] += parStep[0]*parStep[4];
      //
      for (int ip=kNParTypes;ip--;) tmpAcc[ir*kNParTypes+ip] = parInt[ip];
    }
    if (fail) {itst++; continue;} // propagation failed
    for (int ir=0;ir<fNBins;ir++) for (int ip=kNParTypes;ip--;) fData[ip][ir] += tmpAcc[ir*kNParTypes+ip];
  }
  //
  for (int ip=kNParTypes;ip--;) for (int ir=fNBins;ir--;) fData[ip][ir] /= ntest;
  delete[] tmpAcc;
  //  Print();
  //
}

//___________________________________________________________
void AliITSUMatLUT::Print(Option_t*) const
{
  // print data 
  printf("Average material budget in %d bins for %.4f<R<%.4f\n",fNBins,fRMin,fRMax);
  printf("  # :  rMin : rMax  \t  X2X0  (  incr  )\t  RhoL  (  incr  )\n");
  for (int i=0;i<fNBins;i++) {
    double r = fRMin + fDR*i;
    printf("%4d:%7.3f:%7.3f\t%.6f(%.6f)\t%.6f(%.6f)\n",i,r,r+fDR,
	   fData[kParX2X0][i],fData[kParX2X0][i]-(i==0 ? 0:fData[kParX2X0][i-1]),
	   fData[kParRhoL][i],fData[kParRhoL][i]-(i==0 ? 0:fData[kParRhoL][i-1]));
  }

}

//___________________________________________________________
TH1* AliITSUMatLUT::GetHisto(const Option_t* option, const Char_t *name) const
{
  // extract data to histo
  if (fNBins<1) return 0;
  TString nms = name;
  if (nms.IsNull()) nms = "matLUT";
  TH1F* h = new TH1F(nms.Data(),nms.Data(),fNBins,fRMin,fRMax);
  TString opts = option;
  opts.ToLower();
  Bool_t diff = opts.Contains("d");
  Int_t par = opts.Contains("rhol") ? kParRhoL : kParX2X0;
  double valPrev = 0;
  for (int i=0;i<fNBins;i++) {
    double val = fData[par][i] - valPrev;
    if (diff) valPrev = fData[par][i];
    h->SetBinContent(i+1, val);
  }
  return h;
}

//___________________________________________________________
Double_t AliITSUMatLUT::GetMatBudget(const Double_t *pnt0, const Double_t *pnt1, Double_t *ret) const
{
  // query the mat.budget between 2 points
  double r0 = TMath::Sqrt(pnt0[0]*pnt0[0] + pnt0[1]*pnt0[1]);
  double r1 = TMath::Sqrt(pnt1[0]*pnt1[0] + pnt1[1]*pnt1[1]);
  if (r1<r0) {double t=r1;r1=r0;r0=t;}
  double dr = r1-r0;
  if (dr<1e-4) {
    for (int i=kNParTypes;i--;) ret[i] = 0;
    return 0;
  }
  //
  double di = pnt1[0]-pnt0[0];
  double dst = di*di;
  di = pnt1[1]-pnt0[1];
  dst += di*di;
  di = pnt1[2]-pnt0[2];
  dst += di*di;
  dst = TMath::Sqrt(dst);
  double dstf = dst/dr;
  //
  double par0[kNParTypes],par1[kNParTypes];
  GetData(r0,par0);
  GetData(r1,par1);
  for (int i=kNParTypes;i--;) ret[i] = dstf*(par1[i]-par0[i]);
  return dst;
  //
}

//___________________________________________________________
void AliITSUMatLUT::GetData(Double_t r, Double_t* params) const
{
  // get integrated parameters from rMin to r
  double binF = (r-fRMin)*fDRInv;
  if (binF<0) binF=0;
  else if (binF>=fNBins) binF = fNBins-1;
  int   bin   = int(binF);
  double frac = 1.-(binF-bin);
  for (int i=kNParTypes;i--;) {
    double prev = bin ? fData[i][bin-1] : 0;
    params[i] = fData[i][bin] - frac*(fData[i][bin]-prev);
  }
  //
}
 AliITSUMatLUT.cxx:1
 AliITSUMatLUT.cxx:2
 AliITSUMatLUT.cxx:3
 AliITSUMatLUT.cxx:4
 AliITSUMatLUT.cxx:5
 AliITSUMatLUT.cxx:6
 AliITSUMatLUT.cxx:7
 AliITSUMatLUT.cxx:8
 AliITSUMatLUT.cxx:9
 AliITSUMatLUT.cxx:10
 AliITSUMatLUT.cxx:11
 AliITSUMatLUT.cxx:12
 AliITSUMatLUT.cxx:13
 AliITSUMatLUT.cxx:14
 AliITSUMatLUT.cxx:15
 AliITSUMatLUT.cxx:16
 AliITSUMatLUT.cxx:17
 AliITSUMatLUT.cxx:18
 AliITSUMatLUT.cxx:19
 AliITSUMatLUT.cxx:20
 AliITSUMatLUT.cxx:21
 AliITSUMatLUT.cxx:22
 AliITSUMatLUT.cxx:23
 AliITSUMatLUT.cxx:24
 AliITSUMatLUT.cxx:25
 AliITSUMatLUT.cxx:26
 AliITSUMatLUT.cxx:27
 AliITSUMatLUT.cxx:28
 AliITSUMatLUT.cxx:29
 AliITSUMatLUT.cxx:30
 AliITSUMatLUT.cxx:31
 AliITSUMatLUT.cxx:32
 AliITSUMatLUT.cxx:33
 AliITSUMatLUT.cxx:34
 AliITSUMatLUT.cxx:35
 AliITSUMatLUT.cxx:36
 AliITSUMatLUT.cxx:37
 AliITSUMatLUT.cxx:38
 AliITSUMatLUT.cxx:39
 AliITSUMatLUT.cxx:40
 AliITSUMatLUT.cxx:41
 AliITSUMatLUT.cxx:42
 AliITSUMatLUT.cxx:43
 AliITSUMatLUT.cxx:44
 AliITSUMatLUT.cxx:45
 AliITSUMatLUT.cxx:46
 AliITSUMatLUT.cxx:47
 AliITSUMatLUT.cxx:48
 AliITSUMatLUT.cxx:49
 AliITSUMatLUT.cxx:50
 AliITSUMatLUT.cxx:51
 AliITSUMatLUT.cxx:52
 AliITSUMatLUT.cxx:53
 AliITSUMatLUT.cxx:54
 AliITSUMatLUT.cxx:55
 AliITSUMatLUT.cxx:56
 AliITSUMatLUT.cxx:57
 AliITSUMatLUT.cxx:58
 AliITSUMatLUT.cxx:59
 AliITSUMatLUT.cxx:60
 AliITSUMatLUT.cxx:61
 AliITSUMatLUT.cxx:62
 AliITSUMatLUT.cxx:63
 AliITSUMatLUT.cxx:64
 AliITSUMatLUT.cxx:65
 AliITSUMatLUT.cxx:66
 AliITSUMatLUT.cxx:67
 AliITSUMatLUT.cxx:68
 AliITSUMatLUT.cxx:69
 AliITSUMatLUT.cxx:70
 AliITSUMatLUT.cxx:71
 AliITSUMatLUT.cxx:72
 AliITSUMatLUT.cxx:73
 AliITSUMatLUT.cxx:74
 AliITSUMatLUT.cxx:75
 AliITSUMatLUT.cxx:76
 AliITSUMatLUT.cxx:77
 AliITSUMatLUT.cxx:78
 AliITSUMatLUT.cxx:79
 AliITSUMatLUT.cxx:80
 AliITSUMatLUT.cxx:81
 AliITSUMatLUT.cxx:82
 AliITSUMatLUT.cxx:83
 AliITSUMatLUT.cxx:84
 AliITSUMatLUT.cxx:85
 AliITSUMatLUT.cxx:86
 AliITSUMatLUT.cxx:87
 AliITSUMatLUT.cxx:88
 AliITSUMatLUT.cxx:89
 AliITSUMatLUT.cxx:90
 AliITSUMatLUT.cxx:91
 AliITSUMatLUT.cxx:92
 AliITSUMatLUT.cxx:93
 AliITSUMatLUT.cxx:94
 AliITSUMatLUT.cxx:95
 AliITSUMatLUT.cxx:96
 AliITSUMatLUT.cxx:97
 AliITSUMatLUT.cxx:98
 AliITSUMatLUT.cxx:99
 AliITSUMatLUT.cxx:100
 AliITSUMatLUT.cxx:101
 AliITSUMatLUT.cxx:102
 AliITSUMatLUT.cxx:103
 AliITSUMatLUT.cxx:104
 AliITSUMatLUT.cxx:105
 AliITSUMatLUT.cxx:106
 AliITSUMatLUT.cxx:107
 AliITSUMatLUT.cxx:108
 AliITSUMatLUT.cxx:109
 AliITSUMatLUT.cxx:110
 AliITSUMatLUT.cxx:111
 AliITSUMatLUT.cxx:112
 AliITSUMatLUT.cxx:113
 AliITSUMatLUT.cxx:114
 AliITSUMatLUT.cxx:115
 AliITSUMatLUT.cxx:116
 AliITSUMatLUT.cxx:117
 AliITSUMatLUT.cxx:118
 AliITSUMatLUT.cxx:119
 AliITSUMatLUT.cxx:120
 AliITSUMatLUT.cxx:121
 AliITSUMatLUT.cxx:122
 AliITSUMatLUT.cxx:123
 AliITSUMatLUT.cxx:124
 AliITSUMatLUT.cxx:125
 AliITSUMatLUT.cxx:126
 AliITSUMatLUT.cxx:127
 AliITSUMatLUT.cxx:128
 AliITSUMatLUT.cxx:129
 AliITSUMatLUT.cxx:130
 AliITSUMatLUT.cxx:131
 AliITSUMatLUT.cxx:132
 AliITSUMatLUT.cxx:133
 AliITSUMatLUT.cxx:134
 AliITSUMatLUT.cxx:135
 AliITSUMatLUT.cxx:136
 AliITSUMatLUT.cxx:137
 AliITSUMatLUT.cxx:138
 AliITSUMatLUT.cxx:139
 AliITSUMatLUT.cxx:140
 AliITSUMatLUT.cxx:141
 AliITSUMatLUT.cxx:142
 AliITSUMatLUT.cxx:143
 AliITSUMatLUT.cxx:144
 AliITSUMatLUT.cxx:145
 AliITSUMatLUT.cxx:146
 AliITSUMatLUT.cxx:147
 AliITSUMatLUT.cxx:148
 AliITSUMatLUT.cxx:149
 AliITSUMatLUT.cxx:150
 AliITSUMatLUT.cxx:151
 AliITSUMatLUT.cxx:152
 AliITSUMatLUT.cxx:153
 AliITSUMatLUT.cxx:154
 AliITSUMatLUT.cxx:155
 AliITSUMatLUT.cxx:156
 AliITSUMatLUT.cxx:157
 AliITSUMatLUT.cxx:158
 AliITSUMatLUT.cxx:159
 AliITSUMatLUT.cxx:160
 AliITSUMatLUT.cxx:161
 AliITSUMatLUT.cxx:162
 AliITSUMatLUT.cxx:163
 AliITSUMatLUT.cxx:164
 AliITSUMatLUT.cxx:165
 AliITSUMatLUT.cxx:166
 AliITSUMatLUT.cxx:167
 AliITSUMatLUT.cxx:168
 AliITSUMatLUT.cxx:169
 AliITSUMatLUT.cxx:170
 AliITSUMatLUT.cxx:171
 AliITSUMatLUT.cxx:172
 AliITSUMatLUT.cxx:173
 AliITSUMatLUT.cxx:174
 AliITSUMatLUT.cxx:175
 AliITSUMatLUT.cxx:176
 AliITSUMatLUT.cxx:177
 AliITSUMatLUT.cxx:178
 AliITSUMatLUT.cxx:179
 AliITSUMatLUT.cxx:180
 AliITSUMatLUT.cxx:181
 AliITSUMatLUT.cxx:182
 AliITSUMatLUT.cxx:183
 AliITSUMatLUT.cxx:184
 AliITSUMatLUT.cxx:185
 AliITSUMatLUT.cxx:186
 AliITSUMatLUT.cxx:187
 AliITSUMatLUT.cxx:188
 AliITSUMatLUT.cxx:189
 AliITSUMatLUT.cxx:190
 AliITSUMatLUT.cxx:191
 AliITSUMatLUT.cxx:192
 AliITSUMatLUT.cxx:193
 AliITSUMatLUT.cxx:194
 AliITSUMatLUT.cxx:195
 AliITSUMatLUT.cxx:196
 AliITSUMatLUT.cxx:197
 AliITSUMatLUT.cxx:198
 AliITSUMatLUT.cxx:199
 AliITSUMatLUT.cxx:200
 AliITSUMatLUT.cxx:201
 AliITSUMatLUT.cxx:202
 AliITSUMatLUT.cxx:203
 AliITSUMatLUT.cxx:204