#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.)
{
}
AliITSCorrMapSDD::AliITSCorrMapSDD(Char_t *mapname):
TNamed(mapname,""),
fNAnodePts(fgkNAnodePtsDefault),
fNDriftPts(fgkNDriftPtsDefault),
fXt1(0.),
fXt2(0.),
fXm1(0.),
fXm2(0.),
fDrLen(0.)
{
}
void AliITSCorrMapSDD::ComputeGridPoints(Float_t z, Float_t x, AliITSsegmentationSDD *seg, Bool_t isReco){
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){
ComputeGridPoints(z,x,seg,kTRUE);
Float_t m=(fXt2-fXt1)/(fXm2-fXm1);
Float_t q=fXt1-m*fXm1;
Float_t xcorr=m*fDrLen+q;
return GetInversionBit() ? fDrLen-xcorr : xcorr-fDrLen;
}
Float_t AliITSCorrMapSDD::GetShiftForSimulation(Float_t z, Float_t x, AliITSsegmentationSDD *seg){
ComputeGridPoints(z,x,seg,kFALSE);
Float_t m=(fXm2-fXm1)/(fXt2-fXt1);
Float_t q=fXm1-m*fXt1;
Float_t xshifted=m*fDrLen+q;
return GetInversionBit() ? xshifted-fDrLen : fDrLen-xshifted;
}
TH2F* AliITSCorrMapSDD::GetMapHisto() const{
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{
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{
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;
}