#include "AliITSURecoParam.h"
#include "AliLog.h"
#include "AliITSUTrackCond.h"
ClassImp(AliITSURecoParam)
const Double_t AliITSURecoParam::fgkMaxDforV0dghtrForProlongation = 30;
const Double_t AliITSURecoParam::fgkMaxDForProlongation = 40;
const Double_t AliITSURecoParam::fgkMaxDZForProlongation = 60;
const Double_t AliITSURecoParam::fgkMinPtForProlongation = 0.0;
const Double_t AliITSURecoParam::fgkSigmaRoadY = 20.E-4;
const Double_t AliITSURecoParam::fgkSigmaRoadZ = 20.E-4;
const Double_t AliITSURecoParam::fgkTanLorentzAngle = 0;
const Bool_t AliITSURecoParam::fgkAllowDiagonalClusterization = kFALSE;
const Double_t AliITSURecoParam::fgkTPCITSWallRMin = 50.;
const Double_t AliITSURecoParam::fgkTPCITSWallRMax = 80.;
const Double_t AliITSURecoParam::fgkTPCITSWallZSpanH = 250.;
const Double_t AliITSURecoParam::fgkTPCITSWallMaxStep = 6.;
const Bool_t AliITSURecoParam::fgkUseMatLUT[kNTrackingPhases] = {kFALSE,kFALSE,kFALSE};
AliITSURecoParam::AliITSURecoParam()
: fNLayers(0)
,fMaxDforV0dghtrForProlongation(fgkMaxDforV0dghtrForProlongation)
,fMaxDForProlongation(fgkMaxDForProlongation)
,fMaxDZForProlongation(fgkMaxDZForProlongation)
,fMinPtForProlongation(fgkMinPtForProlongation)
,fTPCITSWallRMin(fgkTPCITSWallRMin)
,fTPCITSWallRMax(fgkTPCITSWallRMax)
,fTPCITSWallZSpanH(fgkTPCITSWallZSpanH)
,fTPCITSWallMaxStep(fgkTPCITSWallMaxStep)
,fAllowDiagonalClusterization(0)
,fTanLorentzAngle(0)
,fSigmaY2(0)
,fSigmaZ2(0)
,fTrackingConditions(0)
,fTracker(0)
,fSAonly(kFALSE)
,fMaxROCycle(126)
{
SetName("ITS");
SetTitle("ITS");
for (int i=kNTrackingPhases;i--;) fUseMatLUT[i] = fgkUseMatLUT[i];
}
AliITSURecoParam::AliITSURecoParam(Int_t nLr)
: fNLayers(0)
,fMaxDforV0dghtrForProlongation(fgkMaxDforV0dghtrForProlongation)
,fMaxDForProlongation(fgkMaxDForProlongation)
,fMaxDZForProlongation(fgkMaxDZForProlongation)
,fMinPtForProlongation(fgkMinPtForProlongation)
,fTPCITSWallRMin(fgkTPCITSWallRMin)
,fTPCITSWallRMax(fgkTPCITSWallRMax)
,fTPCITSWallZSpanH(fgkTPCITSWallZSpanH)
,fTPCITSWallMaxStep(fgkTPCITSWallMaxStep)
,fAllowDiagonalClusterization(0)
,fTanLorentzAngle(0)
,fSigmaY2(0)
,fSigmaZ2(0)
,fTrackingConditions(0)
,fTracker(0)
,fSAonly(kFALSE)
,fMaxROCycle(126)
{
SetName("ITS");
SetTitle("ITS");
SetNLayers(nLr);
}
AliITSURecoParam::~AliITSURecoParam()
{
delete[] fTanLorentzAngle;
delete[] fSigmaY2;
delete[] fSigmaZ2;
delete[] fAllowDiagonalClusterization;
fTrackingConditions.Delete();
}
AliITSURecoParam *AliITSURecoParam::GetHighFluxParam()
{
enum {
kBit0=0x1<<0, kBit1=0x1<<1, kBit2=0x1<<2, kBit3=0x1<<3,
kBit4=0x1<<4, kBit5=0x1<<5, kBit6=0x1<<6, kBit7=0x7<<2, kBit8=0x1<<8
};
const Bool_t kAllowDiagCl = kFALSE;
const Bool_t kUseLUT[3]={kTRUE,kTRUE,kFALSE};
Int_t nLr=7;
AliITSURecoParam * itsRecoParam = new AliITSURecoParam();
itsRecoParam->SetNLayers(nLr);
itsRecoParam->SetEventSpecie(AliRecoParam::kHighMult);
itsRecoParam->SetTitle("HighMult");
for (int i=0; i<nLr; i++)
itsRecoParam->SetAllowDiagonalClusterization(i,kAllowDiagCl);
for (int i=AliITSURecoParam::kNTrackingPhases; i--;)
itsRecoParam->SetUseMatLUT(i,kUseLUT[i]);
AliITSUTrackCond *trCond=0;
{
int c0nBranch[7] = {3,9,15,4,5,7,10};
int c0nCands[7] = {10,15,45,20,60,20,10};
float c0tr2clChi2[7] ={20,25,30,40,45,45,70};
float c0gloChi2[7] = {6,10,20,30,60,60,70};
float c0missPen[7] = {2.,2.,2.,2.,2.,2.,2.};
float c0maxChi2SA[14]={0.,0.,0.,0.,2.5,5.,10.,20.,20.,20.,20.,20.,20.,20.};
float c0maxChi2Match = 10.;
trCond = new AliITSUTrackCond();
trCond->SetNLayers(nLr);
trCond->SetMaxITSTPCMatchChi2(c0maxChi2Match);
for (int i=0; i<nLr; i++) {
trCond->SetMaxBranches(i,c0nBranch[i]);
trCond->SetMaxCandidates(i,c0nCands[i]);
trCond->SetMaxTr2ClChi2(i,c0tr2clChi2[i]);
trCond->SetMaxChi2GloNrm(i,c0gloChi2[i]);
trCond->SetMissPenalty(i,c0missPen[i]);
}
for (int i=1; i<=2*nLr; i++) trCond->SetMaxITSSAChi2(i,c0maxChi2SA[i-1]);
trCond->AddNewCondition(5);
trCond->AddGroupPattern( kBit0|kBit1|kBit2, 2);
trCond->AddGroupPattern( kBit3|kBit4 , 1);
trCond->AddGroupPattern( kBit5|kBit6 , 1);
trCond->Init();
itsRecoParam->AddTrackingCondition(trCond);
}
{
int c1nBranch[7] = {0,0,0,4,6,6,10};
int c1nCands[7] = {0,0,0,5,5,5,8};
float c1tr2clChi2[7]= {0,0,0,20,20,20,30};
float c1gloChi2[7] = {0,0,0,16,40,35,30};
float c1missPen[7] = {0.,0.,0.,2.,2.,2.,2.};
float c1maxChi2SA[14]={0.,0.,0.,5.,13.,13.,18.,10.,10.,10.,10.,10.,10.,10.};
float c1maxChi2Match = 10.;
trCond = new AliITSUTrackCond();
trCond->SetNLayers(nLr);
trCond->ExcludeLayer(0);
trCond->ExcludeLayer(1);
trCond->ExcludeLayer(2);
trCond->SetMaxITSTPCMatchChi2(c1maxChi2Match);
for (int i=0; i<nLr; i++) {
trCond->SetMaxBranches(i,c1nBranch[i]);
trCond->SetMaxCandidates(i,c1nCands[i]);
trCond->SetMaxTr2ClChi2(i,c1tr2clChi2[i]);
trCond->SetMaxChi2GloNrm(i,c1gloChi2[i]);
trCond->SetMissPenalty(i,c1missPen[i]);
}
for (int i=1; i<=2*nLr; i++) trCond->SetMaxITSSAChi2(i,c1maxChi2SA[i-1]);
trCond->AddNewCondition(4);
trCond->AddGroupPattern( kBit3|kBit4|kBit5|kBit6, 4);
trCond->Init();
itsRecoParam->AddTrackingCondition(trCond);
}
{
int c2nBranch[7] = {0,0,0,0,0,6,10};
int c2nCands[7] = {0,0,0,0,0,5,8};
float c2tr2clChi2[7]= {0,0,0,0,0,15,20};
float c2gloChi2[7] = {0,0,0,0,0,15,20};
float c2missPen[7] = {0.,0.,0.,0.,0.,2.,2.};
float c2maxChi2SA[14]={0.,5.,5.,5.,13.,13.,18.,10.,10.,10.,10.,10.,10.,10.};
float c2maxChi2Match = 6.;
trCond = new AliITSUTrackCond();
trCond->SetNLayers(nLr);
trCond->ExcludeLayer(0);
trCond->ExcludeLayer(1);
trCond->ExcludeLayer(2);
trCond->ExcludeLayer(3);
trCond->ExcludeLayer(4);
trCond->SetMaxITSTPCMatchChi2(c2maxChi2Match);
for (int i=0; i<nLr; i++) {
trCond->SetMaxBranches(i,c2nBranch[i]);
trCond->SetMaxCandidates(i,c2nCands[i]);
trCond->SetMaxTr2ClChi2(i,c2tr2clChi2[i]);
trCond->SetMaxChi2GloNrm(i,c2gloChi2[i]);
trCond->SetMissPenalty(i,c2missPen[i]);
}
for (int i=1;i<=2*nLr;i++) trCond->SetMaxITSSAChi2(i,c2maxChi2SA[i-1]);
trCond->AddNewCondition(2);
trCond->AddGroupPattern( kBit5|kBit6, 2);
trCond->Init();
itsRecoParam->AddTrackingCondition(trCond);
}
return itsRecoParam;
}
AliITSURecoParam *AliITSURecoParam::GetLowFluxParam()
{
AliITSURecoParam *param = new AliITSURecoParam();
return param;
}
AliITSURecoParam *AliITSURecoParam::GetCosmicTestParam()
{
AliITSURecoParam *param = new AliITSURecoParam();
return param;
}
void AliITSURecoParam::SetNLayers(Int_t n)
{
if (fNLayers>0) AliFatal(Form("Number of layers was already set to %d",fNLayers));
if (n<1) n = 1;
fNLayers = n;
fTanLorentzAngle = new Double_t[n];
fSigmaY2 = new Double_t[n];
fSigmaZ2 = new Double_t[n];
fAllowDiagonalClusterization = new Bool_t[n];
for (int i=n;i--;) {
fAllowDiagonalClusterization[i] = fgkAllowDiagonalClusterization;
fTanLorentzAngle[i] = fgkTanLorentzAngle;
fSigmaY2[i] = fgkSigmaRoadY*fgkSigmaRoadY;
fSigmaZ2[i] = fgkSigmaRoadZ*fgkSigmaRoadZ;
}
}
void AliITSURecoParam::SetTanLorentzAngle(Int_t lr, Double_t v)
{
if (lr>=fNLayers) AliFatal(Form("Number of defined layers is %d",fNLayers));
fTanLorentzAngle[lr] = v;
}
void AliITSURecoParam::SetSigmaY2(Int_t lr, Double_t v)
{
if (lr>=fNLayers) AliFatal(Form("Number of defined layers is %d",fNLayers));
fSigmaY2[lr] = v;
}
void AliITSURecoParam::SetSigmaZ2(Int_t lr, Double_t v)
{
if (lr>=fNLayers) AliFatal(Form("Number of defined layers is %d",fNLayers));
fSigmaZ2[lr] = v;
}
void AliITSURecoParam::SetAllowDiagonalClusterization(Int_t lr, Bool_t v)
{
if (lr>=fNLayers) AliFatal(Form("Number of defined layers is %d",fNLayers));
fAllowDiagonalClusterization[lr] = v;
}
void AliITSURecoParam::Print(Option_t *) const
{
printf("%s: %s %s\n",ClassName(),GetName(),GetTitle());
printf("%-30s\t%f\n","fMaxDforV0dghtrForProlongation",fMaxDforV0dghtrForProlongation);
printf("%-30s\t%f\n","fMaxDForProlongation",fMaxDForProlongation);
printf("%-30s\t%f\n","fMaxDZForProlongation",fMaxDZForProlongation);
printf("%-30s\t%f\n","fMinPtForProlongation",fMinPtForProlongation);
printf("Use material LUT at steps: ");
for (int i=0;i<kNTrackingPhases;i++) printf("%d : %s |",i,GetUseMatLUT(i) ? "ON":"OFF"); printf("\n");
printf("TPC-ITS wall: %.3f<R<%.3f DZ/2=%.3f MaxStep=%.3f\n",
fTPCITSWallRMin,fTPCITSWallRMax,fTPCITSWallZSpanH,fTPCITSWallMaxStep);
printf("N.Layers: %d\n",fNLayers);
if (fNLayers>0) {
printf("Layer-wise data:\n");
printf("%-30s\t:","fTanLorentzAngle"); for (int i=0;i<fNLayers;i++) printf(" %+.2e",fTanLorentzAngle[i]); printf("\n");
printf("%-30s\t:","fSigmaY2"); for (int i=0;i<fNLayers;i++) printf(" %+.2e",fSigmaY2[i]); printf("\n");
printf("%-30s\t:","fSigmaZ2"); for (int i=0;i<fNLayers;i++) printf(" %+.2e",fSigmaZ2[i]); printf("\n");
}
int nTrCond = GetNTrackingConditions();
printf("%d tracking conditions defined\n",nTrCond);
for (int itc=0;itc<nTrCond;itc++) {
printf("Tracking condition %d\n",itc);
GetTrackingCondition(itc)->Print();
}
}
void AliITSURecoParam::AddTrackingCondition(AliITSUTrackCond* cond)
{
fTrackingConditions.AddLast(cond);
}