2 /**************************************************************************
3 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
5 * Author: The ALICE Off-line Project. *
6 * Contributors are mentioned in the code where appropriate. *
8 * Permission to use, copy, modify and distribute this software and its *
9 * documentation strictly for non-commercial purposes is hereby granted *
10 * without fee, provided that the above copyright notice appears in all *
11 * copies and that both the copyright notice and this permission notice *
12 * appear in the supporting documentation. The authors make no claims *
13 * about the suitability of this software for any purpose. It is *
14 * provided "as is" without express or implied warranty. *
15 **************************************************************************/
20 gSystem->Load("libANALYSIS");
21 gSystem->Load("libTPCcalib");
25 gSystem->Load("libANALYSIS");
26 gSystem->Load("libTPCcalib");
30 TFile f("CalibObjectsTrain2.root");
31 AliTPCcalibMaterial *calibMaterial = (AliTPCcalibMaterial *)f->Get("alignMaterial");
36 #include "Riostream.h"
42 #include "THnSparse.h"
50 #include "TGraphErrors.h"
53 #include "AliTPCclusterMI.h"
54 #include "AliTPCseed.h"
55 #include "AliESDVertex.h"
56 #include "AliESDEvent.h"
57 #include "AliESDfriend.h"
58 #include "AliESDInputHandler.h"
59 #include "AliAnalysisManager.h"
61 #include "AliTracker.h"
63 #include "AliTPCCalROC.h"
67 #include "AliTPCcalibMaterial.h"
69 #include "TTreeStream.h"
70 #include "AliTPCTracklet.h"
71 #include "TTimeStamp.h"
72 #include "AliTPCcalibDB.h"
73 #include "AliTPCcalibLaser.h"
74 #include "AliDCSSensorArray.h"
75 #include "AliDCSSensor.h"
77 #include "AliKFParticle.h"
78 #include "AliKFVertex.h"
80 #include "AliESDTZERO.h"
82 ClassImp(AliTPCcalibMaterial)
84 AliTPCcalibMaterial::AliTPCcalibMaterial():
85 AliTPCcalibBase("calibMaterial","calibMaterial"),
92 AliTPCcalibMaterial::AliTPCcalibMaterial(const char * name, const char * title):
93 AliTPCcalibBase(name,title),
102 AliTPCcalibMaterial::~AliTPCcalibMaterial(){
105 // class is owner of all histograms
107 if (!fHisMaterial) return;
109 delete fHisMaterialRPhi;
114 Long64_t AliTPCcalibMaterial::Merge(TCollection *li) {
118 TIterator* iter = li->MakeIterator();
119 AliTPCcalibMaterial* cal = 0;
121 while ((cal = (AliTPCcalibMaterial*)iter->Next())) {
122 if (!cal->InheritsFrom(AliTPCcalibMaterial::Class())) {
123 Error("Merge","Attempt to add object of class %s to a %s", cal->ClassName(), this->ClassName());
126 AliTPCcalibMaterial* calib= (AliTPCcalibMaterial*)(cal);
128 if (!fHisMaterial) fHisMaterial=MakeHisto();
129 fHisMaterial->Add(calib->fHisMaterial);
130 fHisMaterialRPhi->Add(calib->fHisMaterialRPhi);
137 void AliTPCcalibMaterial::Process(AliESDEvent *event){
141 const Int_t kMinCl=40;
142 const Float_t kMinRatio=0.7;
143 const Float_t kMaxS=0.05;
144 const Float_t kMinDist=5;
145 const Double_t kStep=1.;
149 // TTreeSRedirector * cstream = GetDebugStreamer();
156 // fill histogram of track prolongations
158 Int_t ntracks = event->GetNumberOfTracks();
159 for (Int_t itrack=0; itrack<ntracks; itrack++){
160 AliESDtrack *track=event->GetTrack(itrack);
161 if (!track) continue;
162 if (track->GetTPCNcls()<=kMinCl) continue;
163 if ((1.+track->GetTPCNcls())/(1.+track->GetTPCNclsF())<=kMinRatio) continue;
164 if ((1.+track->GetTPCnclsS())/(1.+track->GetTPCNcls())>kMaxS) continue;
165 if (!track->GetInnerParam()) continue;
166 if (track->GetKinkIndex(0)!=0) continue;
168 track->GetImpactParameters(dca[0],dca[1]);
169 if (TMath::Abs(dca[0])<kMinDist && TMath::Abs(dca[1])<kMinDist) continue;
170 AliExternalTrackParam param(*(track->GetInnerParam()));
171 if (!AliTracker::PropagateTrackTo(¶m,90,0.0005,10,kTRUE)) continue;
172 Double_t x[5]={0,0,0,TMath::Sqrt(TMath::Abs(param.GetP()))*param.GetSign(),TMath::Sqrt(TMath::Abs(track->GetTPCsignal()))};
175 for (Float_t radius=90; radius>0; radius-=kStep){
176 if (!AliTracker::PropagateTrackTo(¶m,radius,0.0005,kStep*0.5,kTRUE)) break;
177 if (TMath::Abs(param.GetSnp())>0.8) break;
179 Double_t weight=1./TMath::Sqrt(1.+param.GetSnp()*param.GetSnp()+param.GetTgl()*param.GetTgl());
180 fHisMaterial->Fill(x,weight);
181 Double_t r = TMath::Sqrt(x[0]*x[0]+x[1]*x[1]);
182 Double_t phi = TMath::ATan2(x[1],x[0]);
185 fHisMaterialRPhi->Fill(x,weight);
190 THnSparse *AliTPCcalibMaterial::MakeHisto(){
192 // Make track prolongation histogram
196 Int_t bins[5] = {100, 100, 300, 40, 100};
197 Double_t xmin[5] = {-100, -100, -300, -2, 5};
198 Double_t xmax[5] = {100, 100, 300, 2, 33};
199 TString axisName[5]={
206 TString axisTitle[5]={
214 Int_t binsR[5] = {30, 360, 300, 40, 100};
215 Double_t xminR[5] = { 0, -3.14, -300, -2, 5};
216 Double_t xmaxR[5] = {30, 3.14, 300, 2, 33};
217 TString axisNameR[5]={
224 TString axisTitleR[5]={
232 THnSparse *sparse = new THnSparseF("his_Material", "His Material", 5, bins, xmin, xmax);
233 THnSparse *sparseR = new THnSparseF("his_MaterialRPhi", "His Material Rphi", 5, binsR, xminR, xmaxR);
234 for (Int_t iaxis=0; iaxis<5; iaxis++){
235 sparse->GetAxis(iaxis)->SetName(axisName[iaxis]);
236 sparse->GetAxis(iaxis)->SetTitle(axisTitle[iaxis]);
237 sparseR->GetAxis(iaxis)->SetName(axisNameR[iaxis]);
238 sparseR->GetAxis(iaxis)->SetTitle(axisTitleR[iaxis]);
241 fHisMaterialRPhi=sparseR;
248 void AliTPCcalibMaterial::ProcessPairs(AliESDEvent *event){
250 // Process pairs of tracks to get a material budget map
254 if (event) AliKFParticle::SetField(event->GetMagneticField()); // set mean magnetic field for KF particles
256 // 1. Calculate total dEdx for all TPC tracks
258 const Int_t kMinCl=70;
259 const Double_t kEpsilon=0.000001;
260 const Float_t kMinRatio=0.7;
261 const Float_t kMinDist=1.5;
262 const Float_t kMinDistChi2=8; //
263 const Float_t kMaxDistZ=280; // max distanceZ
264 const Float_t kMaxDistR=250; // max distanceR
265 const Double_t kMaxChi2 =36; // maximal chi2 to define the vertex
266 const Double_t kMaxDistVertexSec=3; // maximal distance to secondary vertex
269 AliESDVertex *vertexSPD = (AliESDVertex *)event->GetPrimaryVertexSPD();
270 AliESDVertex * spdVertex = (AliESDVertex *)event->GetPrimaryVertexSPD();
271 AliESDVertex * trackVertex = (AliESDVertex *)event->GetPrimaryVertexTracks();
272 AliESDVertex * tpcVertex = (AliESDVertex *)event->GetPrimaryVertexTPC();
273 AliESDTZERO * tzero = (AliESDTZERO *)event->GetESDTZERO() ;
275 Double_t tpcSignalTotPrim=0;
276 Double_t tpcSignalTotSec=0;
280 Int_t ntracks=event->GetNumberOfTracks();
281 if ( ntracks<=2 ) return;
289 //1. Calculate total dEdx for primary and secondary tracks
290 // and count primaries and secondaries
291 Int_t *rejectTrack = new Int_t[ntracks];
293 for (Int_t itrack=0; itrack<ntracks; itrack++){
294 AliESDtrack *track=event->GetTrack(itrack);
295 rejectTrack[itrack]=0;
296 if (!track) continue;
297 if (track->GetTPCNcls()<=kMinCl) continue; // skip short tracks
299 if ((1.+track->GetTPCNcls())/(1.+track->GetTPCNclsF())<=kMinRatio) continue;
300 if (!track->GetInnerParam()) continue; // skip not TPC tracks
301 if (track->GetKinkIndex(0)!=0) {rejectTrack[itrack]+=16;continue;} // skip kinks
302 track->GetImpactParameters(dca[0],dca[1]);
303 if (TMath::Abs(dca[0])>kMaxDistR && TMath::Abs(dca[1])>kMaxDistZ) continue;
304 // remove too dip secondaries
305 if (TMath::Abs(dca[0])<kMinDist && TMath::Abs(dca[1])<kMinDist){
306 tpcSignalTotPrim+=track->GetTPCsignal();
309 tpcSignalTotSec+=track->GetTPCsignal();
312 if (cov[0]>kEpsilon &&TMath::Abs(dca[0])>kEpsilon &&TMath::Sqrt(dca[0]*dca[0]/(TMath::Abs(cov[0])))<kMinDistChi2) rejectTrack[itrack]+=1; // primary
313 if (cov[0]>kEpsilon &&TMath::Abs(dca[0])>kEpsilon &&TMath::Abs(dca[0])<kMinDist) rejectTrack[itrack]+=1; // primary
314 if (track->GetTPCsignal()<40) rejectTrack[itrack]+=16;
316 if (CheckLooper(itrack, event)) rejectTrack[itrack]+=2; // looper
317 if (CheckV0(itrack,event)) rejectTrack[itrack]+=4;
322 // 2. Find secondary vertices - double loop
324 for (Int_t itrack0=0; itrack0<ntracks; itrack0++){
325 AliESDtrack *track0=event->GetTrack(itrack0);
326 if (!track0) continue;
327 if (track0->GetTPCNcls()<=kMinCl) continue; // skip short tracks
328 if ((1.+track0->GetTPCNcls())/(1.+track0->GetTPCNclsF())<=kMinRatio) continue;
329 if (!track0->GetInnerParam()) continue; // skip not TPC tracks
330 if (track0->GetKinkIndex(0)>0) continue; // skip kinks
331 if (rejectTrack[itrack0]) continue; // skip
332 track0->GetImpactParameters(dca[0],dca[1]);
333 track0->GetImpactParameters(dca0[0],dca0[1]);
334 if (TMath::Abs(dca[0])>kMaxDistR && TMath::Abs(dca[1])>kMaxDistZ) continue;
335 // remove too dip secondaries
337 AliKFParticle part0(*track0,211); //assuming pion mass
338 if (track0->Charge()*part0.Q()<0) part0.Q()*=-1; // change sign if opposite
340 for (Int_t itrack1=itrack0+1; itrack1<ntracks; itrack1++){
341 AliESDtrack *track1=event->GetTrack(itrack1);
342 if (!track1) continue;
343 if (rejectTrack[itrack1]) continue; // skip
344 if (track1->GetTPCNcls()<=kMinCl) continue; // skip short tracks
345 if ((1.+track1->GetTPCNcls())/(1.+track1->GetTPCNclsF())<=kMinRatio) continue;
346 if (!track1->GetInnerParam()) continue; // skip not TPC tracks
347 if (track1->GetKinkIndex(0)!=0) continue; // skip kinks
348 track1->GetImpactParameters(dca1[0],dca1[1]);
349 track1->GetImpactParameters(dca[0],dca[1]);
350 if (TMath::Abs(dca[0])<kMinDist && TMath::Abs(dca[1])<kMinDist) continue;
351 if (TMath::Abs(dca[0])>kMaxDistR && TMath::Abs(dca[1])>kMaxDistZ) continue;
352 AliKFParticle part1(*track1,211); // assuming pion mass
353 if (track1->Charge()*part1.Q()<0) part1.Q()*=-1; // change sign if opposite
360 if ((vertex.GetChi2()/vertex.GetNDF())> kMaxChi2) continue;
361 if (TMath::Abs(vertex.GetX())>kMaxDistR) continue;
362 if (TMath::Abs(vertex.GetY())>kMaxDistR) continue;
363 if (TMath::Abs(vertex.GetZ())>kMaxDistZ) continue;
364 Double_t errX2=vertex.GetErrX();
365 Double_t errY2=vertex.GetErrY();
366 Double_t errZ2=vertex.GetErrZ();
368 Double_t err3D=TMath::Sqrt(errX2*errX2+errY2*errY2+errZ2*errZ2/10.);
369 Double_t err2D=TMath::Sqrt(errX2*errX2+errY2*errY2);
370 if (err3D>kMaxDistVertexSec) continue;
371 if (err3D*TMath::Sqrt(vertex.GetChi2()+0.00001)>kMaxDistVertexSec) continue;
374 dvertex += (vertexSPD->GetX()-vertex.GetX())*(vertexSPD->GetX()-vertex.GetX());
375 dvertex += (vertexSPD->GetY()-vertex.GetY())*(vertexSPD->GetY()-vertex.GetY());
376 dvertex += (vertexSPD->GetZ()-vertex.GetZ())*(vertexSPD->GetZ()-vertex.GetZ());
377 dvertex=TMath::Sqrt(dvertex+0.00000001);
378 if (err3D>0.2*dvertex) continue;
379 if (err3D*TMath::Sqrt(vertex.GetChi2()+0.000001)>0.1*dvertex) continue;
380 Double_t radius = TMath::Sqrt((vertex.GetX()*vertex.GetX()+vertex.GetY()*vertex.GetY()));
387 for (Int_t itrack2=0; itrack2<ntracks; itrack2++){
388 if (itrack2==itrack0) continue;
389 if (itrack2==itrack1) continue;
390 if (rejectTrack[itrack2]) continue; // skip
391 AliESDtrack *track2=event->GetTrack(itrack2);
392 if (!track2) continue;
393 if (track2->GetTPCNcls()<=kMinCl) continue; // skip short tracks
394 if ((1.+track2->GetTPCNcls())/(1.+track2->GetTPCNclsF())<=kMinRatio) continue;
395 if (!track2->GetInnerParam()) continue; // skip not TPC tracks
396 if (track2->GetKinkIndex(0)>0) continue; // skip kinks
397 track2->GetImpactParameters(dca[0],dca[1]);
398 if (TMath::Abs(dca[0])<kMinDist && TMath::Abs(dca[1])<kMinDist) continue;
399 if (TMath::Abs(dca[0])>kMaxDistR && TMath::Abs(dca[1])>kMaxDistZ) continue;
400 if (TMath::Abs(track2->GetD(vertex.GetX(), vertex.GetY(),event->GetMagneticField()))>kMaxDistVertexSec) continue;
401 Double_t vtxx[3]={vertex2.GetX(),vertex2.GetY(),vertex2.GetZ()};
402 Double_t svtxx[3]={vertex.GetErrX(),vertex.GetErrY(),vertex.GetErrZ()};
403 AliESDVertex vtx(vtxx,svtxx);
404 AliExternalTrackParam param=*track2;
405 Double_t delta[2]={0,0};
406 if (!param.PropagateToDCA(&vtx,event->GetMagneticField(),kMaxDistVertexSec,delta)) continue;
407 if (TMath::Abs(delta[0])>kMaxDistVertexSec) continue;
408 if (TMath::Abs(delta[1])>kMaxDistVertexSec) continue;
409 if (TMath::Abs(delta[0])>6.*TMath::Sqrt(param.GetSigmaY2()+vertex2.GetErrY()*vertex2.GetErrY())+0.1) continue;
410 if (TMath::Abs(delta[1])>6.*TMath::Sqrt(param.GetSigmaZ2()+vertex2.GetErrZ()*vertex2.GetErrZ())+0.5) continue;
412 AliKFParticle part2(param,211); // assuming pion mass
413 if (track2->Charge()*part2.Q()<0) part2.Q()*=-1; // change sign if opposite
415 rejectTrack[itrack0]+=10; // do noit reuse the track
416 rejectTrack[itrack1]+=10; // do not reuse the track
417 rejectTrack[itrack2]+=10;
421 TTreeSRedirector *pcstream = GetDebugStreamer();
426 Float_t dedx0= track0->GetTPCsignal();
427 Float_t dedx1= track1->GetTPCsignal();
428 AliExternalTrackParam * p0= (AliExternalTrackParam *)track0->GetInnerParam();
429 AliExternalTrackParam * p1= (AliExternalTrackParam *)track1->GetInnerParam();
430 Double_t errX=vertex2.GetErrX();
431 Double_t errY=vertex2.GetErrY();
432 Double_t errZ=vertex2.GetErrZ();
433 Double_t vx = vertex2.GetX();
434 Double_t vy = vertex2.GetY();
435 Double_t vz = vertex2.GetZ();
436 (*pcstream)<<"mapTPC"<<
437 "run="<<fRun<< // run
438 "event="<<fEvent<< // event number
439 "time="<<fTime<< // timeStamp
440 "trigger="<<fTrigger<< // trigger
441 "mag="<<fMagF<< // magnetic field
443 "spdV.="<<spdVertex<< // spd vertex
444 "trackV.="<<trackVertex<< // track vertex
445 "tpcV.="<<tpcVertex<< // track vertex
446 "tzero.="<<tzero<< // tzero info
448 "ntracks="<<ntracks<<
449 "ntracksTPC="<<ntracksTPC<<
450 "nPrim="<<nTPCPrim<< // number of primaries
451 "nSec="<<nTPCSec<< // number of secondaries
452 "sigPrim="<<tpcSignalTotPrim<< // total dEdx in primaries
453 "sigSec="<<tpcSignalTotSec<< // total dEdx in secondaries
454 "dedx0="<<dedx0<< // dedx part 0
455 "dedx1="<<dedx1<< // dedx part 1
456 "p0.="<<p0<< // part 0
457 "p1.="<<p1<< //part 1
458 "v.="<<&vertex<< // KF vertex
459 "v2.="<<&vertex2<< // KF vertex all tracks
464 "dvertex="<<dvertex<<
476 if (vertex2.GetNDF()>2){
477 (*pcstream)<<"mapVertex"<<
478 "run="<<fRun<< // run
479 "event="<<fEvent<< // event number
480 "time="<<fTime<< // timeStamp
481 "trigger="<<fTrigger<< // trigger
482 "mag="<<fMagF<< // magnetic field
484 "spdV.="<<spdVertex<< // spd vertex
485 "trackV.="<<trackVertex<< // track vertex
486 "tpcV.="<<tpcVertex<< // track vertex
487 "tzero.="<<tzero<< // tzero info
490 "ntracks="<<ntracks<<
491 "ntracksTPC="<<ntracksTPC<<
492 "nPrim="<<nTPCPrim<< // number of primaries
493 "nSec="<<nTPCSec<< // number of secondaries
494 "sigPrim="<<tpcSignalTotPrim<< // total dEdx in primaries
495 "sigSec="<<tpcSignalTotSec<< // total dEdx in secondaries
496 "dedx0="<<dedx0<< // dedx part 0
497 "dedx1="<<dedx1<< // dedx part 1
498 "p0.="<<p0<< // part 0
499 "p1.="<<p1<< //part 1
500 "v.="<<&vertex<< // KF vertex
501 "v2.="<<&vertex2<< // KF vertex all tracks
515 "dvertex="<<dvertex<<
521 TTreeSRedirector *pcstream = GetDebugStreamer();
523 (*pcstream)<<"statTPC"<<
524 "run="<<fRun<< // run
525 "time="<<fTime<< // timeStamp
526 "trigger="<<fTrigger<< // trigger
527 "mag="<<fMagF<< // magnetic field
528 "ntracks="<<ntracks<<
529 "ntracksTPC="<<ntracksTPC<<
531 "nPrim="<<nTPCPrim<< // number of primaries
532 "nSec="<<nTPCSec<< // number of secondaries
533 "sigPrim="<<tpcSignalTotPrim<< // total dEdx in primaries
534 "sigSec="<<tpcSignalTotSec<< // total dEdx in secondaries
536 "spdV.="<<spdVertex<< // spd vertex
537 "trackV.="<<trackVertex<< // track vertex
538 "tpcV.="<<tpcVertex<< // track vertex
539 "tzero.="<<tzero<< // tzero info
542 delete [] rejectTrack;
546 Bool_t AliTPCcalibMaterial::CheckLooper(Int_t index, AliESDEvent *event){
548 // check if given track is looper candidate
549 // if looper return kTRUE
551 Int_t ntracks=event->GetNumberOfTracks();
553 const Double_t ktglCut=0.03;
554 const Double_t kalphaCut=0.4;
555 static Int_t counter=0;
557 AliESDtrack * track0 = event->GetTrack(index);
558 AliESDtrack * track1P = 0;
559 for (Int_t itrack1=0; itrack1<ntracks; itrack1++){
560 if (itrack1==index) continue;
561 AliESDtrack *track1=event->GetTrack(itrack1);
562 if (!track1) continue;
563 if (TMath::Abs(TMath::Abs(track1->GetTgl())-TMath::Abs(track0->GetTgl()))>ktglCut) continue;
564 if (TMath::Abs(TMath::Abs(track1->GetAlpha())-TMath::Abs(track0->GetAlpha()))>kalphaCut) continue;
569 TTreeSRedirector *pcstream = GetDebugStreamer();
570 if (pcstream &&counter<100000){
572 AliExternalTrackParam p0(*track0);
573 AliExternalTrackParam p1(*track1P);
574 (*pcstream)<<"checkLooper"<<
584 Bool_t AliTPCcalibMaterial::CheckV0(Int_t index, AliESDEvent *event){
586 // check if given track is V0 candidata
587 // if looper return kTRUE
590 Int_t ntracks=event->GetNumberOfTracks();
592 const Double_t kSigmaMass=0.001;
593 const Int_t kChi2Cut=10;
594 static Int_t counter=0;
596 AliESDtrack * track0 = event->GetTrack(index);
597 AliExternalTrackParam pL(*track0);
598 AliKFParticle part0El(*track0, 11); //assuming mass e
599 AliKFParticle part0Pi(*track0, 211); //assuming mass pi0
600 AliKFParticle part0P(*track0, 2212); //assuming mass proton
601 if (track0->Charge()*part0El.Q()<0) {
602 part0El.Q()*=-1; // change sign if opposite
603 part0Pi.Q()*=-1; // change sign if opposite
604 part0P.Q()*=-1; // change sign if opposite
609 for (Int_t itrack1=0; itrack1<ntracks; itrack1++){
610 if (itrack1==index) continue;
611 AliESDtrack *track1=event->GetTrack(itrack1);
612 if (!track1) continue;
613 if (track1->Charge()*track0->Charge()>0) continue;
614 AliKFParticle part1El(*track1, 11); //assuming mass e
615 AliKFParticle part1Pi(*track1, 211); //assuming mass e
616 AliKFParticle part1P(*track1, 2212); //assuming mass e
617 if (track1->Charge()*part1El.Q()<0) {
618 part1El.Q()*=-1; // change sign if opposite
619 part1Pi.Q()*=-1; // change sign if opposite
620 part1P.Q()*=-1; // change sign if opposite
623 AliKFVertex vertexG; // gamma conversion candidate
626 AliKFVertex vertexGC; // gamma conversion candidate
629 vertexGC.SetMassConstraint(0,kSigmaMass);
630 AliKFVertex vertexK0; // gamma conversion candidate
633 AliKFVertex vertexK0C; // gamma conversion candidate
636 vertexK0C.SetMassConstraint(0.497614,kSigmaMass);
637 if (vertexGC.GetChi2()<kChi2Cut && vertexG.GetMass()<0.06) isGamma=kTRUE;
638 if (vertexK0C.GetChi2()<kChi2Cut&&TMath::Abs(vertexK0.GetMass()-0.5)<0.06) isK0=kTRUE;
641 TTreeSRedirector *pcstream = GetDebugStreamer();
642 if (pcstream&&counter<2000){
644 AliExternalTrackParam p0(*track0);
645 AliExternalTrackParam p1(*track1);
646 (*pcstream)<<"checkV0"<<
647 "p0.="<<&p0<< //particle 0
648 "p1.="<<&p1<< //particle 1
649 "isGamma="<<isGamma<< // is gamma candidate
650 "isK0s="<<isK0<< // is k0 candidate
651 "vG.="<<&vertexG<< // is gamma candidate
652 "vGC.="<<&vertexGC<< // is gamma candidate
653 "vK.="<<&vertexK0<< // is K0s candidate
654 "vKC.="<<&vertexK0C<< // is K0s candidate
660 if (index1>0) return kTRUE;
665 //AliXRDPROOFtoolkit::FilterList("mater.list","* mapTPC",1);
666 AliXRDPROOFtoolkit toolkit;
667 TChain *chain = toolkit.MakeChainRandom("mater.list.Good","mapVertex",0,4000);
668 TChain *chainTPC = toolkit.MakeChainRandom("mater.list.Good","mapTPC",0,50000);
671 TCut cutErr="sqrt(v.fChi2)*err3D<1.0";
672 TCut cutOccu="sqrt(v.fChi2*(errX^2+errY^2))/min(sqrt(v.fP[0]^2+v.fP[1]^2+v.fP[2]^2/20),20)<0.2&&sqrt((errX^2+errY^2))/min(sqrt(v.fP[0]^2+v.fP[1]^2+v.fP[2]^2/20),20)<0.3&&sqrt(v.fChi2)*err3D<1.5";
674 chainTPC->Draw(">>listTPC",cutOccu,"entryList");
675 TEntryList *elistTPC = (TEntryList*)gDirectory->Get("listTPC");
676 chainTPC->SetEntryList(elistTPC);
681 chainTPC.Draw("v.fP[1]:v.fP[0]","sqrt(v.fP[0]^2+v.fP[1]^2)<100","",10000000);
683 TCut cutITS="abs(v.fP[2])-10<sqrt(v.fP[0]^2+v.fP[1]^2)";
684 chainTPC.Draw("v.fP[1]:v.fP[0]",cutITS+"(sqrt(v.fP[0]^2+v.fP[1]^2)<50)&&err2D<1&&err3D/dvertex<0.05","",500000);
687 chainTPC.Draw("v.fP[1]:v.fP[0]>>his(400,-100,100,400,-100,100)","err2D<1&&err2D/dvertex<0.2","colz",50000);
690 chainTPC.Draw("radius:vz>>his(400,-100,100,400,0,100)","err2D<1&&err2D/dvertex<0.05","colz",5000);
692 TTree * tree = chain->CloneTree();
693 TFile f("material.root","recreate");
699 TCut cutChi2="v.fChi2<2&&sqrt(errX^2+errY^2)<2.";
700 TFile f("material.root")
701 TTree * tree = (TTree*)f.Get("mapVertex");
703 tree->Draw("v.fChi2",cutChi2,"",1000)