//
const Double_t badval = -9999;
-
- //cut on number of chambers
- const Double_t cutch = 6;
-
- //cut on mean number of clusters per chamber
- const Double_t cutclsperch = 18;
-
- const Double_t nch = track->GetTRDNchamberdEdx();
- if(nch < cutch){
- return badval;
- }
-
- const Double_t ncls = track->GetTRDNclusterdEdx();
- if( ncls/nch < cutclsperch){
- return badval;
- }
-
Double_t pTRD = -999;
for(Int_t ich=0; ich<6; ich++){
pTRD = track->GetTRDmomentum(ich);
return -99999;
}
- const Float_t *meanpar = (fkTRDdEdxParams->GetMeanParameter(type)).GetMatrixArray();
- const Float_t *respar = (fkTRDdEdxParams->GetSigmaParameter(type)).GetMatrixArray();
+ const Double_t nch = track->GetTRDNchamberdEdx();
+ const Double_t ncls = track->GetTRDNclusterdEdx();
+
+ const TVectorF meanvec = fkTRDdEdxParams->GetMeanParameter(type, nch, ncls);
+ if(meanvec.GetNrows()==0){
+ return badval;
+ }
+
+ const TVectorF resvec = fkTRDdEdxParams->GetSigmaParameter(type, nch, ncls);
+ if(resvec.GetNrows()==0){
+ return badval;
+ }
+
+ const Float_t *meanpar = meanvec.GetMatrixArray();
+ const Float_t *respar = resvec.GetMatrixArray();
//============================================================================================<<<<<<<<<<<<<
//
}
-void AliTRDdEdxParams::CheckType(const Int_t itype, const TString tag) const
+Int_t AliTRDdEdxParams::GetIter(const Int_t itype, const Int_t nch, const Int_t ncls) const
{
//
- //check if itype is in range
+ //return array iterator
//
- if(itype<0 || itype>=MAXNPAR){
- AliError(Form("AliTRDdEdxParams::CheckType %s itype out of range %d\n", tag.Data(), itype));
+ Int_t itNch = -999, itNcls = -999;
+
+ //hard coded cuts
+ if(nch==6){
+ itNch = 0;
+ }
+ else{
+ itNch = 1;
+ }
+
+ if(ncls/nch>=18){
+ itNcls = 0;
+ }
+ else{
+ itNcls = 1;
}
+
+ const Int_t finaliter = itype*2*2 + itNch*2 + itNcls;
+
+ if(finaliter<0 || finaliter>= MAXSIZE){
+ AliError(Form("out of range itype %d nch %d ncls %d\n", itype, nch, ncls));
+ }
+
+ return finaliter;
}
-const TVectorF& AliTRDdEdxParams::GetParameter(const TVectorF par[], const Int_t itype)const
+const TVectorF& AliTRDdEdxParams::GetParameter(const TVectorF par[], const Int_t itype, const Int_t nch, const Int_t ncls)const
{
//
//return parameter for particle itype from par[]
//
- CheckType(itype, "GetParameter");
+ const Int_t iter = GetIter(itype, nch, ncls);
- return par[itype];
+ return par[iter];
}
-void AliTRDdEdxParams::SetParameter(TVectorF par[], const Int_t itype, const Int_t npar, const Float_t vals[])
+void AliTRDdEdxParams::SetParameter(TVectorF par[], const Int_t itype, const Int_t nch, const Int_t ncls, const Int_t npar, const Float_t vals[])
{
//
//set parameter, vals of dimension npar, for particle itype
//
- CheckType(itype, "SetParameter");
+ const Int_t iter = GetIter(itype, nch, ncls);
TVectorF p2(npar, vals);
- par[itype].ResizeTo(p2);
- par[itype] = p2;
+ par[iter].ResizeTo(p2);
+ par[iter] = p2;
}
void AliTRDdEdxParams::Print(Option_t* option) const
TObject::Print(option);
printf("\n======================= Mean ========================\n");
- for(Int_t ii=0; ii<MAXNPAR; ii++){
+ for(Int_t ii=0; ii<MAXSIZE; ii++){
printf("%d: Nrows() %d\n",ii, fMeanPar[ii].GetNrows());
if(fMeanPar[ii].GetNrows()) fMeanPar[ii].Print();
}
printf("\n======================= Sigma ========================\n");
- for(Int_t ii=0; ii<MAXNPAR; ii++){
+ for(Int_t ii=0; ii<MAXSIZE; ii++){
printf("%d: Nrows() %d\n",ii, fSigmaPar[ii].GetNrows());
if(fSigmaPar[ii].GetNrows()) fSigmaPar[ii].Print();
}
#include "TVectorT.h"
#include "TString.h"
-//maximum number of paticle types
-#define MAXNPAR 10
+//maximum number of array size
+#define MAXSIZE 100
class AliTRDdEdxParams: public TNamed
{
AliTRDdEdxParams(const TString name="name", const TString title="title");
void Print(Option_t* option = "") const;
- const TVectorF& GetMeanParameter(const Int_t itype) const { return GetParameter(fMeanPar, itype);}
- const TVectorF& GetSigmaParameter(const Int_t itype) const { return GetParameter(fSigmaPar, itype);}
+ const TVectorF& GetMeanParameter( const Int_t itype, const Int_t nch, const Int_t ncls) const { return GetParameter(fMeanPar, itype, nch, ncls);}
+ const TVectorF& GetSigmaParameter(const Int_t itype, const Int_t nch, const Int_t ncls) const { return GetParameter(fSigmaPar, itype, nch, ncls);}
- void SetMeanParameter(const Int_t itype, const Int_t npar, const Float_t vals[]){ SetParameter(fMeanPar, itype, npar, vals); }
- void SetSigmaParameter(const Int_t itype, const Int_t npar, const Float_t vals[]){ SetParameter(fSigmaPar, itype, npar, vals); }
+ void SetMeanParameter( const Int_t itype, const Int_t nch, const Int_t ncls, const Int_t npar, const Float_t vals[]){ SetParameter(fMeanPar, itype, nch, ncls, npar, vals); }
+ void SetSigmaParameter(const Int_t itype, const Int_t nch, const Int_t ncls, const Int_t npar, const Float_t vals[]){ SetParameter(fSigmaPar, itype, nch, ncls, npar, vals); }
private:
- const TVectorF& GetParameter(const TVectorF par[], const Int_t itype) const;
- void SetParameter(TVectorF par[], const Int_t itype, const Int_t npar, const Float_t vals[]);
+ const TVectorF& GetParameter(const TVectorF par[], const Int_t itype, const Int_t nch, const Int_t ncls) const;
+ void SetParameter(TVectorF par[], const Int_t itype, const Int_t nch, const Int_t ncls, const Int_t npar, const Float_t vals[]);
- TVectorF fMeanPar[MAXNPAR];
- TVectorF fSigmaPar[MAXNPAR];
+ TVectorF fMeanPar[MAXSIZE];
+ TVectorF fSigmaPar[MAXSIZE];
- void CheckType(const Int_t itype, const TString tag) const;
+ Int_t GetIter(const Int_t itype, const Int_t nch, const Int_t ncls) const;
- ClassDef(AliTRDdEdxParams,1);
+ ClassDef(AliTRDdEdxParams,2);
};
#endif
const Float_t meanpars[]={1.521e+00 , 7.294e-01 , 8.066e+00 , 2.146e-02 , 3.137e+01 , 7.160e-15 , 2.838e+00 , 1.100e+01};
const Float_t respars[]={-4.122e-01 , 1.019e+00 , -1.319e-01};
- for(Int_t ipar=0; ipar< MAXNPAR; ipar++){
- if(ipar == AliPID::kProton){
- const Float_t tmpproton[]={2.026e+00 , -1.462e-04 , 1.202e+00 , 1.162e-01 , 2.092e+00 , -3.018e-02 , 3.665e+00 , 3.487e-07};
- defobj->SetMeanParameter(ipar, sizeof(tmpproton)/sizeof(Float_t), tmpproton);
+ for(Int_t ipar=0; ipar< 10; ipar++){
+ for(Int_t ich = 0; ich < 2; ich++){
+ for(Int_t icls = 0; icls < 2; icls++){
+
+ TVectorF tmp;
+ //!!! has to be consistent with
+ //Int_t GetIter(const Int_t itype, const Int_t nch, const Int_t ncls) const
+ //in AliTRDdEdxParams
+ const Int_t nch = ich==0? 6 : 1;
+ const Int_t ncls = icls==0? 180 : 1;
+
+
+ if(ich==0 && icls==0){
+ if(ipar == AliPID::kProton){
+ const Float_t tmpproton[]={2.026e+00 , -1.462e-04 , 1.202e+00 , 1.162e-01 , 2.092e+00 , -3.018e-02 , 3.665e+00 , 3.487e-07};
+ defobj->SetMeanParameter(ipar, nch, ncls, sizeof(tmpproton)/sizeof(Float_t), tmpproton);
+ }
+ else if(ipar == AliPID::kPion || ipar ==AliPID::kElectron){
+ const Float_t tmppe[]={1.508e+00 , 7.356e-01 , 8.002e+00 , 1.932e-02 , 3.058e+01 , 5.114e-18 , 3.561e+00 , 1.408e+01};
+ defobj->SetMeanParameter(ipar, nch, ncls, sizeof(tmppe)/sizeof(Float_t), tmppe);
+ }
+ else{
+ defobj->SetMeanParameter(ipar, nch, ncls, sizeof(meanpars)/sizeof(Float_t), meanpars);
+ }
+
+ defobj->SetSigmaParameter(ipar, nch, ncls, sizeof(respars)/sizeof(Float_t), respars);
+ }
+ else{
+ //bad nch and ncls, 0-size array
+ defobj->SetMeanParameter( ipar, nch, ncls, 0, meanpars);
+ defobj->SetSigmaParameter(ipar, nch, ncls, 0, respars);
+ }
+
+ }
}
- else if(ipar == AliPID::kPion || ipar ==AliPID::kElectron){
- const Float_t tmppe[]={1.508e+00 , 7.356e-01 , 8.002e+00 , 1.932e-02 , 3.058e+01 , 5.114e-18 , 3.561e+00 , 1.408e+01};
- defobj->SetMeanParameter(ipar, sizeof(tmppe)/sizeof(Float_t), tmppe);
- }
- else{
- defobj->SetMeanParameter(ipar, sizeof(meanpars)/sizeof(Float_t), meanpars);
- }
-
- defobj->SetSigmaParameter(ipar, sizeof(respars)/sizeof(Float_t), respars);
}
defobj->Print();