]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGUD/UPC/AliAnalysisTaskUpcK0sK0s.cxx
Merge branch 'master' of https://git.cern.ch/reps/AliRoot
[u/mrichter/AliRoot.git] / PWGUD / UPC / AliAnalysisTaskUpcK0sK0s.cxx
1 /*************************************************************************
2 * Copyright(c) 1998-2008, ALICE Experiment at CERN, All rights reserved. *
3 *                                                                        *
4 * Author: The ALICE Off-line Project.                                    *
5 * Contributors are mentioned in the code where appropriate.              *
6 *                                                                        *
7 * Permission to use, copy, modify and distribute this software and its   *
8 * documentation strictly for non-commercial purposes is hereby granted   *
9 * without fee, provided that the above copyright notice appears in all   *
10 * copies and that both the copyright notice and this permission notice   *
11 * appear in the supporting documentation. The authors make no claims     *
12 * about the suitability of this software for any purpose. It is          *
13 * provided "as is" without express or implied warranty.                  * 
14 **************************************************************************/
15
16 // c++ headers
17 #include <iostream>
18 #include <string.h>
19
20 // root headers
21 #include "TH1I.h"
22 #include "TTree.h"
23 #include "TClonesArray.h"
24 #include "TParticle.h"
25 #include "TObjString.h"
26 #include "TFile.h"
27 #include "TDatabasePDG.h"
28 #include "TLorentzVector.h"
29
30 // aliroot headers
31 #include "AliAnalysisManager.h"
32 #include "AliInputEventHandler.h"
33 #include "AliESDEvent.h"
34 #include "AliAODEvent.h"
35 #include "AliMCEvent.h"
36 #include "AliAODVZERO.h"
37 #include "AliAODZDC.h"
38 #include "AliESDVZERO.h"
39 #include "AliESDZDC.h"
40 #include "AliPIDResponse.h"
41 #include "AliAODTrack.h"
42 #include "AliAODPid.h"
43 #include "AliAODVertex.h"
44 #include "AliESDVertex.h"
45 #include "AliMultiplicity.h"
46 #include "AliESDtrack.h"
47 #include "AliESDMuonTrack.h"
48 #include "AliAODMCParticle.h"
49 #include "AliMCParticle.h"
50
51 // my headers
52 #include "AliAnalysisTaskUpcK0sK0s.h"
53
54 ClassImp(AliAnalysisTaskUpcK0sK0s);
55
56 using std::cout;
57 using std::endl;
58
59 //trees for UPC analysis,
60 // michal.broz@cern.ch
61
62 //_____________________________________________________________________________
63 AliAnalysisTaskUpcK0sK0s::AliAnalysisTaskUpcK0sK0s() 
64   : AliAnalysisTaskSE(),fType(0),fRunTree(kTRUE),fRunHist(kTRUE),hCounter(0),fK0sTree(0),
65     fRunNum(0),fPerNum(0),fOrbNum(0),fL0inputs(0),fL1inputs(0),fVtxContrib(0),fBCrossNum(0),fNtracklets(0),
66     fZDCAenergy(0),fZDCCenergy(0),fV0Adecision(0),fV0Cdecision(0),
67     fDataFilnam(0),fRecoPass(0),fEvtNum(0),
68     fK0sAODv0s(0),fK0sESDv0s(0),fK0sAODTracks(0),fK0sESDTracks(0),
69     fListHist(0),fHistTriggersPerRun(0),fHistK0sMass(0)
70
71 {
72
73 //Dummy constructor
74
75 }//AliAnalysisTaskUpcK0sK0s
76
77
78 //_____________________________________________________________________________
79 AliAnalysisTaskUpcK0sK0s::AliAnalysisTaskUpcK0sK0s(const char *name) 
80   : AliAnalysisTaskSE(name),fType(0),fRunTree(kTRUE),fRunHist(kTRUE),hCounter(0),fK0sTree(0),
81     fRunNum(0),fPerNum(0),fOrbNum(0),fL0inputs(0),fL1inputs(0),fVtxContrib(0),fBCrossNum(0),fNtracklets(0),
82     fZDCAenergy(0),fZDCCenergy(0),fV0Adecision(0),fV0Cdecision(0),
83     fDataFilnam(0),fRecoPass(0),fEvtNum(0),
84     fK0sAODv0s(0),fK0sESDv0s(0),fK0sAODTracks(0),fK0sESDTracks(0),
85     fListHist(0),fHistTriggersPerRun(0),fHistK0sMass(0)
86
87 {
88
89   // Constructor
90   if( strstr(name,"ESD") ) fType = 0;
91   if( strstr(name,"AOD") ) fType = 1;
92   
93   Init();
94
95   DefineOutput(1, TTree::Class());
96   DefineOutput(2, TH1I::Class());
97   DefineOutput(3, TList::Class());
98
99 }//AliAnalysisTaskUpcK0sK0s
100
101 //_____________________________________________________________________________
102 void AliAnalysisTaskUpcK0sK0s::Init()
103 {
104   
105   for(Int_t i=0; i<ntrg; i++) fTrigger[i] = kFALSE;
106
107 }//Init
108
109 //_____________________________________________________________________________
110 AliAnalysisTaskUpcK0sK0s::~AliAnalysisTaskUpcK0sK0s() 
111 {
112   // Destructor
113   if(fK0sTree){
114      delete fK0sTree;
115      fK0sTree = 0x0;
116   }
117   if(hCounter){
118      delete hCounter;
119      hCounter = 0x0;
120   }
121   if(fListHist){
122      delete fListHist;
123      fListHist = 0x0;
124   }
125
126 }//~AliAnalysisTaskUpcK0sK0s
127
128
129 //_____________________________________________________________________________
130 void AliAnalysisTaskUpcK0sK0s::UserCreateOutputObjects()
131 {
132    hCounter = new TH1I("hCounter", "hCounter", 34000, 1., 34001.);
133
134   //input file
135   fDataFilnam = new TObjString();
136   fDataFilnam->SetString("");
137
138     //vertices
139   fK0sAODv0s = new TClonesArray("AliAODv0", 1000);
140   fK0sESDv0s = new TClonesArray("AliESDv0", 1000);
141   
142     //tracks
143   fK0sAODTracks = new TClonesArray("AliAODTrack", 1000);
144   fK0sESDTracks = new TClonesArray("AliESDtrack", 1000);
145
146   //output tree with K0s candidate events
147   fK0sTree = new TTree("fK0sTree", "fK0sTree");
148   fK0sTree ->Branch("fRunNum", &fRunNum, "fRunNum/I");
149   fK0sTree ->Branch("fPerNum", &fPerNum, "fPerNum/i");
150   fK0sTree ->Branch("fOrbNum", &fOrbNum, "fOrbNum/i");
151   
152   fK0sTree ->Branch("fBCrossNum", &fBCrossNum, "fBCrossNum/s");
153   fK0sTree ->Branch("fTrigger", &fTrigger[0], Form("fTrigger[%i]/O", ntrg));
154   fK0sTree ->Branch("fL0inputs", &fL0inputs, "fL0inputs/i");
155   fK0sTree ->Branch("fL1inputs", &fL1inputs, "fL1inputs/i");
156   fK0sTree ->Branch("fNtracklets", &fNtracklets, "fNtracklets/s");
157   fK0sTree ->Branch("fVtxContrib", &fVtxContrib, "fVtxContrib/I");
158   fK0sTree ->Branch("fZDCAenergy", &fZDCAenergy, "fZDCAenergy/D");
159   fK0sTree ->Branch("fZDCCenergy", &fZDCCenergy, "fZDCCenergy/D");
160   fK0sTree ->Branch("fV0Adecision", &fV0Adecision, "fV0Adecision/I");
161   fK0sTree ->Branch("fV0Cdecision", &fV0Cdecision, "fV0Cdecision/I");  
162   fK0sTree ->Branch("fDataFilnam", &fDataFilnam);
163   fK0sTree ->Branch("fRecoPass", &fRecoPass, "fRecoPass/S");
164   fK0sTree ->Branch("fEvtNum", &fEvtNum, "fEvtNum/L");                 
165   if( fType == 0 ) {
166     fK0sTree ->Branch("fK0sESDv0s", &fK0sESDv0s);
167     fK0sTree ->Branch("fK0sESDTracks", &fK0sESDTracks);
168   }
169   if( fType == 1 ) {
170     fK0sTree ->Branch("fK0sAODv0s", &fK0sAODv0s);
171     fK0sTree ->Branch("fK0sAODTracks", &fK0sAODTracks);
172   }
173  
174   
175   fListHist = new TList();
176   fListHist ->SetOwner();
177   
178   fHistTriggersPerRun = new TH1D("fHistTriggersPerRun", "fHistTriggersPerRun", 3000, 167000.5, 170000.5);
179   fListHist->Add(fHistTriggersPerRun);
180     
181   fHistK0sMass = new TH1D("fHistK0sMass","fHistK0sMass",200,0.4,0.6);
182   fListHist->Add(fHistK0sMass);
183   
184   PostData(1, fK0sTree);
185   PostData(2, hCounter);
186   PostData(3, fListHist);
187
188 }//UserCreateOutputObjects
189
190 //_____________________________________________________________________________
191 void AliAnalysisTaskUpcK0sK0s::UserExec(Option_t *) 
192 {
193
194   //cout<<"#################### Next event ##################"<<endl;
195
196   if( fType == 0 ) RunESD();
197   if( fType == 1 ){ 
198         if(fRunHist) RunAODhist();
199         if(fRunTree) RunAODtree();
200         }
201
202 }//UserExec
203 //_____________________________________________________________________________
204 void AliAnalysisTaskUpcK0sK0s::RunAODhist()
205 {
206
207   //input event
208   AliAODEvent *aod = (AliAODEvent*) InputEvent();
209   if(!aod) return;
210
211
212   //Trigger
213   TString trigger = aod->GetFiredTriggerClasses();
214   
215   if( !trigger.Contains("CCUP4-B") ) return;
216   
217   fRunNum = aod ->GetRunNumber();
218   fHistTriggersPerRun->Fill(fRunNum);
219
220
221   //primary vertex
222   AliAODVertex *fAODVertex = aod->GetPrimaryVertex();
223   fVtxContrib = fAODVertex->GetNContributors();
224   if(fVtxContrib < 2) return;
225
226
227   //VZERO, ZDC
228   AliAODVZERO *fV0data = aod ->GetVZEROData();
229   
230   fV0Adecision = fV0data->GetV0ADecision();
231   fV0Cdecision = fV0data->GetV0CDecision();
232   if(fV0Adecision != AliAODVZERO::kV0Empty || fV0Cdecision != AliAODVZERO::kV0Empty) return;
233
234   AliAODZDC *fZDCdata = aod->GetZDCData();
235   
236   fZDCAenergy = fZDCdata->GetZNATowerEnergy()[0];
237   fZDCCenergy = fZDCdata->GetZNCTowerEnergy()[0];
238   if( fZDCAenergy > 6000 || fZDCCenergy > 6000) return;
239   
240   Int_t nGoodV0s=0;
241   Int_t V0Index[3] = {-1,-1,-1};
242   Int_t V0TrackID[6] = {-1,-1,-1,-1,-1,-1};
243
244   Int_t nGoodTracks=0;
245   Int_t TrackID[5] = {-1,-1,-1,-1,-1};
246
247
248   //V0s loop
249   for(Int_t iV0=0; iV0<aod ->GetNumberOfV0s(); iV0++) {
250     AliAODv0 *v0 = aod->GetV0(iV0);
251     if( !v0 ) continue;
252     Bool_t lOnFlyStatus = v0->GetOnFlyStatus();
253     if (lOnFlyStatus) continue;
254     
255     AliAODTrack *pTrack=(AliAODTrack *)v0->GetDaughter(0); //0->Positive Daughter
256     AliAODTrack *nTrack=(AliAODTrack *)v0->GetDaughter(1); //1->Negative Daughter
257     if (!pTrack || !nTrack) continue;
258
259     if ( pTrack->Charge() == nTrack->Charge())continue;
260
261       if(!(pTrack->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
262       if(!(nTrack->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
263       if(pTrack->GetTPCNcls() < 50)continue;
264       if(nTrack->GetTPCNcls() < 50)continue;
265       if(pTrack->Chi2perNDF() > 4)continue;
266       if(nTrack->Chi2perNDF() > 4)continue;
267       
268       Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
269       if(!pTrack->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
270       if(TMath::Abs(dca[1]) > 2) continue;
271       if(!nTrack->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
272       if(TMath::Abs(dca[1]) > 2) continue;
273       
274       V0Index[nGoodV0s] = iV0;
275       V0TrackID[2*nGoodV0s] = pTrack->GetID();
276       V0TrackID[2*nGoodV0s+1] = nTrack->GetID();
277       nGoodV0s++; 
278       if(nGoodV0s > 2) break;
279   }//V0s loop
280   
281   //Track loop
282   for(Int_t itr=0; itr<aod ->GetNumberOfTracks(); itr++) {
283     AliAODTrack *trk = aod->GetTrack(itr);
284     if( !trk ) continue;
285
286       if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
287       if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
288       if(trk->GetTPCNcls() < 50)continue;
289       if(trk->Chi2perNDF() > 4)continue;
290       Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
291       if(!trk->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
292       if(TMath::Abs(dca[1]) > 2) continue;
293      
294       TrackID[nGoodTracks] = trk->GetID();
295       nGoodTracks++;
296                                   
297       if(nGoodTracks > 4) break;  
298   }//Track loop
299
300   if(nGoodV0s == 2 && nGoodTracks == 4){
301         //SortArray(TrackID);
302         //SortArray(V0TrackID);
303         //for(Int_t i=0; i<4; i++) if (TrackID[i] != V0TrackID[i]) return;
304         for(Int_t i=0; i<2; i++){
305                 AliAODv0 *v0 = aod->GetV0(V0Index[i]);                          
306                 fHistK0sMass->Fill(v0->MassK0Short());
307                 }
308   }
309
310   
311   PostData(3, fListHist);
312
313 }
314
315 //_____________________________________________________________________________
316 void AliAnalysisTaskUpcK0sK0s::RunAODtree()
317 {
318   //input event
319   AliAODEvent *aod = (AliAODEvent*) InputEvent();
320   if(!aod) return;
321
322   //input data
323   const char *filnam = ((TTree*) GetInputData(0))->GetCurrentFile()->GetName();
324   fDataFilnam->Clear();
325   fDataFilnam->SetString(filnam);
326   fEvtNum = ((TTree*) GetInputData(0))->GetTree()->GetReadEntry();
327   fRunNum = aod ->GetRunNumber();
328
329   hCounter->Fill( 1 );
330
331   //Trigger
332   TString trigger = aod->GetFiredTriggerClasses();
333   
334   if( !trigger.Contains("CCUP4-B") ) return;
335
336   Bool_t isTRG = kFALSE;
337   for(Int_t i=1; i<ntrg; i++) {
338     if( fTrigger[i] ) {isTRG = kTRUE; hCounter->Fill( fRunNum - 167806 + 1 + i*2000 );}
339   }
340   if( !isTRG ) {PostData(2, hCounter); return;}
341
342   hCounter->Fill( 2 );
343
344   //trigger inputs
345   fL0inputs = aod->GetHeader()->GetL0TriggerInputs();
346   fL1inputs = aod->GetHeader()->GetL1TriggerInputs();
347
348   //Event identification
349   fPerNum = aod ->GetPeriodNumber();
350   fOrbNum = aod ->GetOrbitNumber();
351   fBCrossNum = aod ->GetBunchCrossNumber();
352
353   //primary vertex
354   AliAODVertex *fAODVertex = aod->GetPrimaryVertex();
355   fVtxContrib = fAODVertex->GetNContributors();
356
357   //Tracklets
358   fNtracklets = aod->GetTracklets()->GetNumberOfTracklets();
359
360   //VZERO, ZDC
361   AliAODVZERO *fV0data = aod ->GetVZEROData();
362   AliAODZDC *fZDCdata = aod->GetZDCData();
363   
364   fV0Adecision = fV0data->GetV0ADecision();
365   fV0Cdecision = fV0data->GetV0CDecision();
366   fZDCAenergy = fZDCdata->GetZNATowerEnergy()[0];
367   fZDCCenergy = fZDCdata->GetZNCTowerEnergy()[0];
368   
369   Int_t nGoodV0s=0;
370   Int_t V0Index[3] = {-1,-1,-1};
371   Int_t V0TrackID[6] = {-1,-1,-1,-1,-1,-1};
372
373   Int_t nGoodTracks=0;
374   Int_t TrackID[5] = {-1,-1,-1,-1,-1};
375
376   //V0s loop
377   for(Int_t iV0=0; iV0<aod ->GetNumberOfV0s(); iV0++) {
378     AliAODv0 *v0 = aod->GetV0(iV0);
379     if( !v0 ) continue;
380     Bool_t lOnFlyStatus = v0->GetOnFlyStatus();
381     if (lOnFlyStatus) continue;
382     
383     AliAODTrack *pTrack=(AliAODTrack *)v0->GetDaughter(0); //0->Positive Daughter
384     AliAODTrack *nTrack=(AliAODTrack *)v0->GetDaughter(1); //1->Negative Daughter
385     if (!pTrack || !nTrack) continue;
386
387     if ( pTrack->Charge() == nTrack->Charge())continue;
388
389       if(!(pTrack->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
390       if(!(nTrack->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
391       if(pTrack->GetTPCNcls() < 50)continue;
392       if(nTrack->GetTPCNcls() < 50)continue;
393       if(pTrack->Chi2perNDF() > 4)continue;
394       if(nTrack->Chi2perNDF() > 4)continue;
395       
396       Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
397       if(!pTrack->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
398       if(TMath::Abs(dca[1]) > 2) continue;
399       if(!nTrack->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
400       if(TMath::Abs(dca[1]) > 2) continue;
401       
402       V0Index[nGoodV0s] = iV0;
403       V0TrackID[2*nGoodV0s] = pTrack->GetID();
404       V0TrackID[2*nGoodV0s+1] = nTrack->GetID();
405       nGoodV0s++; 
406       if(nGoodV0s > 2) break;
407   }//V0s loop
408   
409   //Track loop
410   for(Int_t itr=0; itr<aod ->GetNumberOfTracks(); itr++) {
411     AliAODTrack *trk = aod->GetTrack(itr);
412     if( !trk ) continue;
413
414       if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
415       if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
416       if(trk->GetTPCNcls() < 50)continue;
417       if(trk->Chi2perNDF() > 4)continue;
418       Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
419       if(!trk->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
420       if(TMath::Abs(dca[1]) > 2) continue;
421      
422       TrackID[nGoodTracks] = trk->GetID();
423       nGoodTracks++;
424                                   
425       if(nGoodTracks > 4) break;  
426   }//Track loop
427     
428   if(nGoodV0s == 2 && nGoodTracks == 4){
429         //SortArray(TrackID);
430         //SortArray(V0TrackID);
431         //for{Int_t i=0; i<4; i++} if (TrackID[i] != V0TrackID[i]) {PostData(2, hCounter); return;}
432         for(Int_t i=0; i<2; i++){
433                 AliAODv0 *v0 = aod->GetV0(V0Index[i]);
434                 AliAODTrack *pTrack=(AliAODTrack *)v0->GetDaughter(0); //0->Positive Daughter
435                 AliAODTrack *nTrack=(AliAODTrack *)v0->GetDaughter(1); //1->Negative Daughter
436                                 
437                 new((*fK0sAODv0s)[i]) AliAODv0(*v0);
438                 new((*fK0sAODTracks)[2*i]) AliAODTrack(*pTrack);
439                 new((*fK0sAODTracks)[2*i+1]) AliAODTrack(*nTrack);
440                 }
441   fK0sTree ->Fill();
442   
443   }
444   
445   PostData(1, fK0sTree);   
446   PostData(2, hCounter);
447
448 }//RunAOD
449
450 //_____________________________________________________________________________
451 void AliAnalysisTaskUpcK0sK0s::SortArray(Double_t *dArray) {
452     for (Int_t i = 3; i > 0; --i) {
453         for (Int_t j = 0; j < i; ++j) {
454             if (dArray[j] > dArray[j+1]) {
455                 Double_t dTemp = dArray[j];
456                 dArray[j] = dArray[j+1];
457                 dArray[j+1] = dTemp;
458             }
459         }
460     }
461 }
462
463 //_____________________________________________________________________________
464 void AliAnalysisTaskUpcK0sK0s::RunESD()
465 {
466
467   /*/input event
468   AliESDEvent *esd = (AliESDEvent*) InputEvent();
469   if(!esd) return;
470
471   //input data
472   const char *filnam = ((TTree*) GetInputData(0))->GetCurrentFile()->GetName();
473   fDataFilnam->Clear();
474   fDataFilnam->SetString(filnam);
475   fEvtNum = ((TTree*) GetInputData(0))->GetTree()->GetReadEntry();
476   fRunNum = esd->GetRunNumber();
477
478   hCounter->Fill( 1 );
479
480   //Trigger
481   TString trigger = esd->GetFiredTriggerClasses();
482   
483   fTrigger[0]   = trigger.Contains("CINT7-B");
484   fTrigger[1]   = trigger.Contains("CCUP4-B"); // CE 
485   fTrigger[2]   = trigger.Contains("CCUP4-E"); // CE 
486
487   Bool_t isTRG = kFALSE;
488   for(Int_t i=1; i<ntrg; i++) {
489     if( fTrigger[i] ) {isTRG = kTRUE; hCounter->Fill( fRunNum - 167806 + 1 + i*2000 );}
490   }
491   if( !isTRG ) {PostData(3, hCounter); return;}
492
493   hCounter->Fill( 2 );
494
495   //trigger inputs
496   fL0inputs = esd->GetHeader()->GetL0TriggerInputs();
497   fL1inputs = esd->GetHeader()->GetL1TriggerInputs();
498
499   //Event identification
500   fPerNum = esd->GetPeriodNumber();
501   fOrbNum = esd->GetOrbitNumber();
502   fBCrossNum = esd->GetBunchCrossNumber();
503
504   //primary vertex
505   AliESDVertex *fESDVertex = (AliESDVertex*) esd->GetPrimaryVertex();
506   fVtxContrib = fESDVertex->GetNContributors();
507
508   //Tracklets
509   fNtracklets = esd->GetMultiplicity()->GetNumberOfTracklets();
510
511   //VZERO, ZDC
512   AliESDVZERO *fV0data = esd->GetVZEROData();
513   AliESDZDC *fZDCdata = esd->GetESDZDC();
514   
515   fV0Adecision = fV0data->GetV0ADecision();
516   fV0Cdecision = fV0data->GetV0CDecision();
517   fZDCAenergy = fZDCdata->GetZN2TowerEnergy()[0];
518   fZDCCenergy = fZDCdata->GetZN1TowerEnergy()[0];
519   
520   Int_t nGoodTracks=0;
521   Int_t TrackIndex[5] = {-1,-1,-1,-1,-1};
522   
523   //Track loop
524   for(Int_t itr=0; itr<esd ->GetNumberOfTracks(); itr++) {
525     AliESDtrack *trk = esd->GetTrack(itr);
526     if( !trk ) continue;
527
528       if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
529       if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
530       if(trk->GetTPCNcls() < 50)continue;
531       if(trk->GetTPCchi2()/trk->GetTPCNcls() > 4)continue;
532       Float_t dca[2] = {0.0,0.0}; AliExternalTrackParam cParam;
533       if(!trk->RelateToVertex(fESDVertex, esd->GetMagneticField(),300.,&cParam)) continue;
534       trk->GetImpactParameters(dca[0],dca[1]);
535       if(TMath::Abs(dca[1]) > 2) continue;
536       
537       TrackIndex[nGoodTracks] = itr;
538       nGoodTracks++;
539       if(nGoodTracks > 4) break;   
540   }//Track loop
541
542   if(nGoodTracks == 2){
543           for(Int_t i=0; i<2; i++){
544                 AliESDtrack *trk = esd->GetTrack(TrackIndex[i]);
545                 
546                 AliExternalTrackParam cParam;
547                 trk->RelateToVertex(fESDVertex, esd->GetMagneticField(),300.,&cParam);// to get trk->GetImpactParameters(DCAxy,DCAz);
548                                 
549                 new((*fJPsiESDTracks)[i]) AliESDtrack(*trk); 
550                 
551                 }
552   fJPsiTree ->Fill();
553   PostData(1, fJPsiTree);
554   }
555   
556   if(nGoodTracks == 4){
557           for(Int_t i=0; i<4; i++){
558                 AliESDtrack *trk = esd->GetTrack(TrackIndex[i]);
559                 
560                 AliExternalTrackParam cParam;
561                 trk->RelateToVertex(fESDVertex, esd->GetMagneticField(),300.,&cParam);// to get trk->GetImpactParameters(DCAxy,DCAz);
562
563                 new((*fPsi2sESDTracks)[i]) AliESDtrack(*trk); 
564                 
565                 }
566   fPsi2sTree ->Fill();
567   PostData(2, fPsi2sTree);
568   }
569     
570   PostData(3, hCounter);
571 /*/
572 }//RunESD
573
574 //_____________________________________________________________________________
575 void AliAnalysisTaskUpcK0sK0s::Terminate(Option_t *) 
576 {
577
578   cout<<"Analysis complete."<<endl;
579 }//Terminate
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609