1 /*************************************************************************
\r
2 * Copyright(c) 1998-2008,ALICE Experiment at CERN,All rights reserved. *
\r
4 * Author: The ALICE Off-line Project. *
\r
5 * Contributors are mentioned in the code where appropriate. *
\r
7 * Permission to use,copy,modify and distribute this software and its *
\r
8 * documentation strictly for non-commercial purposes is hereby granted *
\r
9 * without fee,provided that the above copyright notice appears in all *
\r
10 * copies and that both the copyright notice and this permission notice *
\r
11 * appear in the supporting documentation. The authors make no claims *
\r
12 * about the suitability of this software for any purpose. It is *
\r
13 * provided "as is" without express or implied warranty. *
\r
14 **************************************************************************/
\r
16 /////////////////////////////////////////////////////
\r
17 // AliAnalysisTaskFlowStrange:
\r
18 // Analysis task to select K0/Lambda candidates for flow analysis.
\r
19 // Authors: Cristian Ivan (civan@cern.ch)
\r
20 // Carlos Perez (cperez@cern.ch)
\r
21 // Pawel Debski (pdebski@cern.ch)
\r
22 //////////////////////////////////////////////////////
\r
30 #include "TProfile.h"
\r
31 #include "TProfile2D.h"
\r
32 #include "TVector3.h"
\r
33 #include "TStopwatch.h"
\r
36 #include "AliAnalysisManager.h"
\r
37 #include "AliInputEventHandler.h"
\r
39 #include "AliVVertex.h"
\r
40 #include "AliVVZERO.h"
\r
41 #include "AliStack.h"
\r
42 #include "AliMCEvent.h"
\r
44 #include "AliESDEvent.h"
\r
45 #include "AliESDtrack.h"
\r
46 #include "AliESDVertex.h"
\r
47 #include "AliESDv0.h"
\r
48 #include "AliESDtrackCuts.h"
\r
50 #include "AliAODEvent.h"
\r
51 #include "AliAODTrack.h"
\r
52 #include "AliAODVertex.h"
\r
53 #include "AliAODv0.h"
\r
54 #include "AliAODTracklets.h"
\r
55 #include "AliAODHeader.h"
\r
57 #include "AliAODMCParticle.h"
\r
58 #include "TClonesArray.h"
\r
59 #include "TDatabasePDG.h"
\r
60 #include "TParticlePDG.h"
\r
63 #include "TObjArray.h"
\r
64 #include "AliFlowCandidateTrack.h"
\r
66 #include "AliFlowTrackCuts.h"
\r
67 #include "AliFlowEventCuts.h"
\r
68 #include "AliFlowEvent.h"
\r
69 #include "AliFlowBayesianPID.h"
\r
70 #include "AliFlowCommonConstants.h"
\r
71 #include "AliFlowVector.h"
\r
73 #include "AliAnalysisTaskFlowStrange.h"
\r
75 ClassImp(AliAnalysisTaskFlowStrange)
\r
77 //=======================================================================
\r
78 AliAnalysisTaskFlowStrange::AliAnalysisTaskFlowStrange() :
\r
79 AliAnalysisTaskSE(),
\r
93 fSkipSelection(kFALSE),
\r
99 fExtraEventRejection(kFALSE),
\r
100 fCentMethod("V0MTRK"),
\r
104 fExcludeTPCEdges(kFALSE),
\r
111 fVZEResponse(NULL),
\r
123 fRFPTPCsignal(10.0),
\r
131 fDecayDCAdaughters(0.0),
\r
132 fDecayCosinePointingAngleXY(0.0),
\r
134 fDecayDecayLength(0.0),
\r
137 fDecayRapidity(0.0),
\r
138 fDecayProductIPXY(0.0),
\r
144 fDecayMaxDCAdaughters(0.0),
\r
145 fDecayMinCosinePointingAngleXY(0.0),
\r
147 fDecayAPCutPie(kTRUE),
\r
148 fDecayMinRadXY(0.0),
\r
149 fDecayMaxDecayLength(0.0),
\r
150 fDecayMaxProductIPXY(0.0),
\r
151 fDecayMaxRapidity(0.0),
\r
155 fDaughterNClsTPC(0),
\r
156 fDaughterCharge(0),
\r
157 fDaughterNFClsTPC(0),
\r
158 fDaughterNSClsTPC(0),
\r
159 fDaughterChi2PerNClsTPC(0.0),
\r
160 fDaughterXRows(0.0),
\r
161 fDaughterImpactParameterXY(0.0),
\r
162 fDaughterImpactParameterZ(0.0),
\r
163 fDaughterStatus(0),
\r
164 fDaughterNSigmaPID(0.0),
\r
165 fDaughterKinkIndex(0),
\r
166 fDaughterMinEta(0.0),
\r
167 fDaughterMaxEta(0.0),
\r
168 fDaughterMinPt(0.0),
\r
169 fDaughterMinNClsTPC(0),
\r
170 fDaughterMinXRows(0),
\r
171 fDaughterMaxChi2PerNClsTPC(0.0),
\r
172 fDaughterMinXRowsOverNClsFTPC(0.0),
\r
173 fDaughterMinImpactParameterXY(0.0),
\r
174 fDaughterMaxNSigmaPID(0.0) {
\r
177 //=======================================================================
\r
178 AliAnalysisTaskFlowStrange::AliAnalysisTaskFlowStrange(const char *name) :
\r
179 AliAnalysisTaskSE(name),
\r
180 fPIDResponse(NULL),
\r
192 fAvoidExec(kFALSE),
\r
193 fSkipSelection(kFALSE),
\r
195 fSkipDHcorr(kTRUE),
\r
199 fExtraEventRejection(kFALSE),
\r
200 fCentMethod("V0MTRK"),
\r
204 fExcludeTPCEdges(kFALSE),
\r
211 fVZEResponse(NULL),
\r
223 fRFPTPCsignal(10.0),
\r
231 fDecayDCAdaughters(0.0),
\r
232 fDecayCosinePointingAngleXY(0.0),
\r
234 fDecayDecayLength(0.0),
\r
237 fDecayRapidity(0.0),
\r
238 fDecayProductIPXY(0.0),
\r
244 fDecayMaxDCAdaughters(0.0),
\r
245 fDecayMinCosinePointingAngleXY(0.0),
\r
247 fDecayAPCutPie(kTRUE),
\r
248 fDecayMinRadXY(0.0),
\r
249 fDecayMaxDecayLength(0.0),
\r
250 fDecayMaxProductIPXY(0.0),
\r
251 fDecayMaxRapidity(0.0),
\r
255 fDaughterNClsTPC(0),
\r
256 fDaughterCharge(0),
\r
257 fDaughterNFClsTPC(0),
\r
258 fDaughterNSClsTPC(0),
\r
259 fDaughterChi2PerNClsTPC(0.0),
\r
260 fDaughterXRows(0.0),
\r
261 fDaughterImpactParameterXY(0.0),
\r
262 fDaughterImpactParameterZ(0.0),
\r
263 fDaughterStatus(0),
\r
264 fDaughterNSigmaPID(0.0),
\r
265 fDaughterKinkIndex(0),
\r
266 fDaughterMinEta(0.0),
\r
267 fDaughterMaxEta(0.0),
\r
268 fDaughterMinPt(0.0),
\r
269 fDaughterMinNClsTPC(0),
\r
270 fDaughterMinXRows(0),
\r
271 fDaughterMaxChi2PerNClsTPC(0.0),
\r
272 fDaughterMinXRowsOverNClsFTPC(0.0),
\r
273 fDaughterMinImpactParameterXY(0.0),
\r
274 fDaughterMaxNSigmaPID(0.0) {
\r
276 DefineInput( 0,TChain::Class());
\r
277 DefineOutput(1,TList::Class());
\r
278 DefineOutput(2,AliFlowEventSimple::Class()); // TPC object
\r
279 DefineOutput(3,AliFlowEventSimple::Class()); // VZE object
\r
281 //=======================================================================
\r
282 AliAnalysisTaskFlowStrange::~AliAnalysisTaskFlowStrange() {
\r
284 if (fCandidates) delete fCandidates;
\r
285 if (fTPCevent) delete fTPCevent;
\r
286 if (fVZEevent) delete fVZEevent;
\r
287 if (fList) delete fList;
\r
289 //=======================================================================
\r
290 void AliAnalysisTaskFlowStrange::UserCreateOutputObjects() {
\r
291 //UserCreateOutputObjects
\r
297 if(fReadESD) MakeFilterBits();
\r
299 AliFlowCommonConstants *cc = AliFlowCommonConstants::GetMaster();
\r
300 cc->SetNbinsMult(100); cc->SetMultMin(0); cc->SetMultMax(4000);
\r
301 cc->SetNbinsPt(200); cc->SetPtMin(0.0); cc->SetPtMax(20.0);
\r
302 cc->SetNbinsPhi(100); cc->SetPhiMin(0.0); cc->SetPhiMax(TMath::TwoPi());
\r
303 cc->SetNbinsEta(100); cc->SetEtaMin(-5.0); cc->SetEtaMax(+5.0);
\r
304 cc->SetNbinsQ(100); cc->SetQMin(0.0); cc->SetQMax(3.0);
\r
305 cc->SetNbinsMass(fMassBins);
\r
306 cc->SetMassMin(fMinMass);
\r
307 cc->SetMassMax(fMaxMass);
\r
309 //loading pid response
\r
310 AliAnalysisManager *man = AliAnalysisManager::GetAnalysisManager();
\r
311 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
\r
312 fPIDResponse = inputHandler->GetPIDResponse();
\r
314 fTPCevent = new AliFlowEvent(100);
\r
315 fVZEevent = new AliFlowEvent(100);
\r
317 //array of candidates
\r
318 fCandidates = new TObjArray(100);
\r
319 fCandidates->SetOwner();
\r
322 if(fUseFP) { // for connection to the flow package
\r
323 PostData(2,fTPCevent);
\r
324 PostData(3,fVZEevent);
\r
327 //=======================================================================
\r
328 void AliAnalysisTaskFlowStrange::AddQAEvents() {
\r
329 // function to add event qa
\r
331 TProfile *tProfile;
\r
332 TList *tQAEvents=new TList();
\r
333 tQAEvents->SetName("Event");
\r
334 tQAEvents->SetOwner();
\r
335 tH1D = new TH1D("Events","Number of Events",6,0,6); tQAEvents->Add(tH1D);
\r
336 tH1D->GetXaxis()->SetBinLabel(1,"exec");
\r
337 tH1D->GetXaxis()->SetBinLabel(2,"userexec");
\r
338 tH1D->GetXaxis()->SetBinLabel(3,"reached");
\r
339 tH1D->GetXaxis()->SetBinLabel(4,"selected");
\r
340 tH1D->GetXaxis()->SetBinLabel(5,"rejectedByLowQw");
\r
341 tH1D->GetXaxis()->SetBinLabel(6,"rejectedByErrorLoadVZEcal");
\r
342 tProfile = new TProfile("Configuration","Configuration",20,0,20); tQAEvents->Add(tProfile);
\r
343 tProfile->Fill( 0.5,fCentPerMin,1); tProfile->GetXaxis()->SetBinLabel( 1,"fCentPerMin");
\r
344 tProfile->Fill( 1.5,fCentPerMax,1); tProfile->GetXaxis()->SetBinLabel( 2,"fCentPerMax");
\r
345 tProfile->Fill( 2.5,fDaughterMinEta,1); tProfile->GetXaxis()->SetBinLabel( 3,"fDaughterMinEta");
\r
346 tProfile->Fill( 3.5,fDaughterMaxEta,1); tProfile->GetXaxis()->SetBinLabel( 4,"fDaughterMaxEta");
\r
347 tProfile->Fill( 4.5,fDaughterMinPt,1); tProfile->GetXaxis()->SetBinLabel( 5,"fDaughterMinPt");
\r
348 tProfile->Fill( 5.5,fDaughterMinNClsTPC,1); tProfile->GetXaxis()->SetBinLabel( 6,"fDaughterMinNClsTPC");
\r
349 tProfile->Fill( 6.5,fDaughterMaxChi2PerNClsTPC,1); tProfile->GetXaxis()->SetBinLabel( 7,"fDaughterMaxChi2PerNClsTPC");
\r
350 tProfile->Fill( 7.5,fDaughterMinXRowsOverNClsFTPC,1); tProfile->GetXaxis()->SetBinLabel( 8,"fDaughterMinXRowsOverNClsFTPC");
\r
351 tProfile->Fill( 8.5,fDaughterMinImpactParameterXY,1); tProfile->GetXaxis()->SetBinLabel( 9,"fDaughterMinImpactParameterXY");
\r
352 tProfile->Fill( 9.5,fDaughterMaxNSigmaPID,1); tProfile->GetXaxis()->SetBinLabel(10,"fDaughterMaxNSigmaPID");
\r
353 tProfile->Fill(10.5,fDecayMaxDCAdaughters,1); tProfile->GetXaxis()->SetBinLabel(11,"fDecayMaxDCAdaughters");
\r
354 tProfile->Fill(11.5,fDecayMinCosinePointingAngleXY,1); tProfile->GetXaxis()->SetBinLabel(12,"fDecayMinCosinePointingAngleXY");
\r
355 tProfile->Fill(12.5,fDecayMinQt,1); tProfile->GetXaxis()->SetBinLabel(13,"fDecayMinQt");
\r
356 tProfile->Fill(13.5,fDecayMinRadXY,1); tProfile->GetXaxis()->SetBinLabel(14,"fDecayMinRadXY");
\r
357 tProfile->Fill(14.5,fDecayMaxDecayLength,1); tProfile->GetXaxis()->SetBinLabel(15,"fDecayMaxDecayLength");
\r
358 tProfile->Fill(15.5,fDecayMaxProductIPXY,1); tProfile->GetXaxis()->SetBinLabel(16,"fDecayMaxProductIPXY");
\r
359 tProfile->Fill(16.5,fDecayMaxRapidity,1); tProfile->GetXaxis()->SetBinLabel(17,"fDecayMaxRapidity");
\r
360 tProfile->Fill(17.5,fDecayMinEta,1); tProfile->GetXaxis()->SetBinLabel(18,"fDecayMinEta");
\r
361 tProfile->Fill(18.5,fDecayMaxEta,1); tProfile->GetXaxis()->SetBinLabel(19,"fDecayMaxEta");
\r
362 tProfile->Fill(19.5,fDecayMinPt,1); tProfile->GetXaxis()->SetBinLabel(20,"fDecayMinPt");
\r
364 tH1D = new TH1D("POI","POIs;multiplicity",800,0,800); tQAEvents->Add(tH1D);
\r
365 tH1D = new TH1D("UNTAG","UNTAG;Untagged Daughters",800,0,800);tQAEvents->Add(tH1D);
\r
366 tH1D = new TH1D("RealTime","RealTime;LogT sec",2000,-10,+10); tQAEvents->Add(tH1D);
\r
367 fList->Add(tQAEvents);
\r
371 //=======================================================================
\r
372 void AliAnalysisTaskFlowStrange::AddEventSpy() {
\r
374 TList *tList=new TList();
\r
375 tList->SetName("EventSpy");
\r
378 tH2D = new TH2D("VTXZ","VTXZ;Global||SPD;SPD",60,-25,+25,60,-25,+25); tList->Add( tH2D );
\r
379 tH2D = new TH2D("CCCC","CCCC;V0M;TRK",60,-10,110,60,-10,110); tList->Add( tH2D );
\r
380 tH2D = new TH2D("REFM","REFM;TPC;GLOBAL",100,0,3000,100,0,3000); tList->Add( tH2D );
\r
384 //=======================================================================
\r
385 void AliAnalysisTaskFlowStrange::AddMakeQSpy() {
\r
386 if(fSkipFlow) return;
\r
390 TList *tList=new TList();
\r
391 tList->SetName("MakeQSpy");
\r
393 tH1D = new TH1D("RFPTPC","TPC Refrence Multiplicity;multiplicity",3000,0,3000); tList->Add( tH1D );
\r
394 tH1D = new TH1D("RFPVZE","VZERO Reference Multiplicity;multiplicity",3000,0,30000); tList->Add( tH1D );
\r
395 tH2D = new TH2D("TPCAllPhiEta","TPCall;Phi;Eta",180,0,TMath::TwoPi(),80,-0.9,+0.9); tList->Add( tH2D );
\r
396 tH2D = new TH2D("VZEAllPhiEta","VZEall;Phi;Eta",20,0,TMath::TwoPi(),40,-4.0,+6.0); tList->Add( tH2D );
\r
397 tH1D = new TH1D("TPCPSI","TPCPSI;PSI",72,0,TMath::Pi()); tList->Add( tH1D );
\r
398 tH1D = new TH1D("TPCPSIA","TPCPSIA;PSIA",72,0,TMath::Pi()); tList->Add( tH1D );
\r
399 tH1D = new TH1D("TPCPSIB","TPCPSIB;PSIB",72,0,TMath::Pi()); tList->Add( tH1D );
\r
400 tH1D = new TH1D("VZEPSI","VZEPSI;PSI",72,0,TMath::Pi()); tList->Add( tH1D );
\r
401 tH1D = new TH1D("VZEPSIA","VZEPSIA;PSIA",72,0,TMath::Pi()); tList->Add( tH1D );
\r
402 tH1D = new TH1D("VZEPSIB","VZEPSIB;PSIB",72,0,TMath::Pi()); tList->Add( tH1D );
\r
403 tPF1 = new TProfile("TPCQ","TPCQ",6,0.5,6.5,"s");
\r
404 tPF1->GetXaxis()->SetBinLabel(1,"Qay"); tPF1->GetXaxis()->SetBinLabel(2,"Qax");
\r
405 tPF1->GetXaxis()->SetBinLabel(3,"Qby"); tPF1->GetXaxis()->SetBinLabel(4,"Qbx");
\r
406 tPF1->GetXaxis()->SetBinLabel(5,"Qy"); tPF1->GetXaxis()->SetBinLabel(6,"Qx");
\r
407 tList->Add( tPF1 );
\r
408 tPF1 = new TProfile("VZEQ","VZEQ",6,0.5,6.5,"s"); tList->Add( tPF1 );
\r
409 tPF1->GetXaxis()->SetBinLabel(1,"Qay"); tPF1->GetXaxis()->SetBinLabel(2,"Qax");
\r
410 tPF1->GetXaxis()->SetBinLabel(3,"Qby"); tPF1->GetXaxis()->SetBinLabel(4,"Qbx");
\r
411 tPF1->GetXaxis()->SetBinLabel(5,"Qy"); tPF1->GetXaxis()->SetBinLabel(6,"Qx");
\r
412 tList->Add( tPF1 );
\r
416 tList=new TList(); tList->SetName("TPCRFPall"); tList->SetOwner(); AddTPCRFPSpy(tList); fList->Add(tList);
\r
417 tList=new TList(); tList->SetName("TPCRFPsel"); tList->SetOwner(); AddTPCRFPSpy(tList); fList->Add(tList);
\r
420 //=======================================================================
\r
421 void AliAnalysisTaskFlowStrange::AddQACandidates() {
\r
422 // function to add histogramming for candidates
\r
423 if(fSkipSelection) return;
\r
432 tList=new TList(); tList->SetName("TrkAll"); tList->SetOwner(); AddTracksSpy(tList); fList->Add(tList);
\r
433 tList=new TList(); tList->SetName("TrkSel"); tList->SetOwner(); AddTracksSpy(tList); fList->Add(tList);
\r
434 tH2D = new TH2D("NPAIR", "NPAIR;NPOS;NNEG",1000,0,5000,1000,0,5000); tList->Add(tH2D);
\r
435 tH2D = new TH2D("PtIPXY","PtIPXY;Pt;IPxy", 100,0,10,200,-10,+10); tList->Add(tH2D);
\r
438 tList=new TList(); tList->SetName("RecAll"); tList->SetOwner(); AddCandidatesSpy(tList); fList->Add(tList);
\r
439 tH2D = new TH2D("V0SADC","V0S AFTER DAUGHTER CUTS;V0ALL;V0IMW",100,0,1000,100,0,1000); tList->Add(tH2D);
\r
440 tList=new TList(); tList->SetName("RecSel"); tList->SetOwner(); AddCandidatesSpy(tList); fList->Add(tList);
\r
442 tList=new TList(); tList->SetName("TrkDau"); tList->SetOwner(); AddTracksSpy(tList); fList->Add(tList);
\r
445 tList=new TList(); tList->SetName("DHCORR"); tList->SetOwner();
\r
446 tH3D = new TH3D("DPHI","DPHI;dPT;dPHI;dETA", 20, -1, +1, 120, -TMath::TwoPi(), TMath::TwoPi(), 16, -1.6, +1.6 ); tList->Add(tH3D);
\r
451 tList=new TList(); tList->SetName("RecAllIP"); tList->SetOwner(); AddCandidatesSpy(tList); fList->Add(tList);
\r
452 tList=new TList(); tList->SetName("RecAllOP"); tList->SetOwner(); AddCandidatesSpy(tList); fList->Add(tList);
\r
453 tList=new TList(); tList->SetName("RecSelIP"); tList->SetOwner(); AddCandidatesSpy(tList); fList->Add(tList);
\r
454 tList=new TList(); tList->SetName("RecSelOP"); tList->SetOwner(); AddCandidatesSpy(tList); fList->Add(tList);
\r
458 tList=new TList(); tList->SetName("RecMth"); tList->SetOwner(); AddCandidatesSpy(tList); fList->Add(tList);
\r
459 tH1D = new TH1D("MCOrigin", "MCOrigin;Rad2",1000,0,100); tList->Add(tH1D);
\r
460 tH2D = new TH2D("PTRes", "PTRes;MCPt;|DAT-MC|/MC",100,0,20,50,0,1); tList->Add(tH2D);
\r
461 tH2D = new TH2D("ETARes","ETARes;MCETA;|DAT-MC|/MC",16,0,0.8,50,0,1); tList->Add(tH2D);
\r
462 tH2D = new TH2D("RXYRes","RXYRes;MCRXY;|DAT-MC|/MC",100,0,20,50,0,1); tList->Add(tH2D);
\r
463 tH2D = new TH2D("DLERes","DLERes;MCDLE;|DAT-MC|/MC",100,0,20,50,0,1); tList->Add(tH2D);
\r
464 tH2D = new TH2D("RAPRes","RAPRes;MCRAP;|DAT-MC|/MC",10,0,0.5,50,0,1); tList->Add(tH2D);
\r
465 tH2D = new TH2D("APARes","APARes;MCAPA;|DAT-MC|/MC",24,-1.2,1.2,50,0,1); tList->Add(tH2D);
\r
466 tH2D = new TH2D("APQRes","APQRes;MCAPQ;|DAT-MC|/MC",25,0,0.25,50,0,1); tList->Add(tH2D);
\r
468 tList=new TList(); tList->SetName("TrkMth"); tList->SetOwner(); AddTracksSpy(tList); fList->Add(tList);
\r
469 tList=new TList(); tList->SetName("MthFDW"); tList->SetOwner(); AddCandidatesSpy(tList); fList->Add(tList);
\r
470 tH1D = new TH1D("MCOrigin", "MCOrigin;Rad2",1000,0,100); tList->Add(tH1D);
\r
474 tList=new TList(); tList->SetName("GenTru"); tList->SetOwner(); AddCandidatesSpy(tList); fList->Add(tList);
\r
475 tList=new TList(); tList->SetName("MCTK0sGenAcc"); tList->SetOwner(); AddMCParticleSpy(tList); fList->Add(tList);
\r
476 tList=new TList(); tList->SetName("MCTLdaGenAcc"); tList->SetOwner(); AddMCParticleSpy(tList); fList->Add(tList);
\r
477 tList=new TList(); tList->SetName("MCTPhiGenAcc"); tList->SetOwner(); AddMCParticleSpy(tList); fList->Add(tList);
\r
478 tList=new TList(); tList->SetName("MCTXiGenAcc"); tList->SetOwner(); AddMCParticleSpy(tList); fList->Add(tList);
\r
479 tList=new TList(); tList->SetName("MCTK0s"); tList->SetOwner(); AddMCParticleSpy(tList); fList->Add(tList);
\r
480 tList=new TList(); tList->SetName("MCTLda"); tList->SetOwner(); AddMCParticleSpy(tList); fList->Add(tList);
\r
483 //=======================================================================
\r
484 void AliAnalysisTaskFlowStrange::Exec(Option_t* option) {
\r
485 // bypassing ::exec (needed because of AMPT)
\r
486 ((TH1D*)((TList*)fList->FindObject("Event"))->FindObject("Events"))->Fill(0);
\r
488 AliAnalysisTaskFlowStrange::UserExec(option);
\r
490 AliAnalysisTaskSE::Exec(option);
\r
493 //=======================================================================
\r
494 void AliAnalysisTaskFlowStrange::UserExec(Option_t *option) {
\r
496 ((TH1D*)((TList*)fList->FindObject("Event"))->FindObject("Events"))->Fill(1);
\r
497 AliAnalysisTaskFlowStrange::MyUserExec(option);
\r
499 //=======================================================================
\r
500 void AliAnalysisTaskFlowStrange::MyNotifyRun() {
\r
501 if(fQAlevel>5 && !fReadESD) AddVZEQA();
\r
502 if(fVZEsave) AddVZEROResponse();
\r
504 //=======================================================================
\r
505 Bool_t AliAnalysisTaskFlowStrange::CalibrateEvent() {
\r
506 if(fVZEsave) SaveVZEROResponse();
\r
507 if(fQAlevel>5 && !fReadESD) SaveVZEROQA(); // 2BIMPROVED
\r
510 LoadVZEROResponse();
\r
511 if(!fVZEResponse) okay = kFALSE;
\r
515 //=======================================================================
\r
516 Bool_t AliAnalysisTaskFlowStrange::AcceptAAEvent(AliESDEvent *tESD) {
\r
517 Double_t acceptEvent=kTRUE;
\r
518 Double_t tTPCVtxZ = tESD->GetPrimaryVertexTPC()->GetZ();
\r
519 if(tESD->GetPrimaryVertexTPC()->GetNContributors()<=0) return kFALSE;
\r
520 Double_t tSPDVtxZ = tESD->GetPrimaryVertexSPD()->GetZ();
\r
521 if(tESD->GetPrimaryVertexSPD()->GetNContributors()<=0) return kFALSE;
\r
523 AliCentrality *cent = tESD->GetCentrality();
\r
525 cc1 = cent->GetCentralityPercentile("V0M");
\r
526 cc2 = cent->GetCentralityPercentile("TRK");
\r
527 TString mycent = fCentMethod;
\r
528 if(fCentMethod.Contains("V0MTRK")) {
\r
529 acceptEvent = TMath::Abs(cc1-cc2)>5.0?kFALSE:acceptEvent; // a la Alex
\r
532 fThisCent = cent->GetCentralityPercentile( mycent );
\r
533 acceptEvent = (fThisCent<fCentPerMin||fThisCent>fCentPerMax)?kFALSE:acceptEvent;
\r
534 acceptEvent = TMath::Abs(tTPCVtxZ-tSPDVtxZ)>0.5?kFALSE:acceptEvent;
\r
535 acceptEvent = TMath::Abs(tTPCVtxZ)>10.0?kFALSE:acceptEvent;
\r
536 if(fQAlevel>0) ((TH2D*)((TList*)fList->FindObject("EventSpy"))->FindObject("VTXZ"))->Fill( tTPCVtxZ, tSPDVtxZ );
\r
537 if(fQAlevel>0) ((TH2D*)((TList*)fList->FindObject("EventSpy"))->FindObject("CCCC"))->Fill( cc1, cc2 );
\r
539 return acceptEvent;
\r
541 //=======================================================================
\r
542 Bool_t AliAnalysisTaskFlowStrange::AcceptAAEvent(AliAODEvent *tAOD) {
\r
543 Double_t acceptEvent=kTRUE;
\r
544 //=>Pile-up rejection (hardcoded)
\r
545 Double_t tVtxZ = tAOD->GetPrimaryVertex()->GetZ();
\r
546 if(tAOD->GetPrimaryVertex()->GetNContributors()<=0) return kFALSE;
\r
547 Double_t tSPDVtxZ = tAOD->GetPrimaryVertexSPD()->GetZ();
\r
548 if(tAOD->GetPrimaryVertexSPD()->GetNContributors()<=0) return kFALSE;
\r
549 Int_t tpc = RefMultTPC();
\r
550 Int_t glo = RefMultGlobal();
\r
551 if(fExtraEventRejection) {
\r
552 TString name = tAOD->GetPrimaryVertex()->GetTitle();
\r
553 if( !name.Contains("VertexerTracks") ) return kFALSE;
\r
554 if( ( Float_t(tpc) < -40.3+1.22*glo ) || ( Float_t(tpc)>(32.1+1.59*glo) ) ) return kFALSE;
\r
557 AliCentrality *cent = tAOD->GetHeader()->GetCentralityP();
\r
559 cc1 = cent->GetCentralityPercentile("V0M");
\r
560 cc2 = cent->GetCentralityPercentile("TRK");
\r
561 TString mycent = fCentMethod;
\r
562 if(fCentMethod.Contains("V0MTRK")) {
\r
563 acceptEvent = TMath::Abs(cc1-cc2)>5.0?kFALSE:acceptEvent;
\r
566 fThisCent = cent->GetCentralityPercentile( mycent );
\r
567 acceptEvent = (fThisCent<fCentPerMin||fThisCent>fCentPerMax)?kFALSE:acceptEvent;
\r
568 acceptEvent = TMath::Abs(tVtxZ-tSPDVtxZ)>0.5?kFALSE:acceptEvent;
\r
569 acceptEvent = TMath::Abs(tVtxZ)>10.0?kFALSE:acceptEvent;
\r
570 if(fQAlevel>0) ((TH2D*)((TList*)fList->FindObject("EventSpy"))->FindObject("VTXZ"))->Fill( tVtxZ, tSPDVtxZ );
\r
571 if(fQAlevel>0) ((TH2D*)((TList*)fList->FindObject("EventSpy"))->FindObject("CCCC"))->Fill( cc1, cc2 );
\r
572 if(fQAlevel>0) ((TH2D*)((TList*)fList->FindObject("EventSpy"))->FindObject("REFM"))->Fill( tpc, glo );
\r
574 return acceptEvent;
\r
576 //=======================================================================
\r
577 Bool_t AliAnalysisTaskFlowStrange::AcceptPPEvent(AliAODEvent *tAOD) {
\r
578 Double_t acceptEvent=kTRUE;
\r
579 Double_t tVtxZ = tAOD->GetPrimaryVertex()->GetZ();
\r
580 if(tAOD->GetPrimaryVertex()->GetNContributors()<=0) return kFALSE;
\r
581 Double_t tSPDVtxZ = tAOD->GetPrimaryVertexSPD()->GetZ();
\r
582 if(tAOD->GetPrimaryVertexSPD()->GetNContributors()<=0) return kFALSE;
\r
584 AliCentrality *cent = tAOD->GetHeader()->GetCentralityP();
\r
586 cc1 = cent->GetCentralityPercentile("V0M");
\r
587 cc2 = cent->GetCentralityPercentile("TRK");
\r
588 fThisCent = GetReferenceMultiplicity();
\r
589 //for pp i use fCentPerXXX to select on multiplicity
\r
590 acceptEvent = (fThisCent<fCentPerMin||fThisCent>fCentPerMax)?kFALSE:acceptEvent;
\r
591 acceptEvent = TMath::Abs(tVtxZ-tSPDVtxZ)>0.5?kFALSE:acceptEvent;
\r
592 acceptEvent = TMath::Abs(tVtxZ)>10.0?kFALSE:acceptEvent;
\r
593 if(fQAlevel>0) ((TH2D*)((TList*)fList->FindObject("EventSpy"))->FindObject("VTXZ"))->Fill( tVtxZ, tSPDVtxZ );
\r
594 if(fQAlevel>0) ((TH2D*)((TList*)fList->FindObject("EventSpy"))->FindObject("CCCC"))->Fill( cc1, cc2 );
\r
596 return acceptEvent;
\r
598 //=======================================================================
\r
599 Int_t AliAnalysisTaskFlowStrange::GetReferenceMultiplicity() { //toberefined
\r
600 AliAODEvent *tAOD = (AliAODEvent *) InputEvent();
\r
601 if(!tAOD) return -1;
\r
602 AliAODTrack *track;
\r
603 Int_t rawN = tAOD->GetNumberOfTracks();
\r
605 for(Int_t id=0; id!=rawN; ++id) {
\r
606 track = tAOD->GetTrack(id);
\r
607 if(!track->TestFilterBit(fRFPFilterBit)) continue;
\r
612 //=======================================================================
\r
613 Bool_t AliAnalysisTaskFlowStrange::AcceptPAEvent(AliAODEvent *tAOD) {
\r
614 //if(aod->GetHeader()->GetEventNumberESDFile() == 0) return; //rejecting first chunk NOT NEEDED ANYMORE
\r
615 Int_t bc2 = tAOD->GetHeader()->GetIRInt2ClosestInteractionMap();
\r
616 if(bc2!=0) return kFALSE;
\r
617 Int_t bc1 = tAOD->GetHeader()->GetIRInt1ClosestInteractionMap();
\r
618 if(bc1!=0) return kFALSE;
\r
619 Short_t isPileup = tAOD->IsPileupFromSPD(5);
\r
620 if(isPileup!=0) return kFALSE;
\r
621 if(tAOD->GetHeader()->GetRefMultiplicityComb08()<0) return kFALSE;
\r
623 const AliAODVertex* spdVtx = tAOD->GetPrimaryVertexSPD();
\r
624 if(!spdVtx) return kFALSE;
\r
625 if(spdVtx->GetNContributors()<=0) return kFALSE;
\r
627 const AliAODVertex* tpcVtx=NULL;
\r
628 Int_t nVertices = tAOD->GetNumberOfVertices();
\r
629 for(Int_t iVertices = 0; iVertices < nVertices; iVertices++){
\r
630 const AliAODVertex* vertex = tAOD->GetVertex(iVertices);
\r
631 if (vertex->GetType() != AliAODVertex::kMainTPC) continue;
\r
634 if(!tpcVtx) return kFALSE;
\r
635 if(tpcVtx->GetNContributors()<=0) return kFALSE;
\r
636 Double_t tTPCVtxZ = tpcVtx->GetZ();
\r
637 Double_t tSPDVtxZ = spdVtx->GetZ();
\r
638 if (TMath::Abs(tSPDVtxZ - tTPCVtxZ)>2.0) return kFALSE;
\r
639 if(plpMV(tAOD)) return kFALSE;
\r
641 Double_t acceptEvent=kTRUE;
\r
643 AliCentrality *cent = tAOD->GetHeader()->GetCentralityP();
\r
645 cc1 = cent->GetCentralityPercentile("V0M");
\r
646 cc2 = cent->GetCentralityPercentile("TRK");
\r
647 if(fCentMethod.Contains("V0MTRK")) fCentMethod = "V0M";
\r
648 fThisCent = cent->GetCentralityPercentile( fCentMethod );
\r
649 acceptEvent = (fThisCent<fCentPerMin||fThisCent>fCentPerMax)?kFALSE:acceptEvent;
\r
650 acceptEvent = TMath::Abs(tTPCVtxZ)>10.0?kFALSE:acceptEvent;
\r
652 if(fQAlevel>0) ((TH2D*)((TList*)fList->FindObject("EventSpy"))->FindObject("VTXZ"))->Fill( tTPCVtxZ, tSPDVtxZ );
\r
653 if(fQAlevel>0) ((TH2D*)((TList*)fList->FindObject("EventSpy"))->FindObject("CCCC"))->Fill( cc1, cc2 );
\r
654 return acceptEvent;
\r
656 //=======================================================================
\r
657 void AliAnalysisTaskFlowStrange::MyUserExec(Option_t *) {
\r
661 fCandidates->SetLast(-1);
\r
662 AliESDEvent *tESD=dynamic_cast<AliESDEvent*>(InputEvent());
\r
663 AliAODEvent *tAOD=dynamic_cast<AliAODEvent*>(InputEvent());
\r
664 Int_t thisRun = fRunNumber;
\r
666 Bool_t acceptEvent=kFALSE;
\r
668 if(!tESD) {ResetContainers(); Publish(); return;}
\r
669 acceptEvent = fRunOnpp?kFALSE:fRunOnpA?kFALSE:AcceptAAEvent(tESD);
\r
670 thisRun = tESD->GetRunNumber();
\r
672 if(!tAOD) {ResetContainers(); Publish(); return;}
\r
673 acceptEvent = fRunOnpp?AcceptPPEvent(tAOD):fRunOnpA?AcceptPAEvent(tAOD):AcceptAAEvent(tAOD);
\r
674 thisRun = tAOD->GetRunNumber();
\r
676 if(thisRun!=fRunNumber) {
\r
677 fRunNumber = thisRun;
\r
680 if( !CalibrateEvent() ) {
\r
681 ((TH1D*)((TList*)fList->FindObject("Event"))->FindObject("Events"))->Fill(5);
\r
682 ResetContainers(); Publish(); return;
\r
684 ((TH1D*)((TList*)fList->FindObject("Event"))->FindObject("Events"))->Fill(2);
\r
685 //=>does the event clear?
\r
686 if(!acceptEvent) {ResetContainers(); Publish(); return;}
\r
690 ((TH1D*)((TList*)fList->FindObject("Event"))->FindObject("Events"))->Fill(4);
\r
691 ResetContainers(); Publish(); return;
\r
694 //=>great, lets do our stuff!
\r
695 ((TH1D*)((TList*)fList->FindObject("Event"))->FindObject("Events"))->Fill(3);
\r
696 //=>load candidates
\r
697 if(!fSkipSelection) {
\r
701 if(fSpecie<10) ReadFromAODv0(tAOD);
\r
702 else ChargeParticles(tAOD);
\r
705 if(!fSkipDHcorr) MakeDHcorr();
\r
712 ((TH1D*)((TList*)fList->FindObject("Event"))->FindObject("RealTime"))->Fill( TMath::Log( tTime.RealTime() ) );
\r
715 //=======================================================================
\r
716 void AliAnalysisTaskFlowStrange::Publish() {
\r
719 PostData(2,fTPCevent);
\r
720 PostData(3,fVZEevent);
\r
723 //=======================================================================
\r
724 void AliAnalysisTaskFlowStrange::ReadFromESD(AliESDEvent *tESD) {
\r
725 AliStack *stack=NULL;
\r
727 AliMCEvent *mcevent=NULL;
\r
728 mcevent = MCEvent();
\r
729 if(mcevent) stack = mcevent->Stack();
\r
732 Int_t num = tESD->GetNumberOfTracks();
\r
733 AliESDtrack *myTrack;
\r
734 Int_t plist[3000], nlist[3000], np=0, nn=0;
\r
735 Double_t pd0[3000], nd0[3000];
\r
736 for (Int_t i=0; i!=num; ++i) {
\r
737 myTrack = (AliESDtrack*) tESD->GetTrack(i);
\r
738 if(!myTrack) continue;
\r
739 LoadTrack(myTrack);
\r
740 FillTrackSpy("TrkAll");
\r
741 if(!AcceptDaughter()) continue;
\r
742 FillTrackSpy("TrkSel");
\r
743 ((TH2D*)((TList*)fList->FindObject("TrkSel"))->FindObject("PtIPXY" ))->Fill( myTrack->Pt(), fDaughterImpactParameterXY );
\r
744 if( myTrack->Charge()>0 ) {
\r
745 pd0[np] = fDaughterImpactParameterXY;
\r
748 nd0[nn] = fDaughterImpactParameterXY;
\r
752 ((TH1D*)((TList*)fList->FindObject("TrkSel"))->FindObject("NPAIR" ))->Fill( np,nn );
\r
753 const AliESDVertex *vtx = tESD->GetPrimaryVertex();
\r
754 AliESDtrack *pT, *nT;
\r
755 for(int p=0; p!=np; ++p) {
\r
756 pT = (AliESDtrack*) tESD->GetTrack( plist[p] );
\r
757 for(int n=0; n!=nn; ++n) {
\r
758 nT = (AliESDtrack*) tESD->GetTrack( nlist[n] );
\r
759 fDecayProductIPXY = pd0[p]*nd0[n];
\r
760 AliExternalTrackParam pETP(*pT), nETP(*nT);
\r
762 pETP.GetDCA(&nETP,tESD->GetMagneticField(),xa,xb);
\r
763 fDecayDCAdaughters = pETP.PropagateToDCA(&nETP,tESD->GetMagneticField());
\r
764 AliESDv0 vertex( nETP,nlist[n], pETP,plist[p] );
\r
765 fDecayCosinePointingAngleXY = CosThetaPointXY( &vertex, vtx );
\r
766 fDecayRadXY = DecayLengthXY( &vertex, vtx );
\r
767 fDecayPt = vertex.Pt();
\r
768 fDecayPhi = vertex.Phi();
\r
769 fDecayEta = vertex.Eta();
\r
770 Double_t pmx, pmy, pmz, nmx, nmy, nmz;
\r
771 vertex.GetNPxPyPz(nmx,nmy,nmz);
\r
772 vertex.GetPPxPyPz(pmx,pmy,pmz);
\r
773 TVector3 mom1(pmx,pmy,pmz), mom2(nmx,nmy,nmz), mom(vertex.Px(),vertex.Py(),vertex.Pz());
\r
774 Double_t qlpos = mom1.Dot(mom)/mom.Mag();
\r
775 Double_t qlneg = mom2.Dot(mom)/mom.Mag();
\r
776 fDecayQt = mom1.Perp(mom);
\r
777 fDecayAlpha = (qlpos-qlneg)/(qlpos+qlneg);
\r
778 Double_t mpi = 0.13957018;
\r
780 Double_t eppi = TMath::Sqrt( mpi*mpi + pmx*pmx + pmy*pmy + pmz*pmz );
\r
781 Double_t enpi = TMath::Sqrt( mpi*mpi + nmx*nmx + nmy*nmy + nmz*nmz );
\r
782 fDecayMass = TMath::Sqrt( mpi*mpi + mpi*mpi + 2*(eppi*enpi - pmx*nmx - pmy*nmy - pmz*nmz ) );
\r
783 fDecayRapidity = vertex.RapK0Short();
\r
785 Double_t mpr = 0.938272013;
\r
787 if(fDecayAlpha>0) {
\r
788 epr = TMath::Sqrt( mpr*mpr + pmx*pmx + pmy*pmy + pmz*pmz );
\r
789 epi = TMath::Sqrt( mpi*mpi + nmx*nmx + nmy*nmy + nmz*nmz );
\r
791 epi = TMath::Sqrt( mpi*mpi + pmx*pmx + pmy*pmy + pmz*pmz );
\r
792 epr = TMath::Sqrt( mpr*mpr + nmx*nmx + nmy*nmy + nmz*nmz );
\r
794 fDecayMass = TMath::Sqrt( mpi*mpi + mpr*mpr + 2*(epi*epr - pmx*nmx - pmy*nmy - pmz*nmz ) );
\r
795 fDecayRapidity = vertex.RapLambda();
\r
797 Double_t energy = TMath::Sqrt( fDecayMass*fDecayMass + vertex.Px()*vertex.Px() + vertex.Py()*vertex.Py() + vertex.Pz()*vertex.Pz() );
\r
798 Double_t gamma = energy/fDecayMass;
\r
799 fDecayDecayLength = DecayLength( &vertex, vtx )/gamma;
\r
800 Double_t dPHI = fDecayPhi;
\r
801 Double_t dDPHI = dPHI - fPsi2;
\r
802 if( dDPHI < 0 ) dDPHI += TMath::TwoPi();
\r
803 if( dDPHI > TMath::Pi() ) dDPHI = TMath::TwoPi()-dDPHI;
\r
805 if( (dDPHI>TMath::PiOver4()) && (dDPHI<3*TMath::PiOver4()) ) FillCandidateSpy("RecAllOP");
\r
806 else FillCandidateSpy("RecAllIP");
\r
808 FillCandidateSpy("RecAll");
\r
809 ((TH2D*)((TList*)fList->FindObject("RecAll"))->FindObject("D0PD0N"))->Fill( pd0[p],nd0[n] );
\r
810 ((TH2D*)((TList*)fList->FindObject("RecAll"))->FindObject("XPOSXNEG"))->Fill( xa, xb );
\r
811 if(!AcceptCandidate()) continue;
\r
812 if(fDecayMass<fMinMass) continue;
\r
813 if(fDecayMass>fMaxMass) continue;
\r
816 if( (dDPHI>TMath::PiOver4()) && (dDPHI<3*TMath::PiOver4()) ) FillCandidateSpy("RecSelOP");
\r
817 else FillCandidateSpy("RecSelIP");
\r
819 FillCandidateSpy("RecSel");
\r
820 ((TH2D*)((TList*)fList->FindObject("RecSel"))->FindObject("D0PD0N"))->Fill( pd0[p],nd0[n] );
\r
821 ((TH2D*)((TList*)fList->FindObject("RecSel"))->FindObject("XPOSXNEG"))->Fill( xa, xb );
\r
823 fDecayIDneg = nT->GetID();
\r
824 fDecayIDpos = pT->GetID();
\r
826 LoadTrack(pT); FillTrackSpy("TrkDau");
\r
827 LoadTrack(nT); FillTrackSpy("TrkDau");
\r
829 //===== BEGIN OF MCMATCH
\r
831 bool matched = false;
\r
832 Int_t labelpos = pT->GetLabel();
\r
833 Int_t labelneg = nT->GetLabel();
\r
835 if( labelpos>0 && labelneg>0 ) {
\r
836 TParticle *mcpos = stack->Particle( labelpos );
\r
837 TParticle *mcneg = stack->Particle( labelneg );
\r
838 Int_t pdgRecPos = mcpos->GetPdgCode();
\r
839 Int_t pdgRecNeg = mcneg->GetPdgCode();
\r
840 if( pdgRecPos==211&&pdgRecNeg==-211 ) if(mcpos->GetMother(0)>0) {
\r
841 if( mcpos->GetMother(0)==mcneg->GetMother(0) ) {
\r
842 TParticle *mcmot = stack->Particle( mcpos->GetMother(0) );
\r
843 rOri = TMath::Sqrt( mcmot->Vx()*mcmot->Vx() + mcmot->Vy()*mcmot->Vy() );
\r
844 if( TMath::Abs(mcmot->GetPdgCode())==310) {
\r
845 if(mcmot->GetNDaughters()==2) matched=true;
\r
851 FillCandidateSpy("RecMth");
\r
852 ((TH2D*)((TList*)fList->FindObject("RecMth"))->FindObject("D0PD0N"))->Fill( pd0[p],nd0[n] );
\r
853 ((TH2D*)((TList*)fList->FindObject("RecMth"))->FindObject("XPOSXNEG"))->Fill( xa, xb );
\r
854 ((TH1D*)((TList*)fList->FindObject("RecMth"))->FindObject("MCOrigin"))->Fill( rOri );
\r
855 LoadTrack(pT); FillTrackSpy("TrkMth");
\r
856 LoadTrack(nT); FillTrackSpy("TrkMth");
\r
859 //===== END OF MCMATCH
\r
863 //=======================================================================
\r
864 void AliAnalysisTaskFlowStrange::ReadStack(TClonesArray* mcArray) {
\r
865 if(!mcArray) return;
\r
866 AliAODMCParticle *myMCTrack, *iMCDau, *jMCDau;
\r
867 for(int i=0; i!=mcArray->GetEntriesFast(); ++i) {
\r
868 myMCTrack = dynamic_cast<AliAODMCParticle*>(mcArray->At( i ));
\r
869 if(!myMCTrack) continue;
\r
871 if(fSpecie>0) tPDG = 3122;
\r
872 if( TMath::Abs(myMCTrack->PdgCode())==tPDG )
\r
873 if( myMCTrack->GetNDaughters() == 2 ) {
\r
874 Int_t iDau = myMCTrack->GetDaughter(0);
\r
875 Int_t jDau = myMCTrack->GetDaughter(1);
\r
876 AliAODMCParticle *posDau=NULL;
\r
877 AliAODMCParticle *negDau=NULL;
\r
878 if(iDau>0&&jDau>0) {
\r
879 iMCDau = dynamic_cast<AliAODMCParticle*>(mcArray->At( iDau ));
\r
880 jMCDau = dynamic_cast<AliAODMCParticle*>(mcArray->At( jDau ));
\r
882 if(iMCDau->Charge()>0) posDau=iMCDau;
\r
883 else negDau=iMCDau;
\r
886 if(jMCDau->Charge()>0) posDau=jMCDau;
\r
887 else negDau=jMCDau;
\r
889 } //got two daughters
\r
890 if(posDau&&negDau) {
\r
891 Double_t dx = myMCTrack->Xv() - posDau->Xv();
\r
892 Double_t dy = myMCTrack->Yv() - posDau->Yv();
\r
893 Double_t dz = myMCTrack->Zv() - posDau->Zv();
\r
894 fDecayRadXY = TMath::Sqrt( dx*dx + dy*dy );
\r
895 TVector3 momPos(posDau->Px(),posDau->Py(),posDau->Pz());
\r
896 TVector3 momNeg(negDau->Px(),negDau->Py(),negDau->Pz());
\r
897 TVector3 momTot(myMCTrack->Px(),myMCTrack->Py(),myMCTrack->Pz());
\r
898 Double_t qlpos = momPos.Dot(momTot)/momTot.Mag();
\r
899 Double_t qlneg = momNeg.Dot(momTot)/momTot.Mag();
\r
900 fDecayQt = momPos.Perp(momTot);
\r
901 fDecayAlpha = 1.-2./(1.+qlpos/qlneg);
\r
902 fDecayMass = myMCTrack->GetCalcMass();
\r
903 Double_t energy = myMCTrack->E();
\r
904 Double_t gamma = energy/fDecayMass;
\r
905 fDecayDecayLength = TMath::Sqrt(dx*dx+dy*dy+dz*dz)/gamma;
\r
906 fDecayPt = myMCTrack->Pt();
\r
907 fDecayPhi = myMCTrack->Phi();
\r
908 fDecayEta = myMCTrack->Eta();
\r
909 fDecayRapidity = myMCTrack->Y();
\r
910 fDecayDCAdaughters = 0;
\r
911 fDecayCosinePointingAngleXY = 1;
\r
912 fDecayProductIPXY = -1;
\r
913 if(AcceptCandidate()) FillCandidateSpy("GenTru");
\r
915 } // k0/lda with two daughters
\r
916 //==== BEGIN TRACK CUTS
\r
917 if(myMCTrack->Eta()<-0.8) continue;
\r
918 if(myMCTrack->Eta()>+0.8) continue;
\r
919 //==== END TRACK CUTS
\r
920 switch( TMath::Abs(myMCTrack->PdgCode()) ) {
\r
922 FillMCParticleSpy( "MCTK0s", myMCTrack );
\r
923 if( myMCTrack->IsPrimary() )
\r
924 FillMCParticleSpy( "MCTK0sGenAcc", myMCTrack );
\r
927 FillMCParticleSpy( "MCTLda", myMCTrack );
\r
928 if( myMCTrack->IsPrimary() )
\r
929 FillMCParticleSpy( "MCTLdaGenAcc", myMCTrack );
\r
932 if( myMCTrack->IsPrimary() )
\r
933 FillMCParticleSpy( "MCTPhiGenAcc", myMCTrack );
\r
936 if( myMCTrack->IsPrimary() )
\r
937 FillMCParticleSpy( "MCTXiGenAcc", myMCTrack );
\r
943 //=======================================================================
\r
944 Double_t AliAnalysisTaskFlowStrange::CosThetaPointXY(AliESDv0 *me, const AliVVertex *vtx) {
\r
945 TVector3 mom( me->Px(), me->Py(), 0 );
\r
946 TVector3 fli( me->Xv()-vtx->GetX(), me->Yv()-vtx->GetY(), 0 );
\r
947 Double_t ctp = mom.Dot(fli) / mom.Mag() / fli.Mag();
\r
950 //=======================================================================
\r
951 Double_t AliAnalysisTaskFlowStrange::CosThetaPointXY(AliAODv0 *me, const AliVVertex *vtx) {
\r
952 TVector3 mom( me->Px(), me->Py(), 0 );
\r
953 TVector3 fli( me->Xv()-vtx->GetX(), me->Yv()-vtx->GetY(), 0 );
\r
954 Double_t ctp = mom.Dot(fli) / mom.Mag() / fli.Mag();
\r
957 //=======================================================================
\r
958 Double_t AliAnalysisTaskFlowStrange::DecayLengthXY(AliESDv0 *me, const AliVVertex *vtx) {
\r
959 Double_t dx = me->Xv()-vtx->GetX();
\r
960 Double_t dy = me->Yv()-vtx->GetY();
\r
961 Double_t dxy = TMath::Sqrt( dx*dx + dy*dy );
\r
964 //=======================================================================
\r
965 Double_t AliAnalysisTaskFlowStrange::DecayLengthXY(AliAODv0 *me, const AliVVertex *vtx) {
\r
966 Double_t dx = me->Xv()-vtx->GetX();
\r
967 Double_t dy = me->Yv()-vtx->GetY();
\r
968 Double_t dxy = TMath::Sqrt( dx*dx + dy*dy );
\r
971 //=======================================================================
\r
972 Double_t AliAnalysisTaskFlowStrange::DecayLength(AliESDv0 *me, const AliVVertex *vtx) {
\r
973 Double_t dx = me->Xv()-vtx->GetX();
\r
974 Double_t dy = me->Yv()-vtx->GetY();
\r
975 Double_t dz = me->Zv()-vtx->GetZ();
\r
976 Double_t dxy = TMath::Sqrt( dx*dx + dy*dy + dz*dz );
\r
979 //=======================================================================
\r
980 Double_t AliAnalysisTaskFlowStrange::DecayLength(AliAODv0 *me, const AliVVertex *vtx) {
\r
981 Double_t dx = me->Xv()-vtx->GetX();
\r
982 Double_t dy = me->Yv()-vtx->GetY();
\r
983 Double_t dz = me->Zv()-vtx->GetZ();
\r
984 Double_t dxy = TMath::Sqrt( dx*dx + dy*dy + dz*dz );
\r
987 //=======================================================================
\r
988 void AliAnalysisTaskFlowStrange::ReadFromAODv0(AliAODEvent *tAOD) {
\r
989 TClonesArray* mcArray=NULL;
\r
991 mcArray = dynamic_cast<TClonesArray*>(tAOD->FindListObject(AliAODMCParticle::StdBranchName()));
\r
992 ReadStack(mcArray);
\r
995 Int_t nV0s = tAOD->GetNumberOfV0s();
\r
997 Int_t v0all=0, v0imw=0;
\r
998 for (Int_t i=0; i!=nV0s; ++i) {
\r
999 myV0 = (AliAODv0*) tAOD->GetV0(i);
\r
1000 if(!myV0) continue;
\r
1001 if(!fOnline) if(myV0->GetOnFlyStatus() ) continue;
\r
1002 if(fOnline) if(!myV0->GetOnFlyStatus() ) continue;
\r
1003 AliAODTrack *iT, *jT;
\r
1004 AliAODVertex *vtx = tAOD->GetPrimaryVertex();
\r
1005 Double_t pos[3],cov[6];
\r
1007 vtx->GetCovarianceMatrix(cov);
\r
1008 const AliESDVertex vESD(pos,cov,100.,100);
\r
1011 iT=(AliAODTrack*) myV0->GetDaughter(0);
\r
1012 if(iT->Charge()>0) {
\r
1013 iPos = 0; iNeg = 1;
\r
1015 iPos = 1; iNeg = 0;
\r
1019 iT=(AliAODTrack*) myV0->GetDaughter(iPos); // positive
\r
1020 AliESDtrack ieT( iT );
\r
1021 ieT.SetTPCClusterMap( iT->GetTPCClusterMap() );
\r
1022 ieT.SetTPCSharedMap( iT->GetTPCSharedMap() );
\r
1023 ieT.SetTPCPointsF( iT->GetTPCNclsF() );
\r
1024 ieT.PropagateToDCA(&vESD, tAOD->GetMagneticField(), 100);
\r
1025 LoadTrack(&ieT,iT->Chi2perNDF());
\r
1027 ieT.GetDZ(pos[0], pos[1], pos[2], tAOD->GetMagneticField(), ip);
\r
1028 fDaughterImpactParameterXY = ip[0];
\r
1029 fDaughterImpactParameterZ = ip[1];
\r
1030 Double_t dD0P = fDaughterImpactParameterXY; //ieT.GetD(pos[0], pos[1], tAOD->GetMagneticField());
\r
1031 if(!AcceptDaughter()) continue;
\r
1033 jT=(AliAODTrack*) myV0->GetDaughter(iNeg); // negative
\r
1034 AliESDtrack jeT( jT );
\r
1035 jeT.SetTPCClusterMap( jT->GetTPCClusterMap() );
\r
1036 jeT.SetTPCSharedMap( jT->GetTPCSharedMap() );
\r
1037 jeT.SetTPCPointsF( jT->GetTPCNclsF() );
\r
1038 jeT.PropagateToDCA(&vESD, tAOD->GetMagneticField(), 100);
\r
1039 LoadTrack(&jeT,jT->Chi2perNDF());
\r
1040 jeT.GetDZ(pos[0], pos[1], pos[2], tAOD->GetMagneticField(), ip);
\r
1041 fDaughterImpactParameterXY = ip[0];
\r
1042 fDaughterImpactParameterZ = ip[1];
\r
1043 Double_t dD0N = fDaughterImpactParameterXY; //jeT.GetD(pos[0], pos[1], tAOD->GetMagneticField());
\r
1044 if(!AcceptDaughter()) continue;
\r
1045 if( fExcludeTPCEdges ) {
\r
1046 if( IsAtTPCEdge(iT->Phi(),iT->Pt(),+1,tAOD->GetMagneticField()) ) continue;
\r
1047 if( IsAtTPCEdge(jT->Phi(),jT->Pt(),-1,tAOD->GetMagneticField()) ) continue;
\r
1050 ieT.GetDCA(&jeT,tAOD->GetMagneticField(),xa,xb);
\r
1052 // cutting out population close to TPC edges :: strange excess saw in 2010
\r
1053 if( fExcludeTPCEdges ) {
\r
1054 Double_t phimod = myV0->Phi();
\r
1055 int sectors[6] = {5,6,9,10,11,12};
\r
1056 for(int ii=0; ii!=6; ++ii)
\r
1057 if( (phimod<(sectors[ii]+1)*TMath::Pi()/9.0) && (phimod>sectors[ii]*TMath::Pi()/9.0) )
\r
1062 fDecayRapidity = myV0->RapK0Short();
\r
1064 fDecayRapidity = myV0->RapLambda();
\r
1065 fDecayDCAdaughters = myV0->DcaV0Daughters();
\r
1066 fDecayCosinePointingAngleXY = CosThetaPointXY( myV0, vtx );
\r
1067 fDecayRadXY = DecayLengthXY( myV0, vtx );
\r
1068 fDecayPt = myV0->Pt();
\r
1069 fDecayPhi = myV0->Phi();
\r
1070 fDecayEta = myV0->Eta();
\r
1071 fDecayProductIPXY = dD0P*dD0N;
\r
1072 fDecayQt = myV0->PtArmV0();
\r
1073 fDecayAlpha = myV0->AlphaV0(); // AlphaV0 -> AODRecoDecat::Alpha -> return 1.-2./(1.+QlProng(0)/QlProng(1));
\r
1074 if(myV0->ChargeProng(iPos)<0) fDecayAlpha = -fDecayAlpha; // protects for a change in convention
\r
1075 fDecayPt = myV0->Pt();
\r
1076 fDecayEta = myV0->Eta();
\r
1077 if( fSpecie==0 ) {
\r
1078 fDecayMass = myV0->MassK0Short();
\r
1080 if(fDecayAlpha>0) fDecayMass = myV0->MassLambda();
\r
1081 else fDecayMass = myV0->MassAntiLambda();
\r
1084 if(fDecayMass<fMinMass) continue;
\r
1085 if(fDecayMass>fMaxMass) continue;
\r
1087 Double_t energy = TMath::Sqrt( fDecayMass*fDecayMass + myV0->Px()*myV0->Px() + myV0->Py()*myV0->Py() + myV0->Pz()*myV0->Pz() );
\r
1088 Double_t gamma = energy/fDecayMass;
\r
1089 fDecayDecayLength = DecayLength( myV0, vtx )/gamma;
\r
1090 Double_t dPHI = fDecayPhi;
\r
1091 Double_t dDPHI = dPHI - fPsi2;
\r
1092 if( dDPHI < 0 ) dDPHI += TMath::TwoPi();
\r
1093 if( dDPHI > TMath::Pi() ) dDPHI = TMath::TwoPi()-dDPHI;
\r
1095 if( (dDPHI>TMath::PiOver4()) && (dDPHI<3*TMath::PiOver4()) ) FillCandidateSpy("RecAllOP");
\r
1096 else FillCandidateSpy("RecAllIP");
\r
1098 FillCandidateSpy("RecAll");
\r
1099 ((TH2D*)((TList*)fList->FindObject("RecAll"))->FindObject("D0PD0N"))->Fill( dD0P, dD0N );
\r
1100 ((TH2D*)((TList*)fList->FindObject("RecAll"))->FindObject("XPOSXNEG"))->Fill( xa, xb );
\r
1101 if(!AcceptCandidate()) continue;
\r
1102 //PID for lambda::proton
\r
1104 if(fDecayPt<1.2) {
\r
1105 if(fDecayAlpha>0) {
\r
1106 if( !PassesPIDCuts(&ieT) ) continue; //positive track
\r
1108 if( !PassesPIDCuts(&jeT) ) continue; //negative track
\r
1112 if( (dDPHI>TMath::PiOver4()) && (dDPHI<3*TMath::PiOver4()) ) FillCandidateSpy("RecSelOP");
\r
1113 else FillCandidateSpy("RecSelIP");
\r
1115 FillCandidateSpy("RecSel");
\r
1116 ((TH2D*)((TList*)fList->FindObject("RecSel"))->FindObject("D0PD0N"))->Fill( dD0P, dD0N );
\r
1117 ((TH2D*)((TList*)fList->FindObject("RecSel"))->FindObject("XPOSXNEG"))->Fill( xa, xb );
\r
1118 fDecayIDneg = iT->GetID();
\r
1119 fDecayIDpos = jT->GetID();
\r
1121 LoadTrack(&ieT,iT->Chi2perNDF());
\r
1122 ieT.GetDZ(pos[0], pos[1], pos[2], tAOD->GetMagneticField(), ip);
\r
1123 fDaughterImpactParameterXY = ip[0];
\r
1124 fDaughterImpactParameterZ = ip[1];
\r
1125 FillTrackSpy("TrkDau");
\r
1126 LoadTrack(&jeT,jT->Chi2perNDF());
\r
1127 jeT.GetDZ(pos[0], pos[1], pos[2], tAOD->GetMagneticField(), ip);
\r
1128 fDaughterImpactParameterXY = ip[0];
\r
1129 fDaughterImpactParameterZ = ip[1];
\r
1130 FillTrackSpy("TrkDau");
\r
1131 //===== BEGIN OF MCMATCH
\r
1133 bool matched = false;
\r
1134 bool feeddown = false;
\r
1135 Int_t labelpos = iT->GetLabel();
\r
1136 Int_t labelneg = jT->GetLabel();
\r
1138 Double_t mcPt=-1, mcEta=-1, mcRap=-1, mcRxy=-1, mcDle=-1, mcApa=-100, mcApq=-1;
\r
1139 Double_t resPt=-1, resEta=-1, resRap=-1, resRxy=-1, resDle=-1, resApa=-1, resApq=-1;
\r
1140 if( labelpos>0 && labelneg>0 ) {
\r
1141 AliAODMCParticle *mcpos = (AliAODMCParticle*) mcArray->At( labelpos );
\r
1142 AliAODMCParticle *mcneg = (AliAODMCParticle*) mcArray->At( labelneg );
\r
1143 Int_t pdgRecPos = mcpos->GetPdgCode();
\r
1144 Int_t pdgRecNeg = mcneg->GetPdgCode();
\r
1145 int pospdg=211, negpdg=211;
\r
1146 int mompdg=310, fdwpdg=333;
\r
1151 pospdg=2212; negpdg=211;
\r
1153 negpdg=2212; pospdg=211;
\r
1156 if( TMath::Abs(pdgRecPos)==pospdg&&TMath::Abs(pdgRecNeg)==negpdg )
\r
1157 if(mcpos->GetMother()>0)
\r
1158 if( mcpos->GetMother()==mcneg->GetMother() ) {
\r
1159 AliAODMCParticle *mcmot = (AliAODMCParticle*) mcArray->At( mcpos->GetMother() );
\r
1160 rOri = TMath::Sqrt( mcmot->Xv()*mcmot->Xv() + mcmot->Yv()*mcmot->Yv() );
\r
1161 mcPt = mcmot->Pt();
\r
1162 mcEta = TMath::Abs( mcmot->Eta() );
\r
1163 mcRap = TMath::Abs( mcmot->Y() );
\r
1164 if(!TMath::AreEqualAbs(mcPt,0,1e-6)) resPt = TMath::Abs(fDecayPt - mcPt) / mcPt;
\r
1165 if(!TMath::AreEqualAbs(mcEta,0,1e-6)) resEta = TMath::Abs(fDecayEta - mcEta) / mcEta;
\r
1166 if(!TMath::AreEqualAbs(mcRap,0,1e-6)) resRap = TMath::Abs(fDecayRapidity - mcRap) / mcRap;
\r
1167 if( TMath::Abs(mcmot->GetPdgCode())==mompdg) {
\r
1168 if(mcmot->GetNDaughters()==2) {
\r
1170 Double_t dx = mcmot->Xv() - mcpos->Xv();
\r
1171 Double_t dy = mcmot->Yv() - mcpos->Yv();
\r
1172 Double_t dz = mcmot->Zv() - mcpos->Zv();
\r
1173 Double_t mcGamma = mcmot->E() / mcmot->GetCalcMass();
\r
1174 mcRxy = TMath::Sqrt( dx*dx + dy*dy );
\r
1175 mcDle = TMath::Sqrt(dx*dx+dy*dy+dz*dz)/mcGamma;
\r
1176 if(!TMath::AreEqualAbs(mcRxy,0,1e-6)) resRxy = TMath::Abs(fDecayRadXY - mcRxy) / mcRxy;
\r
1177 if(!TMath::AreEqualAbs(mcDle,0,1e-6)) resDle = TMath::Abs(fDecayDecayLength - mcDle) / mcDle;
\r
1178 TVector3 momPos(mcpos->Px(),mcpos->Py(),mcpos->Pz());
\r
1179 TVector3 momNeg(mcneg->Px(),mcneg->Py(),mcneg->Pz());
\r
1180 TVector3 momTot(mcmot->Px(),mcmot->Py(),mcmot->Pz());
\r
1181 Double_t qlpos = momPos.Dot(momTot)/momTot.Mag();
\r
1182 Double_t qlneg = momNeg.Dot(momTot)/momTot.Mag();
\r
1183 mcApq = momPos.Perp(momTot);
\r
1184 mcApa = 1.-2./(1.+qlpos/qlneg);
\r
1185 if(!TMath::AreEqualAbs(mcApq,0,1e-6)) resApq = TMath::Abs(fDecayQt - mcApq) / mcApq;
\r
1186 if(!TMath::AreEqualAbs(mcApa,0,1e-6)) resApa = TMath::Abs(fDecayAlpha - mcApa) / mcApa;
\r
1188 if(mcmot->GetMother()>0) {
\r
1189 AliAODMCParticle *mcfdw = (AliAODMCParticle*) mcArray->At( mcmot->GetMother() );
\r
1190 if( TMath::Abs(mcfdw->GetPdgCode())==fdwpdg)
\r
1192 } // k0/lda have mother
\r
1193 } // mother matches k0/lda
\r
1194 } // both have same mother
\r
1195 } // match to MCparticles
\r
1197 FillCandidateSpy("RecMth");
\r
1198 ((TH2D*)((TList*)fList->FindObject("RecMth"))->FindObject("D0PD0N"))->Fill( dD0P,dD0N );
\r
1199 ((TH2D*)((TList*)fList->FindObject("RecMth"))->FindObject("XPOSXNEG"))->Fill( xa, xb );
\r
1200 ((TH1D*)((TList*)fList->FindObject("RecMth"))->FindObject("MCOrigin"))->Fill( rOri );
\r
1201 ((TH2D*)((TList*)fList->FindObject("RecMth"))->FindObject("PTRes"))->Fill( mcPt, resPt );
\r
1202 ((TH2D*)((TList*)fList->FindObject("RecMth"))->FindObject("ETARes"))->Fill( mcEta, resEta );
\r
1203 ((TH2D*)((TList*)fList->FindObject("RecMth"))->FindObject("RAPRes"))->Fill( mcRap, resRap );
\r
1204 ((TH2D*)((TList*)fList->FindObject("RecMth"))->FindObject("RXYRes"))->Fill( mcRxy, resRxy );
\r
1205 ((TH2D*)((TList*)fList->FindObject("RecMth"))->FindObject("DLERes"))->Fill( mcDle, resDle );
\r
1206 ((TH2D*)((TList*)fList->FindObject("RecMth"))->FindObject("APARes"))->Fill( mcApa, resApa );
\r
1207 ((TH2D*)((TList*)fList->FindObject("RecMth"))->FindObject("APQRes"))->Fill( mcApq, resApq );
\r
1208 LoadTrack(&ieT,iT->Chi2perNDF());
\r
1209 ieT.GetDZ(pos[0], pos[1], pos[2], tAOD->GetMagneticField(), ip);
\r
1210 fDaughterImpactParameterXY = ip[0];
\r
1211 fDaughterImpactParameterZ = ip[1];
\r
1212 FillTrackSpy("TrkMth");
\r
1213 LoadTrack(&jeT,jT->Chi2perNDF());
\r
1214 jeT.GetDZ(pos[0], pos[1], pos[2], tAOD->GetMagneticField(), ip);
\r
1215 fDaughterImpactParameterXY = ip[0];
\r
1216 fDaughterImpactParameterZ = ip[1];
\r
1217 FillTrackSpy("TrkMth");
\r
1220 FillCandidateSpy("MthFDW");
\r
1221 ((TH2D*)((TList*)fList->FindObject("MthFDW"))->FindObject("D0PD0N"))->Fill( dD0P,dD0N );
\r
1222 ((TH1D*)((TList*)fList->FindObject("MthFDW"))->FindObject("MCOrigin"))->Fill( rOri );
\r
1225 //===== END OF MCMATCH
\r
1227 ((TH2D*)((TList*)fList->FindObject("RecAll"))->FindObject("V0SADC"))->Fill( v0all,v0imw );
\r
1230 //=======================================================================
\r
1231 Bool_t AliAnalysisTaskFlowStrange::PassesPIDCuts(AliESDtrack *myTrack, AliPID::EParticleType pid) {
\r
1232 Bool_t pass=kTRUE;
\r
1233 if(fPIDResponse) {
\r
1234 fDaughterNSigmaPID = fPIDResponse->NumberOfSigmasTPC(myTrack,pid);
\r
1235 if( TMath::Abs(fDaughterNSigmaPID) > fDaughterMaxNSigmaPID )
\r
1240 //=======================================================================
\r
1241 void AliAnalysisTaskFlowStrange::ChargeParticles(AliAODEvent *tAOD) {
\r
1242 //benchmark purposes (for the ultimate measurement for LHC10h see Alex, Francesco)
\r
1244 // (for the moment) only compatible with SPVZE (no untagging)
\r
1245 for(int i=0; i!=tAOD->GetNumberOfTracks(); ++i) {
\r
1246 AliAODTrack *t = tAOD->GetTrack( i );
\r
1248 if( !t->TestFilterBit(1024) ) continue;
\r
1249 fDecayMass=0.0; // using mass as nsigmas control plot
\r
1250 if(fPIDResponse) { // PID
\r
1251 switch(fSpecie) { // TPC PID only
\r
1253 fDecayMass = fPIDResponse->NumberOfSigmasTPC(t,AliPID::kPion);
\r
1256 fDecayMass = fPIDResponse->NumberOfSigmasTPC(t,AliPID::kKaon);
\r
1259 fDecayMass = fPIDResponse->NumberOfSigmasTPC(t,AliPID::kProton);
\r
1263 Bool_t pass = kTRUE;
\r
1264 if( TMath::Abs(fDecayMass) > 3.0 ) pass=kFALSE;
\r
1265 if( t->Eta()<-0.8 || t->Eta()>+0.8 ) pass=kFALSE;
\r
1266 if( t->Pt()<0.2 || t->Pt()>20.0 ) pass=kFALSE;
\r
1267 if( t->GetTPCsignal()<10.0 ) pass=kFALSE;
\r
1269 fDecayPhi=t->Phi();
\r
1270 fDecayEta=t->Eta();
\r
1274 FillCandidateSpy("RecAll");
\r
1275 if(!pass) continue;
\r
1277 AliESDtrack et( t );
\r
1278 et.SetTPCClusterMap( t->GetTPCClusterMap() );
\r
1279 et.SetTPCSharedMap( t->GetTPCSharedMap() );
\r
1280 et.SetTPCPointsF( t->GetTPCNclsF() );
\r
1282 LoadTrack(&et,t->Chi2perNDF());
\r
1283 AliAODVertex *vtx = tAOD->GetPrimaryVertex();
\r
1286 et.GetDZ(pos[0], pos[1], pos[2], tAOD->GetMagneticField(), ip);
\r
1287 fDaughterImpactParameterXY = ip[0];
\r
1288 fDaughterImpactParameterZ = ip[1];
\r
1289 FillTrackSpy("TrkDau");
\r
1290 FillCandidateSpy("RecSel");
\r
1296 //=======================================================================
\r
1297 void AliAnalysisTaskFlowStrange::Terminate(Option_t *) {
\r
1300 //=======================================================================
\r
1301 void AliAnalysisTaskFlowStrange::MakeTrack() {
\r
1302 // create track for flow tasks
\r
1303 if(fCandidates->GetLast()+5>fCandidates->GetSize()) {
\r
1304 fCandidates->Expand( fCandidates->GetSize()+20 );
\r
1306 Bool_t overwrite = kTRUE;
\r
1307 AliFlowCandidateTrack *oTrack = (static_cast<AliFlowCandidateTrack*> (fCandidates->At( fCandidates->GetLast()+1 )));
\r
1308 if( !oTrack ) { // creates new
\r
1309 oTrack = new AliFlowCandidateTrack();
\r
1310 overwrite = kFALSE;
\r
1311 } else { // overwrites
\r
1312 oTrack->ClearMe();
\r
1314 oTrack->SetMass(fDecayMass);
\r
1315 oTrack->SetPt(fDecayPt);
\r
1316 oTrack->SetPhi(fDecayPhi);
\r
1317 oTrack->SetEta(fDecayEta);
\r
1318 oTrack->AddDaughter(fDecayIDpos);
\r
1319 oTrack->AddDaughter(fDecayIDneg);
\r
1320 oTrack->SetForPOISelection(kTRUE);
\r
1321 oTrack->SetForRPSelection(kFALSE);
\r
1323 fCandidates->SetLast( fCandidates->GetLast()+1 );
\r
1325 fCandidates->AddLast(oTrack);
\r
1329 //=======================================================================
\r
1330 void AliAnalysisTaskFlowStrange::AddCandidates() {
\r
1331 // adds candidates to flow events (untaging if necessary)
\r
1332 if(fDebug) printf("FlowEventTPC %d tracks | %d RFP | %d POI\n",fTPCevent->NumberOfTracks(),fTPCevent->GetNumberOfRPs(),fTPCevent->GetNumberOfPOIs());
\r
1333 if(fDebug) printf("FlowEventVZE %d tracks | %d RFP | %d POI\n",fVZEevent->NumberOfTracks(),fVZEevent->GetNumberOfRPs(),fVZEevent->GetNumberOfPOIs());
\r
1334 if(fDebug) printf("I received %d candidates\n",fCandidates->GetEntriesFast());
\r
1337 for(int iCand=0; iCand!=fCandidates->GetEntriesFast(); ++iCand ) {
\r
1338 AliFlowCandidateTrack *cand = static_cast<AliFlowCandidateTrack*>(fCandidates->At(iCand));
\r
1339 if(!cand) continue;
\r
1340 if(fDebug) printf(" >Checking at candidate %d with %d daughters: mass %f\n",
\r
1341 iCand,cand->GetNDaughters(),cand->Mass());
\r
1343 for(int iDau=0; iDau!=cand->GetNDaughters(); ++iDau) {
\r
1344 if(fDebug) printf(" >Daughter %d with fID %d", iDau, cand->GetIDDaughter(iDau));
\r
1345 for(int iRPs=0; iRPs!=fTPCevent->NumberOfTracks(); ++iRPs ) {
\r
1346 AliFlowTrack *iRP = static_cast<AliFlowTrack*>(fTPCevent->GetTrack( iRPs ));
\r
1347 if(!iRP) continue;
\r
1348 if(!iRP->InRPSelection()) continue;
\r
1349 if(cand->GetIDDaughter(iDau) == iRP->GetID()) {
\r
1350 if(fDebug) printf(" was in RP set");
\r
1352 iRP->SetForRPSelection(kFALSE);
\r
1353 fTPCevent->SetNumberOfRPs( fTPCevent->GetNumberOfRPs() -1 );
\r
1356 if(fDebug) printf("\n");
\r
1358 // <=== untagging
\r
1360 cand->SetForPOISelection(kTRUE);
\r
1361 fTPCevent->InsertTrack( ((AliFlowTrack*) cand) );
\r
1362 fVZEevent->InsertTrack( ((AliFlowTrack*) cand) );
\r
1364 fTPCevent->SetNumberOfPOIs( poi );
\r
1365 fVZEevent->SetNumberOfPOIs( poi );
\r
1366 ((TH1D*)((TList*)fList->FindObject("Event"))->FindObject("POI"))->Fill( poi );
\r
1367 ((TH1D*)((TList*)fList->FindObject("Event"))->FindObject("UNTAG"))->Fill( untagged );
\r
1368 if(fDebug) printf("FlowEventTPC %d tracks | %d RFP | %d POI\n",fTPCevent->NumberOfTracks(),fTPCevent->GetNumberOfRPs(),fTPCevent->GetNumberOfPOIs());
\r
1369 if(fDebug) printf("FlowEventVZE %d tracks | %d RFP | %d POI\n",fVZEevent->NumberOfTracks(),fVZEevent->GetNumberOfRPs(),fVZEevent->GetNumberOfPOIs());
\r
1371 //=======================================================================
\r
1372 void AliAnalysisTaskFlowStrange::PushBackFlowTrack(AliFlowEvent *flowevent, Double_t pt, Double_t phi, Double_t eta, Double_t w, Int_t id) {
\r
1378 rfp.SetForRPSelection(kTRUE);
\r
1379 rfp.SetForPOISelection(kFALSE);
\r
1381 flowevent->InsertTrack( &rfp );
\r
1383 //=======================================================================
\r
1384 Bool_t AliAnalysisTaskFlowStrange::IsAtTPCEdge(Double_t phi,Double_t pt,Int_t charge,Double_t b) {
\r
1385 // Origin: Alex Dobrin
\r
1386 // Implemented by Carlos Perez
\r
1387 TF1 cutLo("cutLo", "-0.01/x+pi/18.0-0.015", 0, 100);
\r
1388 TF1 cutHi("cutHi", "0.55/x/x+pi/18.0+0.03", 0, 100);
\r
1389 Double_t phimod = phi;
\r
1390 if(b<0) phimod = TMath::TwoPi()-phimod; //for negatve polarity field
\r
1391 if(charge<0) phimod = TMath::TwoPi()-phimod; //for negatve charge
\r
1392 phimod += TMath::Pi()/18.0;
\r
1393 phimod = fmod(phimod, TMath::Pi()/9.0);
\r
1394 if( phimod<cutHi.Eval(pt) && phimod>cutLo.Eval(pt) )
\r
1399 //=======================================================================
\r
1400 void AliAnalysisTaskFlowStrange::MakeQVectors() {
\r
1401 //computes event plane and updates fPsi2
\r
1402 //if there is a problem fPsi->-1
\r
1404 Double_t vzeqax, vzeqay, vzeqaw, vzeqbx, vzeqby, vzeqbw;
\r
1405 Double_t tpcqax, tpcqay, tpcqaw, tpcqbx, tpcqby, tpcqbw;
\r
1407 MakeQVZE(InputEvent(),vzeqax,vzeqay,vzeqaw,vzeqbx,vzeqby,vzeqbw);
\r
1408 MakeQTPC(InputEvent(),tpcqax,tpcqay,tpcqaw,tpcqbx,tpcqby,tpcqbw);
\r
1411 Double_t vqx, vqy;
\r
1413 Double_t psivzea,psivzeb,psivze,vzew;
\r
1414 psivzea = ( TMath::Pi()+TMath::ATan2(-vzeqay,-vzeqax) )/2.0;
\r
1415 psivzeb = ( TMath::Pi()+TMath::ATan2(-vzeqby,-vzeqbx) )/2.0;
\r
1416 vqx = vzeqax + vzeqbx;
\r
1417 vqy = vzeqay + vzeqby;
\r
1418 vzew = vzeqaw + vzeqbw;
\r
1419 psivze = ( TMath::Pi()+TMath::ATan2(-vqy,-vqx) )/2.0;
\r
1421 Double_t tqx, tqy;
\r
1423 Double_t psitpca,psitpcb,psitpc,tpcw;
\r
1424 psitpca = ( TMath::Pi()+TMath::ATan2(-tpcqay,-tpcqax) )/2.0;
\r
1425 psitpcb = ( TMath::Pi()+TMath::ATan2(-tpcqby,-tpcqbx) )/2.0;
\r
1426 tqx = tpcqax + tpcqbx;
\r
1427 tqy = tpcqay + tpcqby;
\r
1428 tpcw = tpcqaw + tpcqbw;
\r
1429 psitpc = ( TMath::Pi()+TMath::ATan2(-tqy,-tqx) )/2.0;
\r
1430 //=>does the event clear?
\r
1431 switch(fWhichPsi) {
\r
1433 if( (vzeqaw<2)||(vzeqbw<2) ) return;
\r
1437 if( (tpcqaw<2)||(tpcqbw<2) ) return;
\r
1441 //=>great! recording
\r
1442 ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("VZEPSI"))->Fill( psivze );
\r
1443 ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("VZEPSIA"))->Fill( psivzea );
\r
1444 ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("VZEPSIB"))->Fill( psivzeb );
\r
1445 ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("RFPVZE"))->Fill( vzew );
\r
1447 ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("TPCPSI"))->Fill( psitpc );
\r
1448 ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("TPCPSIA"))->Fill( psitpca );
\r
1449 ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("TPCPSIB"))->Fill( psitpcb );
\r
1450 ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("RFPTPC"))->Fill( tpcw );
\r
1452 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("TPCQ"))->Fill( 1., tpcqay/tpcqaw, tpcqaw );
\r
1453 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("TPCQ"))->Fill( 2., tpcqax/tpcqaw, tpcqaw );
\r
1454 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("TPCQ"))->Fill( 3., tpcqby/tpcqbw, tpcqbw );
\r
1455 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("TPCQ"))->Fill( 4., tpcqbx/tpcqbw, tpcqbw );
\r
1456 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("TPCQ"))->Fill( 5., tqy/tpcw, tpcw );
\r
1457 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("TPCQ"))->Fill( 6., tqx/tpcw, tpcw );
\r
1459 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("VZEQ"))->Fill( 1., vzeqay/vzeqaw, vzeqaw );
\r
1460 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("VZEQ"))->Fill( 2., vzeqax/vzeqaw, vzeqaw );
\r
1461 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("VZEQ"))->Fill( 3., vzeqby/vzeqbw, vzeqbw );
\r
1462 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("VZEQ"))->Fill( 4., vzeqbx/vzeqbw, vzeqbw );
\r
1463 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("VZEQ"))->Fill( 5., vqy/vzew, vzew );
\r
1464 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("VZEQ"))->Fill( 6., vqx/vzew, vzew );
\r
1468 //=======================================================================
\r
1469 void AliAnalysisTaskFlowStrange::MakeQVZE(AliVEvent *tevent,
\r
1470 Double_t &qxa,Double_t &qya,Double_t &qwa,
\r
1471 Double_t &qxb,Double_t &qyb,Double_t &qwb) {
\r
1473 if(fUseFP) fVZEevent->ClearFast();
\r
1474 //=>external weights
\r
1475 Double_t extW[64];
\r
1476 for(int i=0;i!=64;++i) extW[i]=1;
\r
1477 if((!fVZEsave)&&(fVZEResponse)) {
\r
1478 Double_t minC = fCentPerMin, maxC = fCentPerMax;
\r
1483 Int_t ybinmin = fVZEResponse->GetYaxis()->FindBin(minC+1e-6);
\r
1484 Int_t ybinmax = fVZEResponse->GetYaxis()->FindBin(maxC-1e-6);
\r
1485 for(int i=0;i!=64;++i) extW[i] = fVZEResponse->Integral(i+1,i+1,ybinmin,ybinmax)/(maxC-minC);
\r
1487 for(int j=0; j!=8; ++j) {
\r
1489 for(int i=0;i!=8;++i) ring[j] += extW[j*8+i];
\r
1491 //for(int i=0;i!=64;++i) printf("CELL %d -> W = %f ||",i,extW[i]);
\r
1492 for(int i=0;i!=64;++i) extW[i] = ring[i/8]/extW[i]/8.0;
\r
1493 //for(int i=0;i!=64;++i) printf(" W = %f \n",extW[i]);
\r
1496 qxa=qya=qwa=qxb=qyb=qwb=0;
\r
1498 Double_t eta, phi, w;
\r
1500 for(int id=0;id!=32;++id) {
\r
1501 eta = -3.45+0.5*(id/8);
\r
1502 phi = TMath::PiOver4()*(0.5+id%8);
\r
1503 w = tevent->GetVZEROEqMultiplicity(id)*extW[id];
\r
1504 qxa += w*TMath::Cos(2*phi);
\r
1505 qya += w*TMath::Sin(2*phi);
\r
1507 ((TH2D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("VZEAllPhiEta"))->Fill( phi, eta, w );
\r
1509 if(fUseFP) PushBackFlowTrack(fVZEevent,0,phi,eta,w,0);
\r
1512 for(int id=32;id!=64;++id) {
\r
1513 eta = +4.8-0.6*((id/8)-4);
\r
1514 phi = TMath::PiOver4()*(0.5+id%8);
\r
1515 w = tevent->GetVZEROEqMultiplicity(id)*extW[id];
\r
1516 qxb += w*TMath::Cos(2*phi);
\r
1517 qyb += w*TMath::Sin(2*phi);
\r
1519 ((TH2D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("VZEAllPhiEta"))->Fill( phi, eta, w );
\r
1521 if(fUseFP) PushBackFlowTrack(fVZEevent,0,phi,eta,w,0);
\r
1523 if(fUseFP) fVZEevent->SetNumberOfRPs(rfp);
\r
1524 if(fDebug>0&&fUseFP) printf("Inserted tracks in FlowEventVZE %d ==> %.1f\n",fVZEevent->NumberOfTracks(),qwa+qwb);
\r
1526 //=======================================================================
\r
1527 void AliAnalysisTaskFlowStrange::AddTPCRFPSpy(TList *me) {
\r
1529 tH1D = new TH1D("PT", "PT", 50,0,5); me->Add(tH1D);
\r
1530 tH1D = new TH1D("PHI", "PHI", 90,0,TMath::TwoPi()); me->Add(tH1D);
\r
1531 tH1D = new TH1D("ETA", "ETA", 40,-1,+1); me->Add(tH1D);
\r
1532 tH1D = new TH1D("TPCS", "TPC Signal", 100,0,500); me->Add(tH1D);
\r
1533 tH1D = new TH1D("IPXY", "IPXY", 100,-2,+2); me->Add(tH1D);
\r
1534 tH1D = new TH1D("IPZ", "IPZ", 100,-2,+2); me->Add(tH1D);
\r
1536 tH1D = new TH1D("TPCNCLS", "NCLS", 170,-0.5,+169.5); me->Add(tH1D);
\r
1537 tH1D = new TH1D("TPCSHCL", "NSCLS / NCLS", 100,0,1); me->Add(tH1D);
\r
1538 tH1D = new TH1D("TPCFICL", "NCLS1I / NCLS",100,0,1); me->Add(tH1D);
\r
1539 tH1D = new TH1D("TPCXRNF", "XROW / NFCLS", 100,0,1.5); me->Add(tH1D);
\r
1540 tH1D = new TH1D("TPCRCHI", "CHI2 / NCLS", 50,0,5); me->Add(tH1D);
\r
1542 tH1D = new TH1D("ITSNCLS", "NCLS", 7,-0.5,+6.5); me->Add(tH1D);
\r
1543 tH1D = new TH1D("ITSRCHI", "CHI2 / NCLS", 50,0,5); me->Add(tH1D);
\r
1546 //=======================================================================
\r
1547 Bool_t AliAnalysisTaskFlowStrange::PassesRFPTPCCuts(AliESDtrack *track, Double_t aodchi2cls, Float_t aodipxy, Float_t aodipz) {
\r
1548 if(track->GetKinkIndex(0)>0) return kFALSE;
\r
1549 if( (track->GetStatus()&AliESDtrack::kTPCrefit)==0 ) return kFALSE;
\r
1550 Double_t pt = track->Pt();
\r
1551 Double_t phi = track->Phi();
\r
1552 Double_t eta = track->Eta();
\r
1553 Double_t tpcs = track->GetTPCsignal();
\r
1554 Float_t ipxy, ipz;
\r
1555 track->GetImpactParameters(ipxy,ipz);
\r
1556 Int_t cls = track->GetTPCclusters(0);
\r
1557 Double_t xrows, findcls, chi2;
\r
1558 findcls = track->GetTPCNclsF();
\r
1559 xrows = track->GetTPCCrossedRows();
\r
1560 chi2 = track->GetTPCchi2();
\r
1561 Double_t rchi2 = chi2/cls;
\r
1563 rchi2 = aodchi2cls;
\r
1567 Double_t xrnfcls = xrows/findcls;
\r
1568 Double_t scls, cls1i, itschi2;
\r
1570 cls1i = track->GetTPCNclsIter1();
\r
1571 scls = track->GetTPCnclsS();
\r
1572 itscls = track->GetITSclusters(0);
\r
1573 itschi2 = track->GetITSchi2();
\r
1574 Double_t shcl = scls/cls;
\r
1575 Double_t ficl = cls1i/cls;
\r
1576 Double_t itsrchi2 = itscls/itschi2;
\r
1577 ((TH1D*)((TList*)fList->FindObject("TPCRFPall"))->FindObject("PT"))->Fill( pt );
\r
1578 ((TH1D*)((TList*)fList->FindObject("TPCRFPall"))->FindObject("PHI"))->Fill( phi );
\r
1579 ((TH1D*)((TList*)fList->FindObject("TPCRFPall"))->FindObject("ETA"))->Fill( eta );
\r
1580 ((TH1D*)((TList*)fList->FindObject("TPCRFPall"))->FindObject("TPCS"))->Fill( tpcs );
\r
1581 ((TH1D*)((TList*)fList->FindObject("TPCRFPall"))->FindObject("IPXY"))->Fill( ipxy );
\r
1582 ((TH1D*)((TList*)fList->FindObject("TPCRFPall"))->FindObject("IPZ"))->Fill( ipz );
\r
1583 ((TH1D*)((TList*)fList->FindObject("TPCRFPall"))->FindObject("TPCNCLS"))->Fill( cls );
\r
1584 ((TH1D*)((TList*)fList->FindObject("TPCRFPall"))->FindObject("TPCSHCL"))->Fill( shcl );
\r
1585 ((TH1D*)((TList*)fList->FindObject("TPCRFPall"))->FindObject("TPCFICL"))->Fill( ficl );
\r
1586 ((TH1D*)((TList*)fList->FindObject("TPCRFPall"))->FindObject("TPCXRNF"))->Fill( xrnfcls );
\r
1587 ((TH1D*)((TList*)fList->FindObject("TPCRFPall"))->FindObject("TPCRCHI"))->Fill( rchi2 );
\r
1588 ((TH1D*)((TList*)fList->FindObject("TPCRFPall"))->FindObject("ITSNCLS"))->Fill( itscls );
\r
1589 ((TH1D*)((TList*)fList->FindObject("TPCRFPall"))->FindObject("ITSRCHI"))->Fill( itsrchi2 );
\r
1590 if(pt<fRFPminPt) return kFALSE; //0.2
\r
1591 if(pt>fRFPmaxPt) return kFALSE; //5.0
\r
1592 if(eta<fRFPminEta) return kFALSE; //-0.8
\r
1593 if(eta>fRFPmaxEta) return kFALSE; //+0.8
\r
1594 if(tpcs<fRFPTPCsignal) return kFALSE; //10.0
\r
1595 if( TMath::Sqrt(ipxy*ipxy/fRFPmaxIPxy/fRFPmaxIPxy+ipz*ipz/fRFPmaxIPz/fRFPmaxIPz)>1 ) return kFALSE; //2.4 3.2
\r
1596 if(cls<fRFPTPCncls) return kFALSE; //70
\r
1597 ((TH1D*)((TList*)fList->FindObject("TPCRFPsel"))->FindObject("PT"))->Fill( pt );
\r
1598 ((TH1D*)((TList*)fList->FindObject("TPCRFPsel"))->FindObject("PHI"))->Fill( phi );
\r
1599 ((TH1D*)((TList*)fList->FindObject("TPCRFPsel"))->FindObject("ETA"))->Fill( eta );
\r
1600 ((TH1D*)((TList*)fList->FindObject("TPCRFPsel"))->FindObject("TPCS"))->Fill( tpcs );
\r
1601 ((TH1D*)((TList*)fList->FindObject("TPCRFPsel"))->FindObject("IPXY"))->Fill( ipxy );
\r
1602 ((TH1D*)((TList*)fList->FindObject("TPCRFPsel"))->FindObject("IPZ"))->Fill( ipz );
\r
1603 ((TH1D*)((TList*)fList->FindObject("TPCRFPsel"))->FindObject("TPCNCLS"))->Fill( cls );
\r
1604 ((TH1D*)((TList*)fList->FindObject("TPCRFPsel"))->FindObject("TPCSHCL"))->Fill( shcl );
\r
1605 ((TH1D*)((TList*)fList->FindObject("TPCRFPsel"))->FindObject("TPCFICL"))->Fill( ficl );
\r
1606 ((TH1D*)((TList*)fList->FindObject("TPCRFPsel"))->FindObject("TPCXRNF"))->Fill( xrnfcls );
\r
1607 ((TH1D*)((TList*)fList->FindObject("TPCRFPsel"))->FindObject("TPCRCHI"))->Fill( rchi2 );
\r
1608 ((TH1D*)((TList*)fList->FindObject("TPCRFPsel"))->FindObject("ITSNCLS"))->Fill( itscls );
\r
1609 ((TH1D*)((TList*)fList->FindObject("TPCRFPsel"))->FindObject("ITSRCHI"))->Fill( itsrchi2 );
\r
1612 //=======================================================================
\r
1613 void AliAnalysisTaskFlowStrange::MakeQTPC(AliVEvent *tevent,
\r
1614 Double_t &qxa,Double_t &qya,Double_t &qwa,
\r
1615 Double_t &qxb,Double_t &qyb,Double_t &qwb) {
\r
1616 AliESDEvent *tESD = (AliESDEvent*) (tevent);
\r
1617 AliAODEvent *tAOD = (AliAODEvent*) (tevent);
\r
1620 MakeQTPC(tESD,qxa,qya,qwa,qxb,qyb,qwb);
\r
1623 MakeQTPC(tAOD,qxa,qya,qwa,qxb,qyb,qwb);
\r
1626 //=======================================================================
\r
1627 void AliAnalysisTaskFlowStrange::MakeQTPC(AliAODEvent *tAOD,
\r
1628 Double_t &qxa,Double_t &qya,Double_t &qwa,
\r
1629 Double_t &qxb,Double_t &qyb,Double_t &qwb) {
\r
1631 if(fUseFP) fTPCevent->ClearFast();
\r
1632 qxa=qya=qwa=qxb=qyb=qwb=0;
\r
1634 Double_t eta, phi, w;
\r
1636 AliAODVertex *vtx = tAOD->GetPrimaryVertex();
\r
1637 Double_t pos[3],cov[6];
\r
1639 vtx->GetCovarianceMatrix(cov);
\r
1640 const AliESDVertex vESD(pos,cov,100.,100);
\r
1641 AliAODTrack *track;
\r
1643 Int_t rawN = tAOD->GetNumberOfTracks();
\r
1644 for(Int_t id=0; id!=rawN; ++id) {
\r
1645 track = tAOD->GetTrack(id);
\r
1647 if(!track->TestFilterBit(fRFPFilterBit)) continue;
\r
1648 if( fExcludeTPCEdges )
\r
1649 if( IsAtTPCEdge( track->Phi(), track->Pt(), track->Charge(), tAOD->GetMagneticField() ) ) continue;
\r
1650 AliESDtrack etrack( track );
\r
1651 etrack.SetTPCClusterMap( track->GetTPCClusterMap() );
\r
1652 etrack.SetTPCSharedMap( track->GetTPCSharedMap() );
\r
1653 etrack.SetTPCPointsF( track->GetTPCNclsF() );
\r
1655 etrack.GetDZ(pos[0], pos[1], pos[2], tAOD->GetMagneticField(), ip);
\r
1656 if(!PassesRFPTPCCuts(&etrack,track->Chi2perNDF(),ip[0],ip[1])) continue;
\r
1657 //=>collecting info
\r
1658 phi = track->Phi();
\r
1659 eta = track->Eta();
\r
1663 qxa += w*TMath::Cos(2*phi);
\r
1664 qya += w*TMath::Sin(2*phi);
\r
1667 qxb += w*TMath::Cos(2*phi);
\r
1668 qyb += w*TMath::Sin(2*phi);
\r
1671 ((TH2D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("TPCAllPhiEta"))->Fill( phi, eta, w );
\r
1673 if(fUseFP) PushBackFlowTrack(fTPCevent,track->Pt(),phi,eta,w,track->GetID());
\r
1675 if(fUseFP) fTPCevent->SetNumberOfRPs(rfp);
\r
1676 if(fDebug) printf("Inserted tracks in FlowEventTPC %d ==> %.1f\n",fTPCevent->NumberOfTracks(),qwa+qwb);
\r
1678 //=======================================================================
\r
1679 void AliAnalysisTaskFlowStrange::MakeQTPC(AliESDEvent *tESD,
\r
1680 Double_t &qxa,Double_t &qya,Double_t &qwa,
\r
1681 Double_t &qxb,Double_t &qyb,Double_t &qwb) {
\r
1683 if(fUseFP) fTPCevent->ClearFast();
\r
1684 qxa=qya=qwa=qxb=qyb=qwb=0;
\r
1686 Double_t eta, phi, w;
\r
1688 AliESDtrack *track;
\r
1689 Int_t rawN = tESD->GetNumberOfTracks();
\r
1690 for(Int_t id=0; id!=rawN; ++id) {
\r
1691 track = tESD->GetTrack(id);
\r
1693 if( fExcludeTPCEdges )
\r
1694 if( IsAtTPCEdge( track->Phi(), track->Pt(), track->Charge(), tESD->GetMagneticField() ) ) continue;
\r
1695 if(!PassesFilterBit(track)) continue;
\r
1696 if(!PassesRFPTPCCuts(track)) continue;
\r
1697 //=>collecting info
\r
1698 phi = track->Phi();
\r
1699 eta = track->Eta();
\r
1703 qxa += w*TMath::Cos(2*phi);
\r
1704 qya += w*TMath::Sin(2*phi);
\r
1707 qxb += w*TMath::Cos(2*phi);
\r
1708 qyb += w*TMath::Sin(2*phi);
\r
1711 ((TH2D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("TPCAllPhiEta"))->Fill( phi, eta, w );
\r
1713 if(fUseFP) PushBackFlowTrack(fTPCevent,track->Pt(),phi,eta,w,track->GetID());
\r
1715 if(fUseFP) fTPCevent->SetNumberOfRPs(rfp);
\r
1716 if(fDebug) printf("Inserted tracks in FlowEventTPC %d ==> %.1f\n",fTPCevent->NumberOfTracks(),qwa+qwb);
\r
1718 //=======================================================================
\r
1719 void AliAnalysisTaskFlowStrange::AddMCParticleSpy(TList *me) {
\r
1721 tH1D = new TH1D("Pt", "Pt", 100,0.0,20); me->Add(tH1D);
\r
1722 tH1D = new TH1D("Phi", "Phi", 100,0,TMath::TwoPi()); me->Add(tH1D);
\r
1723 tH1D = new TH1D("Eta", "Eta", 100,-1,+1); me->Add(tH1D);
\r
1724 tH1D = new TH1D("Rad2", "Rad2", 1000,0,+100); me->Add(tH1D);
\r
1727 //=======================================================================
\r
1728 void AliAnalysisTaskFlowStrange::FillMCParticleSpy(TString listName, AliAODMCParticle *p) {
\r
1729 ((TH1D*)((TList*)fList->FindObject(listName.Data()))->FindObject("Pt" ))->Fill( p->Pt() );
\r
1730 ((TH1D*)((TList*)fList->FindObject(listName.Data()))->FindObject("Eta" ))->Fill( p->Eta() );
\r
1731 ((TH1D*)((TList*)fList->FindObject(listName.Data()))->FindObject("Phi" ))->Fill( p->Phi() );
\r
1732 ((TH1D*)((TList*)fList->FindObject(listName.Data()))->FindObject("Rad2" ))->Fill( TMath::Sqrt( p->Xv()*p->Xv() +
\r
1733 p->Yv()*p->Yv() ) );
\r
1736 //=======================================================================
\r
1737 void AliAnalysisTaskFlowStrange::FillMCParticleSpy(TString listName, TParticle *p) {
\r
1738 ((TH1D*)((TList*)fList->FindObject(listName.Data()))->FindObject("Pt" ))->Fill( p->Pt() );
\r
1739 ((TH1D*)((TList*)fList->FindObject(listName.Data()))->FindObject("Eta" ))->Fill( p->Eta() );
\r
1740 ((TH1D*)((TList*)fList->FindObject(listName.Data()))->FindObject("Phi" ))->Fill( p->Phi() );
\r
1741 ((TH1D*)((TList*)fList->FindObject(listName.Data()))->FindObject("Rad2" ))->Fill( TMath::Sqrt( p->Vx()*p->Vx() +
\r
1742 p->Vy()*p->Vy() ) );
\r
1745 //=======================================================================
\r
1746 void AliAnalysisTaskFlowStrange::AddCandidatesSpy(TList *me) {
\r
1748 tH2D = new TH2D("PhiEta", "PhiEta;Phi;Eta", 100,0,TMath::TwoPi(),100,-1,+1); me->Add(tH2D);
\r
1749 tH2D = new TH2D("PtRAP", "PtRAP;Pt;Y", 100,0,20,100,-2.0,+2.0); me->Add(tH2D);
\r
1750 tH2D = new TH2D("PtDCA", "PtDCA;Pt;DCA", 100,0,20,100,0,10); me->Add(tH2D);
\r
1751 tH2D = new TH2D("PtCTP", "PtCTP;Pt;CTP", 100,0,20,100,-1,+1); me->Add(tH2D);
\r
1752 //tH2D = new TH2D("PtCTP", "PtCTP;Pt;CTP", 100,0,10,100,0.90,+1); me->Add(tH2D);
\r
1753 tH2D = new TH2D("PtD0D0", "PtD0D0;Pt;D0D0", 100,0,20,100,-5,+5); me->Add(tH2D);
\r
1754 tH2D = new TH2D("PtRad2", "PtRad2;Pt;RadXY", 100,0,20,100,0,+50); me->Add(tH2D);
\r
1755 tH2D = new TH2D("PtDL", "PtDL;Pt;DL", 100,0,20,100,0,+50); me->Add(tH2D);
\r
1756 tH2D = new TH2D("PtMASS", "PtMASS;Pt;MASS", 100,0,20,fMassBins,fMinMass,fMaxMass); me->Add(tH2D);
\r
1757 tH2D = new TH2D("APPOS", "APPOS;alphaPOS;QtPOS",100,-2,+2,100,0,0.3); me->Add(tH2D);
\r
1758 tH2D = new TH2D("D0PD0N", "D0PD0N;D0P;D0N", 200,-10,+10,200,-10,+10); me->Add(tH2D);
\r
1759 tH2D = new TH2D("XPOSXNEG","XPOSXNEG;XPOS;XNEG", 200,-50,+50,200,-50,+50); me->Add(tH2D);
\r
1762 //=======================================================================
\r
1763 void AliAnalysisTaskFlowStrange::FillCandidateSpy(TString listName) {
\r
1764 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("PhiEta"))->Fill( fDecayPhi, fDecayEta );
\r
1765 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("PtRAP" ))->Fill( fDecayPt, fDecayRapidity );
\r
1766 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("PtDCA" ))->Fill( fDecayPt, fDecayDCAdaughters );
\r
1767 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("PtCTP" ))->Fill( fDecayPt, fDecayCosinePointingAngleXY );
\r
1768 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("PtD0D0"))->Fill( fDecayPt, fDecayProductIPXY );
\r
1769 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("PtRad2"))->Fill( fDecayPt, fDecayRadXY );
\r
1770 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("PtDL" ))->Fill( fDecayPt, fDecayDecayLength );
\r
1771 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("PtMASS"))->Fill( fDecayPt, fDecayMass );
\r
1772 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("APPOS" ))->Fill( fDecayAlpha, fDecayQt );
\r
1774 //=======================================================================
\r
1775 Bool_t AliAnalysisTaskFlowStrange::AcceptCandidate() {
\r
1776 if(fDecayEta<fDecayMinEta) return kFALSE;
\r
1777 if(fDecayEta>fDecayMaxEta) return kFALSE;
\r
1778 if(fDecayPt<fDecayMinPt) return kFALSE;
\r
1779 if(fDecayProductIPXY>fDecayMaxProductIPXY) return kFALSE;
\r
1780 if(fDecayDCAdaughters>fDecayMaxDCAdaughters) return kFALSE;
\r
1781 if(fDecayCosinePointingAngleXY<fDecayMinCosinePointingAngleXY) return kFALSE;
\r
1782 if(fDecayRadXY<fDecayMinRadXY) return kFALSE;
\r
1783 if(fDecayDecayLength>fDecayMaxDecayLength*2.6842) return kFALSE;
\r
1784 if(TMath::Abs(fDecayRapidity)>fDecayMaxRapidity) return kFALSE;
\r
1786 if(fDecayAPCutPie) {
\r
1787 if(fDecayQt/TMath::Abs(fDecayAlpha)<fDecayMinQt) return kFALSE;
\r
1789 if(fDecayQt<fDecayMinQt) return kFALSE;
\r
1792 if(fSpecie==1) if(fDecayAlpha>0) return kFALSE;
\r
1793 if(fSpecie==2) if(fDecayAlpha<0) return kFALSE;
\r
1796 //=======================================================================
\r
1797 void AliAnalysisTaskFlowStrange::AddTracksSpy(TList *me) {
\r
1799 tH2D = new TH2D("PHIETA", "PHIETA;PHI;ETA", 100,0,TMath::TwoPi(),100,-2,2); me->Add(tH2D);
\r
1800 tH2D = new TH2D("IPXYIPZ", "IPXYIPZ;IPXY;IPZ", 1000,-20,+20,1000,-20,+20); me->Add(tH2D);
\r
1801 tH2D = new TH2D("PTTPCNCLS", "PTTPCNCLS;PT;NCLS", 100,0,20,170,0,170); me->Add(tH2D);
\r
1802 tH2D = new TH2D("POSTPCNCLCHI2","POSTPCNCLCHI2;NCLS;CHI2/NCLS", 170,0,170,100,0,8); me->Add(tH2D);
\r
1803 tH2D = new TH2D("POSTPCNFCLNXR","POSTPCNFCLNXR;NFCLS;NXR", 170,0,170,170,0,170); me->Add(tH2D);
\r
1804 tH2D = new TH2D("POSTPCNCLNFCL","POSTPCNCLNFCL;NCLS;NFCLS", 170,0,170,170,0,170); me->Add(tH2D);
\r
1805 tH2D = new TH2D("POSTPCNCLNSCL","POSTPCNCLNSCL;NCLS;NSCLS", 170,0,170,170,0,170); me->Add(tH2D);
\r
1806 tH2D = new TH2D("NEGTPCNCLCHI2","NEGTPCNCLCHI2;NCLS;CHI2/NCLS", 170,0,170,100,0,8); me->Add(tH2D);
\r
1807 tH2D = new TH2D("NEGTPCNFCLNXR","NEGTPCNFCLNXR;NFCLS;NXR", 170,0,170,170,0,170); me->Add(tH2D);
\r
1808 tH2D = new TH2D("NEGTPCNCLNFCL","NEGTPCNCLNFCL;NCLS;NFCLS", 170,0,170,170,0,170); me->Add(tH2D);
\r
1809 tH2D = new TH2D("NEGTPCNCLNSCL","NEGTPCNCLNSCL;NCLS;NSCLS", 170,0,170,170,0,170); me->Add(tH2D);
\r
1811 //=======================================================================
\r
1812 void AliAnalysisTaskFlowStrange::FillTrackSpy(TString listName) {
\r
1813 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject( "PHIETA" ))->Fill( fDaughterPhi, fDaughterEta );
\r
1814 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject( "IPXYIPZ" ))->Fill( fDaughterImpactParameterXY, fDaughterImpactParameterZ );
\r
1815 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject( "PTTPCNCLS" ))->Fill( fDaughterPt, fDaughterNClsTPC );
\r
1817 if(fDaughterCharge>0) ch="POS";
\r
1818 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject( Form("%sTPCNCLCHI2",ch.Data()) ))->Fill( fDaughterNClsTPC, fDaughterChi2PerNClsTPC );
\r
1819 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject( Form("%sTPCNFCLNXR",ch.Data()) ))->Fill( fDaughterNFClsTPC, fDaughterXRows );
\r
1820 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject( Form("%sTPCNCLNFCL",ch.Data()) ))->Fill( fDaughterNClsTPC, fDaughterNFClsTPC );
\r
1821 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject( Form("%sTPCNCLNSCL",ch.Data()) ))->Fill( fDaughterNClsTPC, fDaughterNSClsTPC );
\r
1823 //=======================================================================
\r
1824 void AliAnalysisTaskFlowStrange::LoadTrack(AliESDtrack *myTrack, Double_t aodChi2NDF) {
\r
1825 fDaughterCharge = myTrack->Charge();
\r
1826 fDaughterXRows = myTrack->GetTPCCrossedRows();
\r
1827 fDaughterNFClsTPC = myTrack->GetTPCNclsF();
\r
1828 fDaughterNSClsTPC = myTrack->GetTPCnclsS();
\r
1829 fDaughterNClsTPC = myTrack->GetTPCclusters(0);
\r
1831 if(fDaughterNClsTPC>0) fDaughterChi2PerNClsTPC = myTrack->GetTPCchi2()/fDaughterNClsTPC;
\r
1833 fDaughterChi2PerNClsTPC = aodChi2NDF;
\r
1835 myTrack->GetImpactParameters(fDaughterImpactParameterXY,fDaughterImpactParameterZ);
\r
1836 fDaughterStatus = myTrack->GetStatus();
\r
1837 fDaughterPhi = myTrack->Phi();
\r
1838 fDaughterEta = myTrack->Eta();
\r
1839 fDaughterPt = myTrack->Pt();
\r
1840 fDaughterKinkIndex = myTrack->GetKinkIndex(0);
\r
1842 //=======================================================================
\r
1843 Bool_t AliAnalysisTaskFlowStrange::AcceptDaughter() {
\r
1844 if(fDaughterKinkIndex>0) return kFALSE;
\r
1845 if( (fDaughterStatus&AliESDtrack::kTPCrefit)==0 ) return kFALSE;
\r
1846 if(fDaughterNFClsTPC<1) return kFALSE;
\r
1847 if(fDaughterPt<fDaughterMinPt) return kFALSE;
\r
1848 if(fDaughterEta<fDaughterMinEta) return kFALSE;
\r
1849 if(fDaughterEta>fDaughterMaxEta) return kFALSE;
\r
1850 if(fDaughterNClsTPC<fDaughterMinNClsTPC) return kFALSE;
\r
1851 if(fDaughterChi2PerNClsTPC>fDaughterMaxChi2PerNClsTPC) return kFALSE;
\r
1852 if(TMath::Abs(fDaughterImpactParameterXY)<fDaughterMinImpactParameterXY) return kFALSE;
\r
1853 if(fDaughterXRows<fDaughterMinXRowsOverNClsFTPC*fDaughterNFClsTPC) return kFALSE;
\r
1856 //=======================================================================
\r
1857 Double_t AliAnalysisTaskFlowStrange::GetWDist(const AliVVertex* v0, const AliVVertex* v1) {
\r
1858 // calculate sqrt of weighted distance to other vertex
\r
1860 printf("One of vertices is not valid\n");
\r
1863 static TMatrixDSym vVb(3);
\r
1865 double dx = v0->GetX()-v1->GetX();
\r
1866 double dy = v0->GetY()-v1->GetY();
\r
1867 double dz = v0->GetZ()-v1->GetZ();
\r
1868 double cov0[6],cov1[6];
\r
1869 v0->GetCovarianceMatrix(cov0);
\r
1870 v1->GetCovarianceMatrix(cov1);
\r
1871 vVb(0,0) = cov0[0]+cov1[0];
\r
1872 vVb(1,1) = cov0[2]+cov1[2];
\r
1873 vVb(2,2) = cov0[5]+cov1[5];
\r
1874 vVb(1,0) = vVb(0,1) = cov0[1]+cov1[1];
\r
1875 vVb(0,2) = vVb(1,2) = vVb(2,0) = vVb(2,1) = 0.;
\r
1877 if (!vVb.IsValid()) {printf("Singular Matrix\n"); return dist;}
\r
1878 dist = vVb(0,0)*dx*dx + vVb(1,1)*dy*dy + vVb(2,2)*dz*dz
\r
1879 + 2*vVb(0,1)*dx*dy + 2*vVb(0,2)*dx*dz + 2*vVb(1,2)*dy*dz;
\r
1880 return dist>0 ? TMath::Sqrt(dist) : -1;
\r
1882 //=======================================================================
\r
1883 Bool_t AliAnalysisTaskFlowStrange::plpMV(const AliVEvent *event) {
\r
1884 // check for multi-vertexer pile-up
\r
1885 const AliAODEvent *aod = (const AliAODEvent*)event;
\r
1886 const AliESDEvent *esd = (const AliESDEvent*)event;
\r
1888 const int kMinPlpContrib = 5;
\r
1889 const double kMaxPlpChi2 = 5.0;
\r
1890 const double kMinWDist = 15;
\r
1892 if (!aod && !esd) {
\r
1893 printf("Event is neither of AOD nor ESD\n");
\r
1897 const AliVVertex* vtPrm = 0;
\r
1898 const AliVVertex* vtPlp = 0;
\r
1902 if ( !(nPlp=aod->GetNumberOfPileupVerticesTracks()) ) return kFALSE;
\r
1903 vtPrm = aod->GetPrimaryVertex();
\r
1904 if (vtPrm == aod->GetPrimaryVertexSPD()) return kTRUE; // there are pile-up vertices but no primary
\r
1907 if ( !(nPlp=esd->GetNumberOfPileupVerticesTracks())) return kFALSE;
\r
1908 vtPrm = esd->GetPrimaryVertexTracks();
\r
1909 if (((AliESDVertex*)vtPrm)->GetStatus()!=1) return kTRUE; // there are pile-up vertices but no primary
\r
1911 //int bcPrim = vtPrm->GetBC();
\r
1913 for (int ipl=0;ipl<nPlp;ipl++) {
\r
1914 vtPlp = aod ? (const AliVVertex*)aod->GetPileupVertexTracks(ipl) : (const AliVVertex*)esd->GetPileupVertexTracks(ipl);
\r
1916 if (vtPlp->GetNContributors() < kMinPlpContrib) continue;
\r
1917 if (vtPlp->GetChi2perNDF() > kMaxPlpChi2) continue;
\r
1918 // int bcPlp = vtPlp->GetBC();
\r
1919 // if (bcPlp!=AliVTrack::kTOFBCNA && TMath::Abs(bcPlp-bcPrim)>2) return kTRUE; // pile-up from other BC
\r
1921 double wDst = GetWDist(vtPrm,vtPlp);
\r
1922 if (wDst<kMinWDist) continue;
\r
1924 return kTRUE; // pile-up: well separated vertices
\r
1930 //=======================================================================
\r
1931 void AliAnalysisTaskFlowStrange::MakeFilterBits() {
\r
1933 fFB1 = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
\r
1935 fFB1024 = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(kTRUE,1);
\r
1936 fFB1024->SetMinNCrossedRowsTPC(120);
\r
1937 fFB1024->SetMinRatioCrossedRowsOverFindableClustersTPC(0.8);
\r
1938 fFB1024->SetMaxChi2PerClusterITS(36);
\r
1939 fFB1024->SetMaxFractionSharedTPCClusters(0.4);
\r
1940 fFB1024->SetMaxChi2TPCConstrainedGlobal(36);
\r
1941 fFB1024->SetEtaRange(-0.9,0.9);
\r
1942 fFB1024->SetPtRange(0.15, 1e10);
\r
1944 //=======================================================================
\r
1945 Bool_t AliAnalysisTaskFlowStrange::PassesFilterBit(AliESDtrack *track) {
\r
1946 Bool_t ret=kFALSE;
\r
1947 switch(fRFPFilterBit) {
\r
1949 ret = fFB1024->AcceptTrack(track);
\r
1952 ret = fFB1->AcceptTrack(track);
\r
1956 //=======================================================================
\r
1957 void AliAnalysisTaskFlowStrange::LoadVZEROResponse() {
\r
1958 if(fVZEResponse) {
\r
1959 TString run = fVZEResponse->GetTitle();
\r
1960 if( run.Atoi() == fRunNumber ) return;
\r
1961 fVZEResponse = NULL;
\r
1964 fVZEResponse = dynamic_cast<TH2D*> (fVZEload->FindObject( Form("%d",fRunNumber) ));
\r
1965 if(fVZEResponse) {
\r
1966 printf("New VZE calibration: run %d || %s -> Entries %.0f\n",fRunNumber, fVZEResponse->GetTitle(),fVZEResponse->GetEntries());
\r
1968 printf("VZE calibration: request but not found!!!\n");
\r
1971 //=======================================================================
\r
1972 void AliAnalysisTaskFlowStrange::AddVZEQA() {
\r
1973 fVZEQA = new TList();
\r
1974 fVZEQA->SetName( Form("VZEQA%d",fRunNumber) );
\r
1975 fVZEQA->SetOwner();
\r
1977 TProfile2D *prof = new TProfile2D("LINP","LINP;VZEcell;VZEmult;SPDtrkl", 64,0,64,500,0,700,0,10000); fVZEQA->Add( prof );
\r
1978 prof = new TProfile2D("MULP","MULP;VZEcell;CENTR;VZEmult", 64,0,64,100,0,100,0,10000); fVZEQA->Add( prof );
\r
1979 TH3D *tH3D = new TH3D("EQU","EQU;VZEeqmult;VZEmult",100,0,700,100,0,700,64,0,64); fVZEQA->Add( tH3D );
\r
1981 fList->Add(fVZEQA);
\r
1983 //=======================================================================
\r
1984 void AliAnalysisTaskFlowStrange::SaveVZEROQA() {
\r
1985 AliAODEvent *event = dynamic_cast<AliAODEvent*> (InputEvent());
\r
1986 if(!event) return;
\r
1987 AliVVZERO *vzero = event->GetVZEROData();
\r
1988 AliAODTracklets *tracklets = event->GetTracklets();
\r
1989 if(!event) return;
\r
1990 if(!vzero) return;
\r
1991 if(!tracklets) return;
\r
1992 Double_t mult, eqmult;
\r
1994 for(int id=0; id!=64; ++id) {
\r
1995 trkl = tracklets->GetNumberOfTracklets();
\r
1996 mult = vzero->GetMultiplicity(id);
\r
1997 eqmult = event->GetVZEROEqMultiplicity(id);
\r
1998 ((TProfile2D*) fVZEQA->FindObject( "LINP" ))->Fill(id,mult,trkl,1);
\r
1999 ((TProfile2D*) fVZEQA->FindObject( "MULP" ))->Fill(id,fThisCent,mult,1);
\r
2000 ((TH3D*) fVZEQA->FindObject("EQU"))->Fill(eqmult,mult,id);
\r
2003 //=======================================================================
\r
2004 void AliAnalysisTaskFlowStrange::AddVZEROResponse() {
\r
2005 fVZEResponse = NULL;
\r
2006 AliVEvent *event = InputEvent();
\r
2007 if(!event) return;
\r
2008 Int_t thisrun = event->GetRunNumber();
\r
2009 fVZEResponse = new TH2D( Form("%d",thisrun), Form("%d;cell;CC",thisrun), 64,0,64, 50, 0, 100);
\r
2010 fList->Add(fVZEResponse);
\r
2012 //=======================================================================
\r
2013 void AliAnalysisTaskFlowStrange::SaveVZEROResponse() {
\r
2014 if(!fVZEResponse) return;
\r
2015 AliVEvent *event = InputEvent();
\r
2016 if(!event) return;
\r
2018 for(int id=0; id!=64; ++id) {
\r
2019 w = event->GetVZEROEqMultiplicity(id);
\r
2020 fVZEResponse->Fill(id,fThisCent,w);
\r
2023 //=======================================================================
\r
2024 Int_t AliAnalysisTaskFlowStrange::RefMultTPC() {
\r
2025 AliAODEvent *ev = dynamic_cast<AliAODEvent*> (InputEvent());
\r
2026 if(!ev) return -1;
\r
2028 for(int i=0; i!=ev->GetNumberOfTracks(); ++i) {
\r
2029 AliAODTrack *t = ev->GetTrack( i );
\r
2031 if( !t->TestFilterBit(1) ) continue;
\r
2032 if( t->Eta()<-0.8 || t->Eta()>+0.8 ) continue;
\r
2033 if( t->Pt()<0.2 || t->Pt()>5.0 ) continue;
\r
2034 if( t->GetTPCNcls()<70 ) continue;
\r
2035 if( t->GetTPCsignal()<10.0 ) continue;
\r
2036 if( t->Chi2perNDF()<0.2 ) continue;
\r
2041 //=======================================================================
\r
2042 Int_t AliAnalysisTaskFlowStrange::RefMultGlobal() {
\r
2043 AliAODEvent *ev = dynamic_cast<AliAODEvent*> (InputEvent());
\r
2044 if(!ev) return -1;
\r
2046 for(int i=0; i!=ev->GetNumberOfTracks(); ++i) {
\r
2047 AliAODTrack *t = ev->GetTrack( i );
\r
2049 if( !t->TestFilterBit(16) ) continue;
\r
2050 if( t->Eta()<-0.8 || t->Eta()>+0.8 ) continue;
\r
2051 if( t->Pt()<0.2 || t->Pt()>5.0 ) continue;
\r
2052 if( t->GetTPCNcls()<70 ) continue;
\r
2053 if( t->GetTPCsignal()<10.0 ) continue;
\r
2054 if( t->Chi2perNDF()<0.1 ) continue;
\r
2055 Double_t b[3], bcov[3];
\r
2056 if( !t->PropagateToDCA(ev->GetPrimaryVertex(),ev->GetMagneticField(),100,b,bcov) ) continue;
\r
2057 if( b[0]>+0.3 || b[0]<-0.3 || b[1]>+0.3 || b[1]<-0.3) continue;
\r
2062 //=======================================================================
\r
2063 void AliAnalysisTaskFlowStrange::MakeDHcorr() {
\r
2065 for(int iCand=0; iCand!=fCandidates->GetEntriesFast(); ++iCand ) {
\r
2066 AliFlowCandidateTrack *cand = static_cast<AliFlowCandidateTrack*>(fCandidates->At(iCand));
\r
2067 if(!cand) continue;
\r
2068 for(int iRPs=0; iRPs!=fTPCevent->NumberOfTracks(); ++iRPs ) {
\r
2069 AliFlowTrack *iRP = static_cast<AliFlowTrack*>(fTPCevent->GetTrack( iRPs ));
\r
2070 if(!iRP) continue;
\r
2071 if(!iRP->InRPSelection()) continue;
\r
2072 if(cand->GetID() == iRP->GetID()) continue; //avoid autocorr
\r
2073 for(int iDau=0; iDau!=cand->GetNDaughters(); ++iDau) //if it is a decay
\r
2074 if(cand->GetIDDaughter(iDau) == iRP->GetID()) continue;
\r
2076 Double_t dDPHI = iRP->Phi() - cand->Phi();
\r
2077 Double_t dDETA = iRP->Eta() - cand->Eta();
\r
2078 Double_t dDPT = iRP->Pt() - cand->Pt();
\r
2079 ((TH3D*)((TList*)fList->FindObject("DHCORR"))->FindObject("DPHI"))->Fill( dDPT, dDPHI, dDETA );
\r
2084 //=======================================================================
\r
2085 void AliAnalysisTaskFlowStrange::ResetContainers() {
\r
2086 fTPCevent->ClearFast();
\r
2087 fVZEevent->ClearFast();
\r