1 #include "AliAnalysisNucleiInfo.h"
8 #include "AliInputEventHandler.h"
9 #include "AliAODEvent.h"
10 #include "AliESDEvent.h"
11 #include "AliVEvent.h"
12 #include "AliAODTrack.h"
13 #include "AliAODPid.h"
14 #include "AliCentrality.h"
23 #include "AliESDtrackCuts.h"
24 #include "AliAnalysisManager.h"
27 ClassImp(AliAnalysisNucleiInfo)
29 //_____________________________________________________________________________
30 AliAnalysisNucleiInfo::AliAnalysisNucleiInfo():
37 StartTimeTofRes(9999.9),
50 fList[0]->SetName("results");
53 fList[1]->SetName("results2");
55 //______________________________________________________________________________
56 AliAnalysisNucleiInfo::AliAnalysisNucleiInfo(const char *name):
57 AliAnalysisTaskSE(name),
63 StartTimeTofRes(9999.9),
77 DefineOutput(1, TList::Class());
78 fList[0]->SetName("results");
81 DefineOutput(2, TList::Class());
82 fList[1]->SetName("results2");
84 //_____________________________________________________________________________
85 AliAnalysisNucleiInfo::~AliAnalysisNucleiInfo()
87 if(fList[0]) delete fList[0];
88 if(fList[1]) delete fList[1];
90 //______________________________________________________________________________
91 void AliAnalysisNucleiInfo::UserCreateOutputObjects()
93 Char_t namePart[nPart][30];
94 snprintf(namePart[0],30,"e");
95 snprintf(namePart[1],30,"mu");
96 snprintf(namePart[2],30,"pi");
97 snprintf(namePart[3],30,"K");
98 snprintf(namePart[4],30,"p");
99 snprintf(namePart[5],30,"d");
100 snprintf(namePart[6],30,"t");
101 snprintf(namePart[7],30,"He3");
102 snprintf(namePart[8],30,"He4");
104 Char_t name[nSpec][30];
105 snprintf(name[0],20,"e_plus");
106 snprintf(name[1],20,"mu_plus");
107 snprintf(name[2],20,"pi_plus");
108 snprintf(name[3],20,"K_plus");
109 snprintf(name[4],20,"p");
110 snprintf(name[5],20,"d");
111 snprintf(name[6],20,"t");
112 snprintf(name[7],20,"He3");
113 snprintf(name[8],20,"He4");
114 snprintf(name[9],20,"e_minus");
115 snprintf(name[10],20,"mu_minus");
116 snprintf(name[11],20,"pi_minus");
117 snprintf(name[12],20,"K_minus");
118 snprintf(name[13],20,"p_bar");
119 snprintf(name[14],20,"d_bar");
120 snprintf(name[15],20,"t_bar");
121 snprintf(name[16],20,"He3_bar");
122 snprintf(name[17],20,"He4_bar");
126 for(Int_t iB=0;iB<nBconf;iB++) {
128 htemp[iB] = new TH1F("htemp","htemp (avoid the problem with the empty list...);B field",20,-10,10);
130 //htriggerbits[iB] = new TH1I("htriggerbits","htriggerbits; bits",10,-5,5);
131 htriggerbits[iB][0] = new TH1I("htriggerbits_0","trigger mask; bits",45,-5,40);
132 htriggerbits[iB][1] = new TH1I("htriggerbits_1","trigger bits (exclusive); bits",45,-5,40);
134 hZvertex[iB][0] = new TH1F("hZvertex_Selected","Vertex distribution of selected events;z vertex (cm)",240,-30,30);
135 hZvertex[iB][1] = new TH1F("hZvertex_Analyzed","Vertex distribution of analyzed events;z vertex (cm)",240,-30,30);
137 hEta[iB] = new TH1F("hEta_Analyzed","|#eta| distribution after the track cuts;#eta",200,-1.0,1.0);
139 hPhi[iB] = new TH1F("hPhi_Analyzed","#phi distribution after the track cuts;#phi (rad.)",90,0,6.3);//Each TRD supermodule is divided for 5 (DeltaPhi(TRD)=0.35 theoretical)
141 hNtrackAtTof[iB] = new TH1I("hNtrackAtTof","num. tracks when kTOF is required; Number of tracks",3000,0,3000);
143 hStartTimeRes[iB] = new TH1F("hStartTimeRes","hStartTimeRes;t_{0} (ps)",500,0,500);
145 //hbins[0]=500; hbins[1]=2000;
146 hbins[0]=500; hbins[1]=2000;//hbins[0]=100; hbins[1]=500
147 fdEdxVSp[iB][0] = new TH2F("fdEdxVSp_pos","dE/dx vs p (positive charge); p_{TPC}/z (GeV/c); dE/dx_{TPC} (a.u.)",hbins[0],0,10,hbins[1],0,1000);
148 fdEdxVSp[iB][1] = new TH2F("fdEdxVSp_neg","dE/dx vs p (negative charge); p_{TPC}/z (GeV/c); dE/dx_{TPC} (a.u.)",hbins[0],0,10,hbins[1],0,1000);
150 Char_t name_hDeDxExp[nPart][200];
151 Char_t title_hDeDxExp[nPart][200];
152 for(Int_t i=0;i<nPart;i++) {
153 snprintf(name_hDeDxExp[i],200,"hDeDxExp_%s",namePart[i]);
154 snprintf(title_hDeDxExp[i],200,"Expected dE/dx of %s in the TPC;p_{TPC}/z (GeV/c);dE/dx_{TPC} (a.u.)",namePart[i]);
155 hDeDxExp[iB][i] = new TProfile(name_hDeDxExp[i],title_hDeDxExp[i],200,0,10,0,1000,"");//,500,0,5,0,1000,""); toram
158 Char_t name_fNsigmaTpc[nSpec][200];
159 Char_t title_fNsigmaTpc[nSpec][200];
160 hbins[0]=200; hbins[1]=200;
161 for(Int_t i=0;i<nSpec;i++) {
162 snprintf(name_fNsigmaTpc[i],200,"NsigmaTpc_%s",name[i]);
163 snprintf(title_fNsigmaTpc[i],200,"NsigmaTpc_%s;p_{TPC}/z (GeV/c);n_{#sigma_{TPC}}^{%s}",name[i],name[i]);
164 fNsigmaTpc[iB][i] = new TH2F(name_fNsigmaTpc[i],title_fNsigmaTpc[i],hbins[0],0,10,hbins[1],-10,10);
167 hbins[0]=500; hbins[1]=520;//hbins[0]=200; hbins[1]=260;
168 fBetaTofVSp[iB][0] = new TH2F("fBetaTofVSp_pos","#beta_{TOF} vs p/z (positive charge);p(GeV/c);#beta_{TOF}",hbins[0],0,10,hbins[1],0.4,1.05);
169 fBetaTofVSp[iB][1] = new TH2F("fBetaTofVSp_neg","#beta_{TOF} vs p/z (negative charge);p(GeV/c);#beta_{TOF}",hbins[0],0,10,hbins[1],0.4,1.05);
171 Char_t name_hBetaExp[nPart][200];
172 Char_t title_hBetaExp[nPart][200];
173 for(Int_t i=0;i<nPart;i++) {
174 snprintf(name_hBetaExp[i],200,"hBetaTofVsP_Exp_%s",namePart[i]);
175 snprintf(title_hBetaExp[i],200,"Expected #beta_{TOF} vs p/z of %s;p/z (GeV/c); #beta_{TOF}",namePart[i]);
176 hBetaExp[iB][i] = new TProfile(name_hBetaExp[i],title_hBetaExp[i],200,0,10,0.4,1.05,"");
179 Char_t name_fNsigmaTof[2][nSpec][200];
180 Char_t title_fNsigmaTof[2][nSpec][200];
181 hbins[0]=200; hbins[1]=2000;//hbins[0]=200; hbins[1]=200;
182 for(Int_t i=0;i<nSpec;i++) {
183 snprintf(name_fNsigmaTof[0][i],200,"NsigmaTof_%s",name[i]);
184 snprintf(title_fNsigmaTof[0][i],200,"NsigmaTof_%s;p_{T}/z (GeV/c);n_{#sigma_{TOF}}^{%s}",name[i],name[i]);
186 snprintf(name_fNsigmaTof[1][i],200,"NsigmaTofWtpc_%s",name[i]);
187 snprintf(title_fNsigmaTof[1][i],200,"NsigmaTofWtpc_%s (with a 2#sigma TPC cut);p_{T}/z (GeV/c);n_{#sigma_{TOF}}^{%s}",name[i],name[i]);
189 for(Int_t it=0;it<2;it++) {
190 for(Int_t i=0;i<nSpec;i++) {
191 fNsigmaTof[iB][it][i] = new TH2F(name_fNsigmaTof[it][i],title_fNsigmaTof[it][i],hbins[0],0,10,hbins[1],-100,100);//,hbins[0],0,10,hbins[1],-10,10
196 Char_t name_fTofMinusExp[2][nSpec][200];
197 Char_t title_fTofMinusExp[2][nSpec][200];
198 hbins[0]=200; hbins[1]=2000;
200 for(Int_t i=0;i<nSpec;i++) {
201 snprintf(name_fTofMinusExp[0][i],200,"TofMinusExp_%s",name[i]);
202 snprintf(title_fTofMinusExp[0][i],200,"TofMinusExp_%s;p_{T}/z (GeV/c);tof-t_{exp}^{%s} (ps)",name[i],name[i]);
204 snprintf(name_fTofMinusExp[1][i],200,"TofMinusExpWtpc_%s",name[i]);
205 snprintf(title_fTofMinusExp[1][i],200,"TofMinusExpWtpc_%s (with a 2#sigma TPC cut);p_{T}/z (GeV/c);tof-t_{exp}^{%s} (ps)",name[i],name[i]);
207 for(Int_t it=0;it<2;it++) {
208 for(Int_t i=0;i<nSpec;i++) {
209 fTofMinusExp[iB][it][i] = new TH2F(name_fTofMinusExp[it][i],title_fTofMinusExp[it][i],hbins[0],0,10,hbins[1],-20000,20000);
213 Char_t name_h2DCAap[18][200];
214 Char_t title_h2DCAap[18][200];
216 for(Int_t iS=0;iS<nSpec;iS++) {
217 snprintf(name_h2DCAap[iS],200,"h2DCAap_%s",name[iS]);
218 snprintf(title_h2DCAap[iS],200,"h2DCA_%s in for p_{T}/z<1.5GeV/c;DCA_{xy} (cm);DCA_{z} (cm)",name[iS]);
219 if(iS==5 || iS==5+9) h2DCAap[iB][iS] = new TH2F(name_h2DCAap[iS],title_h2DCAap[iS],1750,-3.5,3.5,1750,-3.5,3.5);
220 else h2DCAap[iB][iS] = new TH2F(name_h2DCAap[iS],title_h2DCAap[iS],1,-3.5,3.5,1,-3.5,3.5);
223 fList[iB]->Add(htemp[iB]);
224 for(Int_t i=0;i<2;i++) fList[iB]->Add(htriggerbits[iB][i]);
225 for(Int_t i=0;i<2;i++) fList[iB]->Add(hZvertex[iB][i]);
226 fList[iB]->Add(hEta[iB]);
227 fList[iB]->Add(hPhi[iB]);
228 for(Int_t i=0;i<2;i++) fList[iB]->Add(fdEdxVSp[iB][i]);
229 for(Int_t i=0;i<nPart;i++) {
230 fList[iB]->Add(hDeDxExp[iB][i]);
232 for(Int_t i=0;i<nSpec;i++) {
233 fList[iB]->Add(fNsigmaTpc[iB][i]);
235 for(Int_t i=0;i<2;i++) fList[iB]->Add(fBetaTofVSp[iB][i]);
236 for(Int_t i=0;i<nPart;i++) {
237 fList[iB]->Add(hBetaExp[iB][i]);
239 fList[iB]->Add(hNtrackAtTof[iB]);
240 fList[iB]->Add(hStartTimeRes[iB]);
241 for(Int_t i=0;i<nSpec;i++) {
242 fList[iB]->Add(fNsigmaTof[iB][0][i]);
244 for(Int_t i=0;i<nSpec;i++) {
245 fList[iB]->Add(fNsigmaTof[iB][1][i]);
247 for(Int_t i=0;i<nSpec;i++) {
248 fList[iB]->Add(fTofMinusExp[iB][0][i]);
250 for(Int_t i=0;i<nSpec;i++) {
251 fList[iB]->Add(fTofMinusExp[iB][1][i]);
253 for(Int_t iS=0;iS<nSpec;iS++) {
254 if(iS==5 || iS==5+9) fList[iB]->Add(h2DCAap[iB][iS]);
258 PostData(1, fList[0]);
259 PostData(2, fList[1]);
263 //______________________________________________________________________________
264 void AliAnalysisNucleiInfo::UserExec(Option_t *)
267 // Called for each event
269 fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
270 fESD = dynamic_cast<AliESDEvent*>(InputEvent());
272 Printf("%s:%d AODEvent and ESDEvent not found in Input Manager",(char*)__FILE__,__LINE__);
276 if(fESD) fEvent = fESD;
279 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
280 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
281 fPIDResponse=inputHandler->GetPIDResponse();
283 //--------------------------Magnetic field polarity--------------------
284 Double_t fBfield=fEvent->GetMagneticField();
285 if(fBfield<0.0) iBconf=0;//B--
287 for(Int_t i=0;i<nBconf;i++) htemp[i]->Fill(fBfield);
289 //-------------------------zVertex determination of event----------------
290 Double_t zvtx = 9999.9;
291 const AliVVertex* vtxEVENT = fEvent->GetPrimaryVertex();
292 if(vtxEVENT->GetNContributors()>0) zvtx = vtxEVENT->GetZ();
294 hZvertex[iBconf][0]->Fill(zvtx);
296 //---------------------------EVENT CUTS-----------------------------
297 if(TMath::Abs(zvtx) < 10.0){
302 if(inputHandler->IsEventSelected() & AliVEvent::kMB) iTrigger = 0;
303 if(inputHandler->IsEventSelected() & AliVEvent::kCentral) iTrigger = 16;
304 if(inputHandler->IsEventSelected() & AliVEvent::kSemiCentral) iTrigger = 17;
305 //if((((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected()) & AliVEvent::kAny) iTrigger = 35;
307 if(iTriggerSel!=-99) {//if a dedicated trigger is required
308 if(iTrigger!=iTriggerSel) return;
311 for(Int_t i=0;i<32;i++) {
313 if(inputHandler->IsEventSelected() & bit) htriggerbits[iBconf][0]->Fill(i);
315 if(inputHandler->IsEventSelected() & AliVEvent::kAny) htriggerbits[iBconf][0]->Fill(35);
316 if(inputHandler->IsEventSelected() & AliVEvent::kAnyINT) htriggerbits[iBconf][0]->Fill(36);
318 htriggerbits[iBconf][1]->Fill(iTrigger);
320 hZvertex[iBconf][1]->Fill(zvtx);
322 Int_t nTracks = fEvent->GetNumberOfTracks();
324 //----------------------loop on the TRACKS-----------------------------
325 for(Int_t iT = 0; iT < nTracks; iT++) {
326 AliVTrack* track = (AliVTrack *) fEvent->GetTrack(iT);
332 //For the geometrical cuts
333 Double_t eta = track->Eta();
336 trkFlag = ((AliAODTrack *) track)->TestFilterBit(FilterBit);
337 //TestFilterBit(16) -- Standard Cuts with very loose DCA: GetStandardITSTPCTrackCuts2011(kFALSE) && SetMaxDCAToVertexXY(2.4) && SetMaxDCAToVertexZ(3.2) && SetDCaToVertex2D(kTRUE)
338 //TestFilterBit(32) (STARDARD) -- Standard Cuts with very tight DCA cut ( 7sigma^primaries: 7*(0.0015+0.0050/pt^1.1) ) : GetStandardITSTPCTrackCuts2011().
340 //-------------------------------------start TRACK CUTS--------------------------------
341 if ((track->Pt() < 0.2) || (eta<EtaLimit[0]) || (eta>EtaLimit[1]) || !trkFlag)
344 //Vertex determination
345 Double_t b[2] = {-99., -99.};
346 Double_t bCov[3] = {-99., -99., -99.};
347 if (!track->PropagateToDCA(fEvent->GetPrimaryVertex(), fEvent->GetMagneticField(), 100., b, bCov))
350 Double_t DCAxy = b[0];
351 Double_t DCAz = b[1];
354 Bool_t isDCAxyCut=kFALSE;
355 if(TMath::Abs(DCAxy)<DCAxyCut) isDCAxyCut=kTRUE;
358 Bool_t isDCAzCut=kFALSE;
359 if(TMath::Abs(DCAz)<DCAzCut) isDCAzCut=kTRUE;
361 if (!isDCAxyCut || !isDCAzCut)
364 //-------------------------------------end TRACK CUTS----------------------------------
366 //-------------------------------------Track info--------------------------------------
367 Double_t phi= track->Phi();
368 Double_t charge = (Double_t)track->Charge();
369 Double_t p = track->P();
370 Double_t pt = track->Pt();
371 Double_t dedx = track->GetTPCsignal();
372 Double_t pTPC = track->GetTPCmomentum();
373 Double_t tof = track->GetTOFsignal()-fPIDResponse->GetTOFResponse().GetStartTime(p);
375 //Double_t M2 = 999.9;
376 //Double_t Z2 = 999.9;
378 kTOF = (track->GetStatus() & AliVTrack::kTOFout) && (track->GetStatus() & AliVTrack::kTIME);
380 //-----------------------------TPC info------------------------------
381 Double_t nsigmaTPC[nPart];
382 Double_t expdedx[nPart];
384 Int_t stdFlagPid[9] = {1,2,4,8,16,32,64,128,256};//e,mu,pi,K,p,d,t,He3,He4
387 for(Int_t iS=0;iS<9;iS++){
388 nsigmaTPC[iS] = fPIDResponse->NumberOfSigmasTPC(track,(AliPID::EParticleType) iS);
389 //TPC identification:
390 if(TMath::Abs(nsigmaTPC[iS])<NsigmaTpcCut) {
391 FlagPid += ((Int_t)TMath::Power(2,iS));
395 hEta[iBconf]->Fill(eta);
396 hPhi[iBconf]->Fill(phi);
399 for(Int_t iS=0;iS<9;iS++){
400 expdedx[iS] = fPIDResponse->GetTPCResponse().GetExpectedSignal(track, (AliPID::EParticleType) iS, AliTPCPIDResponse::kdEdxDefault, kTRUE);
401 hDeDxExp[iBconf][iS]->Fill(pTPC,expdedx[iS]);
402 nsigmaTPC[iS] = fPIDResponse->NumberOfSigmasTPC(track,(AliPID::EParticleType) iS);
403 //fNsigmaTpc[iBconf][iS]->Fill(pTPC,nsigmaTPC[iS]);
404 if(charge>0) {//positive particle
405 fNsigmaTpc[iBconf][iS]->Fill(pTPC,nsigmaTPC[iS]);
407 else {//negative particle
408 fNsigmaTpc[iBconf][iS+nPart]->Fill(pTPC,nsigmaTPC[iS]);
412 if(charge>0) fdEdxVSp[iBconf][0]->Fill(pTPC,dedx);
413 else fdEdxVSp[iBconf][1]->Fill(pTPC,dedx);
416 for(Int_t iS=0;iS<9;iS++){
417 if(FlagPid & stdFlagPid[iS]) {
420 h2DCAap[iBconf][iS]->Fill(DCAxy,DCAz);
421 h2DCAap[iBconf][iS]->Fill(-DCAxy,-DCAz);
424 h2DCAap[iBconf][iS+nPart]->Fill(DCAxy,DCAz);
425 h2DCAap[iBconf][iS+nPart]->Fill(-DCAxy,-DCAz);
431 //-----------------------------TOF info------------------------------
433 Double_t massOverZ[9] = {0.000511,0.105658,0.139570,0.493677,0.938272,1.875612859,2.808921005,1.404195741,1.863689620};
435 //----------------------------------------kTOF available-----------------------------
439 Float_t startTimeRes = -9.9;
440 startTimeRes = fPIDResponse->GetTOFResponse().GetStartTimeRes(p);
442 if(startTimeRes>StartTimeTofRes) continue;
444 hStartTimeRes[iBconf]->Fill(startTimeRes);
445 hNtrackAtTof[iBconf]->Fill(nTracks);
447 Double_t exptimes[9];
448 track->GetIntegratedTimes(exptimes);
449 //Integrated times of the Nuclei:
450 for(Int_t iN=5;iN<9;iN++) {
451 exptimes[iN] = exptimes[4]*exptimes[4]*(massOverZ[iN]*massOverZ[iN]/p/p+1)/(massOverZ[4]*massOverZ[4]/p/p+1);
452 exptimes[iN] = TMath::Sqrt(exptimes[iN]);
456 beta=beta/tof;//beta = L/tof/c = t_e/tof
458 Double_t nsigmaTOF[9];
459 for(Int_t iS=0;iS<9;iS++){
460 nsigmaTOF[iS] = fPIDResponse->NumberOfSigmasTOF(track,(AliPID::EParticleType) iS);
462 hBetaExp[iBconf][iS]->Fill(p,exptimes[0]/exptimes[iS]);
463 fNsigmaTof[iBconf][0][iS]->Fill(pt,nsigmaTOF[iS]);
466 hBetaExp[iBconf][iS+nPart]->Fill(p,exptimes[0]/exptimes[iS]);
467 fNsigmaTof[iBconf][0][iS+nPart]->Fill(pt,nsigmaTOF[iS]);
471 if(charge>0) fBetaTofVSp[iBconf][0]->Fill(p,beta);
472 else fBetaTofVSp[iBconf][1]->Fill(p,beta);
474 for(Int_t iS=0;iS<9;iS++){
476 fTofMinusExp[iBconf][0][iS]->Fill(pt,tof-exptimes[iS]);
477 if(FlagPid & stdFlagPid[iS]) {
478 fTofMinusExp[iBconf][1][iS]->Fill(pt,tof-exptimes[iS]);
479 fNsigmaTof[iBconf][1][iS]->Fill(pt,nsigmaTOF[iS]);
483 fTofMinusExp[iBconf][0][iS+nPart]->Fill(pt,tof-exptimes[iS]);
484 if(FlagPid & stdFlagPid[iS]) {
485 fTofMinusExp[iBconf][1][iS+nPart]->Fill(pt,tof-exptimes[iS]);
486 fNsigmaTof[iBconf][1][iS+nPart]->Fill(pt,nsigmaTOF[iS]);
491 }//end kTOF available
493 }//end loop on the events
496 //_____________________________________________________________________________
497 void AliAnalysisNucleiInfo::Terminate(Option_t *)
500 Printf("Terminate()");