1 /**************************************************************************
2 * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
16 ///////////////////////////////////////////////////////////////////////////
17 // AliAnalysisTaskSE for the extraction of the various histograms to
18 // study the pt spectra of identified hadrons:
19 // - log(dEdx)-log(dEdxBB) distributions for pions, kaons and protons in pt bins
20 // - Pt distributions of pions, kaons and protons with nSigma PID
22 // E. Biolcati, biolcati@to.infn.it
23 // L. Milano, milano@to.infn.it
24 // F. Prino, prino@to.infn.it
25 ///////////////////////////////////////////////////////////////////////////
35 #include <TParticle.h>
37 #include "AliAnalysisTaskSE.h"
38 #include "AliAnalysisManager.h"
39 #include "AliAnalysisDataContainer.h"
40 #include "AliESDEvent.h"
41 #include "AliESDInputHandler.h"
42 #include "AliESDtrack.h"
44 #include "AliMCEventHandler.h"
45 #include "AliMCEvent.h"
46 #include "AliPhysicsSelection.h"
47 #include "AliAnalysisTaskSEITSsaSpectra.h"
49 ClassImp(AliAnalysisTaskSEITSsaSpectra)
51 //________________________________________________________________________
52 AliAnalysisTaskSEITSsaSpectra::AliAnalysisTaskSEITSsaSpectra():
53 AliAnalysisTaskSE("Task CFits"),
80 Double_t xbins[kNbins+1]={0.08,0.10,0.12,0.14,0.16,0.18,0.20,0.25,0.30,0.35,0.40,0.45,0.50,0.55,0.60,0.65,0.70,0.75,0.80,0.85,0.90,0.95,1.0};
81 for(Int_t iBin=0; iBin<kNbins+1; iBin++) fPtBinLimits[iBin]=xbins[iBin];
82 fRandGener=new TRandom3(0);
84 DefineInput(0, TChain::Class());
85 DefineOutput(1, TList::Class());
86 Printf("end of AliAnalysisTaskSEITSsaSpectra");
89 //___________________________________________________________________________
90 AliAnalysisTaskSEITSsaSpectra::~AliAnalysisTaskSEITSsaSpectra(){
96 if(fRandGener) delete fRandGener;
99 //________________________________________________________________________
100 Double_t AliAnalysisTaskSEITSsaSpectra::CookdEdx(Double_t *s){
101 // truncated mean for the dEdx
103 Double_t dedx[4]={0.,0.,0.,0.};
104 for (Int_t il=0; il<4; il++) { // count good (>0) dE/dx values
110 if(nc<fMinNdEdxSamples) return -1.;
113 Int_t swap; // sort in ascending order
116 for (Int_t i=0; i<nc-1; i++) {
117 if (dedx[i]<=dedx[i+1]) continue;
125 Double_t sumamp=0,sumweight=0;
126 Double_t weight[4]={1.,1.,0.,0.};
127 if(nc==3) weight[1]=0.5;
128 else if(nc<3) weight[1]=0.;
129 for (Int_t i=0; i<nc; i++) {
130 sumamp+= dedx[i]*weight[i];
131 sumweight+=weight[i];
133 return sumamp/sumweight;
137 //________________________________________________________________________
138 Bool_t AliAnalysisTaskSEITSsaSpectra::DCAcut(Double_t impactXY, Double_t impactZ, Double_t pt, Bool_t optMC){
139 // cut on transverse impact parameter updaated on 20-5-2010
140 // from the study of L. Milano, F. Prino on the ITS standalone tracks
141 // using the common binning of the TPC tracks
145 xyP[0]=88.63;//SIMpass4a12
153 xyP[0]=85.28;//DATApass6
160 Double_t xySigma = xyP[0] + xyP[1]/TMath::Power(TMath::Abs(pt),xyP[2]);
161 Double_t xyMax = fNSigmaDCAxy*xySigma; //in micron
162 if((TMath::Abs(impactXY)*10000)>xyMax) return kFALSE;
164 Double_t zSigma = zP[0] + zP[1]/TMath::Power(TMath::Abs(pt),zP[2]);
165 Double_t zMax = fNSigmaDCAz*zSigma; //in micron
166 if((TMath::Abs(impactZ)*10000)>zMax) return kFALSE;
171 //________________________________________________________________________
172 Double_t AliAnalysisTaskSEITSsaSpectra::Eta2y(Double_t pt, Double_t m, Double_t eta){
173 Double_t mt = TMath::Sqrt(m*m + pt*pt);
174 return TMath::ASinH(pt/mt*TMath::SinH(eta));
178 //________________________________________________________________________
179 Double_t AliAnalysisTaskSEITSsaSpectra::BetheBloch(Double_t bg,Bool_t optMC) {
180 // BB PHOBOS parametrization tuned by G. Ortona on 900 GeV pp data of 2009
182 if(optMC){//Double_t par[5]={139.1,23.36,0.06052,0.2043,-0.0004999};
189 //Double_t par[5]={5.33458e+04,1.65303e+01,2.60065e-03,3.59533e-04,7.51168e-05};}
196 Double_t beta = bg/TMath::Sqrt(1.+ bg*bg);
197 Double_t gamma=bg/beta;
199 if(bg<par[2]) eff=(bg-par[3])*(bg-par[3])+par[4];
200 else eff=(par[2]-par[3])*(par[2]-par[3])+par[4];
201 return (par[1]+2.0*TMath::Log(gamma)-beta*beta)*(par[0]/(beta*beta))*eff;
205 //________________________________________________________________________
206 void AliAnalysisTaskSEITSsaSpectra::UserCreateOutputObjects(){
207 fOutput = new TList();
209 fOutput->SetName("Spiderman");
211 fHistNEvents = new TH1F("fHistNEvents", "Number of processed events",6,0.5,6.5);
212 fHistNEvents->Sumw2();
213 fHistNEvents->SetMinimum(0);
214 fOutput->Add(fHistNEvents);
216 fHistNTracks = new TH1F("fHistNTracks", "Number of ITSsa tracks",20,0.5,20.5);
217 fHistNTracks->Sumw2();
218 fHistNTracks->SetMinimum(0);
219 fOutput->Add(fHistNTracks);
221 //binning for the histogram
222 const Int_t hnbins=400;
223 Double_t hxmin = 0.01;
225 Double_t hlogxmin = TMath::Log10(hxmin);
226 Double_t hlogxmax = TMath::Log10(hxmax);
227 Double_t hbinwidth = (hlogxmax-hlogxmin)/hnbins;
228 Double_t hxbins[hnbins+1];
230 for (Int_t i=1;i<=hnbins;i++) {
231 hxbins[i] = hxmin + TMath::Power(10,hlogxmin+i*hbinwidth);
234 fHistDEDX = new TH2F("fHistDEDX","",hnbins,hxbins,900,0,1000);
235 fOutput->Add(fHistDEDX);
237 fHistDEDXdouble = new TH2F("fHistDEDXdouble","",500,-5,5,900,0,1000);
238 fOutput->Add(fHistDEDXdouble);
241 fHistBeforeEvSel = new TH1F("fHistBeforeEvSel","fHistBeforeEvSel",kNbins,fPtBinLimits);
242 fHistAfterEvSel = new TH1F("fHistAfterEvSel","fHistAfterEvSel",kNbins,fPtBinLimits);
243 fOutput->Add(fHistBeforeEvSel);
244 fOutput->Add(fHistAfterEvSel);
248 for(Int_t j=0;j<3;j++){
249 fHistMCpos[j] = new TH1F(Form("fHistMCpos%d",j),Form("fHistMCpos%d",j),kNbins,fPtBinLimits);
250 fHistMCneg[j] = new TH1F(Form("fHistMCneg%d",j),Form("fHistMCneg%d",j),kNbins,fPtBinLimits);
251 fOutput->Add(fHistMCneg[j]);
252 fOutput->Add(fHistMCpos[j]);
256 for(Int_t j=0;j<3;j++){
257 fHistMCposBefEvSel[j] = new TH1F(Form("fHistMCposBefEvSel%d",j),Form("fHistMCposBefEvSel%d",j),kNbins,fPtBinLimits);
258 fHistMCnegBefEvSel[j] = new TH1F(Form("fHistMCnegBefEvSel%d",j),Form("fHistMCnegBefEvSel%d",j),kNbins,fPtBinLimits);
259 fOutput->Add(fHistMCnegBefEvSel[j]);
260 fOutput->Add(fHistMCposBefEvSel[j]);
263 for(Int_t i=0; i<4; i++){
264 fHistCharge[i] = new TH1F(Form("fHistChargeLay%d",i),Form("fHistChargeLay%d",i),100,0,300);
265 fOutput->Add(fHistCharge[i]);
268 for(Int_t i=0; i<kNbins; i++){
269 fHistPosPi[i] = new TH1F(Form("fHistPosPi%d",i),Form("fHistPosPi%d",i),175,-3.5,3.5);
270 fHistPosK[i] = new TH1F(Form("fHistPosK%d",i),Form("fHistPosK%d",i),175,-3.5,3.5);
271 fHistPosP[i] = new TH1F(Form("fHistPosP%d",i),Form("fHistPosP%d",i),175,-3.5,3.5);
272 fHistNegPi[i] = new TH1F(Form("fHistNegPi%d",i),Form("fHistNegPi%d",i),175,-3.5,3.5);
273 fHistNegK[i] = new TH1F(Form("fHistNegK%d",i),Form("fHistNegK%d",i),175,-3.5,3.5);
274 fHistNegP[i] = new TH1F(Form("fHistNegP%d",i),Form("fHistNegP%d",i),175,-3.5,3.5);
276 fHistDCAPosPi[i] = new TH1F(Form("fHistDCAPosPi%d",i),Form("fHistDCAPosPi%d",i),2000,-1,1); //DCA distr.
277 fHistDCAPosK[i] = new TH1F(Form("fHistDCAPosK%d",i),Form("fHistDCAPosK%d",i),2000,-1,1);
278 fHistDCAPosP[i] = new TH1F(Form("fHistDCAPosP%d",i),Form("fHistDCAPosP%d",i),2000,-1,1);
279 fHistDCANegPi[i] = new TH1F(Form("fHistDCANegPi%d",i),Form("fHistDCANegPi%d",i),2000,-1,1);
280 fHistDCANegK[i] = new TH1F(Form("fHistDCANegK%d",i),Form("fHistDCANegK%d",i),2000,-1,1);
281 fHistDCANegP[i] = new TH1F(Form("fHistDCANegP%d",i),Form("fHistDCANegP%d",i),2000,-1,1);
283 fHistMCPosPi[i] = new TH1F(Form("fHistMCPosPi%d",i),Form("fHistMCPosPi%d",i),175,-3.5,3.5); //MC truth
284 fHistMCPosK[i] = new TH1F(Form("fHistMCPosK%d",i),Form("fHistMCPosK%d",i),175,-3.5,3.5);
285 fHistMCPosP[i] = new TH1F(Form("fHistMCPosP%d",i),Form("fHistMCPosP%d",i),175,-3.5,3.5);
286 fHistMCNegPi[i] = new TH1F(Form("fHistMCNegPi%d",i),Form("fHistMCNegPi%d",i),175,-3.5,3.5);
287 fHistMCNegK[i] = new TH1F(Form("fHistMCNegK%d",i),Form("fHistMCNegK%d",i),175,-3.5,3.5);
288 fHistMCNegP[i] = new TH1F(Form("fHistMCNegP%d",i),Form("fHistMCNegP%d",i),175,-3.5,3.5);
289 fOutput->Add(fHistPosPi[i]);
290 fOutput->Add(fHistPosK[i]);
291 fOutput->Add(fHistPosP[i]);
292 fOutput->Add(fHistNegPi[i]);
293 fOutput->Add(fHistNegK[i]);
294 fOutput->Add(fHistNegP[i]);
296 fOutput->Add(fHistDCAPosPi[i]);//DCA distr.
297 fOutput->Add(fHistDCAPosK[i]);
298 fOutput->Add(fHistDCAPosP[i]);
299 fOutput->Add(fHistDCANegPi[i]);
300 fOutput->Add(fHistDCANegK[i]);
301 fOutput->Add(fHistDCANegP[i]);
303 fOutput->Add(fHistMCPosPi[i]);//MC truth
304 fOutput->Add(fHistMCPosK[i]);
305 fOutput->Add(fHistMCPosP[i]);
306 fOutput->Add(fHistMCNegPi[i]);
307 fOutput->Add(fHistMCNegK[i]);
308 fOutput->Add(fHistMCNegP[i]);
312 for(Int_t j=0;j<3;j++){
313 fHistPosNSigma[j] = new TH1F(Form("hHistPosNSigma%d",j),Form("hHistPosNSigma%d",j),kNbins,fPtBinLimits);
314 fHistNegNSigma[j] = new TH1F(Form("hHistNegNSigma%d",j),Form("hHistNegNSigma%d",j),kNbins,fPtBinLimits);
315 fHistPosNSigmaPrim[j] = new TH1F(Form("hHistPosNSigmaPrim%d",j),Form("hHistPosNSigmaPrim%d",j),kNbins,fPtBinLimits);
316 fHistNegNSigmaPrim[j] = new TH1F(Form("hHistNegNSigmaPrim%d",j),Form("hHistNegNSigmaPrim%d",j),kNbins,fPtBinLimits);
317 fHistPosNSigmaPrimMC[j] = new TH1F(Form("hHistPosNSigmaPrimMC%d",j),Form("hHistPosNSigmaPrimMC%d",j),kNbins,fPtBinLimits);
318 fHistNegNSigmaPrimMC[j] = new TH1F(Form("hHistNegNSigmaPrimMC%d",j),Form("hHistNegNSigmaPrimMC%d",j),kNbins,fPtBinLimits);
319 fOutput->Add(fHistPosNSigma[j]);
320 fOutput->Add(fHistNegNSigma[j]);
321 fOutput->Add(fHistPosNSigmaPrim[j]);
322 fOutput->Add(fHistNegNSigmaPrim[j]);
323 fOutput->Add(fHistPosNSigmaPrimMC[j]);
324 fOutput->Add(fHistNegNSigmaPrimMC[j]);
327 fNtupleNSigma = new TNtuple("fNtupleNSigma","fNtupleNSigma","p:pt:dedx:ncls:sign:run:eta:impactXY:impactZ:isph:pdgcode:mfl");
328 fOutput->Add(fNtupleNSigma);
329 fNtupleMC = new TNtuple("fNtupleMC","fNtupleMC","ptMC:pdgcode:signMC:etaMC:yMC:isph:evSel:run");
330 fOutput->Add(fNtupleMC);
332 Printf("end of CreateOutputObjects");
335 //________________________________________________________________________
336 void AliAnalysisTaskSEITSsaSpectra::UserExec(Option_t *){
338 fESD=(AliESDEvent*)InputEvent();
340 printf("AliAnalysisTaskSDDRP::Exec(): bad ESD\n");
344 //binning for the dEdx distributions
347 Float_t pdgmass[3]={0.13957,0.493677,0.938272}; //mass for pi, K, P (Gev/c^2)
348 Int_t listcode[3]={211,321,2212};//code for pi, K, P (Gev/c^2)
350 Float_t ptMC=-999,yMC=-999,code=-999, signMC=-999,isph=-999,mfl=-999.;
351 Float_t impactXY=-999, impactZ=-999;
357 TParticlePDG *pdgPart=0;
372 /////////////////////
374 AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
376 Printf("ERROR: Could not retrieve MC event handler");
379 AliMCEvent* mcEvent = eventHandler->MCEvent();
381 Printf("ERROR: Could not retrieve MC event");
384 stack = mcEvent->Stack();
386 printf("ERROR: stack not available\n");
392 if(stack) nTrackMC = stack->GetNtrack();
393 const AliESDVertex *vtx = fESD->GetPrimaryVertexSPD();
396 fHistNEvents->Fill(1);
399 fHistNEvents->Fill(2);
400 if(vtx->GetNContributors()<0) evSel=0;
402 fHistNEvents->Fill(3);
403 if(TMath::Abs(vtx->GetZv())>10) evSel=0;
405 fHistNEvents->Fill(4);
406 if(vtx->GetZRes()>0.5) evSel=0;
408 fHistNEvents->Fill(5);
409 if(vtx->IsFromVertexerZ() && vtx->GetDispersion()>0.03) evSel=0;
410 else fHistNEvents->Fill(6);
416 /////first loop on stack, before event selection, filling MC ntuple
418 for(Int_t imc=0; imc<nTrackMC; imc++){
419 part = stack->Particle(imc);
420 if(!stack->IsPhysicalPrimary(imc))continue;//no secondary in the MC sample
422 pdgPart = part->GetPDG();
423 if(pdgPart->Charge()==0) continue; //no neutral particles
424 if(TMath::Abs(part->Eta()) > 0.9) continue; //pseudorapidity-acceptance cut
425 if(part->Energy() != TMath::Abs(part->Pz())) yMC = 0.5*TMath::Log((part->Energy()+part->Pz())/(part->Energy()-part->Pz()));
426 if(TMath::Abs(yMC) > fMaxY) continue; //rapidity cut
428 if(pdgPart->Charge()>0) signMC=1;
431 code=pdgPart->PdgCode();
435 if(TMath::Abs(code)==211 || TMath::Abs(code)==321 || TMath::Abs(code)==2212){
438 xntMC[indexMC++]=(Float_t)ptMC;
439 xntMC[indexMC++]=(Float_t)code;
440 xntMC[indexMC++]=(Float_t)signMC;
441 xntMC[indexMC++]=(Float_t)part->Eta();
442 xntMC[indexMC++]=(Float_t)yMC;
443 xntMC[indexMC++]=(Float_t)isph;
444 xntMC[indexMC++]=(Float_t)evSel;
445 xntMC[indexMC++]=(Float_t)fESD->GetRunNumber();
447 if(fFillNtuple) fNtupleMC->Fill(xntMC);
450 for(Int_t j=0; j<3; j++){
451 if(TMath::Abs(code)==listcode[j]){
452 if(signMC>0) fHistMCposBefEvSel[j]->Fill(TMath::Abs(ptMC));
453 else fHistMCnegBefEvSel[j]->Fill(TMath::Abs(ptMC));
457 for(Int_t j=0; j<3; j++){
458 if(TMath::Abs(code)==listcode[j]){
459 if(signMC>0) fHistMCpos[j]->Fill(TMath::Abs(ptMC));
460 else fHistMCneg[j]->Fill(TMath::Abs(ptMC));
469 for (Int_t iTrack=0; iTrack<fESD->GetNumberOfTracks(); iTrack++) {
474 track = (AliESDtrack*)fESD->GetTrack(iTrack);
475 if (!track) continue;
478 fHistNTracks->Fill(1);
479 status=track->GetStatus();
480 if((status&AliESDtrack::kITSpureSA)==0) continue; //its standalone
481 fHistNTracks->Fill(2);
482 if((status&AliESDtrack::kITSrefit)==0) continue; //its refit
483 fHistNTracks->Fill(3);
484 if(track->GetSign()==0.) continue; //no neutral particles
485 fHistNTracks->Fill(4);
489 UInt_t clumap = track->GetITSClusterMap();
491 for(Int_t il=0; il<2; il++) if(TESTBIT(clumap,il)) nSPD++;
492 if(nSPD<fMinSPDPts) continue;
493 fHistNTracks->Fill(5);
495 for(Int_t j=2;j<6;j++) if(TESTBIT(clumap,j)) count++;
496 if(count<fMinNdEdxSamples) continue; //at least 3 points on SSD/SDD
497 fHistNTracks->Fill(6);
498 //chisquare/nclusters
499 Int_t nclu=nSPD+count;
500 if(track->GetITSchi2()/nclu > fMaxChi2Clu) continue;
501 fHistNTracks->Fill(7);
502 //pseudorapidity and rapidity
503 if(TMath::Abs(track->Eta()) > 0.9) continue;
504 fHistNTracks->Fill(8);
506 //if(fMC) for(Int_t j=0;j<2;j++) s[j]*=3.34/5.43;//correction for SDD miscalibration of the MCpass4
507 track->GetITSdEdxSamples(s);
508 Double_t dedx = CookdEdx(s);
510 fHistNTracks->Fill(9);
513 Float_t pt = track->Pt();
515 for(Int_t m=0; m<kNbins; m++){
516 if(TMath::Abs(pt) > fPtBinLimits[m] && TMath::Abs(pt) < fPtBinLimits[m+1]){
521 track->GetImpactParameters(impactXY, impactZ);
524 //information from the MC kinematics
526 if(track->GetLabel()<0)isph=-1.;
527 if(track->GetLabel()>=0){
528 part = (TParticle*)stack->Particle(track->GetLabel());
529 pdgPart = part->GetPDG();
530 code = pdgPart->PdgCode();
531 if(stack->IsPhysicalPrimary(track->GetLabel()))isph=1.;
534 TParticle* moth = stack->Particle(part->GetFirstMother());
535 Float_t codemoth = TMath::Abs(moth->GetPdgCode());
536 mfl = Int_t (codemoth/ TMath::Power(10, Int_t(TMath::Log10(codemoth))));
542 xnt[index++]=(Float_t)track->GetP();
543 xnt[index++]=(Float_t)track->Pt();
544 xnt[index++]=(Float_t)dedx;
545 xnt[index++]=(Float_t)count;
546 xnt[index++]=(Float_t)track->GetSign();
547 xnt[index++]=(Float_t)fESD->GetRunNumber();
548 xnt[index++]=(Float_t)track->Eta();
549 xnt[index++]=(Float_t)impactXY;
550 xnt[index++]=(Float_t)impactZ;
551 xnt[index++]=(Float_t)isph;
552 xnt[index++]=(Float_t)code;
553 xnt[index]=(Float_t)mfl;
555 if(fFillNtuple) fNtupleNSigma->Fill(xnt);
560 Double_t y[3],bbtheo[3],logdiff[3];
561 Float_t p=track->GetP();
563 dedx=fRandGener->Gaus(dedx,fSmeardEdx*dedx);
564 p=fRandGener->Gaus(p,fSmearP*p);
567 for(Int_t i=0;i<3;i++){
568 y[i] = Eta2y(pt,pdgmass[i],track->Eta());
569 bbtheo[i]=BetheBloch(p/pdgmass[i],fMC);
570 logdiff[i]=TMath::Log(dedx) - TMath::Log(bbtheo[i]);
574 Int_t resocls=(Int_t)count-1;
577 Double_t min=999999.;
579 for(Int_t isp=0; isp<3; isp++){
580 Double_t bb=bbtheo[isp];
581 nsigmas[isp]=TMath::Abs((dedx-bb)/(resodedx[resocls]*bb));
582 if(nsigmas[isp]<min){
587 Double_t yPart=y[minPos];
589 if(min<fMinNSigma && yPart<fMaxY){
590 //DCA distributions, before the DCA cuts
591 if(theBin>=0 && theBin<kNbins){
592 if(track->GetSign()>0){
593 if(minPos==0) fHistDCAPosPi[theBin]->Fill(impactXY);
594 else if(minPos==1) fHistDCAPosK[theBin]->Fill(impactXY);
595 else if(minPos==2) fHistDCAPosP[theBin]->Fill(impactXY);
597 if(minPos==0) fHistDCANegPi[theBin]->Fill(impactXY);
598 else if(minPos==1) fHistDCANegK[theBin]->Fill(impactXY);
599 else if(minPos==2) fHistDCANegP[theBin]->Fill(impactXY);
604 //DCA cut on xy and z
605 if(!DCAcut(impactXY,impactZ,pt,fMC)) continue;
606 fHistNTracks->Fill(10);
608 if(min<fMinNSigma && yPart<fMaxY){
609 if(track->GetSign()>0) fHistPosNSigma[minPos]->Fill(pt);
610 else fHistNegNSigma[minPos]->Fill(pt);
613 if(track->GetSign()>0) fHistPosNSigmaPrim[minPos]->Fill(pt);
614 else fHistNegNSigmaPrim[minPos]->Fill(pt);
615 if(TMath::Abs(code)==listcode[minPos]){
616 if(track->GetSign()>0) fHistPosNSigmaPrimMC[minPos]->Fill(pt);
617 else fHistNegNSigmaPrimMC[minPos]->Fill(pt);
623 if(theBin>=0 && theBin<kNbins){
624 if(track->GetSign()>0){
625 if(TMath::Abs(y[0]) < fMaxY)fHistPosPi[theBin]->Fill(logdiff[0]);
626 if(TMath::Abs(y[1]) < fMaxY)fHistPosK[theBin]->Fill(logdiff[1]);
627 if(TMath::Abs(y[2]) < fMaxY)fHistPosP[theBin]->Fill(logdiff[2]);
629 if((TMath::Abs(y[0])<fMaxY) && (TMath::Abs(code)==211)) fHistMCPosPi[theBin]->Fill(logdiff[0]);
630 if((TMath::Abs(y[1])<fMaxY) && (TMath::Abs(code)==321)) fHistMCPosK[theBin]->Fill(logdiff[1]);
631 if((TMath::Abs(y[2])<fMaxY) && (TMath::Abs(code)==2212)) fHistMCPosP[theBin]->Fill(logdiff[2]);
634 if(TMath::Abs(y[0]) < fMaxY)fHistNegPi[theBin]->Fill(logdiff[0]);
635 if(TMath::Abs(y[1]) < fMaxY)fHistNegK[theBin]->Fill(logdiff[1]);
636 if(TMath::Abs(y[2]) < fMaxY)fHistNegP[theBin]->Fill(logdiff[2]);
638 if((TMath::Abs(y[0])<fMaxY) && (TMath::Abs(code)==211)) fHistMCNegPi[theBin]->Fill(logdiff[0]);
639 if((TMath::Abs(y[1])<fMaxY) && (TMath::Abs(code)==321)) fHistMCNegK[theBin]->Fill(logdiff[1]);
640 if((TMath::Abs(y[2])<fMaxY) && (TMath::Abs(code)==2212)) fHistMCNegP[theBin]->Fill(logdiff[2]);
646 //fill propaganda plot with dedx
647 fHistDEDX->Fill(track->GetP(),dedx);
648 fHistDEDXdouble->Fill(track->GetP()*track->GetSign(),dedx);
650 //fill charge distribution histo to check the calibration
651 for(Int_t j=0;j<4;j++){
653 fHistCharge[j]->Fill(s[j]);
659 Printf("............. end of Exec");
662 //________________________________________________________________________
663 void AliAnalysisTaskSEITSsaSpectra::Terminate(Option_t *) {
665 fOutput = dynamic_cast<TList*>(GetOutputData(1));
667 printf("ERROR: fOutput not available\n");
670 fHistNEvents = dynamic_cast<TH1F*>(fOutput->FindObject("fHistNEvents"));
671 fHistNTracks = dynamic_cast<TH1F*>(fOutput->FindObject("fHistNTracks"));
672 fHistDEDX = dynamic_cast<TH2F*>(fOutput->FindObject("fHistDEDX"));
673 fHistDEDXdouble = dynamic_cast<TH2F*>(fOutput->FindObject("fHistDEDXdouble"));
675 fHistBeforeEvSel = dynamic_cast<TH1F*>(fOutput->FindObject("fHistBeforeEvSel"));
676 fHistAfterEvSel = dynamic_cast<TH1F*>(fOutput->FindObject("fHistAfterEvSel"));
679 for(Int_t j=0;j<3;j++){
680 fHistMCpos[j] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("fHistMCpos%d",j)));
681 fHistMCneg[j] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("fHistMCneg%d",j)));
685 for(Int_t j=0;j<3;j++){
686 fHistMCposBefEvSel[j] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("fHistMCposBefEvSel%d",j)));
687 fHistMCnegBefEvSel[j] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("fHistMCnegBefEvSel%d",j)));
690 for(Int_t i=0; i<4; i++){
691 fHistCharge[i] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("fHistChargeLay%d",i)));
694 for(Int_t i=0; i<kNbins; i++){
695 fHistPosPi[i] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("fHistPosPi%d",i)));
696 fHistPosK[i] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("fHistPosK%d",i)));
697 fHistPosP[i] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("fHistPosP%d",i)));
698 fHistNegPi[i] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("fHistNegPi%d",i)));
699 fHistNegK[i] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("fHistNegK%d",i)));
700 fHistNegP[i] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("fHistNegP%d",i)));
702 fHistDCAPosPi[i] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("fHistDCAPosPi%d",i)));
703 fHistDCAPosK[i] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("fHistDCAPosK%d",i)));
704 fHistDCAPosP[i] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("fHistDCAPosP%d",i)));
705 fHistDCANegPi[i] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("fHistDCANegPi%d",i)));
706 fHistDCANegK[i] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("fHistDCANegK%d",i)));
707 fHistDCANegP[i] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("fHistDCANegP%d",i)));
711 fHistMCPosPi[i] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("fHistMCPosPi%d",i)));
712 fHistMCPosK[i] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("fHistMCPosK%d",i)));
713 fHistMCPosP[i] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("fHistMCPosP%d",i)));
714 fHistMCNegPi[i] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("fHistMCNegPi%d",i)));
715 fHistMCNegK[i] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("fHistMCNegK%d",i)));
716 fHistMCNegP[i] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("fHistMCNegP%d",i)));
720 for(Int_t j=0;j<3;j++){
721 fHistPosNSigma[j] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("hHistPosNSigma%d",j)));
722 fHistNegNSigma[j] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("hHistNegNSigma%d",j)));
723 fHistPosNSigmaPrim[j] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("hHistPosNSigmaPrim%d",j)));
724 fHistNegNSigmaPrim[j] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("hHistNegNSigmaPrim%d",j)));
725 fHistPosNSigmaPrimMC[j] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("hHistPosNSigmaPrimMC%d",j)));
726 fHistNegNSigmaPrimMC[j] = dynamic_cast<TH1F*>(fOutput->FindObject(Form("hHistNegNSigmaPrimMC%d",j)));
729 fNtupleNSigma = dynamic_cast<TNtuple*>(fOutput->FindObject("fNtupleNSigma"));
730 fNtupleMC = dynamic_cast<TNtuple*>(fOutput->FindObject("fNtupleMC"));
732 Printf("end of Terminate");