ROOT logo
/**************************************************************************
 * Copyright(c) 2007-2009, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/* $Id$ */

///////////////////////////////////////////////////////////////////
//                                                               //
// Implementation of the base class for SDD map corrections      //
// Origin: F.Prino, Torino, prino@to.infn.it                     //
//                                                               //
///////////////////////////////////////////////////////////////////

#include "TH1F.h"
#include "TH2F.h"
#include "AliITSCorrMapSDD.h"
#include "AliITSsegmentationSDD.h"

const Int_t AliITSCorrMapSDD::fgkNAnodePtsDefault = 1;
const Int_t AliITSCorrMapSDD::fgkNDriftPtsDefault = 72;

ClassImp(AliITSCorrMapSDD)
//______________________________________________________________________
AliITSCorrMapSDD::AliITSCorrMapSDD():TNamed("defaultmap",""),
  fNAnodePts(fgkNAnodePtsDefault),
  fNDriftPts(fgkNDriftPtsDefault),
  fXt1(0.),
  fXt2(0.),
  fXm1(0.),
  fXm2(0.),
  fDrLen(0.)
{
  // default constructor  
}
//______________________________________________________________________
AliITSCorrMapSDD::AliITSCorrMapSDD(Char_t *mapname):
  TNamed(mapname,""),
  fNAnodePts(fgkNAnodePtsDefault),
  fNDriftPts(fgkNDriftPtsDefault),
  fXt1(0.),
  fXt2(0.),
  fXm1(0.),
  fXm2(0.),
  fDrLen(0.)
{
  // standard constructor
}
//______________________________________________________________________
void AliITSCorrMapSDD::ComputeGridPoints(Float_t z, Float_t x, AliITSsegmentationSDD *seg, Bool_t isReco){
  // extracts points from the discrete grid with the correction map

  const Double_t kMicronTocm = 1.0e-4; 
  Int_t nAnodes=seg->Npz();
  Int_t nAnodesHybrid=seg->NpzHalf();
  Int_t bina =(Int_t) seg->GetAnodeFromLocal(x,z);
  if(bina>nAnodes)  AliError("Wrong anode anumber!");
  if(bina>=nAnodesHybrid) bina-=nAnodesHybrid;
  Float_t stept = seg->Dx()*kMicronTocm/(Float_t)fNDriftPts;
  fDrLen= seg->Dx()*kMicronTocm-TMath::Abs(x);
  if(fDrLen<0) fDrLen=0;
  Int_t bint = TMath::Abs((Int_t)(fDrLen/stept));
  if(bint==fNDriftPts) bint-=1;
  if(bint>=fNDriftPts){
    AliError("Wrong bin number along drift direction!");
    bint=fNDriftPts-1;
  }
  fXt1=stept*bint;
  fXm1=fXt1-GetCellContent(bina,bint)*kMicronTocm;
  if((bint+1)<fNDriftPts){
    fXt2=stept*(bint+1);
    fXm2=fXt2-GetCellContent(bina,bint+1)*kMicronTocm;
  }else{
    fXt2=stept*(bint-1);
    fXm2=fXt2-GetCellContent(bina,bint-1)*kMicronTocm;
  }
  if(isReco){
    if(fXm1<fDrLen && fXm2>fDrLen) return;
    if(bint==0 || bint==(fNDriftPts-1)) return;
    if(fXm1>fDrLen){
      for(Int_t itry=1; itry<=10; itry++){
	Float_t xmtest=(bint-itry)*stept-GetCellContent(bina,bint-itry)*kMicronTocm;
	if(xmtest<fDrLen){
	  fXt1=stept*(bint-itry);
	  fXt2=fXt1+stept;
	  fXm1=fXt1-GetCellContent(bina,bint-itry)*kMicronTocm;
	  fXm2=fXt2-GetCellContent(bina,bint+1-itry)*kMicronTocm;
	  return;
	}
      }
    }
    if(fXm2<fDrLen){
      for(Int_t itry=1; itry<=10; itry++){
	Float_t xmtest=(bint+1+itry)*stept-GetCellContent(bina,bint+1+itry)*kMicronTocm;
	if(xmtest>fDrLen){
	  fXt1=stept*(bint+itry);
	  fXt2=fXt1+stept;
	  fXm1=fXt1-GetCellContent(bina,bint+itry)*kMicronTocm;
	  fXm2=fXt2-GetCellContent(bina,bint+1+itry)*kMicronTocm;
	  return;
	}
      }
    }
  }
}
//______________________________________________________________________
Float_t AliITSCorrMapSDD::GetCorrection(Float_t z, Float_t x, AliITSsegmentationSDD *seg){
  // returns correction in cm starting from local coordinates on the module
  ComputeGridPoints(z,x,seg,kTRUE);
  Float_t m=(fXt2-fXt1)/(fXm2-fXm1);
  Float_t q=fXt1-m*fXm1;
  Float_t xcorr=m*fDrLen+q;
  // fDrLen is the measured drift distance, xcorr is the corresponding true
  return GetInversionBit() ? fDrLen-xcorr : xcorr-fDrLen; 
}
//______________________________________________________________________
Float_t AliITSCorrMapSDD::GetShiftForSimulation(Float_t z, Float_t x, AliITSsegmentationSDD *seg){
  // returns shift to be appiled in digitizarion (in cm) starting from local coordinates on the module
  ComputeGridPoints(z,x,seg,kFALSE);
  Float_t m=(fXm2-fXm1)/(fXt2-fXt1);
  Float_t q=fXm1-m*fXt1;
  Float_t xshifted=m*fDrLen+q;
  // fDrLen is the true drift distance, xshifted is the one with map shift
  return GetInversionBit() ? xshifted-fDrLen : fDrLen-xshifted;
}
//______________________________________________________________________
TH2F* AliITSCorrMapSDD::GetMapHisto() const{
  // Returns a TH2F histogram with map of residuals
  TString hname;
  hname.Form("h%s",GetName());
  TH2F* hmap=new TH2F(hname.Data(),"",fNAnodePts,-0.5,255.5,fNDriftPts,0.,35.);
  for(Int_t iAn=0;iAn<fNAnodePts; iAn++){
    for(Int_t iDr=0;iDr<fNDriftPts; iDr++){
      hmap->SetBinContent(iAn+1,iDr+1,GetCellContent(iAn,iDr));
    }
  }
  return hmap;
}
//______________________________________________________________________
TH1F* AliITSCorrMapSDD::GetMapProfile() const{
  // Returns a TH1F with the projection of the map along drift coordinate
  TString hname;
  hname.Form("p%s",GetName());
  TH1F* hprof=new TH1F(hname.Data(),"",fNDriftPts,0.,35.);
  for(Int_t iDr=0;iDr<fNDriftPts; iDr++){
    Float_t meanval=0.;
    for(Int_t iAn=0;iAn<fNAnodePts; iAn++){
      meanval+=GetCellContent(iAn,iDr);
    }
    hprof->SetBinContent(iDr+1,meanval/fNAnodePts);
  }
  return hprof;
  
}
//______________________________________________________________________
TH1F* AliITSCorrMapSDD::GetResidualDistr(Float_t dmin, Float_t dmax) const{
  // Returns a TH1F histogram with distribution of residual
  TString hname;
  hname.Form("hd%s",GetName());
  TH1F* hd=new TH1F(hname.Data(),"",100,dmin,dmax);
  for(Int_t iAn=0;iAn<fNAnodePts; iAn++){
    for(Int_t iDr=0;iDr<fNDriftPts; iDr++){
      hd->Fill(GetCellContent(iAn,iDr));
    }
  }
  return hd;
}

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