ROOT logo
// $Id$
// Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007

/**************************************************************************
 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
 * full copyright notice.                                                 *
 **************************************************************************/
#if !defined(__CINT__) || defined(__MAKECINT__)
#include <TMath.h>
#include <TEveManager.h>
#include <TEveVSDStructs.h>
#include <TEveTrackPropagator.h>

#include <AliExternalTrackParam.h>
#include <AliESDEvent.h>
#include <AliESDcascade.h>
#include <AliESDVertex.h>
#include <AliEveCascade.h>
#include <AliEveEventManager.h>
#endif

void esd_cascade_init_rectrack(TEveRecTrack& rt, const AliExternalTrackParam* tp)
{
  Double_t      pbuf[3], vbuf[3];

  rt.fSign = tp->GetSign();
  tp->GetXYZ(vbuf);     rt.fV.Set(vbuf);
  tp->GetPxPyPz(pbuf);  rt.fP.Set(pbuf);
  // Double_t ep = at->GetP(), mc = at->GetMass();
  rt.fBeta = 1; // ep/TMath::Sqrt(ep*ep + mc*mc);
}

AliEveCascade* esd_make_cascade(TEveTrackPropagator* rnrStyle, AliESDVertex* primVtx,
				AliESDtrack* bac, AliESDcascade* cascade, Int_t i)
{
  TEveRecTrack   rcPos;
  TEveRecTrack   rcNeg;
  TEveRecV0      rcV0;

  TEveRecTrack   rcBac;
  TEveRecCascade rcCascade;
  
  Double_t v[3];
  cascade->GetXYZ(v[0], v[1], v[2]);
  rcV0.fVCa.Set(v);

  cascade->GetParamN()->GetXYZ(v);  rcV0.fVNeg.Set(v);
  cascade->GetParamP()->GetXYZ(v);  rcV0.fVPos.Set(v);

  rcV0.fV0Birth.Set(primVtx->GetX(), primVtx->GetY(), primVtx->GetZ());

  Double_t pCascade[3]={0.}, pBac[3]={0.}, pNeg[3]={0.}, pPos[3]={0.}, cv[21]={0.};
  //cascade->GetPxPyPz(pCascade[0], pCascade[1], pCascade[2]);
  cascade->GetBPxPyPz(pBac[0], pBac[1], pBac[2]);
  cascade->GetNPxPyPz(pNeg[0], pNeg[1], pNeg[2]);
  cascade->GetPPxPyPz(pPos[0], pPos[1], pPos[2]);
  
  	rcCascade.fPBac.Set(pBac);
  	rcV0.fPNeg.Set(pNeg);
	rcV0.fPPos.Set(pPos);
  /*
  // Debug
  printf("\n ESD info \n");	
  printf("Neg :  px = %.5f, py = %.5f, pz = %.5f \n",pNeg[0], pNeg[1], pNeg[2]);
  printf("Pos :  px = %.5f, py = %.5f, pz = %.5f \n",pPos[0], pPos[1], pPos[2]);
  printf("Bach : px = %.5f, py = %.5f, pz = %.5f \n",pBac[0], pBac[1], pBac[2]);
  
  printf("\n EVE info \n");	
  printf("Neg :  px = %.5f, py = %.5f, pz = %.5f \n",rcV0.fPNeg.fX, rcV0.fPNeg.fY, rcV0.fPNeg.fZ);
  printf("Pos :  px = %.5f, py = %.5f, pz = %.5f \n",rcV0.fPPos.fX, rcV0.fPPos.fY, rcV0.fPPos.fZ);
  printf("Bach : px = %.5f, py = %.5f, pz = %.5f \n",rcCascade.fPBac.fX,rcCascade.fPBac.fY,rcCascade.fPBac.fZ);
  */
  Double_t pLambda = TMath::Sqrt((pNeg[0]+pPos[0])* (pNeg[0]+pPos[0]) +
		  		 (pNeg[1]+pPos[1])* (pNeg[1]+pPos[1]) +
		  		 (pNeg[2]+pPos[2])* (pNeg[2]+pPos[2]) );
  Double_t pBach   = TMath::Sqrt( pBac[0]*pBac[0] + pBac[1]*pBac[1] + pBac[2]*pBac[2]);

  cascade->GetXYZcascade(v[0], v[1], v[2]);
  rcCascade.fCascadeVCa.Set(v);

  rcCascade.fCascadeBirth.Set(primVtx->GetX(), primVtx->GetY(), primVtx->GetZ());

  // Simulation data not directly available in AliESDcascade
  // rcCascade.fDLabel = cascade->GetBindex();

  // Problem: two following lines are not possible: no GetParamB !!
  // cascade->GetParamB()->GetXYZ(v);  rcCascade.fVBac.Set(v); 
  // esd_cascade_init_rectrack(rcBac, cascade->GetParamB());
  // Solution: create an AliExternalTrackParam with null cv...
  AliExternalTrackParam *bParam = new AliExternalTrackParam(v,pBac,cv,cascade->Charge());
  esd_cascade_init_rectrack(rcBac,bParam);
   rcBac.fIndex = cascade->GetBindex();
  
  esd_cascade_init_rectrack(rcNeg, cascade->GetParamN());
   rcNeg.fIndex = cascade->GetNindex();
  esd_cascade_init_rectrack(rcPos, cascade->GetParamP());
   rcPos.fIndex = cascade->GetPindex();
  
  
/*
  // Debug
  TEveVector BacMom = rcBac.GetMomentum();
  printf("Bac mom : px = %f, py = %f, pz =%f, Ptot = %f \n", BacMom.fX, 
	 rcBac.GetMomentum().fY, 
	 BacMom.fZ, 
	 BacMom.Mag());
*/
  AliEveCascade* myCascade = new AliEveCascade(&rcBac, &rcNeg, &rcPos, &rcV0, &rcCascade, rnrStyle);
  myCascade->SetElementName(Form("ESDcascade %d", i));
  
  /*
  // Debug
  TEveVector CascMom(rcCascade.fPBac + rcV0.fPNeg + rcV0.fPPos);
  printf("Casc mom : px = %f, py = %f, pz =%f, Ptot = %f \n", CascMom.fX, CascMom.fY, CascMom.fZ, CascMom.Mag());
  */
  myCascade->SetElementTitle(Form("Info coming directly from AliESDcascade : \n - Charge : %d \n - Cascade decay position : x = %.4f, y = %.4f, z = %.4f, Transv. radius = %.4f cm, Decay Length = %.4f cm\n\n - Pt(Cascade) : %f GeV/c, Ptot(Cascade): %f GeV/c\n - Lambda : px = %.4f, py = %.4f, pz = %.4f, Ptot : %f GeV/c\n - Bach   : px = %.4f, py = %.4f, pz = %.4f, Ptot : %f GeV/c\n\n - Eta : %f\n - Phi : %f deg \n - Theta : %f deg\n - DCA : %f cm \n - Cos(Ptg Angle) : %f \n\n - Eff. mass (Xi hyp) : %f GeV/c2", 
			     		cascade->Charge(),
					v[0], v[1], v[2], TMath::Sqrt(v[0]*v[0] +v[1]*v[1]), TMath::Sqrt(v[0]*v[0] +v[1]*v[1] + v[2]*v[2] ),
					cascade->Pt(), cascade->P(),
					pNeg[0]+pPos[0], pNeg[1]+pPos[1], pNeg[2]+pPos[2], pLambda,
					pBac[0], pBac[1], pBac[2], pBach,
					cascade->Eta(),
					cascade->Phi()   * 180/TMath::Pi(),
					cascade->Theta() * 180/TMath::Pi(),
					cascade->GetDcaXiDaughters(),
  					cascade->GetCascadeCosineOfPointingAngle(primVtx->GetX(),
			     							 primVtx->GetY(),
			     							 primVtx->GetZ()),
					cascade->GetEffMassXi()
				 )
			    );

  
  myCascade->SetESDIndex(i);
  myCascade->SetDaughterDCA(cascade->GetDcaXiDaughters());
  myCascade->SetLambdaP( pNeg[0]+pPos[0], pNeg[1]+pPos[1], pNeg[2]+pPos[2] );
  myCascade->SetBachP(   pBac[0], pBac[1], pBac[2]);
  return myCascade;
}


