]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGDQ/dielectron/AliAnalysisTaskSingleParticle.cxx
Always delete TObjArrays created by TString::Tokenize (Ruben)
[u/mrichter/AliRoot.git] / PWGDQ / dielectron / AliAnalysisTaskSingleParticle.cxx
CommitLineData
5720c765 1/*************************************************************************
2* Copyright(c) 1998-2009, 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///////////////////////////////////////////////////////////////////////////
17// //
18// Analysis task for computing single particle efficiencies //
19// //
20///////////////////////////////////////////////////////////////////////////
21
22#include <TChain.h>
23#include <TH1D.h>
24#include <TList.h>
25#include <THashList.h>
26#include <TString.h>
27
28#include <AliPID.h>
29#include <AliCFContainer.h>
30#include <AliInputEventHandler.h>
31#include <AliESDInputHandler.h>
32#include <AliAODInputHandler.h>
33#include <AliAnalysisManager.h>
34#include <AliVEvent.h>
35#include <AliESDEvent.h>
36#include <AliESDv0.h>
37#include <AliESDv0Cuts.h>
38#include <AliESDv0KineCuts.h>
39#include <AliKFVertex.h>
40#include <AliESDfriendTrack.h>
41#include <AliESDfriend.h>
88e9bae6 42#include <AliTRDseedV1.h>
43#include <AliTRDcluster.h>
44#include <AliTRDtrackV1.h>
5720c765 45
46#include "AliDielectron.h"
47#include "AliDielectronHistos.h"
48#include "AliDielectronPair.h"
49#include "AliDielectronCF.h"
50#include "AliDielectronMC.h"
51#include "AliDielectronHistos.h"
52#include "AliAnalysisTaskSingleParticle.h"
53
54#include <iostream>
55using namespace std;
56
57ClassImp(AliAnalysisTaskSingleParticle)
58
59//_________________________________________________________________________________
60AliAnalysisTaskSingleParticle::AliAnalysisTaskSingleParticle() :
61 AliAnalysisTaskSE(),
62 fCfContainer(0x0),
63 fHistos(0x0),
64 fHistogramList(),
65 fSelectPhysics(kTRUE),
66 fTriggerMask(AliVEvent::kMB),
67 fRejectPileup(kFALSE),
68 fFillTRDfriendPH(kFALSE),
69 fEventFilter(0x0),
70 fTrackFilter(0x0),
71 fPairFilter(0x0),
72 fV0Cuts(0x0),
73 fLambdaFilter(0x0),
74 fK0sFilter(0x0),
75 fV0KineCuts(0x0),
76 fCFNVars(0),
77 fEventStat(0x0)
78{
79 //
80 // Constructor
81 //
82 for(Int_t i=0; i<kNMaxDimensions; ++i) {
83 fCFVarsEnabled[i] = -1; fCFVarsNbins[i] = 0;
84 fCFVarRanges[i][0] = 0.0; fCFVarRanges[i][1] = -1.0;
85 fCFVarBins[i] = "";
86 }
87}
88
89//_________________________________________________________________________________
90AliAnalysisTaskSingleParticle::AliAnalysisTaskSingleParticle(const char *name) :
91 AliAnalysisTaskSE(name),
92 fCfContainer(0x0),
93 fHistos(0x0),
94 fHistogramList(),
95 fSelectPhysics(kTRUE),
96 fTriggerMask(AliVEvent::kMB),
97 fRejectPileup(kFALSE),
98 fFillTRDfriendPH(kFALSE),
99 fEventFilter(0x0),
100 fTrackFilter(0x0),
101 fPairFilter(0x0),
102 fV0Cuts(0x0),
103 fLambdaFilter(0x0),
104 fK0sFilter(0x0),
105 fV0KineCuts(0x0),
106 fCFNVars(0),
107 fEventStat(0x0)
108{
109 //
110 // Constructor
111 //
112 for(Int_t i=0; i<kNMaxDimensions; ++i) {
113 fCFVarsEnabled[i] = -1; fCFVarsNbins[i] = 0;
114 fCFVarRanges[i][0] = 0.0; fCFVarRanges[i][1] = -1.0;
115 fCFVarBins[i] = "";
116 }
117 fHistogramList.SetName("QAhistos");
118 fHistogramList.SetOwner();
119 DefineInput(0, TChain::Class());
120 DefineOutput(1, AliCFContainer::Class());
121 DefineOutput(2, TList::Class());
122 DefineOutput(3, TH1D::Class());
123}
124
125
126//____________________________________________________________________
127AliAnalysisTaskSingleParticle::~AliAnalysisTaskSingleParticle()
128{
129 //
130 // Destructor
131 //
132 fHistogramList.SetOwner(kFALSE);
133 if(fHistos) delete fHistos;
134 delete fCfContainer;
135}
136
137
138//____________________________________________________________________
139void AliAnalysisTaskSingleParticle::AddCFVar(Int_t var, Int_t nbins, Double_t lowLim, Double_t highLim) {
140 //
141 // Configure variables for the CF container
142 //
143 if(fCFNVars>=kNMaxDimensions) return;
144 fCFVarsEnabled[fCFNVars] = var;
145 fCFVarsNbins[fCFNVars] = nbins;
146 fCFVarRanges[fCFNVars][0] = lowLim;
147 fCFVarRanges[fCFNVars][1] = highLim;
148 ++fCFNVars;
149}
150
151
152//____________________________________________________________________
153void AliAnalysisTaskSingleParticle::AddCFVar(Int_t var, const Char_t* bins) {
154 //
155 // Configure variables for the CF container
156 //
157 if(fCFNVars>=kNMaxDimensions) return;
158 fCFVarsEnabled[fCFNVars] = var;
159 fCFVarBins[fCFNVars] = bins;
160 ++fCFNVars;
161}
162
163
164//_________________________________________________________________________________
165void AliAnalysisTaskSingleParticle::UserCreateOutputObjects()
166{
167 //
168 // Initialize CF container
169 //
170 if(fCfContainer) return;
171 if(!fHistogramList.IsEmpty()) return;
172
173 if (!fEventStat){
174 fEventStat=new TH1D("hEventStat","Event statistics",4,-0.5,3.5);
175 fEventStat->GetXaxis()->SetBinLabel(1,"Before Phys. Sel.");
176 fEventStat->GetXaxis()->SetBinLabel(2,"After Phys. Sel.");
177 fEventStat->GetXaxis()->SetBinLabel(3,"After event filter");
178 fEventStat->GetXaxis()->SetBinLabel(4,"After pileup rejection");
179 }
180
181 //Bool_t hasMC = AliDielectronMC::Instance()->HasMC();
182
183 if(!fCfContainer) {
184 for(Int_t ivar=0; ivar<fCFNVars; ++ivar) {
185 if(fCFVarBins[ivar][0]!='\0') {
186 TObjArray* arr = fCFVarBins[ivar].Tokenize(",");
187 fCFVarsNbins[ivar] = arr->GetEntries()-1;
09d5920f 188 delete arr;
5720c765 189 }
190 }
191 fCFVarsNbins[fCFNVars] = AliPID::kSPECIES;
192 //
193 // If fFillTRDfriendPH is toggled then add some predefined variables to the CF
194 // Hardcoded variables and binning !! TODO: Implement them in the VarManager ??
195 // This container is filled for every TRD time bin, and every tracklet from a track
196 Double_t phLimits[2] = {0.0, 2000.}; Int_t phBins = 200;
197 Double_t detLimits[2] = {-0.5, 539.5}; Int_t detBins = 540;
198 const Int_t kNTrdMomBins = 17;
199 Double_t trdMomLimits[kNTrdMomBins+1] = {0.0, 0.5, 0.7, 0.9, 1.1, 1.3, 1.5, 1.7, 1.9, 2.1, 2.5, 3.0, 3.5, 4.0, 5.0, 6.0, 8.0, 10.0};
200 Int_t trdNtb = 30; Double_t trdTbLims[2] = {0.5, 30.5};
201 Int_t trdQtotNbins = 200; Double_t trdQtotLims[2] = {0.0, 10000.};
202 fCFVarsNbins[fCFNVars+1] = kNTrdMomBins;
203 fCFVarsNbins[fCFNVars+2] = detBins;
204 fCFVarsNbins[fCFNVars+3] = trdNtb;
205 fCFVarsNbins[fCFNVars+4] = phBins;
206 fCFVarsNbins[fCFNVars+5] = trdQtotNbins;
207
208 if(fCFNVars>0 || fFillTRDfriendPH) {
209 fCfContainer = new AliCFContainer("SingleParticle", "Single Particle CF", 1, (fFillTRDfriendPH ? fCFNVars+6 : fCFNVars+1), fCFVarsNbins);
210 for(Int_t ivar=0; ivar<fCFNVars; ++ivar) {
211 if(fCFVarBins[ivar][0]=='\0')
212 fCfContainer->SetBinLimits(ivar, fCFVarRanges[ivar][0], fCFVarRanges[ivar][1]);
213 else {
214 TObjArray* arr = fCFVarBins[ivar].Tokenize(",");
215 if(arr->GetEntries()-1>0) {
216 Double_t* binLims = new Double_t[arr->GetEntries()];
217 for(Int_t ib=0;ib<arr->GetEntries();++ib) {
218 TString binStr = arr->At(ib)->GetName();
219 binLims[ib] = binStr.Atof();
220 }
221 fCfContainer->SetBinLimits(ivar, binLims);
222 }
09d5920f 223 delete arr;
5720c765 224 }
225 fCfContainer->SetVarTitle(ivar, AliDielectronVarManager::GetValueName(fCFVarsEnabled[ivar]));
226 }
227 fCfContainer->SetBinLimits(fCFNVars, -0.5+AliPID::kElectron, 0.5+AliPID::kProton);
228 fCfContainer->SetVarTitle(fCFNVars, "specie");
229 if(fFillTRDfriendPH) {
230 fCfContainer->SetBinLimits(fCFNVars+1, trdMomLimits);
231 fCfContainer->SetVarTitle(fCFNVars+1, "TRD_trackletMom");
232 fCfContainer->SetBinLimits(fCFNVars+2, detLimits[0], detLimits[1]);
233 fCfContainer->SetVarTitle(fCFNVars+2, "TRD_detector");
234 fCfContainer->SetBinLimits(fCFNVars+3, trdTbLims[0], trdTbLims[1]);
235 fCfContainer->SetVarTitle(fCFNVars+3, "TRD_tb");
236 fCfContainer->SetBinLimits(fCFNVars+4, phLimits[0], phLimits[1]);
237 fCfContainer->SetVarTitle(fCFNVars+4, "TRD_PH");
238 fCfContainer->SetBinLimits(fCFNVars+5, trdQtotLims[0], trdQtotLims[1]);
239 fCfContainer->SetVarTitle(fCFNVars+5, "TRD_Qtot");
240 }
241 fCfContainer->SetStepTitle(0, "Tracking");
242 }
243 }
244
245 if(fHistos) {
246 fHistogramList.Add(const_cast<THashList*>(fHistos->GetHistogramList()));
247 }
248
249 if(fCfContainer) PostData(1, fCfContainer);
250 if(fHistos) PostData(2, &fHistogramList);
251 PostData(3, fEventStat);
252}
253
254//_________________________________________________________________________________
255void AliAnalysisTaskSingleParticle::UserExec(Option_t *)
256{
257 //
258 // Main loop. Called for every event
259 //
260
261 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
262 //Bool_t isESD=man->GetInputEventHandler()->IsA()==AliESDInputHandler::Class();
263 //Bool_t isAOD=man->GetInputEventHandler()->IsA()==AliAODInputHandler::Class();
264
265 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
266 if (!inputHandler) return;
267
268 if ( inputHandler->GetPIDResponse() ){
269 AliDielectronVarManager::SetPIDResponse( inputHandler->GetPIDResponse() );
270 } else {
271 AliFatal("This task needs the PID response attached to the input event handler!");
272 }
273 // Was event selected ?
274 UInt_t isSelected = AliVEvent::kAny;
275 if( fSelectPhysics && inputHandler && inputHandler->GetEventSelection() ) {
276 isSelected = inputHandler->IsEventSelected();
277 isSelected&=fTriggerMask;
278 }
279
280 //Before physics selection
281 fEventStat->Fill(0);
282 if (isSelected==0) {
283 PostData(3,fEventStat);
284 return;
285 }
286 //after physics selection
287 fEventStat->Fill(1);
288
289 //event filter
290 if (fEventFilter) {
291 if (!fEventFilter->IsSelected(InputEvent())) {PostData(3, fEventStat); return;}
292 }
293 fEventStat->Fill(2);
294
295 //pileup
296 if (fRejectPileup){
297 if (InputEvent()->IsPileupFromSPD(3,0.8,3.,2.,5.)) {PostData(3, fEventStat); return;}
298 }
299 fEventStat->Fill(3);
300
301 if(!fCfContainer) {PostData(3, fEventStat); return;}
302 //bz for AliKF
303 Double_t bz = InputEvent()->GetMagneticField();
304 AliKFParticle::SetField( bz );
305
306 AliDielectronPID::SetCorrVal((Double_t)InputEvent()->GetRunNumber());
307
308 AliESDEvent* esd = (AliESDEvent*)InputEvent();
309 AliDielectronVarManager::SetEvent(esd);
310
311 Double_t valuesPos[AliDielectronVarManager::kNMaxValues];
312 Double_t valuesNeg[AliDielectronVarManager::kNMaxValues];
313 Double_t valuesPair[AliDielectronVarManager::kNMaxValues];
314 AliDielectronVarManager::Fill(esd, valuesPos);
315 AliDielectronVarManager::Fill(esd, valuesNeg);
316 AliDielectronVarManager::Fill(esd, valuesPair);
317
318 if(fHistos && fHistos->GetHistogramList()->FindObject("Event"))
319 fHistos->FillClass("Event", AliDielectronVarManager::kNMaxValues, valuesPos);
320
321 const AliESDVertex *primaryVertex = esd->GetPrimaryVertex();
322 AliKFVertex primaryVertexKF(*primaryVertex);
323
324 fV0KineCuts->SetEvent(esd);
325 fV0KineCuts->SetPrimaryVertex(&primaryVertexKF);
326
327 Int_t pdgV0=0; Int_t pdgP=0; Int_t pdgN=0;
328 for(Int_t iV0=0; iV0<InputEvent()->GetNumberOfV0s(); ++iV0) { // loop over V0s
329 //cout << "iV0 = " << iV0 << endl;
330 AliESDv0 *v0 = esd->GetV0(iV0);
331
332 AliESDtrack* legPos = esd->GetTrack(v0->GetPindex());
333 AliESDtrack* legNeg = esd->GetTrack(v0->GetNindex());
334
335 if(legPos->GetSign() == legNeg->GetSign()) {
336 //cout << "V0 rejected: same sign legs" << endl;
337 continue;
338 }
339
340 //To avoid ghosts test of trunk for the refit
341 if(!(legPos->GetStatus() & AliESDtrack::kTPCrefit)) {
342 //cout << "pos leg rejected: no TPCrefit" << endl;
343 continue;
344 }
345 if(!(legNeg->GetStatus() & AliESDtrack::kTPCrefit)) {
346 //cout << "neg leg rejected: no TPCrefit" << endl;
347 continue;
348 }
349
350 Bool_t v0ChargesAreCorrect = (legPos->GetSign()==+1 ? kTRUE : kFALSE);
351 legPos = (!v0ChargesAreCorrect ? esd->GetTrack(v0->GetNindex()) : legPos);
352 legNeg = (!v0ChargesAreCorrect ? esd->GetTrack(v0->GetPindex()) : legNeg);
353
354 Bool_t good = fV0KineCuts->ProcessV0(v0, pdgV0, pdgP, pdgN);
355 if(!good) {
356 //cout << "V0KineCuts rejected V0" << endl;
357 continue;
358 }
359
360 if(!fFillTRDfriendPH) {
361 //cout << "No TRD friend filling" << endl;
362 if(pdgV0!=22) continue;
363 if(TMath::Abs(pdgN)!=11) continue;
364 if(TMath::Abs(pdgP)!=11) continue;
365 }
366 /*
367 // V0 standard cuts
368 if(fV0Cuts) {
369 TList v0List;
370 v0List.Add(v0);
371 v0List.Add(legPos); v0List.Add(legNeg);
372 v0List.Add(const_cast<AliESDVertex*>(primaryVertex));
373 if(!fV0Cuts->IsSelected(&v0List)) continue;
374 }*/
375
376 // additional track filtering
377 if(fTrackFilter && !fTrackFilter->IsSelected(legPos)) {
378 //cout << "pos leg rejected: track filter" << endl;
379 continue;
380 }
381 if(fTrackFilter && !fTrackFilter->IsSelected(legNeg)) {
382 //cout << "neg leg rejected: track filter" << endl;
383 continue;
384 }
385
386 AliKFParticle* posKF = (v0ChargesAreCorrect ? new AliKFParticle(*(v0->GetParamP()),pdgP) : new AliKFParticle(*(v0->GetParamN()),pdgN));
387 AliKFParticle* negKF = (v0ChargesAreCorrect ? new AliKFParticle(*(v0->GetParamN()),pdgN) : new AliKFParticle(*(v0->GetParamP()),pdgP));
388 AliDielectronPair pair;
389 pair.SetTracks(posKF, negKF, legPos, legNeg);
390 pair.SetType(1);
391 if(fPairFilter && !fPairFilter->IsSelected(&pair)) {
392 //cout << "diele pair rejected: pair filter" << endl;
393 continue;
394 }
395
396 // additional filtering on the KF pair (mass, chi2, etc.)
397 // Gamma conversion inclusion cuts
398 /*
399 AliKFParticle* posKFGammaEle = (v0ChargesAreCorrect ? new AliKFParticle(*(v0->GetParamP()),-11) : new AliKFParticle(*(v0->GetParamN()),-11));
400 AliKFParticle* negKFGammaEle = (v0ChargesAreCorrect ? new AliKFParticle(*(v0->GetParamN()),+11) : new AliKFParticle(*(v0->GetParamP()),+11));
401 AliDielectronPair gammaPair;
402 gammaPair.SetTracks(posKFGammaEle, negKFGammaEle, legPos, legNeg);
403 gammaPair.SetType(1);
404 if(fPairFilter && !fPairFilter->IsSelected(&gammaPair)) continue;
405 */
406 /*
407 // Lambda exclusion cuts
408 AliKFParticle* posKFLambdaPro = (v0ChargesAreCorrect ? new AliKFParticle(*(v0->GetParamP()),2212) : new AliKFParticle(*(v0->GetParamN()),2212));
409 AliKFParticle* negKFLambdaPio = (v0ChargesAreCorrect ? new AliKFParticle(*(v0->GetParamN()),-211) : new AliKFParticle(*(v0->GetParamP()),-211));
410 AliDielectronPair lambdaPair;
411 lambdaPair.SetTracks(posKFLambdaPro, negKFLambdaPio, legPos, legNeg);
412 lambdaPair.SetType(1);
413 if(fLambdaFilter && fLambdaFilter->IsSelected(&lambdaPair)) continue;
414 // Anti-Lambda exclusion cuts
415 AliKFParticle* posKFALambdaPio = (v0ChargesAreCorrect ? new AliKFParticle(*(v0->GetParamP()),211) : new AliKFParticle(*(v0->GetParamN()),211));
416 AliKFParticle* negKFALambdaPro = (v0ChargesAreCorrect ? new AliKFParticle(*(v0->GetParamN()),-2212) : new AliKFParticle(*(v0->GetParamP()),-2212));
417 AliDielectronPair alambdaPair;
418 alambdaPair.SetTracks(posKFALambdaPio, negKFALambdaPro, legPos, legNeg);
419 alambdaPair.SetType(1);
420 if(fLambdaFilter && fLambdaFilter->IsSelected(&alambdaPair)) continue;
421 // K0s exclusion cuts
422 AliKFParticle* posKFK0sPio = (v0ChargesAreCorrect ? new AliKFParticle(*(v0->GetParamP()),211) : new AliKFParticle(*(v0->GetParamN()),211));
423 AliKFParticle* negKFK0sPio = (v0ChargesAreCorrect ? new AliKFParticle(*(v0->GetParamN()),-211) : new AliKFParticle(*(v0->GetParamP()),-211));
424 AliDielectronPair k0sPair;
425 k0sPair.SetTracks(posKFK0sPio, negKFK0sPio, legPos, legNeg);
426 k0sPair.SetType(1);
427 if(fK0sFilter && fK0sFilter->IsSelected(&k0sPair)) continue;
428 */
429
430 // Fill histograms and the CF container
431 AliDielectronVarManager::Fill(legPos, valuesPos);
432 AliDielectronVarManager::Fill(legNeg, valuesNeg);
433
434 if(fHistos && fHistos->GetHistogramList()->FindObject("Track_Pos"))
435 fHistos->FillClass("Track_Pos", AliDielectronVarManager::kNMaxValues, valuesPos);
436 if(fHistos && fHistos->GetHistogramList()->FindObject("Track_Neg"))
437 fHistos->FillClass("Track_Neg", AliDielectronVarManager::kNMaxValues, valuesNeg);
438
439 AliDielectronVarManager::Fill(&pair, valuesPair);
440 if(fHistos && fHistos->GetHistogramList()->FindObject(Form("Pair_%s",AliDielectron::PairClassName(1))))
441 fHistos->FillClass(Form("Pair_%s",AliDielectron::PairClassName(1)), AliDielectronVarManager::kNMaxValues, valuesPair);
442
443 if(valuesPos[AliDielectronVarManager::kPOut]>=0.5)
444 FillContainer(0, valuesPos, (v0ChargesAreCorrect ? v0->GetPindex() : v0->GetNindex()), (v0ChargesAreCorrect ? pdgP : pdgN));
445 if(valuesNeg[AliDielectronVarManager::kPOut]>=0.5)
446 FillContainer(0, valuesNeg, (v0ChargesAreCorrect ? v0->GetNindex() : v0->GetPindex()), (v0ChargesAreCorrect ? pdgN : pdgP));
447 } // end loop over online V0s
448
449 //delete gammaPair;
450
451 PostData(1, fCfContainer);
452 PostData(2, &fHistogramList);
453 PostData(3, fEventStat);
454}
455
456//_________________________________________________________________________________
457void AliAnalysisTaskSingleParticle::FinishTaskOutput()
458{
459 //
460 //
461 //
462}
463
464
465//_________________________________________________________________________________
466void AliAnalysisTaskSingleParticle::FillContainer(Int_t step, const Double_t* values, Int_t trackId, Int_t pdg) {
467 //
468 // Fill the CF container
469 //
470 Double_t valuesCF[kNMaxDimensions];
471 for(Int_t i=0; i<fCFNVars; ++i) valuesCF[i] = values[fCFVarsEnabled[i]];
472
473 Double_t pid = -1.0;
474 if(TMath::Abs(pdg)==11) pid = AliPID::kElectron;
475 if(TMath::Abs(pdg)==13) pid = AliPID::kMuon;
476 if(TMath::Abs(pdg)==211) pid = AliPID::kPion;
477 if(TMath::Abs(pdg)==321) pid = AliPID::kKaon;
478 if(TMath::Abs(pdg)==2212) pid = AliPID::kProton;
479 valuesCF[fCFNVars] = pid;
480
481 if(fFillTRDfriendPH) {
482 AliESDfriendTrack* friendTrk = fESDfriend->GetTrack(trackId);
483 if(!friendTrk) return;
484 if(values[AliDielectronVarManager::kTRDntracklets]>0.001) {
485 TObject* o=0x0; Int_t ical = 0;
486 AliTRDtrackV1* trdTrack=0x0;
487 while(1) {
488 o = friendTrk->GetCalibObject(ical++);
489 if(!o) break;
490 TString objName = o->IsA()->GetName();
491 if(!objName.Contains("AliTRDtrackV1")) continue;
492 trdTrack = dynamic_cast<AliTRDtrackV1*>(o);
493 break;
494 }
495 if(!trdTrack) return;
496
497 Double_t charge = 0.0;
498 for(Int_t ipl = 0; ipl < 6; ipl++) { // loop over TRD layers
499 AliTRDseedV1 *tracklet = trdTrack->GetTracklet(ipl);
500 if(!tracklet) continue;
501 if(!tracklet->IsOK()) continue;
502 valuesCF[fCFNVars+1] = tracklet->GetMomentum();
503 valuesCF[fCFNVars+2] = tracklet->GetDetector();
504 charge = 0.0;
505 for(Int_t itb = 0; itb < AliTRDseedV1::kNtb; itb++){
506 AliTRDcluster *c = tracklet->GetClusters(itb);
507 AliTRDcluster *c1 = tracklet->GetClusters(itb + AliTRDseedV1::kNtb); // second pad row
508 if(c) charge += TMath::Abs(c->GetQ()); //
509 if(c1) charge += TMath::Abs(c1->GetQ());
510 }
511 valuesCF[fCFNVars+5] = charge;
512
513 for(Int_t itb = 0; itb < AliTRDseedV1::kNtb; itb++){
514 AliTRDcluster *c = tracklet->GetClusters(itb);
515 AliTRDcluster *c1 = tracklet->GetClusters(itb + AliTRDseedV1::kNtb); // second pad row
516 if(!(c || c1)) continue;
517 AliTRDcluster *cptr = (c ? c : c1);
518 Int_t tcal = cptr->GetLocalTimeBin();
519 Float_t sig = 0;
520 if(c) sig += TMath::Abs(c->GetQ()); //
521 if(c1) sig += TMath::Abs(c1->GetQ());
522 valuesCF[fCFNVars+3] = tcal;
523 valuesCF[fCFNVars+4] = sig;
524
525 fCfContainer->Fill(valuesCF, step);
526 } // end loop over time bins
527 } // end loop over tracklets
528 } // end if track has TRD tracklets
529 } // end if fill TRD friend PH
530 if(!fFillTRDfriendPH)
531 fCfContainer->Fill(valuesCF, step);
532}
533