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.                                                 *
 **************************************************************************/

#include "AliEveKineTools.h"
#include "AliEveTrack.h"

#include <AliStack.h>
#include <AliTrackReference.h>

#include <TTree.h>
#include <TBranchElement.h>
#include <TClonesArray.h>
#include <TParticle.h>

#include <map>

//______________________________________________________________________________
// AliEveKineTools
//
// Tools for import of kinematics.
//

ClassImp(AliEveKineTools)

namespace {

  // Map to store label-to-track association.
  //
  // multimap is used as there are cases when initial particles (in
  // particular resonances) are not assigned proper status-codes
  // and can thus be found several times in the eve-track-list.

  typedef std::multimap<Int_t, AliEveTrack*>                 TrackMap_t;
  typedef std::multimap<Int_t, AliEveTrack*>::const_iterator TrackMap_ci;

  void MapTracks(TrackMap_t& map, TEveElement* cont, Bool_t recurse)
  {
    TEveElement::List_i i = cont->BeginChildren();
    while (i != cont->EndChildren()) {
      AliEveTrack* track = static_cast<AliEveTrack*>(*i);
      map.insert(std::make_pair(track->GetLabel(), track));
      if (recurse)
        MapTracks(map, track, recurse);
      ++i;
    }
  }
}

/**************************************************************************/

void AliEveKineTools::SetDaughterPathMarks(TEveElement* cont, AliStack* stack, Bool_t recurse)
{
  // Import daughters birth points.

  TEveElement::List_i  iter = cont->BeginChildren();
  while(iter != cont->EndChildren())
  {
    AliEveTrack* track = static_cast<AliEveTrack*>(*iter);
    TParticle* p = stack->Particle(track->GetLabel());
    if (p->GetNDaughters())
    {
      Int_t d0 = p->GetDaughter(0), d1 = p->GetDaughter(1);
      for(int d = d0; d > 0 && d <= d1; ++d)
      {
	TParticle* dp = stack->Particle(d);
        track->AddPathMark(TEvePathMark(TEvePathMark::kDaughter,
                                        TEveVector(dp->Vx(), dp->Vy(), dp->Vz()),
                                        TEveVector(dp->Px(), dp->Py(), dp->Pz()),
                                        dp->T()));
        // printf("Daughter path-mark for %d, %d, t=%e, r=%f,%f,%f\n",
        //        track->GetLabel(), d, dp->T(), dp->Vx(), dp->Vy(), dp->Vz());
      }

      // Check last process, set decay if needed.
      Int_t lp = stack->Particle(d1)->GetUniqueID();
      if (lp != kPBrem && lp != kPDeltaRay && lp < kPCerenkov)
      {
        TParticle* dp = stack->Particle(d1);
        track->AddPathMark(TEvePathMark(TEvePathMark::kDecay,
                                        TEveVector(dp->Vx(), dp->Vy(), dp->Vz()),
                                        TEveVector(0, 0,0),  dp->T()));
      }

      if (recurse)
	SetDaughterPathMarks(track, stack, recurse);
    }
    ++iter;
  }
}

/**************************************************************************/

void AliEveKineTools::SetTrackReferences(TEveElement* cont, TTree* treeTR, Bool_t recurse)
{
  // Set decay and track reference path-marks.

  static const TEveException kEH("AliEveKineTools::ImportPathMarks");

  TrackMap_t map;
  MapTracks(map, cont, recurse);

  TClonesArray* arr = 0;
  treeTR->SetBranchAddress("TrackReferences", &arr);

  Int_t nTreeEntries = (Int_t) treeTR->GetEntries();

  for (Int_t te = 0; te < nTreeEntries; ++te)
  {
    treeTR->GetEntry(te);

    Int_t last_label = -1;
    std::pair<TrackMap_ci, TrackMap_ci> range;
    Int_t nArrEntries = arr->GetEntriesFast();

    // printf("tree-entry %d, n-arr-entries %d\n", te, nArrEntries);

    for (Int_t ae = 0; ae < nArrEntries; ++ae)
    {
      AliTrackReference* atr = (AliTrackReference*)arr->UncheckedAt(ae);
      Bool_t isRef = (atr->DetectorId() != -1);
      Int_t  label = atr->GetTrack();

      // printf("    arr-entry %d, label %d, detid %d, len=%f, t=%e r=%f,%f,%f\n",
      //        ae, label, atr->DetectorId(), 
      //        atr->GetLength(), atr->GetTime(), atr->X(), atr->Y(), atr->Z());

      if (label < 0)
        throw(kEH + Form("negative label for array-entry %d in tree-entry %d.",
                         ae, te));

      if (label != last_label)
      {
        range      = map.equal_range(label);
        last_label = label;
      }

      for (TrackMap_ci i = range.first; i != range.second; ++i)
      {
	i->second->AddPathMark
          (TEvePathMark(isRef ? TEvePathMark::kReference : TEvePathMark::kDecay,
                        TEveVector(atr->X(),  atr->Y(),  atr->Z()),
                        TEveVector(atr->Px(), atr->Py(), atr->Pz()),
                        atr->GetTime()));
      }
    }
  }
  delete arr;
}

/**************************************************************************/

void AliEveKineTools::SortPathMarks(TEveElement* el, Bool_t recurse)
{
  // Sort path-marks for track by time.
  // If recurse is true, descends down all track children.

  AliEveTrack* track = dynamic_cast<AliEveTrack*>(el);
  if (track)
    track->SortPathMarksByTime();

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