AliEveCascadeList* esd_cascade()
{
  AliESDEvent* esd = AliEveEventManager::AssertESD();

  AliESDVertex* primVertex = (AliESDVertex*) esd->GetPrimaryVertex();

  AliEveCascadeList* cont = new AliEveCascadeList("ESD cascade");
  cont->SetMainColor(kBlue+2);
  TEveTrackPropagator* rnrStyle = cont->GetPropagator();
  rnrStyle->SetMagField( 0.1*esd->GetMagneticField() );

  gEve->AddElement(cont);

  Int_t count = 0;
  for (Int_t n=0; n<esd->GetNumberOfCascades(); ++n)
  {
    AliESDcascade *cascade = esd->GetCascade(n);

    Int_t bacInd = cascade->GetBindex();
    AliESDtrack* bacTr = esd->GetTrack(bacInd);

    AliEveCascade* myCascade = esd_make_cascade(rnrStyle, primVertex, bacTr, cascade, n);
    if (myCascade)
    {
      gEve->AddElement(myCascade, cont);
      ++count;
    }
  }

  cont->SetTitle("Cascade candidates (reco)");

  cont->MakeCascades();
  gEve->Redraw3D();

  return cont;
}
 esd_cascade.C:1
 esd_cascade.C:2
 esd_cascade.C:3
 esd_cascade.C:4
 esd_cascade.C:5
 esd_cascade.C:6
 esd_cascade.C:7
 esd_cascade.C:8
 esd_cascade.C:9
 esd_cascade.C:10
 esd_cascade.C:11
 esd_cascade.C:12
 esd_cascade.C:13
 esd_cascade.C:14
 esd_cascade.C:15
 esd_cascade.C:16
 esd_cascade.C:17
 esd_cascade.C:18
 esd_cascade.C:19
 esd_cascade.C:20
 esd_cascade.C:21
 esd_cascade.C:22
 esd_cascade.C:23
 esd_cascade.C:24
 esd_cascade.C:25
 esd_cascade.C:26
 esd_cascade.C:27
 esd_cascade.C:28
 esd_cascade.C:29
 esd_cascade.C:30
 esd_cascade.C:31
 esd_cascade.C:32
 esd_cascade.C:33
 esd_cascade.C:34
 esd_cascade.C:35
 esd_cascade.C:36
 esd_cascade.C:37
 esd_cascade.C:38
 esd_cascade.C:39
 esd_cascade.C:40
 esd_cascade.C:41
 esd_cascade.C:42
 esd_cascade.C:43
 esd_cascade.C:44
 esd_cascade.C:45
 esd_cascade.C:46
 esd_cascade.C:47
 esd_cascade.C:48
 esd_cascade.C:49
 esd_cascade.C:50
 esd_cascade.C:51
 esd_cascade.C:52
 esd_cascade.C:53
 esd_cascade.C:54
 esd_cascade.C:55
 esd_cascade.C:56
 esd_cascade.C:57
 esd_cascade.C:58
 esd_cascade.C:59
 esd_cascade.C:60
 esd_cascade.C:61
 esd_cascade.C:62
 esd_cascade.C:63
 esd_cascade.C:64
 esd_cascade.C:65
 esd_cascade.C:66
 esd_cascade.C:67
 esd_cascade.C:68
 esd_cascade.C:69
 esd_cascade.C:70
 esd_cascade.C:71
 esd_cascade.C:72
 esd_cascade.C:73
 esd_cascade.C:74
 esd_cascade.C:75
 esd_cascade.C:76
 esd_cascade.C:77
 esd_cascade.C:78
 esd_cascade.C:79
 esd_cascade.C:80
 esd_cascade.C:81
 esd_cascade.C:82
 esd_cascade.C:83
 esd_cascade.C:84
 esd_cascade.C:85
 esd_cascade.C:86
 esd_cascade.C:87
 esd_cascade.C:88
 esd_cascade.C:89
 esd_cascade.C:90
 esd_cascade.C:91
 esd_cascade.C:92
 esd_cascade.C:93
 esd_cascade.C:94
 esd_cascade.C:95
 esd_cascade.C:96
 esd_cascade.C:97
 esd_cascade.C:98
 esd_cascade.C:99
 esd_cascade.C:100
 esd_cascade.C:101
 esd_cascade.C:102
 esd_cascade.C:103
 esd_cascade.C:104
 esd_cascade.C:105
 esd_cascade.C:106
 esd_cascade.C:107
 esd_cascade.C:108
 esd_cascade.C:109
 esd_cascade.C:110
 esd_cascade.C:111
 esd_cascade.C:112
 esd_cascade.C:113
 esd_cascade.C:114
 esd_cascade.C:115
 esd_cascade.C:116
 esd_cascade.C:117
 esd_cascade.C:118
 esd_cascade.C:119
 esd_cascade.C:120
 esd_cascade.C:121
 esd_cascade.C:122
 esd_cascade.C:123
 esd_cascade.C:124
 esd_cascade.C:125
 esd_cascade.C:126
 esd_cascade.C:127
 esd_cascade.C:128
 esd_cascade.C:129
 esd_cascade.C:130
 esd_cascade.C:131
 esd_cascade.C:132
 esd_cascade.C:133
 esd_cascade.C:134
 esd_cascade.C:135
 esd_cascade.C:136
 esd_cascade.C:137
 esd_cascade.C:138
 esd_cascade.C:139
 esd_cascade.C:140
 esd_cascade.C:141
 esd_cascade.C:142
 esd_cascade.C:143
 esd_cascade.C:144
 esd_cascade.C:145
 esd_cascade.C:146
 esd_cascade.C:147
 esd_cascade.C:148
 esd_cascade.C:149
 esd_cascade.C:150
 esd_cascade.C:151
 esd_cascade.C:152
 esd_cascade.C:153
 esd_cascade.C:154
 esd_cascade.C:155
 esd_cascade.C:156
 esd_cascade.C:157
 esd_cascade.C:158
 esd_cascade.C:159
 esd_cascade.C:160
 esd_cascade.C:161
 esd_cascade.C:162
 esd_cascade.C:163
 esd_cascade.C:164
 esd_cascade.C:165
 esd_cascade.C:166
 esd_cascade.C:167
 esd_cascade.C:168
 esd_cascade.C:169
 esd_cascade.C:170
 esd_cascade.C:171
 esd_cascade.C:172
 esd_cascade.C:173
 esd_cascade.C:174
 esd_cascade.C:175
 esd_cascade.C:176
 esd_cascade.C:177
 esd_cascade.C:178
 esd_cascade.C:179