9 #include "TDatabasePDG.h"
10 #include "AliRunLoader.h"
17 #include "TLinearFitter.h"
19 #include "TTreeStream.h"
25 #include "AliTracker.h"
26 #include "AliESDEvent.h"
27 #include "AliESDtrack.h"
28 #include "AliESDfriend.h"
29 #include "AliESDfriendTrack.h"
30 #include "AliMathBase.h"
31 #include "AliTPCseed.h"
32 #include "AliTPCclusterMI.h"
34 #include "AliKFParticle.h"
35 #include "AliKFVertex.h"
37 #include "AliTrackPointArray.h"
39 #include "AliTPCcalibV0.h"
42 #include "TTreeStream.h"
43 #include "AliTPCcalibDB.h"
44 #include "AliTPCCorrection.h"
45 #include "AliGRPObject.h"
46 #include "AliTPCTransform.h"
52 ClassImp(AliTPCcalibV0)
55 AliTPCcalibV0::AliTPCcalibV0() :
68 AliTPCcalibV0::AliTPCcalibV0(const Text_t *name, const Text_t *title):
79 fPdg = new TDatabasePDG;
80 // create output histograms
85 AliTPCcalibV0::~AliTPCcalibV0(){
97 void AliTPCcalibV0::ProcessESD(AliESDEvent *esd, AliStack *stack){
102 AliKFParticle::SetField(esd->GetMagneticField());
103 if (TMath::Abs(AliTracker::GetBz())<1) return;
117 void AliTPCcalibV0::DumpToTreeHPT(AliESDEvent *esd){
119 // Dump V0s fith full firend information to the
121 if (TMath::Abs(AliTracker::GetBz())<1) return;
122 const Int_t kMinCluster=110;
123 const Float_t kMinPt =3.;
124 AliESDfriend *esdFriend=static_cast<AliESDfriend*>(esd->FindListObject("AliESDfriend"));
126 Printf("ERROR: esdFriend not available");
130 Int_t ntracks=esd->GetNumberOfTracks();
131 for (Int_t i=0;i<ntracks;++i) {
133 AliESDtrack *track = esd->GetTrack(i);
134 if (track->GetTPCncls()<kMinCluster) continue;
135 AliESDfriendTrack *friendTrack = esdFriend->GetTrack(i);
136 if (!friendTrack) continue;
137 if (TMath::Abs(AliTracker::GetBz())>1){ // cut on momenta if measured
138 if (track->Pt()>kMinPt) isOK=kTRUE;
140 if (TMath::Abs(AliTracker::GetBz())<1){ // require primary track for the B field OFF data
141 Bool_t isAccepted=kTRUE;
142 if (!track->IsOn(AliESDtrack::kITSrefit)) isAccepted=kFALSE;
143 if (!track->IsOn(AliESDtrack::kTPCrefit)) isAccepted=kFALSE;
144 if (!track->IsOn(AliESDtrack::kTOFout)) isAccepted=kFALSE;
145 Float_t dvertex[2],cvertex[3];
146 track->GetImpactParametersTPC(dvertex,cvertex);
147 if (TMath::Abs(dvertex[0]/TMath::Sqrt(cvertex[0]+0.01))>20) isAccepted=kFALSE;
148 if (TMath::Abs(dvertex[1]/TMath::Sqrt(TMath::Abs(cvertex[2]+0.01)))>20) isAccepted=kFALSE;
149 track->GetImpactParameters(dvertex,cvertex);
150 if (TMath::Abs(dvertex[0]/TMath::Sqrt(cvertex[0]+0.01))>10) isAccepted=kFALSE;
151 if (TMath::Abs(dvertex[1]/TMath::Sqrt(TMath::Abs(cvertex[2]+0.01)))>10) isAccepted=kFALSE;
152 if (!isAccepted) isOK=kFALSE;
158 TObject *calibObject;
159 AliTPCseed *seed = 0;
160 for (Int_t l=0;(calibObject=friendTrack->GetCalibObject(l));++l) {
161 if ((seed=dynamic_cast<AliTPCseed*>(calibObject))) break;
165 fHPTTree = new TTree("HPT","HPT");
166 fHPTTree->SetDirectory(0);
168 if (fHPTTree->GetEntries()==0){
170 fHPTTree->SetDirectory(0);
171 fHPTTree->Branch("t.",&track);
172 fHPTTree->Branch("ft.",&friendTrack);
173 fHPTTree->Branch("s.",&seed);
175 fHPTTree->SetBranchAddress("t.",&track);
176 fHPTTree->SetBranchAddress("ft.",&friendTrack);
177 fHPTTree->SetBranchAddress("s.",&seed);
186 void AliTPCcalibV0::DumpToTree(AliESDEvent *esd){
188 // Dump V0s fith full firend information to the
190 Int_t nV0s = fESD->GetNumberOfV0s();
191 const Int_t kMinCluster=110;
192 const Double_t kDownscale=0.01;
193 const Float_t kMinR =0;
194 const Float_t kMinPt =1.0;
195 const Float_t kMinMinPt =0.7;
196 AliESDfriend *esdFriend=static_cast<AliESDfriend*>(esd->FindListObject("AliESDfriend"));
198 Printf("ERROR: esdFriend not available");
203 for (Int_t ivertex=0; ivertex<nV0s; ivertex++){
205 AliESDv0 * v0 = (AliESDv0*) esd->GetV0(ivertex);
206 AliESDtrack * track0 = fESD->GetTrack(v0->GetIndex(0)); // negative track
207 AliESDtrack * track1 = fESD->GetTrack(v0->GetIndex(1)); // positive track
208 if (track0->GetTPCNcls()<kMinCluster) continue;
209 if (track0->GetKinkIndex(0)>0) continue;
210 if (track1->GetTPCNcls()<kMinCluster) continue;
211 if (track1->GetKinkIndex(0)>0) continue;
212 if (v0->GetOnFlyStatus()==kFALSE) continue;
214 if (TMath::Min(track0->Pt(),track1->Pt())<kMinMinPt) continue;
217 if (TMath::Max(track0->Pt(),track1->Pt())>kMinPt) isOK=kTRUE;
218 if (gRandom->Rndm()<kDownscale) isOK=kTRUE;
221 AliESDfriendTrack *ftrack0 = esdFriend->GetTrack(v0->GetIndex(0));
222 if (!ftrack0) continue;
223 AliESDfriendTrack *ftrack1 = esdFriend->GetTrack(v0->GetIndex(1));
224 if (!ftrack1) continue;
226 TObject *calibObject;
227 AliTPCseed *seed0 = 0;
228 AliTPCseed *seed1 = 0;
229 for (Int_t l=0;(calibObject=ftrack0->GetCalibObject(l));++l) {
230 if ((seed0=dynamic_cast<AliTPCseed*>(calibObject))) break;
232 for (Int_t l=0;(calibObject=ftrack1->GetCalibObject(l));++l) {
233 if ((seed1=dynamic_cast<AliTPCseed*>(calibObject))) break;
235 if (!seed0) continue;
236 if (!seed1) continue;
237 AliExternalTrackParam * paramIn0 = (AliExternalTrackParam *)track0->GetInnerParam();
238 AliExternalTrackParam * paramIn1 = (AliExternalTrackParam *)track1->GetInnerParam();
239 if (!paramIn0) continue;
240 if (!paramIn1) continue;
244 fV0Tree = new TTree("V0s","V0s");
245 fV0Tree->SetDirectory(0);
247 if (fV0Tree->GetEntries()==0){
249 fV0Tree->SetDirectory(0);
250 fV0Tree->Branch("v0.",&v0);
251 fV0Tree->Branch("t0.",&track0);
252 fV0Tree->Branch("t1.",&track1);
253 fV0Tree->Branch("ft0.",&ftrack0);
254 fV0Tree->Branch("ft1.",&ftrack1);
255 fV0Tree->Branch("s0.",&seed0);
256 fV0Tree->Branch("s1.",&seed1);
258 fV0Tree->SetBranchAddress("v0.",&v0);
259 fV0Tree->SetBranchAddress("t0.",&track0);
260 fV0Tree->SetBranchAddress("t1.",&track1);
261 fV0Tree->SetBranchAddress("ft0.",&ftrack0);
262 fV0Tree->SetBranchAddress("ft1.",&ftrack1);
263 fV0Tree->SetBranchAddress("s0.",&seed0);
264 fV0Tree->SetBranchAddress("s1.",&seed1);
271 Long64_t AliTPCcalibV0::Merge(TCollection *const li) {
273 TIterator* iter = li->MakeIterator();
274 AliTPCcalibV0* cal = 0;
276 while ((cal = (AliTPCcalibV0*)iter->Next())) {
279 fV0Tree = new TTree("V0s","V0s");
280 fV0Tree->SetDirectory(0);
282 if (cal->fV0Tree->GetEntries()>0) AliTPCcalibV0::AddTree(cal->fV0Tree);
283 if (cal->fHPTTree->GetEntries()>0) AliTPCcalibV0::AddTreeHPT(cal->fHPTTree);
290 void AliTPCcalibV0::AddTree(TTree * treeInput){
292 // Add the content of tree:
293 // Notice automatic copy of tree in ROOT does not work for such complicated tree
295 AliESDv0 * v0 = new AliESDv0;
297 AliESDtrack * track0 = 0; // negative track
298 AliESDtrack * track1 = 0; // positive track
299 AliESDfriendTrack *ftrack0 = 0;
300 AliESDfriendTrack *ftrack1 = 0;
301 AliTPCseed *seed0 = 0;
302 AliTPCseed *seed1 = 0;
303 treeInput->SetBranchStatus("ft0.",kFALSE);
304 treeInput->SetBranchStatus("ft1.",kFALSE);
306 Double_t massK0= pdg.GetParticle("K0")->Mass();
307 Double_t massLambda= pdg.GetParticle("Lambda0")->Mass();
309 Int_t entries= treeInput->GetEntries();
310 for (Int_t i=0; i<entries; i++){
311 treeInput->SetBranchAddress("v0.",&v0);
312 treeInput->SetBranchAddress("t0.",&track0);
313 treeInput->SetBranchAddress("t1.",&track1);
314 treeInput->SetBranchAddress("ft0.",&ftrack0);
315 treeInput->SetBranchAddress("ft1.",&ftrack1);
316 treeInput->SetBranchAddress("s0.",&seed0);
317 treeInput->SetBranchAddress("s1.",&seed1);
318 if (fV0Tree->GetEntries()==0){
319 fV0Tree->SetDirectory(0);
320 fV0Tree->Branch("v0.",&v0);
321 fV0Tree->Branch("t0.",&track0);
322 fV0Tree->Branch("t1.",&track1);
323 fV0Tree->Branch("ft0.",&ftrack0);
324 fV0Tree->Branch("ft1.",&ftrack1);
325 fV0Tree->Branch("s0.",&seed0);
326 fV0Tree->Branch("s1.",&seed1);
328 fV0Tree->SetBranchAddress("v0.",&v0);
329 fV0Tree->SetBranchAddress("t0.",&track0);
330 fV0Tree->SetBranchAddress("t1.",&track1);
331 fV0Tree->SetBranchAddress("ft0.",&ftrack0);
332 fV0Tree->SetBranchAddress("ft1.",&ftrack1);
333 fV0Tree->SetBranchAddress("s0.",&seed0);
334 fV0Tree->SetBranchAddress("s1.",&seed1);
337 treeInput->GetEntry(i);
338 ftrack0->GetCalibContainer()->SetOwner(kTRUE);
339 ftrack1->GetCalibContainer()->SetOwner(kTRUE);
341 if (v0->GetOnFlyStatus()==kFALSE) isOK=kFALSE;
342 if (track0->GetTPCncls()<100) isOK=kFALSE;
343 if (track1->GetTPCncls()<100) isOK=kFALSE;
344 if (TMath::Min(seed0->Pt(),seed1->Pt())<kMinPt) isOK=kFALSE;
345 if (TMath::Min(track0->Pt(),track1->Pt())<kMinPt) isOK=kFALSE;
347 if (TMath::Abs(v0->GetEffMass(2,2)-massK0)<0.05) isV0=kTRUE;
348 if (TMath::Abs(v0->GetEffMass(4,2)-massLambda)<0.05) isV0=kTRUE;
349 if (TMath::Abs(v0->GetEffMass(2,4)-massLambda)<0.05) isV0=kTRUE;
350 if (TMath::Abs(v0->GetEffMass(0,0))<0.02) isV0=kFALSE; //reject electrons
351 if (!isV0) isOK=kFALSE;
352 if (isOK) fV0Tree->Fill();
370 void AliTPCcalibV0::AddTreeHPT(TTree * treeInput){
372 // Add the content of tree:
373 // Notice automatic copy of tree in ROOT does not work for such complicated tree
375 AliESDtrack *track = 0;
376 AliESDfriendTrack *friendTrack = 0;
377 AliTPCseed *seed = 0;
378 if (!treeInput) return;
379 if (treeInput->GetEntries()==0) return;
381 Int_t entries= treeInput->GetEntries();
383 for (Int_t i=0; i<entries; i++){
388 treeInput->SetBranchAddress("t.",&track);
389 treeInput->SetBranchAddress("ft.",&friendTrack);
390 treeInput->SetBranchAddress("s.",&seed);
391 treeInput->GetEntry(i);
393 if (fHPTTree->GetEntries()==0){
394 fHPTTree->SetDirectory(0);
395 fHPTTree->Branch("t.",&track);
396 fHPTTree->Branch("ft.",&friendTrack);
397 fHPTTree->Branch("s.",&seed);
399 fHPTTree->SetBranchAddress("t.",&track);
400 fHPTTree->SetBranchAddress("ft.",&friendTrack);
401 fHPTTree->SetBranchAddress("s.",&seed);
404 if (!track->IsOn(AliESDtrack::kITSrefit)) isOK=kFALSE;
405 if (!track->IsOn(AliESDtrack::kTOFout)) isOK=kFALSE;
406 if (isOK) fHPTTree->Fill();
415 void AliTPCcalibV0::MakeMC(){
418 // 1. Select interesting particles
419 // 2. Assign the recosntructed particles
421 //1. Select interesting particles
422 const Float_t kMinP = 0.2;
423 const Float_t kMinPt = 0.1;
424 const Float_t kMaxR = 0.5;
425 const Float_t kMaxTan = 1.2;
426 const Float_t kMaxRad = 150;
428 if (!fParticles) fParticles = new TObjArray;
431 Int_t entries = fStack->GetNtrack();
432 for (Int_t ipart=0; ipart<entries; ipart++){
433 part = fStack->Particle(ipart);
435 if (part->P()<kMinP) continue;
436 if (part->R()>kMaxR) continue;
437 if (TMath::Abs(TMath::Tan(part->Theta()-TMath::Pi()*0.5))>kMaxTan) continue;
438 Bool_t isInteresting = kFALSE;
439 if (part->GetPdgCode()==22) isInteresting =kTRUE;
440 if (part->GetPdgCode()==310) isInteresting =kTRUE;
441 if (part->GetPdgCode()==111) isInteresting =kTRUE;
442 if (TMath::Abs(part->GetPdgCode()==3122)) isInteresting =kTRUE;
445 if (!isInteresting) continue;
446 fParticles->AddLast(new TParticle(*part));
448 if (fParticles->GetEntries()<1) {
454 Int_t sentries=fParticles->GetEntries();;
455 for (Int_t ipart=0; ipart<sentries; ipart++){
456 part = (TParticle*)fParticles->At(ipart);
462 Int_t id0 = part->GetDaughter(0);
463 Int_t id1 = part->GetDaughter(1);
464 if (id0>=fStack->GetNtrack() ) id0*=-1;
465 if (id1>=fStack->GetNtrack() ) id1*=-1;
466 Bool_t findable = kTRUE;
467 if (id0<0 || id1<0) findable = kFALSE;
470 p0 = fStack->Particle(id0);
471 if (p0->R()>kMaxRad) findable = kFALSE;
472 if (p0->Pt()<kMinPt) findable = kFALSE;
473 if (p0->Vz()>250) findable= kFALSE;
474 if (TMath::Abs(TMath::Tan(p0->Theta()-TMath::Pi()*0.5))>2) findable=kFALSE;
475 if (fPdg->GetParticle(p0->GetPdgCode())==0) findable =kFALSE;
477 if (fPdg->GetParticle(p0->GetPdgCode())->Charge()==0) charge++;
479 p1 = fStack->Particle(id1);
480 if (p1->R()>kMaxRad) findable = kFALSE;
481 if (p1->Pt()<kMinPt) findable = kFALSE;
482 if (TMath::Abs(p1->Vz())>250) findable= kFALSE;
483 if (TMath::Abs(TMath::Tan(p1->Theta()-TMath::Pi()*0.5))>2) findable=kFALSE;
484 if (fPdg->GetParticle(p1->GetPdgCode())==0) findable = kFALSE;
486 if (fPdg->GetParticle(p1->GetPdgCode())->Charge()==0) charge++;
489 // (*fDebugStream)<<"MC0"<<
491 // "findable="<<findable<<
495 if (!findable) continue;
496 Float_t minpt = TMath::Min(p0->Pt(), p1->Pt());
501 AliKFVertex primVtx(*(fESD->GetPrimaryVertex()));
502 for (Int_t ivertex=0; ivertex<fESD->GetNumberOfV0s(); ivertex++){
503 AliESDv0 * v0 = fESD->GetV0(ivertex);
504 // select coresponding track
505 AliESDtrack * trackN = fESD->GetTrack(v0->GetIndex(0));
506 if (TMath::Abs(trackN->GetLabel())!=id0 && TMath::Abs(trackN->GetLabel())!=id1) continue;
507 AliESDtrack * trackP = fESD->GetTrack(v0->GetIndex(1));
508 if (TMath::Abs(trackP->GetLabel())!=id0 && TMath::Abs(trackP->GetLabel())!=id1) continue;
509 TParticle *pn = fStack->Particle(TMath::Abs(trackN->GetLabel()));
510 TParticle *pp = fStack->Particle(TMath::Abs(trackP->GetLabel()));
513 if ( v0->GetOnFlyStatus()) nnew++;
514 if (!v0->GetOnFlyStatus()) nold++;
515 if (part->GetPdgCode()==22 && TMath::Abs(pn->GetPdgCode())==11 && TMath::Abs(pp->GetPdgCode())==11)
517 if (part->GetPdgCode()==310 && TMath::Abs(pn->GetPdgCode())==211 && TMath::Abs(pp->GetPdgCode())==211)
519 if (part->GetPdgCode()==3122){
520 if (TMath::Abs(pn->GetPdgCode())==210 ) type=2;
523 AliKFParticle *v0kf = Fit(primVtx,v0,pn->GetPdgCode(),pp->GetPdgCode());
524 v0kf->SetProductionVertex( primVtx );
525 AliKFParticle *v0kfc = Fit(primVtx,v0,pn->GetPdgCode(),pp->GetPdgCode());
526 v0kfc->SetProductionVertex( primVtx );
527 v0kfc->SetMassConstraint(fPdg->GetParticle(part->GetPdgCode())->Mass());
528 Float_t chi2 = v0kf->GetChi2();
529 Float_t chi2C = v0kf->GetChi2();
532 TTreeSRedirector *cstream = GetDebugStreamer();
572 fParticles->Delete();
576 void AliTPCcalibV0::MakeFitTreeTrack(const TObjArray * corrArray, Double_t ptCut, Int_t run){
580 // 0. Loop over selected tracks
581 // 1. Loop over all transformation - refit the track with and without the
583 // 2. Dump the matching paramaeters to the debugStremer
587 const Int_t kMinNcl=120;
588 TFile f("TPCV0Objects.root");
589 AliTPCcalibV0 *v0TPC = (AliTPCcalibV0*) f.Get("v0TPC");
590 TTree * treeInput = v0TPC->GetHPTTree();
591 TTreeSRedirector *pcstream = new TTreeSRedirector("fitHPT.root");
592 AliESDtrack *track = 0;
593 AliESDfriendTrack *friendTrack = 0;
594 AliTPCseed *seed = 0;
595 if (!treeInput) return;
596 if (treeInput->GetEntries()==0) return;
598 treeInput->SetBranchAddress("t.",&track);
599 treeInput->SetBranchAddress("ft.",&friendTrack);
600 treeInput->SetBranchAddress("s.",&seed);
603 if (corrArray) ncorr = corrArray->GetEntries();
604 AliTPCTransform *transform = AliTPCcalibDB::Instance()->GetTransform() ;
605 AliTPCParam *param = AliTPCcalibDB::Instance()->GetParameters();
606 AliGRPObject* grp = AliTPCcalibDB::Instance()->GetGRP(run);
607 Double_t time=0.5*(grp->GetTimeStart() +grp->GetTimeEnd());
611 Int_t ntracks= treeInput->GetEntries();
612 for (Int_t itrack=0; itrack<ntracks; itrack++){
613 treeInput->GetEntry(itrack);
614 if (!track) continue;
615 if (seed->Pt()<ptCut) continue;
616 if (track->Pt()<ptCut) continue;
617 if (track->GetTPCncls()<kMinNcl) continue;
619 // Reapply transformation
621 for (Int_t irow=0; irow<159; irow++){
622 AliTPCclusterMI *cluster=seed->GetClusterPointer(irow);
623 if (cluster &&cluster->GetX()>10){
624 Double_t x0[3]={cluster->GetRow(),cluster->GetPad(),cluster->GetTimeBin()};
625 Int_t index0[1]={cluster->GetDetector()};
626 transform->Transform(x0,index0,0,1);
627 cluster->SetX(x0[0]);
628 cluster->SetY(x0[1]);
629 cluster->SetZ(x0[2]);
635 AliExternalTrackParam* paramInner=0;
636 AliExternalTrackParam* paramOuter=0;
637 AliExternalTrackParam* paramIO=0;
639 for (Int_t icorr=-1; icorr<ncorr; icorr++){
641 AliTPCCorrection *corr = 0;
642 if (icorr>=0) corr = (AliTPCCorrection*)corrArray->At(icorr);
643 AliExternalTrackParam * trackInner = RefitTrack(seed, corr,85,134,0.1);
644 AliExternalTrackParam * trackIO = RefitTrack(seed, corr,245,85,0.1);
645 AliExternalTrackParam * trackOuter = RefitTrack(seed, corr,245,134,0.1 );
646 if (trackInner&&trackOuter&&trackIO){
647 trackOuter->Rotate(trackInner->GetAlpha());
648 trackOuter->PropagateTo(trackInner->GetX(),AliTracker::GetBz());
650 paramInner=trackInner;
651 paramOuter=trackOuter;
653 paramIO->Rotate(seed->GetAlpha());
654 paramIO->PropagateTo(seed->GetX(),AliTracker::GetBz());
661 if (paramOuter&& paramInner) {
662 // Bool_t isOK=kTRUE;
663 if (paramInner->GetSigmaY2()>0.01) isOK&=kFALSE;
664 if (paramOuter->GetSigmaY2()>0.01) isOK&=kFALSE;
665 if (paramInner->GetSigmaZ2()>0.01) isOK&=kFALSE;
666 if (paramOuter->GetSigmaZ2()>0.01) isOK&=kFALSE;
670 "pIn.="<<paramInner<<
671 "pOut.="<<paramOuter;
679 .x ../ConfigCalibTrain.C(run)
680 .L ../AddTaskTPCCalib.C
682 TFile fexb("../../RegisterCorrectionExB.root");
683 AliTPCComposedCorrection *cc= (AliTPCComposedCorrection*) fexb.Get("ComposedExB");
685 cc->Print("DA"); // Print used correction classes
686 TObjArray *array = cc->GetCorrections()
687 AliTPCcalibV0::MakeFitTreeTrack(array,2,run);
692 void AliTPCcalibV0::MakeFitTreeV0(const TObjArray * corrArray, Double_t ptCut, Int_t run){
696 // 0. Loop over selected tracks
697 // 1. Loop over all transformation - refit the track with and without the
699 // 2. Dump the matching paramaeters to the debugStremer
703 const Int_t kMinNcl=120;
704 TFile f("TPCV0Objects.root");
705 AliTPCcalibV0 *v0TPC = (AliTPCcalibV0*) f.Get("v0TPC");
706 TTree * treeInput = v0TPC->GetV0Tree();
707 TTreeSRedirector *pcstream = new TTreeSRedirector("fitV0.root");
709 AliESDtrack *track0 = 0;
710 AliESDfriendTrack *friendTrack0 = 0;
711 AliTPCseed *seed0 = 0;
713 AliESDtrack *track1 = 0;
714 AliESDfriendTrack *friendTrack1 = 0;
716 AliTPCseed *seed1 = 0;
717 if (!treeInput) return;
718 if (treeInput->GetEntries()==0) return;
720 treeInput->SetBranchAddress("v0.",&v0);
721 treeInput->SetBranchAddress("t0.",&track0);
722 treeInput->SetBranchAddress("ft0.",&friendTrack0);
723 treeInput->SetBranchAddress("s0.",&s0);
724 treeInput->SetBranchAddress("t1.",&track1);
725 treeInput->SetBranchAddress("ft1.",&friendTrack1);
726 treeInput->SetBranchAddress("s1.",&s1);
730 if (corrArray) ncorr = corrArray->GetEntries();
731 AliTPCTransform *transform = AliTPCcalibDB::Instance()->GetTransform() ;
732 AliTPCParam *param = AliTPCcalibDB::Instance()->GetParameters();
733 AliGRPObject* grp = AliTPCcalibDB::Instance()->GetGRP(run);
734 Double_t time=0.5*(grp->GetTimeStart() +grp->GetTimeEnd());
735 Double_t massK0= pdg.GetParticle("K0")->Mass();
736 Double_t massLambda= pdg.GetParticle("Lambda0")->Mass();
737 Double_t massPion=pdg.GetParticle("pi+")->Mass();
738 Double_t massProton=pdg.GetParticle("proton")->Mass();
739 Double_t pdgPion=pdg.GetParticle("pi+")->PdgCode();
740 Double_t pdgProton=pdg.GetParticle("proton")->PdgCode();
749 Int_t nv0s= treeInput->GetEntries();
750 for (Int_t iv0=0; iv0<nv0s; iv0++){
754 Int_t isAntiLambda=0;
755 treeInput->GetEntry(iv0);
756 if (TMath::Abs(v0->GetEffMass(2,2)-massK0)<0.03) {isK0=1; v0Type=1;} //select K0s
757 if (TMath::Abs(v0->GetEffMass(4,2)-massLambda)<0.01) {isLambda=1; v0Type=2;} //select Lambda
758 if (TMath::Abs(v0->GetEffMass(2,4)-massLambda)<0.01) {isAntiLambda=1;v0Type=3;} //select Anti Lambda
759 if (isK0+isLambda+isAntiLambda!=1) continue;
764 if (isLambda) {mass0=massProton; pdg0=pdgProton;}
765 if (isAntiLambda) {mass1=massProton; pdg1=pdgProton;}
767 if (isK0==0) massV0=massLambda;
770 seed0=(s0->GetSign()>0)?s0:s1;
771 seed1=(s0->GetSign()>0)?s1:s0;
772 if (seed0->GetZ()*seed1->GetZ()<0) continue; //remove membrane crossed tracks
773 if (seed0->Pt()<ptCut) continue;
774 if (seed1->Pt()<ptCut) continue;
776 // Reapply transformation
778 for (Int_t itype=0; itype<2; itype++){
779 AliTPCseed * seed = (itype==0) ? seed0: seed1;
780 for (Int_t irow=0; irow<159; irow++){
781 AliTPCclusterMI *cluster=seed->GetClusterPointer(irow);
782 if (cluster &&cluster->GetX()>10){
783 Double_t x0[3]={cluster->GetRow(),cluster->GetPad(),cluster->GetTimeBin()};
784 Int_t index0[1]={cluster->GetDetector()};
785 transform->Transform(x0,index0,0,1);
786 cluster->SetX(x0[0]);
787 cluster->SetY(x0[1]);
788 cluster->SetZ(x0[2]);
794 Double_t radius = v0->GetRr();
796 v0->GetXYZ(xyz[0],xyz[1],xyz[2]);
797 Double_t alpha = TMath::ATan2(xyz[1],xyz[0]);
798 TObjArray arrayV0in(ncorr+1);
799 TObjArray arrayV0io(ncorr+1);
800 TObjArray arrayT0(ncorr+1);
801 TObjArray arrayT1(ncorr+1);
802 arrayV0in.SetOwner(kTRUE);
803 arrayV0io.SetOwner(kTRUE);
805 for (Int_t icorr=-1; icorr<ncorr; icorr++){
806 AliTPCCorrection *corr =0;
807 if (icorr>=0) corr = (AliTPCCorrection*)corrArray->At(icorr);
809 AliExternalTrackParam * trackInner0 = RefitTrack(seed0, corr,160,85,mass0);
810 AliExternalTrackParam * trackIO0 = RefitTrack(seed0, corr,245,85,mass0);
811 AliExternalTrackParam * trackInner1 = RefitTrack(seed1, corr,160,85,mass1);
812 AliExternalTrackParam * trackIO1 = RefitTrack(seed1, corr,245,85,mass1);
813 if (!trackInner0) isOK=kFALSE;
814 if (!trackInner1) isOK=kFALSE;
815 if (!trackIO0) isOK=kFALSE;
816 if (!trackIO1) isOK=kFALSE;
818 if (!trackInner0->Rotate(alpha)) isOK=kFALSE;
819 if (!trackInner1->Rotate(alpha)) isOK=kFALSE;
820 if (!trackIO0->Rotate(alpha)) isOK=kFALSE;
821 if (!trackIO1->Rotate(alpha)) isOK=kFALSE;
823 if (!AliTracker::PropagateTrackToBxByBz(trackInner0, radius, mass0, 1, kFALSE)) isOK=kFALSE;
824 if (!AliTracker::PropagateTrackToBxByBz(trackInner1, radius, mass1, 1, kFALSE)) isOK=kFALSE;
825 if (!AliTracker::PropagateTrackToBxByBz(trackIO0, radius, mass0, 1, kFALSE)) isOK=kFALSE;
826 if (!AliTracker::PropagateTrackToBxByBz(trackIO1, radius, mass1, 1, kFALSE)) isOK=kFALSE;
828 arrayT0.AddAt(trackIO0->Clone(),icorr+1);
829 arrayT1.AddAt(trackIO1->Clone(),icorr+1);
830 Int_t charge=(trackIO0->GetSign());
831 AliKFParticle pin0( *trackInner0, pdg0*charge);
832 AliKFParticle pin1( *trackInner1, -pdg1*charge);
833 AliKFParticle pio0( *trackIO0, pdg0*charge);
834 AliKFParticle pio1( *trackIO1, -pdg1*charge);
841 arrayV0in.AddAt(v0in.Clone(),icorr+1);
842 arrayV0io.AddAt(v0io.Clone(),icorr+1);
847 //AliKFParticle* pin0= (AliKFParticle*)arrayV0in.At(0);
848 AliKFParticle* pio0= (AliKFParticle*)arrayV0io.At(0);
849 AliExternalTrackParam *param0=(AliExternalTrackParam *)arrayT0.At(0);
850 AliExternalTrackParam *param1=(AliExternalTrackParam *)arrayT1.At(0);
851 Double_t mass0=0, mass0E=0;
852 pio0->GetMass( mass0,mass0E);
854 Double_t mean=mass0-massV0;
855 if (TMath::Abs(mean)>0.05) continue;
856 Double_t mass[10000];
858 Int_t dtype=30; // id for V0
859 Int_t ptype=5; // id for invariant mass
860 // Int_t id=TMath::Nint(100.*(param0->Pt()-param1->Pt())/(param0->Pt()+param1->Pt())); // K0s V0 asymetry
861 Int_t id=1000.*(param0->Pt()-param1->Pt()); // K0s V0 asymetry
862 Double_t gx,gy,gz, px,py,pz;
863 Double_t pt = v0->Pt();
864 v0->GetXYZ(gx,gy,gz);
865 v0->GetPxPyPz(px,py,pz);
866 Double_t theta=pz/TMath::Sqrt(px*px+py*py);
867 Double_t phi=TMath::ATan2(py,px);
868 Double_t snp=0.5*(seed0->GetSnp()+seed1->GetSnp());
869 Double_t sector=9*phi/TMath::Pi();
870 Double_t dsec=sector-TMath::Nint(sector);
871 Double_t refX=TMath::Sqrt(gx*gx+gy*gy);
872 //Int_t nentries=v0Type;
873 Double_t bz=AliTracker::GetBz();
875 (*pcstream)<<"fitDebug"<<
883 (*pcstream)<<"fit"<< // dump valus for fit
884 "run="<<run<< //run number
885 "bz="<<bz<< // magnetic filed used
886 "dtype="<<dtype<< // detector match type 30
887 "ptype="<<ptype<< // parameter type
888 "theta="<<theta<< // theta
891 "mean="<<mean<< // mean dist value
892 "rms="<<mass0E<< // rms
896 "refX="<<refX<< // reference radius
897 "gx="<<gx<< // global position
898 "gy="<<gy<< // global position
899 "gz="<<gz<< // global position
900 "dRrec="<<dRrec<< // delta Radius in reconstruction
901 "pt="<<pt<< // pt of the particle
902 "id="<<id<< //delta of the momenta
903 "entries="<<v0Type;// type of the V0
904 for (Int_t icorr=0; icorr<ncorr; icorr++){
905 AliTPCCorrection *corr =0;
906 if (icorr>=0) corr = (AliTPCCorrection*)corrArray->At(icorr);
907 AliKFParticle* pin= (AliKFParticle*)arrayV0in.At(icorr+1);
908 AliKFParticle* pio= (AliKFParticle*)arrayV0io.At(icorr+1);
909 AliExternalTrackParam *par0=(AliExternalTrackParam *)arrayT0.At(icorr+1);
910 AliExternalTrackParam *par1=(AliExternalTrackParam *)arrayT1.At(icorr+1);
912 pio->GetMass( mass[icorr],massE);
915 Form("%s=",corr->GetName())<<mass[icorr];
916 (*pcstream)<<"fitDebug"<<
917 Form("%s=",corr->GetName())<<mass[icorr]<<
918 Form("%sp0.=",corr->GetName())<<par0<<
919 Form("%sp1=",corr->GetName())<<par1;
921 (*pcstream)<<"fit"<< "isOK="<<isOK<<"\n";
922 (*pcstream)<<"fitDebug"<< "isOK="<<isOK<<"\n";
927 AliExternalTrackParam * AliTPCcalibV0::RefitTrack(AliTPCseed *seed, AliTPCCorrection * corr, Double_t xstart, Double_t xstop, Double_t mass){
930 // seed - tpc track with cluster
931 // corr - distrotion/correction class - apllied to the points
932 // xstart - radius to start propagate/update
933 // xstop - radius to stop propagate/update
935 const Double_t kResetCov=20.;
936 const Double_t kSigma=5.;
938 for (Int_t i=0;i<15;i++) covar[i]=0;
939 covar[0]=kSigma*kSigma;
940 covar[2]=kSigma*kSigma;
941 covar[5]=kSigma*kSigma/Float_t(150*150);
942 covar[9]=kSigma*kSigma/Float_t(150*150);
945 AliExternalTrackParam *refit = new AliExternalTrackParam(*seed);
946 refit->PropagateTo(xstart, AliTracker::GetBz());
947 refit->AddCovariance(covar);
948 refit->ResetCovariance(kResetCov);
949 Double_t xmin = TMath::Min(xstart,xstop);
950 Double_t xmax = TMath::Max(xstart,xstop);
954 for (Int_t index0=0; index0<159; index0++){
955 Int_t irow= (xstart<xstop)? index0:159-index0;
956 AliTPCclusterMI *cluster=seed->GetClusterPointer(irow); //cluster in local system
957 if (!cluster) continue;
958 if (cluster->GetX()<xmin) continue;
959 if (cluster->GetX()>xmax) continue;
960 Double_t alpha = TMath::Pi()*(cluster->GetDetector()+0.5)/9.;
961 if (!refit->Rotate(alpha)) isOK=kFALSE;
962 Double_t x = cluster->GetX();
963 Double_t y = cluster->GetY();
964 Double_t z = cluster->GetZ();
966 Float_t xyz[3]={cluster->GetX(),cluster->GetY(),cluster->GetZ()}; // original position
967 corr->DistortPointLocal(xyz,cluster->GetDetector());
972 if (!AliTracker::PropagateTrackToBxByBz(refit, x,mass,1.,kFALSE)) isOK=kFALSE;
974 Double_t cov[3]={0.01,0.,0.01};
975 Double_t yz[2]={y,z};
976 if (!refit->Update(yz,cov)) isOK=kFALSE;
979 if (!AliTracker::PropagateTrackToBxByBz(refit, xstop, mass,1.,kTRUE)) isOK=kFALSE;
997 void AliTPCcalibV0::MakeV0s(){
1001 const Int_t kMinCluster=40;
1002 const Float_t kMinR =0;
1003 if (! fV0s) fV0s = new TObjArray(10);
1008 for (Int_t ivertex=0; ivertex<fESD->GetNumberOfV0s(); ivertex++){
1009 AliESDv0 * v0 = fESD->GetV0(ivertex);
1010 if (v0->GetOnFlyStatus()) continue;
1018 for (Int_t ivertex=0; ivertex<fESD->GetNumberOfV0s(); ivertex++){
1019 AliESDv0 * v0 = fESD->GetV0(ivertex);
1020 if (!v0->GetOnFlyStatus()) continue;
1029 Int_t ntracks = fESD->GetNumberOfTracks();
1030 for (Int_t itrack0=0; itrack0<ntracks; itrack0++){
1031 AliESDtrack * track0 = fESD->GetTrack(itrack0);
1032 if (track0->GetSign()>0) continue;
1033 if ( track0->GetTPCNcls()<kMinCluster) continue;
1034 if (track0->GetKinkIndex(0)>0) continue;
1036 for (Int_t itrack1=0; itrack1<ntracks; itrack1++){
1037 AliESDtrack * track1 = fESD->GetTrack(itrack1);
1038 if (track1->GetSign()<0) continue;
1039 if ( track1->GetTPCNcls()<kMinCluster) continue;
1040 if (track1->GetKinkIndex(0)>0) continue;
1042 // AliExternalTrackParam param0(*track0);
1043 // AliExternalTrackParam param1(*track1);
1045 vertex.SetParamN(*track0);
1046 vertex.SetParamP(*track1);
1048 xyz[0] = fESD->GetPrimaryVertex()->GetXv();
1049 xyz[1] = fESD->GetPrimaryVertex()->GetYv();
1050 xyz[2] = fESD->GetPrimaryVertex()->GetZv();
1052 if (vertex.GetRr()<kMinR) continue;
1053 if (vertex.GetDcaV0Daughters()>1.) continue;
1054 if (vertex.GetDcaV0Daughters()>0.3*vertex.GetRr()) continue;
1055 // if (vertex.GetPointAngle()<0.9) continue;
1056 vertex.SetIndex(0,itrack0);
1057 vertex.SetIndex(1,itrack1);
1058 fV0s->AddLast(new AliV0(vertex));
1062 for (Int_t i=0;i<fV0s->GetEntries(); i++) delete fV0s->At(i);
1073 void AliTPCcalibV0::ProcessV0(Int_t ftype){
1077 if (! fGammas) fGammas = new TObjArray(10);
1079 Int_t nV0s = fV0s->GetEntries();
1080 if (nV0s==0) return;
1081 AliKFVertex primVtx(*(fESD->GetPrimaryVertex()));
1083 for (Int_t ivertex=0; ivertex<nV0s; ivertex++){
1084 AliESDv0 * v0 = (AliESDv0*)fV0s->At(ivertex);
1085 AliESDtrack * trackN = fESD->GetTrack(v0->GetIndex(0)); // negative track
1086 AliESDtrack * trackP = fESD->GetTrack(v0->GetIndex(1)); // positive track
1088 const AliExternalTrackParam * paramInNeg = trackN->GetInnerParam();
1089 const AliExternalTrackParam * paramInPos = trackP->GetInnerParam();
1091 if (!paramInPos) continue; // in case the inner paramters do not exist
1092 if (!paramInNeg) continue;
1096 AliKFParticle *v0K0 = Fit(primVtx,v0,-211,211);
1097 AliKFParticle *v0Gamma = Fit(primVtx,v0,11,-11);
1098 AliKFParticle *v0Lambda42 = Fit(primVtx,v0,-2212,211);
1099 AliKFParticle *v0Lambda24 = Fit(primVtx,v0,-211,2212);
1100 //Set production vertex
1101 v0K0->SetProductionVertex( primVtx );
1102 v0Gamma->SetProductionVertex( primVtx );
1103 v0Lambda42->SetProductionVertex( primVtx );
1104 v0Lambda24->SetProductionVertex( primVtx );
1105 Double_t massK0, massGamma, massLambda42,massLambda24, massSigma;
1106 v0K0->GetMass( massK0,massSigma);
1107 v0Gamma->GetMass( massGamma,massSigma);
1108 v0Lambda42->GetMass( massLambda42,massSigma);
1109 v0Lambda24->GetMass( massLambda24,massSigma);
1110 Float_t chi2K0 = v0K0->GetChi2()/v0K0->GetNDF();
1111 Float_t chi2Gamma = v0Gamma->GetChi2()/v0Gamma->GetNDF();
1112 Float_t chi2Lambda42 = v0Lambda42->GetChi2()/v0Lambda42->GetNDF();
1113 Float_t chi2Lambda24 = v0Lambda24->GetChi2()/v0Lambda24->GetNDF();
1115 // Mass Contrained params
1117 AliKFParticle *v0K0C = Fit(primVtx,v0,-211,211);
1118 AliKFParticle *v0GammaC = Fit(primVtx,v0,11,-11);
1119 AliKFParticle *v0Lambda42C = Fit(primVtx,v0,-2212,211); //lambdaBar
1120 AliKFParticle *v0Lambda24C = Fit(primVtx,v0,-211,2212); //lambda
1122 v0K0C->SetProductionVertex( primVtx );
1123 v0GammaC->SetProductionVertex( primVtx );
1124 v0Lambda42C->SetProductionVertex( primVtx );
1125 v0Lambda24C->SetProductionVertex( primVtx );
1127 v0K0C->SetMassConstraint(fPdg->GetParticle(310)->Mass());
1128 v0GammaC->SetMassConstraint(0);
1129 v0Lambda42C->SetMassConstraint(fPdg->GetParticle(-3122)->Mass());
1130 v0Lambda24C->SetMassConstraint(fPdg->GetParticle(3122)->Mass());
1132 Double_t timeK0, sigmaTimeK0;
1133 Double_t timeLambda42, sigmaTimeLambda42;
1134 Double_t timeLambda24, sigmaTimeLambda24;
1135 v0K0C->GetLifeTime(timeK0, sigmaTimeK0);
1136 //v0K0Gamma->GetLifeTime(timeK0, sigmaTimeK0);
1137 v0Lambda42C->GetLifeTime(timeLambda42, sigmaTimeLambda42);
1138 v0Lambda24C->GetLifeTime(timeLambda24, sigmaTimeLambda24);
1142 Float_t chi2K0C = v0K0C->GetChi2()/v0K0C->GetNDF();
1143 if (chi2K0C<0) chi2K0C=100;
1144 Float_t chi2GammaC = v0GammaC->GetChi2()/v0GammaC->GetNDF();
1145 if (chi2GammaC<0) chi2GammaC=100;
1146 Float_t chi2Lambda42C = v0Lambda42C->GetChi2()/v0Lambda42C->GetNDF();
1147 if (chi2Lambda42C<0) chi2Lambda42C=100;
1148 Float_t chi2Lambda24C = v0Lambda24C->GetChi2()/v0Lambda24C->GetNDF();
1149 if (chi2Lambda24C<0) chi2Lambda24C=100;
1151 Float_t minChi2C=99;
1153 if (chi2K0C<minChi2C) { minChi2C= chi2K0C; type=0;}
1154 if (chi2GammaC<minChi2C) { minChi2C= chi2GammaC; type=1;}
1155 if (chi2Lambda42C<minChi2C) { minChi2C= chi2Lambda42C; type=2;}
1156 if (chi2Lambda24C<minChi2C) { minChi2C= chi2Lambda24C; type=3;}
1159 if (chi2K0<minChi2) { minChi2= chi2K0; type0=0;}
1160 if (chi2Gamma<minChi2) { minChi2= chi2Gamma; type0=1;}
1161 if (chi2Lambda42<minChi2) { minChi2= chi2Lambda42; type0=2;}
1162 if (chi2Lambda24<minChi2) { minChi2= chi2Lambda24; type0=3;}
1164 // 0 is negative particle; 1 is positive particle
1165 Float_t betaGamma0 = 0;
1166 Float_t betaGamma1 = 0;
1170 betaGamma0 = paramInNeg->GetP()/fPdg->GetParticle(-211)->Mass();
1171 betaGamma1 = paramInPos->GetP()/fPdg->GetParticle(211)->Mass();
1174 betaGamma0 = paramInNeg->GetP()/fPdg->GetParticle(11)->Mass();
1175 betaGamma1 = paramInPos->GetP()/fPdg->GetParticle(-11)->Mass();
1178 betaGamma0 = paramInNeg->GetP()/fPdg->GetParticle(-2212)->Mass();
1179 betaGamma1 = paramInPos->GetP()/fPdg->GetParticle(211)->Mass();
1182 betaGamma0 = paramInNeg->GetP()/fPdg->GetParticle(-211)->Mass();
1183 betaGamma1 = paramInPos->GetP()/fPdg->GetParticle(2212)->Mass();
1187 // cuts and histogram filling
1188 Int_t numCand = 0; // number of particle types which have a chi2 < 10*minChi2
1190 if (minChi2C < 2 && ftype == 1) {
1192 if (chi2K0C < 10*minChi2C) numCand++;
1193 if (chi2GammaC < 10*minChi2C) numCand++;
1194 if (chi2Lambda42C < 10*minChi2C) numCand++;
1195 if (chi2Lambda24C < 10*minChi2C) numCand++;
1201 // write output tree
1202 if (minChi2>50) continue;
1203 TTreeSRedirector *cstream = GetDebugStreamer();
1208 "trackN.="<<trackN<<
1209 "trackP.="<<trackP<<
1211 "betaGamma0="<<betaGamma0<<
1212 "betaGamma1="<<betaGamma1<<
1215 "chi2C="<<minChi2C<<
1217 "v0Gamma.="<<v0Gamma<<
1218 "v0Lambda42.="<<v0Lambda42<<
1219 "v0Lambda24.="<<v0Lambda24<<
1221 "chi20K0.="<<chi2K0<<
1222 "chi2Gamma.="<<chi2Gamma<<
1223 "chi2Lambda42.="<<chi2Lambda42<<
1224 "chi2Lambda24.="<<chi2Lambda24<<
1226 "chi20K0c.="<<chi2K0C<<
1227 "chi2Gammac.="<<chi2GammaC<<
1228 "chi2Lambda42c.="<<chi2Lambda42C<<
1229 "chi2Lambda24c.="<<chi2Lambda24C<<
1232 "v0GammaC.="<<v0GammaC<<
1233 "v0Lambda42C.="<<v0Lambda42C<<
1234 "v0Lambda24C.="<<v0Lambda24C<<
1237 "massGamma="<<massGamma<<
1238 "massLambda42="<<massLambda42<<
1239 "massLambda24="<<massLambda24<<
1242 "timeLambda42="<<timeLambda42<<
1243 "timeLambda24="<<timeLambda24<<
1246 if (type==1) fGammas->AddLast(v0);
1264 void AliTPCcalibV0::ProcessPI0(){
1268 Int_t nentries = fGammas->GetEntries();
1269 if (nentries<2) return;
1271 Double_t m0[3], m1[3];
1272 AliKFVertex primVtx(*(fESD->GetPrimaryVertex()));
1273 for (Int_t i0=0; i0<nentries; i0++){
1274 AliESDv0 *v00 = (AliESDv0*)fGammas->At(i0);
1275 v00->GetPxPyPz (m0[0], m0[1], m0[2]);
1276 AliKFParticle *p00 = Fit(primVtx, v00, 11,-11);
1277 p00->SetProductionVertex( primVtx );
1278 p00->SetMassConstraint(0);
1280 for (Int_t i1=i0; i1<nentries; i1++){
1281 AliESDv0 *v01 = (AliESDv0*)fGammas->At(i1);
1282 v01->GetPxPyPz (m1[0], m1[1], m1[2]);
1283 AliKFParticle *p01 = Fit(primVtx, v01, 11,-11);
1284 p01->SetProductionVertex( primVtx );
1285 p01->SetMassConstraint(0);
1286 if (v00->GetIndex(0) != v01->GetIndex(0) &&
1287 v00->GetIndex(1) != v01->GetIndex(1)){
1288 AliKFParticle pi0( *p00,*p01);
1289 pi0.SetProductionVertex(primVtx);
1290 Double_t n1 = TMath::Sqrt (m0[0]*m0[0] + m0[1]*m0[1] + m0[2]*m0[2]);
1291 Double_t n2 = TMath::Sqrt (m1[0]*m1[0] + m1[1]*m1[1] + m1[2]*m1[2]);
1292 Double_t mass = TMath::Sqrt(2.*(n1*n2 - (m0[0]*m1[0] + m0[1]*m1[1] + m0[2]*m1[2])));
1293 TTreeSRedirector *cstream = GetDebugStreamer();
1315 AliKFParticle * AliTPCcalibV0::Fit(AliKFVertex & /*primVtx*/, AliESDv0 *v0, Int_t PDG1, Int_t PDG2){
1319 AliKFParticle p1( *(v0->GetParamN()), PDG1 );
1320 AliKFParticle p2( *(v0->GetParamP()), PDG2 );
1321 AliKFParticle *V0 = new AliKFParticle;
1324 V0->SetVtxGuess(x,y,z);
1333 void AliTPCcalibV0::BinLogX(TH2F *h) {
1337 TAxis *axis = h->GetXaxis();
1338 int bins = axis->GetNbins();
1340 Double_t from = axis->GetXmin();
1341 Double_t to = axis->GetXmax();
1342 Double_t *new_bins = new Double_t[bins + 1];
1345 Double_t factor = pow(to/from, 1./bins);
1347 for (int i = 1; i <= bins; i++) {
1348 new_bins[i] = factor * new_bins[i-1];
1350 axis->Set(bins, new_bins);