ROOT logo
// $Id$
// Main author: Davide Caffarri 2009

/**************************************************************************
 * 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 <TClonesArray.h>
#include <TROOT.h>
#include <TSystem.h>
#include <TEveVSDStructs.h>
#include <TEveTrackPropagator.h>
#include <TEvePointSet.h>
#include <TEveManager.h>
#include <TEveUtil.h>

#include <AliExternalTrackParam.h>
#include <AliVVertex.h>
#include <AliAODVertex.h>
#include <AliAODEvent.h>
#include <AliAODTrack.h>
#include <AliAODMCParticle.h>
#include <AliESDtrack.h>
#include <AliESDEvent.h>
#include <PWGHF/vertexingHF/AliAODRecoDecayHF.h>
#include <PWGHF/vertexingHF/AliAODRecoDecayHF2Prong.h>
#include <PWGHF/vertexingHF/macros/LoadLibraries.C>
#include <AliEveHF.h>
#include <AliEveEventManager.h>
#else
class AliAODRecoDecayHF;
#endif

void aod_hf_init_rectrack(TEveRecTrack& rt, 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);
}


AliEveHF* aod_make_HF(TEveTrackPropagator* rnrStyle, AliAODVertex* primAODVtx,
		      AliESDtrack* neg, AliESDtrack* pos, AliAODRecoDecayHF* rd, Int_t i)
{
  TEveRecTrack  rcPos;
  TEveRecTrack  rcNeg;
  //TEveRecV0     rcV0;

  /*
    Double_t p[3];
    p[0]=rd->PxProng(0);  p[1]=rd->PyProng(0);  p[2]=rd->PzProng(0);
    rcV0.fPPos.Set(p);
    p[0]=rd->PxProng(1);  p[1]=rd->PyProng(1);  p[2]=rd->PzProng(1);
    rcV0.fPNeg.Set(p);

    p[0]=rd->Px();  p[1]=rd->Py();  p[2]=rd->Pz();
  */

  Double_t primVtx[3]={primAODVtx->GetX(), primAODVtx->GetY(), primAODVtx->GetZ()};


  Double_t v[3] = {rd->Xv(),rd->Yv(),rd->Zv()};
  printf("vertex %f %f %f\n",v[0],v[1],v[2]);

  aod_hf_init_rectrack(rcNeg, neg);
  //rcNeg.fIndex = v0->GetNindex();
  aod_hf_init_rectrack(rcPos, pos);
  //rcPos.fIndex = v0->GetPindex();

  AliEveHF* myHF = new AliEveHF(&rcNeg, &rcPos, primVtx ,rd, rnrStyle);
  myHF->SetElementName(Form("D0->Kpi %d", i));
  myHF->SetElementTitle(Form("CosPointingAngle %f", rd->CosPointingAngle()));
  myHF->SetAODIndex(i);
  return myHF;
}

AliEveHFList* aod_HF()
{
  Bool_t useParFiles=kFALSE;
  
  TEveUtil::LoadMacro("$ALICE_ROOT/PWGHF/vertexingHF/macros/LoadLibraries.C+");
  LoadLibraries(useParFiles);
  
  AliAODEvent* aod = AliEveEventManager::AssertAOD();
  AliESDEvent* esd = AliEveEventManager::AssertESD();

  /*
    gSystem->Load("libANALYSIS");
    gSystem->Load("libANALYSISalice");
    gSystem->Load("libCORRFW");
    gSystem->Load("libPWG3base");
    gSystem->Load("libPWG3vertexingHF");
  */

  // load MC particles
  TClonesArray *mcArray =
    (TClonesArray*) aod->FindListObject(AliAODMCParticle::StdBranchName());
  if (!mcArray) {
    printf("MC particles branch not found!\n");
    return 0;
  }

  AliAODVertex* primVtx_aod = (AliAODVertex*) aod->GetPrimaryVertex();
  // AliESDVertex *primVtx_esd = (AliESDVertex*) esd->GetPrimaryVertex();

  AliEveHFList* cont = new AliEveHFList("AOD HF vertices");
  cont->SetMainColor(2);
  TEveTrackPropagator* rnrStyle = cont->GetPropagator();
  rnrStyle->SetMagField( 0.1*aod->GetMagneticField() );

  gEve->AddElement(cont);

  TEvePointSet* pointsD0toKpi = new TEvePointSet("D0->Kpi vertex locations");

  // load D0->Kpi candidates
  TClonesArray *arrayD0toKpi = (TClonesArray*) aod->FindListObject("D0toKpi");

  // load 3prong candidates
  // TClonesArray *array3Prong =
  // (TClonesArray*)aod->GetList()->FindObject("Charm3Prong");

  Int_t countD0 = 0;
  for (Int_t iD0toKpi=0; iD0toKpi<arrayD0toKpi->GetEntriesFast(); iD0toKpi++)
  {
    AliAODRecoDecayHF2Prong *rd = (AliAODRecoDecayHF2Prong*)arrayD0toKpi->UncheckedAt(iD0toKpi);
    Bool_t unsetvtx=kFALSE;
    if (!rd->GetOwnPrimaryVtx()) {
      rd->SetOwnPrimaryVtx(primVtx_aod);
      unsetvtx=kTRUE;
    }
    // REAL D0 particle. If you want to draw only real D0 un-comment these lines
    //Int_t labD0 = rd->MatchToMC(421,mcArray);
    //if(labD0<0) continue;

    AliAODTrack *negAODTr = dynamic_cast<AliAODTrack *>(rd->GetDaughter(0));
    AliAODTrack *posAODTr = dynamic_cast<AliAODTrack *>(rd->GetDaughter(1));

    AliVVertex  *secv = rd->GetSecondaryVtx();

    AliESDtrack *negTr = new AliESDtrack(negAODTr);
    AliESDtrack *posTr = new AliESDtrack(posAODTr);

    negTr->PropagateToDCA((AliAODVertex*)secv,aod->GetMagneticField(),100.);
    posTr->PropagateToDCA((AliAODVertex*)secv,aod->GetMagneticField(),100.);

    AliEveHF* myD0 = aod_make_HF(rnrStyle,primVtx_aod,negTr,posTr,rd,iD0toKpi);
    if (myD0) {
      gEve->AddElement(myD0,cont);
      countD0++;
    }

    pointsD0toKpi->SetNextPoint(rd->Xv(),rd->Yv(),rd->Zv());
    pointsD0toKpi->SetPointId(rd);

    if(unsetvtx) {
      rd->UnsetOwnPrimaryVtx();
    }
  }

  //cont->SetTitle("test");

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

  pointsD0toKpi->SetTitle(Form("N=%d", pointsD0toKpi->Size()));
  pointsD0toKpi->SetMarkerStyle(4);
  pointsD0toKpi->SetMarkerSize(1.5);
  pointsD0toKpi->SetMarkerColor(kViolet);

  gEve->AddElement(pointsD0toKpi);
  gEve->Redraw3D();

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