]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGHF/hfe/AliHFEpidTRD.cxx
Yvonne for the TPC-TOF MB pPb analysis
[u/mrichter/AliRoot.git] / PWGHF / hfe / AliHFEpidTRD.cxx
1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 *                                                                        *
4 * Author: The ALICE Off-line Project.                                    *
5 * Contributors are mentioned in the code where appropriate.              *
6 *                                                                        *
7 * Permission to use, copy, modify and distribute this software and its   *
8 * documentation strictly for non-commercial purposes is hereby granted   *
9 * without fee, provided that the above copyright notice appears in all   *
10 * copies and that both the copyright notice and this permission notice   *
11 * appear in the supporting documentation. The authors make no claims     *
12 * about the suitability of this software for any purpose. It is          *
13 * provided "as is" without express or implied warranty.                  *
14 **************************************************************************/
15 //
16 // Class for TRD PID
17 // Implements the abstract base class AliHFEpidbase 
18 // Make PID does the PID decision 
19 // Class further contains TRD specific cuts and QA histograms 
20 //  
21 // Authors: 
22 //   Markus Fasel <M.Fasel@gsi.de>  
23 // 
24 #include <TH1F.h>
25 #include <TH2F.h>
26 #include <THnSparse.h>
27 #include <TList.h>
28 #include <TString.h>
29
30 #include "AliAODPid.h"
31 #include "AliAODTrack.h"
32 #include "AliAODMCParticle.h"
33 #include "AliESDtrack.h"
34 #include "AliLog.h"
35 #include "AliMCParticle.h"
36 #include "AliOADBContainer.h"
37 #include "AliPID.h"
38 #include "AliPIDResponse.h"
39
40 #include "AliHFEOADBThresholdsTRD.h"
41 #include "AliHFEpidQAmanager.h"
42 #include "AliHFEpidTRD.h"
43
44 ClassImp(AliHFEpidTRD)
45
46 //___________________________________________________________________
47 AliHFEpidTRD::AliHFEpidTRD() :
48     AliHFEpidBase()
49   , fOADBThresholds(NULL)
50   , fMinP(0.5)
51   , fNTracklets(6)
52   , fCutNTracklets(0)
53   , fRunNumber(0)
54   , fElectronEfficiency(0.90)
55   , fTotalChargeInSlice0(kFALSE)
56   , fTRDOldPIDMethod(kFALSE)
57   , fTRD2DPID(kFALSE)
58 {
59   //
60   // default  constructor
61   // 
62   memset(fThreshParams, 0, sizeof(Double_t) * kThreshParams);
63 }
64
65 //___________________________________________________________________
66 AliHFEpidTRD::AliHFEpidTRD(const char* name) :
67     AliHFEpidBase(name)
68   , fOADBThresholds(NULL)
69   , fMinP(0.5)
70   , fNTracklets(6)
71   , fCutNTracklets(0)
72   , fRunNumber(0)
73   , fElectronEfficiency(0.91)
74   , fTotalChargeInSlice0(kFALSE)
75   , fTRDOldPIDMethod(kFALSE)
76   , fTRD2DPID(kFALSE)
77 {
78   //
79   // default  constructor
80   // 
81   memset(fThreshParams, 0, sizeof(Double_t) * kThreshParams);
82 }
83
84 //___________________________________________________________________
85 AliHFEpidTRD::AliHFEpidTRD(const AliHFEpidTRD &ref):
86     AliHFEpidBase("")
87   , fOADBThresholds(NULL)
88   , fMinP(ref.fMinP)
89   , fNTracklets(ref.fNTracklets)
90   , fCutNTracklets(ref.fCutNTracklets)
91   , fRunNumber(ref.fRunNumber)
92   , fElectronEfficiency(ref.fElectronEfficiency)
93   , fTotalChargeInSlice0(ref.fTotalChargeInSlice0)
94   , fTRDOldPIDMethod(ref.fTRDOldPIDMethod)
95   , fTRD2DPID(ref.fTRD2DPID)
96 {
97   //
98   // Copy constructor
99   //
100   memset(fThreshParams, 0, sizeof(Double_t) * kThreshParams);
101   ref.Copy(*this);
102 }
103
104 //___________________________________________________________________
105 AliHFEpidTRD &AliHFEpidTRD::operator=(const AliHFEpidTRD &ref){
106   //
107   // Assignment operator
108   //
109   if(this != &ref){
110     ref.Copy(*this);
111   }
112   return *this;
113 }
114
115 //___________________________________________________________________
116 void AliHFEpidTRD::Copy(TObject &ref) const {
117   //
118   // Performs the copying of the object
119   //
120   AliHFEpidTRD &target = dynamic_cast<AliHFEpidTRD &>(ref);
121   
122   target.fMinP = fMinP;
123   target.fNTracklets = fNTracklets;
124   target.fCutNTracklets = fCutNTracklets;
125   target.fRunNumber = fRunNumber;
126   target.fTotalChargeInSlice0 = fTotalChargeInSlice0;
127   target.fTRDOldPIDMethod = fTRDOldPIDMethod;
128   target.fTRD2DPID = fTRD2DPID;
129   target.fElectronEfficiency = fElectronEfficiency;
130   memcpy(target.fThreshParams, fThreshParams, sizeof(Double_t) * kThreshParams);
131   AliHFEpidBase::Copy(ref);
132 }
133
134 //___________________________________________________________________
135 AliHFEpidTRD::~AliHFEpidTRD(){
136   //
137   // Destructor
138   //
139 }
140
141 //______________________________________________________
142 Bool_t AliHFEpidTRD::InitializePID(Int_t run){
143   //
144   // InitializePID call different init function depending on TRD PID method
145   //
146   //
147
148   if(fTRDOldPIDMethod) return Initialize1D(run);
149   else return kTRUE;
150
151
152
153 }
154
155 //______________________________________________________
156 Bool_t AliHFEpidTRD::Initialize1D(Int_t run){
157   //
158   // InitializePID: Load TRD thresholds and create the electron efficiency axis
159   // to navigate 
160   //
161   AliDebug(1, Form("Initializing TRD PID for run %d", run));
162   if(InitParamsFromOADB(run)){
163     SetBit(kThresholdsInitialized);
164     return kTRUE;
165   }
166   AliDebug(1, Form("Threshold Parameters for %d tracklets and an electron efficiency %f loaded:", fNTracklets, fElectronEfficiency));
167   AliDebug(1, Form("Params: [%f|%f|%f|%f]", fThreshParams[0], fThreshParams[1], fThreshParams[2], fThreshParams[3]));
168   fRunNumber = run;
169   return kFALSE;
170 }
171
172 /*
173 //______________________________________________________
174 Bool_t AliHFEpidTRD::Initialize2D(Int_t run){
175   //
176   // Initialize2DimPID
177   //
178   //
179
180     return kTRUE;
181
182 }
183 */
184
185 //______________________________________________________
186 Int_t AliHFEpidTRD::IsSelected(const AliHFEpidObject *track, AliHFEpidQAmanager *pidqa) const {
187   //
188   // Does PID for TRD alone:
189   // PID algorithm selected according to flag
190   //
191   //
192
193    if(fTRDOldPIDMethod) return IsSelected1D(track, pidqa);
194    else return IsSelectedTRDPID(track, pidqa);
195
196
197 }
198
199 //______________________________________________________
200 Int_t AliHFEpidTRD::IsSelected1D(const AliHFEpidObject *track, AliHFEpidQAmanager *pidqa) const {
201   //
202   // Does PID for TRD alone:
203   // PID thresholds based on 90% Electron Efficiency level approximated by a linear 
204   // step function
205   //
206   if(!TestBit(kThresholdsInitialized)) {
207     AliDebug(1,"Threshold Parameters not available");
208     return 0;
209   }
210   AliDebug(2, "Applying TRD PID");
211   if(!fkPIDResponse){
212     AliDebug(2, "Cannot process track");
213     return 0;
214   }
215
216
217 /*
218   const AliESDtrack *esdt = dynamic_cast<const AliESDtrack *>(track->GetRecTrack());
219   printf("checking IdentifiedAsElectronTRD, number of Tracklets: %d\n", esdt->GetTRDntrackletsPID());
220   if(fkPIDResponse->IdentifiedAsElectronTRD(dynamic_cast<const AliVTrack *>(track->GetRecTrack()), 0.8)) printf("Track identified as electron\n");
221   else printf("Track rejected\n");
222 */
223   AliHFEpidObject::AnalysisType_t anatype = track->IsESDanalysis() ? AliHFEpidObject::kESDanalysis: AliHFEpidObject::kAODanalysis;
224   Double_t p = GetP(track->GetRecTrack(), anatype);
225   if(p < fMinP){ 
226     AliDebug(2, Form("Track momentum below %f", fMinP));
227     return 0;
228   }
229
230   if(pidqa) pidqa->ProcessTrack(track, AliHFEpid::kTRDpid, AliHFEdetPIDqa::kBeforePID); 
231
232   if(fCutNTracklets > 0){
233     AliDebug(1, Form("Number of tracklets cut applied: %d\n", fCutNTracklets));
234     Int_t ntracklets = track->GetRecTrack() ? track->GetRecTrack()->GetTRDntrackletsPID() : 0;
235     if(TestBit(kExactTrackletCut)){
236       AliDebug(1, Form("Exact cut applied: %d tracklets found\n", ntracklets));
237       if(ntracklets != fCutNTracklets) return 0;
238     } else {
239       AliDebug(1, Form("Greater Equal cut applied: %d tracklets found\n", ntracklets));
240       if(ntracklets < fCutNTracklets) return 0;
241     }
242   }
243   AliDebug(1,"Track selected\n");
244
245   Double_t electronLike = GetElectronLikelihood(track->GetRecTrack(), anatype);
246   Double_t threshold;
247   if(TestBit(kSelectCutOnTheFly)){ 
248     threshold = GetTRDthresholds(p, track->GetRecTrack()->GetTRDntrackletsPID());
249   } else {
250     threshold = GetTRDthresholds(p);
251   }
252   AliDebug(2, Form("Threshold: %f\n", threshold));
253   if(electronLike > threshold){
254     if(pidqa) pidqa->ProcessTrack(track, AliHFEpid::kTRDpid, AliHFEdetPIDqa::kAfterPID);
255     return 11;
256   }
257   return 211;
258
259 }
260
261 //______________________________________________________
262 Int_t AliHFEpidTRD::IsSelectedTRDPID(const AliHFEpidObject *track, AliHFEpidQAmanager *pidqa) const {
263   //
264   // 2D TRD PID
265   // 
266   // 
267   //
268   AliDebug(2, "Applying TRD PID");
269   if(!fkPIDResponse){
270     AliDebug(2, "Cannot process track");
271     return 0;
272   }
273
274   AliHFEpidObject::AnalysisType_t anatype = track->IsESDanalysis() ? AliHFEpidObject::kESDanalysis: AliHFEpidObject::kAODanalysis;
275   Double_t p = GetP(track->GetRecTrack(), anatype);
276   if(p < fMinP){ 
277     AliDebug(2, Form("Track momentum %f below %f", p, fMinP));
278     return 0;
279   }
280   AliDebug(2, Form("Track momentum %f above %f", p, fMinP));
281  
282   if(pidqa) pidqa->ProcessTrack(track, AliHFEpid::kTRDpid, AliHFEdetPIDqa::kBeforePID); 
283   AliDebug(1,"PID qa done for step before\n");
284
285   if(fCutNTracklets > 0){
286     AliDebug(1, Form("Number of tracklets cut applied: %d\n", fCutNTracklets));
287     Int_t ntracklets = track->GetRecTrack() ? track->GetRecTrack()->GetTRDntrackletsPID() : 0;
288     if(TestBit(kExactTrackletCut)){
289       AliDebug(1, Form("Exact cut applied: %d tracklets found\n", ntracklets));
290       if(ntracklets != fCutNTracklets) return 0;
291     } else {
292       AliDebug(1, Form("Greater Equal cut applied: %d tracklets found\n", ntracklets));
293       if(ntracklets < fCutNTracklets) return 0;
294     }
295   }
296   AliDebug(1,"Track selected\n");
297
298   Int_t centralitybin = track->IsPbPb() ? track->GetCentrality() : -2;
299   Float_t fCentralityLimitsdefault[12]= {0.,5.,10., 20., 30., 40., 50., 60.,70.,80., 90., 100.};
300   Float_t centrality=-1;
301   if(centralitybin>=0) centrality=fCentralityLimitsdefault[centralitybin]+1;
302   AliDebug(2, Form("Just before cutting Electron effi: %f %i %i %f\n", fElectronEfficiency,track->GetCentrality(),centralitybin,centrality));
303
304   AliTRDPIDResponse::ETRDPIDMethod fTRDPIDMethod = AliTRDPIDResponse::kLQ1D;
305   if(fTRD2DPID) fTRDPIDMethod = AliTRDPIDResponse::kLQ2D;
306
307  if(fkPIDResponse->IdentifiedAsElectronTRD(track->GetRecTrack(),fElectronEfficiency,centrality,fTRDPIDMethod)){
308       AliDebug(2, Form("Electron effi: %f %i %i %f %i\n", fElectronEfficiency,track->GetCentrality(),centralitybin,centrality,fTRDPIDMethod));
309       if(pidqa) pidqa->ProcessTrack(track, AliHFEpid::kTRDpid, AliHFEdetPIDqa::kAfterPID); 
310       AliDebug(1,"PID qa done for step after\n");
311       return 11;
312   } else return 211;
313
314
315
316 }
317
318 //___________________________________________________________________
319 Double_t AliHFEpidTRD::GetTRDthresholds(Double_t p, UInt_t nTracklets) const { 
320   //
321   // Return momentum dependent and electron efficiency dependent TRD thresholds
322   // Determine threshold based on the number of tracklets on the fly, electron efficiency not modified
323   // 
324   Double_t threshParams[4];
325   AliDebug(1, Form("Select cut for %d tracklets\n", nTracklets));
326   // Get threshold paramters for the given number of tracklets from OADB container
327   AliHFEOADBThresholdsTRD *thresholds = dynamic_cast<AliHFEOADBThresholdsTRD *>(fOADBThresholds->GetObject(fRunNumber));
328   if(!thresholds){
329     AliDebug(1, Form("Thresholds for run %d not in the OADB", fRunNumber));
330     return 0.;
331   }
332   if(!thresholds->GetThresholdParameters(nTracklets, fElectronEfficiency, threshParams)){
333     AliDebug(1, "loading thresholds failed\n");
334     return 0.;
335   }
336   Double_t threshold = 1. - threshParams[0] - threshParams[1] * p - threshParams[2] * TMath::Exp(-threshParams[3] * p);
337   return TMath::Max(TMath::Min(threshold, 0.99), 0.2); // truncate the threshold upperwards to 0.999 and lowerwards to 0.2 and exclude unphysical values
338 }
339
340 //___________________________________________________________________
341 Double_t AliHFEpidTRD::GetTRDthresholds(Double_t p) const { 
342   //
343   // Return momentum dependent and electron efficiency dependent TRD thresholds
344   // 
345   Double_t threshold = 1. - fThreshParams[0] - fThreshParams[1] * p - fThreshParams[2] * TMath::Exp(-fThreshParams[3] * p);
346   return TMath::Max(TMath::Min(threshold, 0.99), 0.2); // truncate the threshold upperwards to 0.999 and lowerwards to 0.2 and exclude unphysical values
347 }
348
349
350 //___________________________________________________________________
351 Bool_t AliHFEpidTRD::InitParamsFromOADB(Int_t run){
352   //
353   // The name of the function says it all
354   //
355   AliHFEOADBThresholdsTRD *thresholds = dynamic_cast<AliHFEOADBThresholdsTRD *>(fOADBThresholds->GetObject(run));
356   if(!thresholds){
357     AliDebug(1, Form("Thresholds for run %d not in the OADB", run));
358     return kFALSE;
359   }
360   return thresholds->GetThresholdParameters(fNTracklets, fElectronEfficiency, fThreshParams);
361 }
362
363 //___________________________________________________________________
364 void AliHFEpidTRD::RenormalizeElPi(const Double_t * const likein, Double_t * const likeout) const {
365   //
366   // Renormalize likelihoods for electrons and pions neglecting the 
367   // likelihoods for protons, kaons and muons
368   //
369   memset(likeout, 0, sizeof(Double_t) * AliPID::kSPECIES);
370   Double_t norm = likein[AliPID::kElectron] + likein[AliPID::kPion];
371   if(norm == 0.) norm = 1.;   // Safety
372   likeout[AliPID::kElectron] = likein[AliPID::kElectron] / norm;
373   likeout[AliPID::kPion] = likein[AliPID::kPion] / norm;
374 }
375
376 //___________________________________________________________________
377 Double_t AliHFEpidTRD::GetElectronLikelihood(const AliVTrack *track, AliHFEpidObject::AnalysisType_t anaType) const {
378   //
379   // Get TRD likelihoods for ESD respectively AOD tracks
380   //
381   AliDebug(1, "Starting getting TRD likelihood\n");
382   Double_t pidProbs[AliPID::kSPECIES]; memset(pidProbs, 0, sizeof(Double_t) * AliPID::kSPECIES);
383   if(anaType == AliHFEpidObject::kESDanalysis){
384     const AliESDtrack *esdtrack = dynamic_cast<const AliESDtrack *>(track);
385     if(esdtrack) esdtrack->GetTRDpid(pidProbs);
386   } else {
387       if(fTRD2DPID) fkPIDResponse->ComputeTRDProbability(track, AliPID::kSPECIES, pidProbs,AliTRDPIDResponse::kLQ2D); 
388       else fkPIDResponse->ComputeTRDProbability(track, AliPID::kSPECIES, pidProbs,AliTRDPIDResponse::kLQ1D);
389   }
390   for(Int_t k=0; k < AliPID::kSPECIES; k++) {
391     AliDebug(2, Form("proba: %f for %d\n", pidProbs[k],k));
392   }
393   if(!IsRenormalizeElPi()) return pidProbs[AliPID::kElectron];
394   Double_t probsNew[AliPID::kSPECIES];
395   RenormalizeElPi(pidProbs, probsNew);
396   return probsNew[AliPID::kElectron];
397 }
398
399 //___________________________________________________________________
400 Double_t AliHFEpidTRD::GetP(const AliVParticle *track, AliHFEpidObject::AnalysisType_t anaType) const {
401   //
402   // Get the Momentum in the TRD
403   //
404   Double_t p = 0.;
405   if(anaType == AliHFEpidObject::kESDanalysis){
406     const AliESDtrack *esdtrack = dynamic_cast<const AliESDtrack *>(track);
407     if(esdtrack) p = esdtrack->GetOuterParam() ? esdtrack->GetOuterParam()->P() : esdtrack->P();
408   } else {
409     const AliAODTrack *aodtrack = dynamic_cast<const AliAODTrack *>(track);
410     if(aodtrack) p = aodtrack->P();
411   }
412   return p;
413 }
414
415 //___________________________________________________________________
416 Double_t AliHFEpidTRD::GetChargeLayer(const AliVParticle *track, UInt_t layer, AliHFEpidObject::AnalysisType_t anaType) const {
417   //
418   // Get the Charge in a single TRD layer
419   //
420   if(layer >= 6) return 0.;
421   Double_t charge = 0.;
422   if(anaType == AliHFEpidObject::kESDanalysis){
423     const AliESDtrack *esdtrack = dynamic_cast<const AliESDtrack *>(track);
424     if(esdtrack){
425       // Distinction between old and new reconstruction: in the new reconstruction, the total charge is stored in slice 0, slices 1 to 8 are used for the slices for 
426       // the neural network. 
427       if(fTotalChargeInSlice0)
428         charge = esdtrack->GetTRDslice(static_cast<UInt_t>(layer), 0);
429       else
430        for(Int_t islice = 0; islice < esdtrack->GetNumberOfTRDslices(); islice++) charge += esdtrack->GetTRDslice(static_cast<UInt_t>(layer), islice);
431     }
432   } else {
433     const AliAODTrack *aodtrack = dynamic_cast<const AliAODTrack *>(track);
434     AliAODPid *aoddetpid = aodtrack ? aodtrack->GetDetPid() : NULL;
435     if(aoddetpid){
436       if(fTotalChargeInSlice0)
437         charge = aoddetpid->GetTRDslices()[layer * aoddetpid->GetTRDnSlices()];
438       else
439        for(Int_t islice = 0; islice < aoddetpid->GetTRDnSlices(); islice++) charge += aoddetpid->GetTRDslices()[layer * aoddetpid->GetTRDnSlices() + islice];
440     }
441   }
442   return charge;
443 }
444
445 //___________________________________________________________________
446 void AliHFEpidTRD::GetTRDmomenta(const AliVTrack *track, Double_t *mom) const {
447   //
448   // Fill Array with momentum information at the TRD tracklet
449   //
450   for(Int_t itl = 0; itl < 6; itl++) 
451     mom[itl] = track->GetTRDmomentum(itl);
452 }
453
454 //___________________________________________________________________
455 Double_t AliHFEpidTRD::GetTRDSignalV1(const AliESDtrack *track, Float_t truncation) const {
456   //
457   // Calculation of the TRD Signal via truncated mean
458   // Method 1: Take all Slices available
459   // cut out 0s
460   // Order them in increasing order
461   // Cut out the upper third
462   // Calculate mean over the last 2/3 slices
463   //
464   const Int_t kNSlices = 48;
465   const Int_t kLastSlice = 6; // Slice 7 is taken out from the truncated mean calculation
466   const Double_t kVerySmall = 1e-12;
467   // Weight the slice to equalize the MPV of the dQ/dl-distribution per slice to the one in the first slice
468   // Pions are used as reference for the equalization
469   const Double_t kWeightSlice[8] = {1., 2.122, 1.8, 1.635, 1.595, 1.614, 1.16, 7.0};
470   const Double_t kWeightSliceNo0[8] = {1., 1., 1.271, 1.451, 1.531, 1.543, 1.553, 2.163};  // Weighting factors in case slice 0 stores the total charge
471   const Double_t *kWeightFactor = fTotalChargeInSlice0 ? kWeightSliceNo0 : kWeightSlice;
472   AliDebug(3, Form("Number of Tracklets: %d\n", track->GetTRDntrackletsPID()));
473   Double_t trdSlices[kNSlices], tmp[kNSlices];
474   Int_t indices[48];
475   Int_t icnt = 0;
476   for(Int_t idet = 0; idet < 6; idet++)
477     for(Int_t islice = fTotalChargeInSlice0 ? 1 : 0 ; islice <= kLastSlice; islice++){
478       AliDebug(2, Form("Chamber[%d], Slice[%d]: TRDSlice = %f", idet, islice, track->GetTRDslice(idet, islice)));
479       if(TMath::Abs(track->GetTRDslice(idet, islice)) < kVerySmall) continue;;
480       trdSlices[icnt++] = track->GetTRDslice(idet, islice) * kWeightFactor[islice];
481     }
482   AliDebug(1, Form("Number of Slices: %d\n", icnt));
483   if(icnt < 6) return 0.;   // We need at least 6 Slices for the truncated mean
484   TMath::Sort(icnt, trdSlices, indices, kFALSE);
485   memcpy(tmp, trdSlices, sizeof(Double_t) * icnt);
486   for(Int_t ien = 0; ien < icnt; ien++)
487     trdSlices[ien] = tmp[indices[ien]];
488   Double_t trdSignal = TMath::Mean(static_cast<Int_t>(static_cast<Float_t>(icnt) * truncation), trdSlices);
489   Double_t mom = track->GetOuterParam() ? track->GetOuterParam()->P() : -1;
490   AliDebug(3, Form("PID Meth. 1: p[%f], TRDSignal[%f]", mom, trdSignal));
491   return trdSignal;
492 }
493
494 //___________________________________________________________________
495 Double_t AliHFEpidTRD::GetTRDSignalV2(const AliESDtrack *track, Float_t truncation) const {
496   //
497   // Calculation of the TRD Signal via truncated mean
498   // Method 2: Take only first 5 slices per chamber
499   // Order them in increasing order
500   // Cut out upper half 
501   // Now do mean with the reamining 3 slices per chamber
502   //
503   const Double_t kWeightSlice[8] = {1., 2.122, 1.8, 1.635, 1.595, 1.614, 1.16, 7.0};
504   const Int_t kLayers = 6;
505   const Int_t kSlicesLow = 6;
506   const Int_t kSlicesHigh = 1;
507   const Double_t kVerySmall = 1e-12;
508   Double_t trdSlicesLowTime[kLayers*kSlicesLow], trdSlicesRemaining[kLayers*(kSlicesHigh + kSlicesLow)];
509   Int_t indices[kLayers*kSlicesLow];
510   Int_t cntLowTime=0, cntRemaining = 0;
511   for(Int_t idet = 0; idet < 6; idet++)
512     for(Int_t islice = fTotalChargeInSlice0 ? 1 : 0; islice < kSlicesLow+kSlicesHigh; islice++){
513       if(TMath::Abs(track->GetTRDslice(idet, islice)) < kVerySmall) continue;;
514       if(islice < kSlicesLow){
515         AliDebug(3, Form("Part 1, Det[%d], Slice[%d], TRDSlice: %f", idet, islice, track->GetTRDslice(idet, islice)));
516         trdSlicesLowTime[cntLowTime++] = track->GetTRDslice(idet, islice) * kWeightSlice[islice];
517       } else{
518         AliDebug(3, Form("Part 1, Det[%d], Slice[%d], TRDSlice: %f", idet, islice, track->GetTRDslice(idet, islice)));
519         trdSlicesRemaining[cntRemaining++] = track->GetTRDslice(idet, islice) * kWeightSlice[islice];
520       }
521     }
522   if(cntLowTime < 4 || cntRemaining < 2) return 0.; // Min. Number of Slices at high time is 2 (matches with 1 layer), for the truncated mean we need at least 4 Slices
523   TMath::Sort(cntLowTime, trdSlicesLowTime, indices, kFALSE);
524   // Fill the second array with the lower half of the first time bins
525   for(Int_t ien = 0; ien < static_cast<Int_t>(static_cast<Float_t>(cntLowTime) * truncation); ien++)
526     trdSlicesRemaining[cntRemaining++] = trdSlicesLowTime[indices[ien]];
527   Double_t trdSignal = TMath::Mean(cntRemaining, trdSlicesRemaining);
528   Double_t mom = track->GetOuterParam() ? track->GetOuterParam()->P() : -1;
529   AliDebug(3, Form("PID Meth. 2: p[%f], TRDSignal[%f]", mom, trdSignal));
530   return trdSignal;
531 }