#include "AliITSPidParams.h"
#include "AliITSdEdxSamples.h"
#include "AliLog.h"
#include <TMath.h>
ClassImp(AliITSdEdxSamples)
AliITSdEdxSamples::AliITSdEdxSamples():TObject(),
fNSamples(0),
fClusterMap(0),
fP(0.),
fParticleSpecie(0),
fLayersForPid(0xFFFF)
{
for(Int_t i=0; i<kMaxSamples; i++){
fdESamples[i]=0.;
fdxSamples[i]=0.;
fPAtSample[i]=0.;
}
}
AliITSdEdxSamples::AliITSdEdxSamples(Int_t nSamples, Double_t* esamples, Double_t* xsamples, Double_t mom, Int_t specie) :
TObject(),
fNSamples(nSamples),
fClusterMap(0),
fP(mom),
fParticleSpecie(specie),
fLayersForPid(0xFFFF)
{
SetdESamples(nSamples,esamples);
SetdxSamples(nSamples,xsamples);
SetClusterMapFromdE();
}
AliITSdEdxSamples::AliITSdEdxSamples(const AliITSdEdxSamples& source) :
TObject(),
fNSamples(source.fNSamples),
fClusterMap(source.fClusterMap),
fP(source.fP),
fParticleSpecie(source.fParticleSpecie),
fLayersForPid(source.fLayersForPid)
{
for(Int_t i=0; i<kMaxSamples; i++){
fdESamples[i]=source.GetdESample(i);
fdxSamples[i]=source.GetdxSample(i);
fPAtSample[i]=source.GetMomentumAtSample(i);
}
}
AliITSdEdxSamples& AliITSdEdxSamples::operator=(const AliITSdEdxSamples &source){
if(this==&source) return *this;
((TObject *)this)->operator=(source);
fNSamples = source.fNSamples;
fClusterMap = source.fClusterMap;
fP = source.fP;
fParticleSpecie = source.fParticleSpecie;
fLayersForPid = source.fLayersForPid;
for(Int_t i=0; i<kMaxSamples; i++){
fdESamples[i]=source.GetdESample(i);
fdxSamples[i]=source.GetdxSample(i);
fPAtSample[i]=source.GetMomentumAtSample(i);
}
return *this;
}
void AliITSdEdxSamples::SetdESamples(Int_t nSamples, Double_t* samples){
if(nSamples>kMaxSamples){
AliWarning(Form("Too many dE samples,only first %d will be used",kMaxSamples));
fNSamples=kMaxSamples;
}else{
fNSamples=nSamples;
}
for(Int_t i=0; i<fNSamples; i++) fdESamples[i]=samples[i];
for(Int_t i=fNSamples; i<kMaxSamples; i++) fdESamples[i]=0.;
return;
}
void AliITSdEdxSamples::SetdxSamples(Int_t nSamples, Double_t* samples){
if(nSamples>kMaxSamples){
AliWarning(Form("Too many dx samples,only first %d will be used",kMaxSamples));
fNSamples=kMaxSamples;
}else{
fNSamples=nSamples;
}
for(Int_t i=0; i<fNSamples; i++) fdxSamples[i]=samples[i];
for(Int_t i=fNSamples; i<kMaxSamples; i++) fdxSamples[i]=0.;
return;
}
void AliITSdEdxSamples::SetSamplesAndMomenta(Int_t nSamples, Double_t* esamples, Double_t* xsamples, Double_t* mom){
SetdESamples(nSamples,esamples);
SetdxSamples(nSamples,xsamples);
for(Int_t i=0; i<fNSamples; i++) fPAtSample[i]=mom[i];
for(Int_t i=fNSamples; i<kMaxSamples; i++) fPAtSample[i]=0.;
return;
}
void AliITSdEdxSamples::SetLayerSample(Int_t iLayer, Bool_t haspoint, Double_t dE, Double_t dx, Double_t p){
if(haspoint){
SetPointOnLayer(iLayer);
fdESamples[iLayer]=dE;
fdxSamples[iLayer]=dx;
fPAtSample[iLayer]=p;
}else{
if(HasPointOnLayer(iLayer)) fClusterMap-=(1<<iLayer);
fdESamples[iLayer]=0.;
fdxSamples[iLayer]=0.;
fPAtSample[iLayer]=0.;
}
}
Double_t AliITSdEdxSamples::GetTruncatedMean(Double_t frac, Double_t mindedx) const {
Int_t nc=0;
Double_t dedx[kMaxSamples];
for (Int_t il=0; il<fNSamples; il++) {
Double_t dedxsamp=GetdEdxSample(il);
if(HasPointOnLayer(il) && UseLayerForPid(il) && dedxsamp>mindedx){
dedx[nc]= dedxsamp;
nc++;
}
}
if(nc<1) return 0.;
Int_t swap;
do {
swap=0;
for (Int_t i=0; i<nc-1; i++) {
if (dedx[i]<=dedx[i+1]) continue;
Double_t tmp=dedx[i];
dedx[i]=dedx[i+1];
dedx[i+1]=tmp;
swap++;
}
} while (swap);
Double_t sumamp=0,sumweight=0;
Double_t weight[kMaxSamples];
for(Int_t iw=0; iw<kMaxSamples; iw++) weight[iw]=0.;
Int_t lastUsed=(Int_t)(frac*nc+0.00001);
if(lastUsed==0) lastUsed=1;
if(lastUsed>kMaxSamples) lastUsed=kMaxSamples;
for(Int_t iw=0; iw<lastUsed; iw++) weight[iw]=1.;
if((frac*nc-lastUsed)>0.4 && lastUsed<kMaxSamples) weight[lastUsed]=0.5;
for (Int_t i=0; i<nc; i++) {
sumamp+= dedx[i]*weight[i];
sumweight+=weight[i];
}
if(sumweight>0.) return sumamp/sumweight;
else return 0.;
}
Double_t AliITSdEdxSamples::GetWeightedMean(Double_t mindedx) const {
Int_t nc=0;
Double_t dedx[kMaxSamples];
for (Int_t il=0; il<fNSamples; il++) {
Double_t dedxsamp=GetdEdxSample(il);
if(HasPointOnLayer(il) && UseLayerForPid(il) && dedxsamp>mindedx){
dedx[nc]= dedxsamp;
nc++;
}
}
if(nc<1) return 0.;
Double_t weiSum = 0.;
for (Int_t i=0; i<nc; i++) {
weiSum+=TMath::Power(dedx[i],-2);
}
Double_t wMean=0.;
if(weiSum>0.) wMean= TMath::Power(weiSum/nc,-0.5);
return wMean;
}
void AliITSdEdxSamples::GetConditionalProbabilities(const AliITSPidParams* pars, Double_t condprob[AliPID::kSPECIES], Double_t mindedx) const {
const Int_t nPart = 3;
Double_t itsProb[nPart] = {1,1,1};
for(Int_t iS=0; iS<fNSamples; iS++){
if(!HasPointOnLayer(iS)) continue;
if(!UseLayerForPid(iS)) continue;
Int_t iLayer=iS+3;
if(iLayer>6) iLayer=6;
Float_t dedx = GetdEdxSample(iS);
if(dedx<mindedx) continue;
Float_t layProb = pars->GetLandauGausNorm(dedx,AliPID::kProton,fP,iLayer);
itsProb[0] *= layProb;
layProb = pars->GetLandauGausNorm(dedx,AliPID::kKaon,fP,iLayer);
if (fP < 0.16) layProb=0.00001;
itsProb[1] *= layProb;
layProb = pars->GetLandauGausNorm(dedx,AliPID::kPion,fP,iLayer);
itsProb[2] *= layProb;
}
Double_t sumProb = 0;
for (Int_t iPart = 0; iPart < nPart; iPart++) {
sumProb += itsProb[iPart];
}
sumProb += 2*itsProb[2];
for (Int_t iPart = 0; iPart < nPart; iPart++) {
itsProb[iPart]/=sumProb;
}
condprob[AliPID::kElectron] = itsProb[2];
condprob[AliPID::kMuon] = itsProb[2];
condprob[AliPID::kPion] = itsProb[2];
condprob[AliPID::kKaon] = itsProb[1];
condprob[AliPID::kProton] = itsProb[0];
return;
}
void AliITSdEdxSamples::PrintAll() const{
printf("Particle %d momentum %f GeV/c, number of points %d\n",
GetParticleSpecieMC(),
fP,
GetNumberOfEffectiveSamples());
for(Int_t iLay=0; iLay<fNSamples; iLay++){
printf(" Layer %d Point %d dE %f keV dx %f cm mom %f GeV/c\n",iLay,
HasPointOnLayer(iLay),
GetdESample(iLay),
GetdxSample(iLay),
GetMomentumAtSample(iLay));
}
printf("Layers used for PID:\n");
printf("Layer ");
for(Int_t iLay=0; iLay<fNSamples; iLay++){
printf("%d ",iLay);
}
printf("\n");
printf("Use ");
for(Int_t iLay=0; iLay<fNSamples; iLay++){
printf("%d ",UseLayerForPid(iLay));
}
printf("\n");
printf("Truncated mean = %f\n",GetTruncatedMean());
}
void AliITSdEdxSamples::PrintClusterMap() const{
printf("Layer ");
for(Int_t iLay=0; iLay<fNSamples; iLay++){
printf("%d ",iLay);
}
printf("\n");
printf("Point ");
for(Int_t iLay=0; iLay<fNSamples; iLay++){
printf("%d ",HasPointOnLayer(iLay));
}
printf("\n");
}
AliITSdEdxSamples.cxx:100 AliITSdEdxSamples.cxx:101 AliITSdEdxSamples.cxx:102 AliITSdEdxSamples.cxx:103 AliITSdEdxSamples.cxx:104 AliITSdEdxSamples.cxx:105 AliITSdEdxSamples.cxx:106 AliITSdEdxSamples.cxx:107 AliITSdEdxSamples.cxx:108 AliITSdEdxSamples.cxx:109 AliITSdEdxSamples.cxx:110 AliITSdEdxSamples.cxx:111 AliITSdEdxSamples.cxx:112 AliITSdEdxSamples.cxx:113 AliITSdEdxSamples.cxx:114 AliITSdEdxSamples.cxx:115 AliITSdEdxSamples.cxx:116 AliITSdEdxSamples.cxx:117 AliITSdEdxSamples.cxx:118 AliITSdEdxSamples.cxx:119 AliITSdEdxSamples.cxx:120 AliITSdEdxSamples.cxx:121 AliITSdEdxSamples.cxx:122 AliITSdEdxSamples.cxx:123 AliITSdEdxSamples.cxx:124 AliITSdEdxSamples.cxx:125 AliITSdEdxSamples.cxx:126 AliITSdEdxSamples.cxx:127 AliITSdEdxSamples.cxx:128 AliITSdEdxSamples.cxx:129 AliITSdEdxSamples.cxx:130 AliITSdEdxSamples.cxx:131 AliITSdEdxSamples.cxx:132 AliITSdEdxSamples.cxx:133 AliITSdEdxSamples.cxx:134 AliITSdEdxSamples.cxx:135 AliITSdEdxSamples.cxx:136 AliITSdEdxSamples.cxx:137 AliITSdEdxSamples.cxx:138 AliITSdEdxSamples.cxx:139 AliITSdEdxSamples.cxx:140 AliITSdEdxSamples.cxx:141 AliITSdEdxSamples.cxx:142 AliITSdEdxSamples.cxx:143 AliITSdEdxSamples.cxx:144 AliITSdEdxSamples.cxx:145 AliITSdEdxSamples.cxx:146 AliITSdEdxSamples.cxx:147 AliITSdEdxSamples.cxx:148 AliITSdEdxSamples.cxx:149 AliITSdEdxSamples.cxx:150 AliITSdEdxSamples.cxx:151 AliITSdEdxSamples.cxx:152 AliITSdEdxSamples.cxx:153 AliITSdEdxSamples.cxx:154 AliITSdEdxSamples.cxx:155 AliITSdEdxSamples.cxx:156 AliITSdEdxSamples.cxx:157 AliITSdEdxSamples.cxx:158 AliITSdEdxSamples.cxx:159 AliITSdEdxSamples.cxx:160 AliITSdEdxSamples.cxx:161 AliITSdEdxSamples.cxx:162 AliITSdEdxSamples.cxx:163 AliITSdEdxSamples.cxx:164 AliITSdEdxSamples.cxx:165 AliITSdEdxSamples.cxx:166 AliITSdEdxSamples.cxx:167 AliITSdEdxSamples.cxx:168 AliITSdEdxSamples.cxx:169 AliITSdEdxSamples.cxx:170 AliITSdEdxSamples.cxx:171 AliITSdEdxSamples.cxx:172 AliITSdEdxSamples.cxx:173 AliITSdEdxSamples.cxx:174 AliITSdEdxSamples.cxx:175 AliITSdEdxSamples.cxx:176 AliITSdEdxSamples.cxx:177 AliITSdEdxSamples.cxx:178 AliITSdEdxSamples.cxx:179 AliITSdEdxSamples.cxx:180 AliITSdEdxSamples.cxx:181 AliITSdEdxSamples.cxx:182 AliITSdEdxSamples.cxx:183 AliITSdEdxSamples.cxx:184 AliITSdEdxSamples.cxx:185 AliITSdEdxSamples.cxx:186 AliITSdEdxSamples.cxx:187 AliITSdEdxSamples.cxx:188 AliITSdEdxSamples.cxx:189 AliITSdEdxSamples.cxx:190 AliITSdEdxSamples.cxx:191 AliITSdEdxSamples.cxx:192 AliITSdEdxSamples.cxx:193 AliITSdEdxSamples.cxx:194 AliITSdEdxSamples.cxx:195 AliITSdEdxSamples.cxx:196 AliITSdEdxSamples.cxx:197 AliITSdEdxSamples.cxx:198 AliITSdEdxSamples.cxx:199 AliITSdEdxSamples.cxx:200 AliITSdEdxSamples.cxx:201 AliITSdEdxSamples.cxx:202 AliITSdEdxSamples.cxx:203 AliITSdEdxSamples.cxx:204 AliITSdEdxSamples.cxx:205 AliITSdEdxSamples.cxx:206 AliITSdEdxSamples.cxx:207 AliITSdEdxSamples.cxx:208 AliITSdEdxSamples.cxx:209 AliITSdEdxSamples.cxx:210 AliITSdEdxSamples.cxx:211 AliITSdEdxSamples.cxx:212 AliITSdEdxSamples.cxx:213 AliITSdEdxSamples.cxx:214 AliITSdEdxSamples.cxx:215 AliITSdEdxSamples.cxx:216 AliITSdEdxSamples.cxx:217 AliITSdEdxSamples.cxx:218 AliITSdEdxSamples.cxx:219 AliITSdEdxSamples.cxx:220 AliITSdEdxSamples.cxx:221 AliITSdEdxSamples.cxx:222 AliITSdEdxSamples.cxx:223 AliITSdEdxSamples.cxx:224 AliITSdEdxSamples.cxx:225 AliITSdEdxSamples.cxx:226 AliITSdEdxSamples.cxx:227 AliITSdEdxSamples.cxx:228 AliITSdEdxSamples.cxx:229 AliITSdEdxSamples.cxx:230 AliITSdEdxSamples.cxx:231 AliITSdEdxSamples.cxx:232 AliITSdEdxSamples.cxx:233 AliITSdEdxSamples.cxx:234 AliITSdEdxSamples.cxx:235 AliITSdEdxSamples.cxx:236 AliITSdEdxSamples.cxx:237 AliITSdEdxSamples.cxx:238 AliITSdEdxSamples.cxx:239 AliITSdEdxSamples.cxx:240 AliITSdEdxSamples.cxx:241 AliITSdEdxSamples.cxx:242 AliITSdEdxSamples.cxx:243 AliITSdEdxSamples.cxx:244 AliITSdEdxSamples.cxx:245 AliITSdEdxSamples.cxx:246 AliITSdEdxSamples.cxx:247 AliITSdEdxSamples.cxx:248 AliITSdEdxSamples.cxx:249 AliITSdEdxSamples.cxx:250 AliITSdEdxSamples.cxx:251 AliITSdEdxSamples.cxx:252 AliITSdEdxSamples.cxx:253 AliITSdEdxSamples.cxx:254 AliITSdEdxSamples.cxx:255 AliITSdEdxSamples.cxx:256 AliITSdEdxSamples.cxx:257 AliITSdEdxSamples.cxx:258 AliITSdEdxSamples.cxx:259 AliITSdEdxSamples.cxx:260 AliITSdEdxSamples.cxx:261 AliITSdEdxSamples.cxx:262 AliITSdEdxSamples.cxx:263 AliITSdEdxSamples.cxx:264 AliITSdEdxSamples.cxx:265 AliITSdEdxSamples.cxx:266 AliITSdEdxSamples.cxx:267 AliITSdEdxSamples.cxx:268 AliITSdEdxSamples.cxx:269 AliITSdEdxSamples.cxx:270 AliITSdEdxSamples.cxx:271 AliITSdEdxSamples.cxx:272 AliITSdEdxSamples.cxx:273 AliITSdEdxSamples.cxx:274 AliITSdEdxSamples.cxx:275 AliITSdEdxSamples.cxx:276 AliITSdEdxSamples.cxx:277 AliITSdEdxSamples.cxx:278 AliITSdEdxSamples.cxx:279 AliITSdEdxSamples.cxx:280 AliITSdEdxSamples.cxx:281 AliITSdEdxSamples.cxx:282 AliITSdEdxSamples.cxx:283 AliITSdEdxSamples.cxx:284 AliITSdEdxSamples.cxx:285 AliITSdEdxSamples.cxx:286 AliITSdEdxSamples.cxx:287 AliITSdEdxSamples.cxx:288 AliITSdEdxSamples.cxx:289 AliITSdEdxSamples.cxx:290 AliITSdEdxSamples.cxx:291 AliITSdEdxSamples.cxx:292 AliITSdEdxSamples.cxx:293 AliITSdEdxSamples.cxx:294 AliITSdEdxSamples.cxx:295 AliITSdEdxSamples.cxx:296 AliITSdEdxSamples.cxx:297 AliITSdEdxSamples.cxx:298 AliITSdEdxSamples.cxx:299 AliITSdEdxSamples.cxx:300 AliITSdEdxSamples.cxx:301 AliITSdEdxSamples.cxx:302 AliITSdEdxSamples.cxx:303 AliITSdEdxSamples.cxx:304 AliITSdEdxSamples.cxx:305 AliITSdEdxSamples.cxx:306 AliITSdEdxSamples.cxx:307