Normalized positive PID weights (conditional probabilities)
authorhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 14 Dec 2005 13:52:56 +0000 (13:52 +0000)
committerhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 14 Dec 2005 13:52:56 +0000 (13:52 +0000)
STEER/AliESDtrack.cxx

index 0270c60..9e93710 100644 (file)
 
 ClassImp(AliESDtrack)
 
+void SetPIDValues(Float_t * dest, const Double_t * src, Int_t n) {
+  // This function copies "n" PID weights from "scr" to "dest"
+  // and normalizes their sum to 1 thus producing conditional probabilities.
+  // The negative weights are set to 0.
+  // In case all the weights are non-positive they are replaced by
+  // uniform probabilities
+
+  if (n<=0) return;
+
+  Float_t uniform = 1./(Float_t)n;
+
+  Float_t sum = 0;
+  for (Int_t i=0; i<n; i++) 
+    if (src[i]>=0) {
+      sum+=src[i];
+      dest[i] = src[i];
+    }
+    else {
+      dest[i] = 0;
+    }
+
+  if(sum>0)
+    for (Int_t i=0; i<n; i++) dest[i] /= sum;
+  else
+    for (Int_t i=0; i<n; i++) dest[i] = uniform;
+}
+
 //_______________________________________________________________________
 AliESDtrack::AliESDtrack() : 
   TObject(),
@@ -889,7 +916,7 @@ void AliESDtrack::SetIntegratedTimes(const Double_t *times) {
 //_______________________________________________________________________
 void AliESDtrack::SetITSpid(const Double_t *p) {
   // Sets values for the probability of each particle type (in ITS)
-  for (Int_t i=0; i<AliPID::kSPECIES; i++) fITSr[i]=p[i];
+  SetPIDValues(fITSr,p,AliPID::kSPECIES);
   SetStatus(AliESDtrack::kITSpid);
 }
 
@@ -942,7 +969,7 @@ Float_t AliESDtrack::GetTPCdensity(Int_t row0, Int_t row1) const{
 //_______________________________________________________________________
 void AliESDtrack::SetTPCpid(const Double_t *p) {  
   // Sets values for the probability of each particle type (in TPC)
-  for (Int_t i=0; i<AliPID::kSPECIES; i++) fTPCr[i]=p[i];
+  SetPIDValues(fTPCr,p,AliPID::kSPECIES);
   SetStatus(AliESDtrack::kTPCpid);
 }
 
@@ -965,7 +992,7 @@ Int_t AliESDtrack::GetTRDclusters(UInt_t *idx) const {
 //_______________________________________________________________________
 void AliESDtrack::SetTRDpid(const Double_t *p) {  
   // Sets values for the probability of each particle type (in TRD)
-  for (Int_t i=0; i<AliPID::kSPECIES; i++) fTRDr[i]=p[i];
+  SetPIDValues(fTRDr,p,AliPID::kSPECIES);
   SetStatus(AliESDtrack::kTRDpid);
 }
 
@@ -991,7 +1018,7 @@ Float_t AliESDtrack::GetTRDpid(Int_t iSpecies) const
 //_______________________________________________________________________
 void AliESDtrack::SetTOFpid(const Double_t *p) {  
   // Sets the probability of each particle type (in TOF)
-  for (Int_t i=0; i<AliPID::kSPECIES; i++) fTOFr[i]=p[i];
+  SetPIDValues(fTOFr,p,AliPID::kSPECIES);
   SetStatus(AliESDtrack::kTOFpid);
 }
 
@@ -1030,7 +1057,7 @@ void AliESDtrack::SetTOFInfo(Float_t*info) {
 //_______________________________________________________________________
 void AliESDtrack::SetPHOSpid(const Double_t *p) {  
   // Sets the probability of each particle type (in PHOS)
-  for (Int_t i=0; i<AliPID::kSPECIESN; i++) fPHOSr[i]=p[i];
+  SetPIDValues(fPHOSr,p,AliPID::kSPECIESN);
   SetStatus(AliESDtrack::kPHOSpid);
 }
 
@@ -1043,7 +1070,7 @@ void AliESDtrack::GetPHOSpid(Double_t *p) const {
 //_______________________________________________________________________
 void AliESDtrack::SetEMCALpid(const Double_t *p) {  
   // Sets the probability of each particle type (in EMCAL)
-  for (Int_t i=0; i<AliPID::kSPECIESN; i++) fEMCALr[i]=p[i];
+  SetPIDValues(fEMCALr,p,AliPID::kSPECIESN);
   SetStatus(AliESDtrack::kEMCALpid);
 }
 
@@ -1056,7 +1083,7 @@ void AliESDtrack::GetEMCALpid(Double_t *p) const {
 //_______________________________________________________________________
 void AliESDtrack::SetRICHpid(const Double_t *p) {  
   // Sets the probability of each particle type (in RICH)
-  for (Int_t i=0; i<AliPID::kSPECIES; i++) fRICHr[i]=p[i];
+  SetPIDValues(fRICHr,p,AliPID::kSPECIES);
   SetStatus(AliESDtrack::kRICHpid);
 }
 
@@ -1071,7 +1098,7 @@ void AliESDtrack::GetRICHpid(Double_t *p) const {
 //_______________________________________________________________________
 void AliESDtrack::SetESDpid(const Double_t *p) {  
   // Sets the probability of each particle type for the ESD track
-  for (Int_t i=0; i<AliPID::kSPECIES; i++) fR[i]=p[i];
+  SetPIDValues(fR,p,AliPID::kSPECIES);
   SetStatus(AliESDtrack::kESDpid);
 }