1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
17 // in central diffractive event
21 // Xianguo Lu <lu@physi.uni-heidelberg.de>
28 #include <TLorentzVector.h>
30 #include <THnSparse.h>
32 #include "AliCDBManager.h"
33 #include "AliCDBEntry.h"
34 #include "AliESDInputHandler.h"
35 #include "AliESDtrackCuts.h"
36 #include "AliGeomManager.h"
37 #include "AliITSAlignMille2Module.h"
38 #include "AliITSsegmentationSPD.h"
39 #include "AliKFParticle.h"
40 #include "AliMultiplicity.h"
42 #include "AliSPDUtils.h"
43 #include "AliTriggerAnalysis.h"
45 #include "AliAnalysisTaskDDMeson.h"
47 void AliAnalysisTaskDDMeson::IniTask()
50 //initialize values used in many places
53 fmass1 = 0.01 * fnmass;
62 feta = 0.04 * fneta/2.;
77 AliAnalysisTaskDDMeson::AliAnalysisTaskDDMeson(const TString opt):
78 AliAnalysisTaskSE("DDMeson")
126 //slot in TaskSE must start from 1
127 DefineOutput(1, TList::Class());
128 DefineOutput(2, THnSparse::Class());
129 DefineOutput(3, THnSparse::Class());
130 DefineOutput(4, THnSparse::Class());
131 DefineOutput(5, THnSparse::Class());
136 AliAnalysisTaskDDMeson::AliAnalysisTaskDDMeson(const AliAnalysisTaskDDMeson &p):
137 AliAnalysisTaskSE("DDMeson")
153 , fCHECKVBA(p.fCHECKVBA)
154 , fCHECKVBC(p.fCHECKVBC)
177 , fThnMass(p.fThnMass)
179 , fThnDEta(p.fThnDEta)
189 AliAnalysisTaskDDMeson & AliAnalysisTaskDDMeson::operator=(const AliAnalysisTaskDDMeson &p)
194 if(&p == this) return *this;
195 AliAnalysisTaskSE::operator=(p);
211 fCHECKVBA = p.fCHECKVBA;
212 fCHECKVBC = p.fCHECKVBC;
236 fThnMass = p.fThnMass;
238 fThnDEta = p.fThnDEta;
246 AliAnalysisTaskDDMeson::~AliAnalysisTaskDDMeson()
251 if(fESD) delete fESD;
280 void AliAnalysisTaskDDMeson::CheckRange(Double_t &ptv, Double_t &pta, Double_t &etaa
285 //save over/under flow bins
288 const Double_t eps = 1e-6;
289 if(ptv>=fptv1) ptv = fptv1 - eps;
290 if(pta>=fpta1) pta = fpta1 - eps;
292 if(etaa >= feta) etaa = feta - eps;
294 if(etaa <= -feta) etaa = -feta + eps;
296 if(mpi >= fmass1) mpi = fmass1 - eps;
300 void AliAnalysisTaskDDMeson::UserCreateOutputObjects()
303 //CreateOutputObjects
305 //=======================================
306 const Double_t kvz0=1, kvz1=5;
307 const Int_t nkvz=(Int_t)(kvz1-kvz0);
309 const Double_t charge0=1, charge1=4;
310 const Int_t ncharge=(Int_t)(charge1-charge0);
312 const Double_t mass0 = 0;
313 //=======================================
314 //total momentum and pt in lab frame:
316 //=======================================
317 const Double_t nsel0 = 2;
319 //=======================================
320 const Double_t cts0=0, cts1=1;
322 //=======================================
323 const Double_t ctlab0 = -1, ctlab1 = 1;
325 //=======================================
327 const Int_t nparPtMass = 7;
328 const Int_t nbinPtMass[] ={fnnsel, nkvz, ncharge, fnmass, fnptv, fncts, fnctlab};
329 const Double_t xminPtMass[] ={nsel0, kvz0, charge0, mass0, p0, cts0, ctlab0};
330 const Double_t xmaxPtMass[] ={fnsel1, kvz1, charge1, fmass1, fptv1, cts1, ctlab1};
331 fThnMass = new THnSparseD("DDMeson_Mass","nsel, kvz, charge, Mpipi, ptv, cts, ctlab", nparPtMass, nbinPtMass, xminPtMass, xmaxPtMass);
334 const Int_t nparDPt = 4;
335 const Int_t nbinDPt[] ={fnnsel, nkvz, ncharge, fnpta};
336 const Double_t xminDPt[] ={nsel0, kvz0, charge0, p0};
337 const Double_t xmaxDPt[] ={fnsel1, kvz1, charge1, fpta1};
338 fThnDPt = new THnSparseD("DDMeson_DPt","nsel, kvz, charge, pt1", nparDPt, nbinDPt, xminDPt, xmaxDPt);
340 const Int_t nparDEta = 4;
341 const Int_t nbinDEta[] ={fnnsel, nkvz, ncharge, fneta};
342 const Double_t xminDEta[] ={nsel0, kvz0, charge0, -feta};
343 const Double_t xmaxDEta[] ={fnsel1, kvz1, charge1, feta};
344 fThnDEta = new THnSparseD("DDMeson_DEta"," nsel, kvz, charge, eta1", nparDEta, nbinDEta, xminDEta, xmaxDEta);
347 const Double_t mks = 0.494;
348 const Double_t dks = 0.024;
349 const Int_t nparKF = 4;
350 const Int_t nbinKF[] = {nkvz, 200, 200, 200};
351 const Double_t xminKF[] ={kvz0, mks-dks, mks-dks, 0};
352 const Double_t xmaxKF[] ={kvz1, mks+dks, mks+dks, 10};
353 fThnKF = new THnSparseD("DDMeson_KF","kvz, rawks, kfks, chi2", nparKF, nbinKF, xminKF, xmaxKF);
354 //=======================================
355 //=======================================
356 fHBIT = new TH1I("HBIT","",32,1,33);
358 const Int_t runb0 = 114650; //runa1=114649, runb1=117630, runc0=117631, runc1=121526, rund0=121527, rund1=126460, rune0=126461, rune1 = 130930; //runf0=130931, all checked on elog
359 const Int_t runf1 = 133900;//02OCT2010
360 const Int_t run0 = runb0-1, run1 = runf1+1;
361 const Int_t nrun = (Int_t)(run1-run0);
363 fat = new TH1I("at","",nrun,run0,run1);
364 fct = new TH1I("ct","",nrun,run0,run1);
365 fbt = new TH1I("bt","",nrun,run0,run1);
366 fnt = new TH1I("nt","",nrun,run0,run1);
367 ftt = new TH1I("tt","",nrun,run0,run1);
369 fv0ntrk = new TH2D("c_v0ntrk","",80,0,80, 4, 1, 5);//x: ntrk; y: GetV0
370 frsntrk = new TH2D("c_rsntrk","",1000,0,1000, 200, 0,200);
372 fhps = new TH1I("a000_ps", "", 20, 0,20);
373 fhfo = new TH2I("a010_fo", "", 50, 0, 50, 50, 0, 50);
374 fhspd = new TH1I("a011_spd", "", 50, 0, 50);
375 fhv0fmd = new TH2I("a020_v0fmd", "", 4, 0, 4, 4, 0, 4);
376 fhpriv = new TH1I("a100_priv", "", 2, 0,2);
377 fhntrk = new TH1I("a110_ntrk", "", (Int_t)fnsel1, 0, (Int_t)fnsel1);
383 //------>>> Very important!!!!!!!
402 void AliAnalysisTaskDDMeson::UserExec(Option_t *)
407 //----------------------------------- general protection
411 //----------------------------------- trigger bits
415 //----------------------------------- track cuts
416 const Int_t ntrk0 = fESD->GetNumberOfTracks();
417 const AliESDtrack * trks[ntrk0];
418 for(Int_t ii=0; ii<ntrk0; ii++){
421 const Int_t nsel = CutESD(trks);
425 for(Int_t ii=0; ii<nsel; ii++){
426 for(Int_t jj=ii+1; jj<nsel; jj++){
427 const AliESDtrack * trkpair[2]={trks[ii], trks[jj]};
429 //----------------------------------- tracks initailization
431 if(tmprd.Rndm()>0.5){
435 //------------------------------------------------------------------------
436 const Int_t pipdg = 211;
437 const AliKFParticle daughter0(*(trkpair[0]), pipdg);
438 const AliKFParticle daughter1(*(trkpair[1]), pipdg);
440 const AliKFParticle parent(daughter0, daughter1);
441 const Double_t kfchi2 = parent.GetChi2();
442 const Double_t kfmass = parent.GetMass();
444 //------------------------------------------------------------------------
445 const Int_t kvz = GetV0();
447 const AliESDtrack * trk1=trkpair[0];
448 const AliESDtrack * trk2=trkpair[1];
450 const Double_t ch1 = trk1->GetSign();
451 const Double_t ch2 = trk2->GetSign();
452 const Int_t combch = GetCombCh(ch1, ch2);
454 Double_t pta = trk1->Pt();
455 Double_t etaa = trk1->Eta();
457 Double_t tmpp1[3], tmpp2[3];
458 trk1->GetPxPyPz(tmpp1);
459 trk2->GetPxPyPz(tmpp2);
461 //------------------------------------------------------------------------
462 //------------------------------------------------------------------------
463 const Double_t ctlab = GetCtlab(tmpp1, tmpp2);
466 const Double_t masspi = AliPID::ParticleMass(AliPID::kPion);
467 const TLorentzVector sumv = GetKinematics(tmpp1, tmpp2, masspi, masspi, cts);
468 Double_t pipi = sumv.Mag();
469 Double_t ptv = sumv.Pt();
471 CheckRange(ptv, pta, etaa, pipi);
473 const Double_t varMass[] ={nsel, kvz, combch
477 const Double_t varDPt[] ={nsel, kvz, combch, pta};
478 const Double_t varDEta[] ={nsel, kvz, combch, etaa};
479 fThnMass->Fill(varMass);
480 fThnDPt->Fill(varDPt);
481 fThnDEta->Fill(varDEta);
483 const Double_t varKF[] = {kvz, pipi, kfmass, kfchi2};
484 if(nsel==2 && combch==3)
488 //------------------------------------------------------------------------
489 //------------------------------------------------------------------------
492 PostData(2, fThnMass);
493 PostData(3, fThnDPt);
494 PostData(4, fThnDEta);
497 //=======================================================================
498 //=======================================================================
500 void AliAnalysisTaskDDMeson::Terminate(Option_t *)
503 //fillbit before leaving
508 void AliAnalysisTaskDDMeson::FillBit()
511 //save the bit count in f*t
516 const Int_t bin = fat->FindBin(fRun);
517 fat->AddBinContent(bin, tot[0]);
518 fct->AddBinContent(bin, tot[1]);
519 fbt->AddBinContent(bin, tot[2]);
520 fnt->AddBinContent(bin, tot[3]);
521 ftt->AddBinContent(bin, tot[4]);
524 void AliAnalysisTaskDDMeson::CalcBit(TH1I *hc, Double_t tot[]) const
527 //calculate the bit count in f*t
529 if(hc->GetBinLowEdge(1)!=1){
530 printf("xlulog hc defined incorrectly!! %f\n",hc->GetBinLowEdge(1));
533 if(hc->GetBinContent(0)){
534 printf("\nxlulog hc !!!!!!!!!!!!!!!!!!! underflow!!!!!!!!!!!!!!!!! %f\n\n", hc->GetBinContent(0));
537 if(hc->GetBinContent(hc->GetNbinsX())){
538 printf("\nxlulog hc !!!!!!!!!!!!!!!!! OVERflow!!!!!!!!!!!!!! %f\n\n", hc->GetBinContent(hc->GetNbinsX()));
543 Double_t atot=0, ctot=0, btot=0, ntot=0;
544 for(Int_t ib=1; ib<=hc->GetNbinsX(); ib++){
545 const Double_t cont = hc->GetBinContent(ib);
546 if( (ib & fCHECKVBA) && !(ib & fCHECKVBC) ){
549 else if( !(ib & fCHECKVBA) && (ib & fCHECKVBC) ){
552 else if( (ib & fCHECKVBA) && (ib & fCHECKVBC) ){
560 const Double_t ttot = atot + ctot + btot + ntot;
569 char fullname[5][20];
570 strncpy(fullname[0],"V0A-ONLY",19);
571 strncpy(fullname[1],"V0C-ONLY",19);
572 strncpy(fullname[2],"V0A & V0C",19);
573 strncpy(fullname[3],"!V0A & !V0C",19);
574 strncpy(fullname[4],"TOTAL",19);
575 for (Int_t ii=0;ii<5;ii++){
576 fullname[ii][19] = '\0';
579 for(Int_t ii=0;ii<5;ii++){
580 printf("xlulog %s CTP-L0: %s\tTOT: %10.0f\n",fOpt.Data(), fullname[ii],tot[ii]);
585 const Int_t nb=hc->GetNbinsX();
586 for(Int_t ib=0; ib<=nb+1; ib++){
587 hc->SetBinContent(ib, 0);
591 //====================================================================================
593 Bool_t AliAnalysisTaskDDMeson::CheckESD()
598 const AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler *>(fInputHandler);
600 fESD = esdH->GetEvent();
602 AliError("xlulog No ESD Event");
606 if(fabs(fESD->GetMagneticField())<1){
607 printf("xlulog strange Bfield! %f\n", fESD->GetMagneticField());
611 const Int_t tmprun = fESD->GetRunNumber();
615 printf("xlulog run changed during exec!! %d %d\n", tmprun, fRun);
619 if(fOpt.Contains("SPD")){
627 void AliAnalysisTaskDDMeson::SPDLoadGeom() const
629 //method to get the gGeomanager
630 // it is called at the CreatedOutputObject stage
631 // to comply with the CAF environment
632 AliCDBManager *man = AliCDBManager::Instance();
633 TString cdbpath("local:///lustre/alice/alien/alice/data/2010/OCDB");
634 man->SetDefaultStorage(cdbpath);
636 man->SetSpecificStorage("ITS/Align/Data",cdbpath);
637 man->SetSpecificStorage("GRP/Geometry/Data",cdbpath);
639 AliCDBEntry* obj = man->Get(AliCDBPath("GRP", "Geometry", "Data"));
641 AliGeomManager::SetGeometry((TGeoManager*)obj->GetObject());
642 AliGeomManager::ApplyAlignObjsFromCDB("ITS");
643 printf("xlulog DDMeson %s Geom Loaded for run %d !\n", fOpt.Data(), fRun);
646 printf("xlulog DDMeson %s was unable to load Geom for run %d !\n", fOpt.Data(), fRun);
650 Bool_t AliAnalysisTaskDDMeson::SPDLoc2Glo(const Int_t id, const Double_t *loc, Double_t *glo) const
656 static TGeoHMatrix mat;
657 Int_t vid = AliITSAlignMille2Module::GetVolumeIDFromIndex(id);
659 printf("xlulog Did not find module with such ID %d\n",id);
662 AliITSAlignMille2Module::SensVolMatrix(vid,&mat);
663 mat.LocalToMaster(loc,glo);
667 Bool_t AliAnalysisTaskDDMeson::CheckChipEta(const Int_t chipKey) const
674 if(fOpt.Contains("SPD0"))
677 const Double_t etacut = 1.0;
679 UInt_t module=999, offchip=999;
680 AliSPDUtils::GetOfflineFromOfflineChipKey(chipKey,module,offchip);
681 UInt_t hs = AliSPDUtils::GetOnlineHSFromOffline(module);
682 if(hs<2) offchip = 4 - offchip; // inversion in the inner layer...
689 const Int_t aa[]={0, 0, 255, 255};
690 const AliITSsegmentationSPD seg;
692 for(Int_t ic=0; ic<4; ic++){
693 Float_t localchip[3]={0.,0.,0.};
694 seg.DetToLocal(aa[ic],col[ic]+32*offchip,localchip[0],localchip[2]); // local coordinate of the chip center
695 //printf("local coordinates %d %d: %f %f \n",chipKey, ic, localchip[0],localchip[2]);
696 const Double_t local[3] = {localchip[0],localchip[1],localchip[2]};
697 Double_t glochip[3]={0.,0.,0.};
698 if(!SPDLoc2Glo(module,local,glochip)){
702 const TVector3 pos(glochip[0],glochip[1],glochip[2]);
705 if(fabs(pos.Eta()) > etacut)
712 void AliAnalysisTaskDDMeson::GetNFO(Int_t &ni, Int_t &no) const
718 const AliMultiplicity *mult = fESD->GetMultiplicity();
721 for(Int_t iChipKey=0; iChipKey < 1200; iChipKey++){
722 if(mult->TestFastOrFiredChips(iChipKey) && CheckChipEta(iChipKey)){ // here you check if the FastOr bit is 1 or 0
724 nFOinner++; // here you count the FastOr bits in the inner layer
726 nFOouter++; // here you count the FastOr bits in the outer layer
734 Bool_t AliAnalysisTaskDDMeson::CheckBit()
737 //get offline trigger
741 AliTriggerAnalysis triggerAnalysis;
743 //hardware 1: hw 0: offline
744 const Bool_t khw = kFALSE;
745 const Bool_t v0A = (triggerAnalysis.V0Trigger(fESD, AliTriggerAnalysis::kASide, khw) == AliTriggerAnalysis::kV0BB);
746 const Bool_t v0C = (triggerAnalysis.V0Trigger(fESD, AliTriggerAnalysis::kCSide, khw) == AliTriggerAnalysis::kV0BB);
749 const Bool_t v0ABG = (triggerAnalysis.V0Trigger(fESD, AliTriggerAnalysis::kASide, khw) == AliTriggerAnalysis::kV0BG);
750 const Bool_t v0CBG = (triggerAnalysis.V0Trigger(fESD, AliTriggerAnalysis::kCSide, khw) == AliTriggerAnalysis::kV0BG);
751 const Bool_t v0BG = v0ABG || v0CBG;
752 const Int_t fastOROffline = triggerAnalysis.SPDFiredChips(fESD, 0); // SPD number of chips from clusters (!)
754 //http://alisoft.cern.ch/viewvc/trunk/ANALYSIS/AliPhysicsSelection.cxx?view=markup&root=AliRoot
755 //Bool_t mb1 = (fastOROffline > 0 || v0A || v0C) && (!v0BG);
758 const Bool_t fmdA = triggerAnalysis.FMDTrigger(fESD, AliTriggerAnalysis::kASide);
759 const Bool_t fmdC = triggerAnalysis.FMDTrigger(fESD, AliTriggerAnalysis::kCSide);
761 Bool_t bitA = kFALSE, bitC = kFALSE;
762 if(fOpt.Contains("V0")){
766 if(fOpt.Contains("FMD")){
771 //---------------------------------------------------------------------------------------------
772 //---------------------------------------------------------------------------------------------
773 //considering the efficiency per chip, nfo and fastORhw is required only to have non-0 count!!
775 //simulate SPD _hardware_ trigger in eta range
776 if(fOpt.Contains("SPD")){
777 Int_t ni=-999, no = -999;
786 //simulate MB condition, since for double gap SPD is definitely fired, fastORhw>0 to reduce GA, GC, NG
787 //http://alisoft.cern.ch/viewvc/trunk/ANALYSIS/AliTriggerAnalysis.cxx?view=markup&root=AliRoot
788 //Int_t AliTriggerAnalysis::SPDFiredChips(const AliESDEvent* aEsd, Int_t origin, Bool_t fillHists, Int_t layer)
789 // returns the number of fired chips in the SPD
790 // origin = 0 --> aEsd->GetMultiplicity()->GetNumberOfFiredChips() (filled from clusters)
791 // origin = 1 --> aEsd->GetMultiplicity()->TestFastOrFiredChips() (from hardware bits)
792 const Int_t fastORhw = triggerAnalysis.SPDFiredChips(fESD, 1);
793 fhspd->Fill(fastORhw);
797 //---------------------------------------------------------------------------------------------
798 //---------------------------------------------------------------------------------------------
800 const Int_t iv0 = v0A + 2*v0C;
801 const Int_t ifmd = fmdA + 2*fmdC;
802 fhv0fmd->Fill(iv0, ifmd);
804 //---------------------------------------------------------------------------------------------
805 //---------------------------------------------------------------------------------------------
807 //need a base number to distringuish from null entry; fHBit starts from 1; important!!
815 fHBIT->Fill( fBitcg );
820 Int_t AliAnalysisTaskDDMeson::CutESD(const AliESDtrack *outtrk[])
826 //collision vertex cut
827 //A cut in XY is implicitly done during the reconstruction by constraining the vertex to the beam diamond.
831 const AliESDVertex *vertex = fESD->GetPrimaryVertexTracks();
832 if(vertex->GetNContributors()<1) {
834 vertex = fESD->GetPrimaryVertexSPD();
835 if(vertex->GetNContributors()<1) {
836 // NO GOOD VERTEX, SKIP EVENT
840 const Bool_t kpriv = kpr0 && ( fabs(fESD->GetPrimaryVertex()->GetZ())<10 );
845 AliESDtrackCuts *esdTrackCuts = new AliESDtrackCuts;//::GetStandardITSTPCTrackCuts2010(kTRUE);
849 esdTrackCuts->SetMinNClustersTPC(70);
850 esdTrackCuts->SetMaxChi2PerClusterTPC(4);
851 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
852 esdTrackCuts->SetRequireTPCRefit(kTRUE);
854 esdTrackCuts->SetRequireITSRefit(kTRUE);
855 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
856 AliESDtrackCuts::kAny);
857 // 7*(0.0026+0.0050/pt^1.01)
858 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
860 esdTrackCuts->SetMaxDCAToVertexZ(2);
861 esdTrackCuts->SetDCAToVertex2D(kFALSE);
862 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
865 esdTrackCuts->SetEtaRange(-0.9, 0.9);
867 const TObjArray* seltrk = esdTrackCuts->GetAcceptedTracks(fESD);
868 const Int_t n0=seltrk->GetEntries();
869 const AliESDtrack * trks[n0];
871 for(Int_t ii=0; ii<n0; ii++){
873 const AliESDtrack *esdtrack = (AliESDtrack *)(seltrk->At(ii));
876 if(!CutTrack(esdtrack))
880 trks[nsel++]=esdtrack;
886 fv0ntrk->Fill(nsel,GetV0());
890 frsntrk->Fill(fESD->GetNumberOfTracks(), nsel);
895 for(Int_t ii=0; ii<nsel; ii++){
903 Bool_t AliAnalysisTaskDDMeson::CutTrack(const AliESDtrack * esdtrack) const
913 //=================================================================================
915 void AliAnalysisTaskDDMeson::SwapTrack(const AliESDtrack * trks[]) const
920 const AliESDtrack * tmpt = trks[0];
925 Int_t AliAnalysisTaskDDMeson::GetV0() const
931 const Bool_t ka = (fBitcg & fCHECKVBA);
932 const Bool_t kc = (fBitcg & fCHECKVBC);
935 //a1c0 a0c1 must be adjacent so that a cut for signal gas can be eaily applied
936 const Int_t a0c0 = 1;
937 const Int_t a1c0 = 2;
938 const Int_t a0c1 = 3;
939 const Int_t a1c1 = 4;
953 Int_t AliAnalysisTaskDDMeson::GetCombCh(const Double_t s1, const Double_t s2) const
956 //get combination of charges
958 const Int_t combPP = 1;
959 const Int_t combMM = 2;
960 const Int_t combPM = 3;
971 //==========================================================================
973 TLorentzVector AliAnalysisTaskDDMeson::GetKinematics(const Double_t *pa, const Double_t *pb, const Double_t ma, const Double_t mb, Double_t & cts) const
976 //get kinematics, cts = cos(theta_{#star})
978 TLorentzVector va, vb, sumv;
979 va.SetXYZM(pa[0], pa[1], pa[2], ma);
980 vb.SetXYZM(pb[0], pb[1], pb[2], mb);
983 const TVector3 bv = -sumv.BoostVector();
987 //printf("test a %f %f %f -- %f %f\n", va.X(), va.Y(), va.Z(), va.Theta(), va.Phi());
988 //printf("test b %f %f %f -- %f %f\n", vb.X(), vb.Y(), vb.Z(), vb.Theta(), vb.Phi());
990 cts = fabs(cos(va.Theta()));
995 Double_t AliAnalysisTaskDDMeson::GetCtlab(const Double_t *pa, const Double_t *pb) const
1002 va.SetXYZ(pa[0], pa[1], pa[2]);
1003 vb.SetXYZ(pb[0], pb[1], pb[2]);
1005 const TVector3 ua = va.Unit();
1006 const TVector3 ub = vb.Unit();