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

/// \ingroup evemacros
/// \file MUON_displaySimu.C
///
/// \author B. Vulpescu, LPC

#if !defined(__CINT__) || defined(__MAKECINT__)
#include <Riostream.h>
#include <Rtypes.h>
#include <TTree.h>
#include <TStyle.h>
#include <TString.h>
#include <TSystem.h>
#include <TEveManager.h>
#include <TEveElement.h>
#include <TEveTrack.h>

#include <AliLog.h>
#include <AliMpSegmentation.h>
#include <AliMpDDLStore.h>
#include <AliMpCDB.h>
#include <AliMUONRecoCheck.h>
#include <AliMUONTrack.h>
#include <AliMUONTrackExtrap.h>
#include <AliMUONVTrackStore.h>
#include <AliStack.h>
#include <AliRunLoader.h>
#include <AliESDEvent.h>
#include <AliESDMuonTrack.h>
#include <AliEveEventManager.h>
#include <AliEveMUONData.h>
#include <AliEveMUONChamber.h>
#include <AliEveMUONTrack.h>
#else
class AliEveMUONData;
class AliEveEventManager;
#endif

AliEveMUONData     *g_muon_data       = 0;

Int_t  g_currentEvent = -1;
Bool_t g_fromRaw      = kFALSE;

void MUON_ESD_tracks();
void MUON_Ref_tracks();
void MUON_MC_tracks();

void MUON_displaySimu(Bool_t fromRaw = kFALSE, Bool_t showTracks = kTRUE, Bool_t clustersFromESD = kTRUE)
{
  //
  // display from simulated digits (or produced raw data) 
  // tracks: ESD, Refs, MC
  // 

  if (!AliMpSegmentation::Instance()) AliMpCDB::LoadMpSegmentation();
  if (!AliMpDDLStore::Instance())     AliMpCDB::LoadDDLStore();

  // set the magnetic field for track extrapolations
  AliEveEventManager::AssertMagField();
  AliMUONTrackExtrap::SetField();

  TTree* dt = 0;
  TTree* ct = 0;
  TTree* ht = 0;

  if (AliEveEventManager::GetMaster() == 0) {
    printf("No alieve event: use alieve_init(...) \n");
    return;
  }

  if (g_currentEvent == AliEveEventManager::GetMaster()->GetEventId()) {
    if (g_fromRaw == fromRaw) {
      printf("Same event... \n");
      return;
    } else {
      if (g_fromRaw) {
	printf("Same event with digits.\n");
	AliEveEventManager::GetMaster()->GotoEvent(g_currentEvent);
      } else {
	printf("Same event with raw.\n");
	AliEveEventManager::GetMaster()->GotoEvent(g_currentEvent);
      }
    }
  }

  g_fromRaw = fromRaw;

  TString dataPath = TString(AliEveEventManager::GetMaster()->GetTitle());
  dataPath.Append("/raw.root");

  AliRunLoader* rl =  AliEveEventManager::AssertRunLoader();
  g_muon_data = new AliEveMUONData;

  if (!fromRaw) {
    rl->LoadDigits("MUON");
    dt = rl->GetTreeD("MUON", false);
    if (dt == 0) {
      AliInfoGeneral("MUON_displaySimu.C", "No digits produced!");
    } else {
      AliInfoGeneral("MUON_displaySimu.C", "With aliroot digits!");
      g_muon_data->LoadDigits(dt);
    }
  } else {
    if (gSystem->AccessPathName(dataPath.Data(),kFileExists)) {
      AliInfoGeneral("MUON_displaySimu.C", "No raw data produced!");
    } else {
      AliInfoGeneral("MUON_displaySimu.C", "With raw digits!");
      g_muon_data->LoadRaw(dataPath.Data());
    }
  }

  TString esdDataPath = TString(AliEveEventManager::GetMaster()->GetTitle());
  esdDataPath.Append("/AliESDs.root");
  if (clustersFromESD) {
    g_muon_data->LoadRecPointsFromESD(esdDataPath.Data());
  } else {
    rl->LoadRecPoints("MUON");
    ct = rl->GetTreeR("MUON", false);
    g_muon_data->LoadRecPoints(ct);
  }
  
  rl->LoadHits("MUON");
  ht = rl->GetTreeH("MUON", false);
  g_muon_data->LoadHits(ht);
  
  g_currentEvent = AliEveEventManager::GetMaster()->GetEventId();

  gStyle->SetPalette(1, 0);

  gEve->DisableRedraw();

  TEveElementList* l = new TEveElementList("MUONChambers");
  l->SetTitle("MUON chambers");
  l->SetMainColor(2);
  gEve->AddElement(l);

  for (Int_t ic = 0; ic < 14; ic++)
  {
    AliEveMUONChamber* mucha = new AliEveMUONChamber(ic);

    mucha->SetFrameColor(2);
    mucha->SetChamberID(ic);

    mucha->SetDataSource(g_muon_data);

    gEve->AddElement(mucha, l);
  }

  if (showTracks) {
    MUON_ESD_tracks();
    MUON_Ref_tracks();
    MUON_MC_tracks();
  }

  gEve->Redraw3D(kTRUE);
  gEve->EnableRedraw();
}

//______________________________________________________________________________
void MUON_ESD_tracks()
{
  AliESDEvent* esd = AliEveEventManager::AssertESD();

  TEveTrackList* lt = new TEveTrackList("ESD-Tracks");
  lt->SetMainColor(6);
  //lt->SetMUON();

  gEve->AddElement(lt);

  AliESDMuonTrack *mt;
  TEveRecTrack rt;
  Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
  Int_t nTrack = 0;
  for (Int_t n = 0; n < nMuonTracks; n++)
  {
    mt = esd->GetMuonTrack(n);

    if (mt->GetNHit() == 0) continue;
    nTrack++;

    rt.fLabel = n;

    AliEveMUONTrack* track = new AliEveMUONTrack(&rt, lt->GetPropagator());

    track->MakeESDTrack(mt);

    gEve->AddElement(track, lt);
  }

}

//______________________________________________________________________________
void MUON_Ref_tracks()
{
  TString dataPathESD = TString(AliEveEventManager::GetMaster()->GetTitle());
  dataPathESD.Append("/AliESDs.root");
  TString dataPathSIM = TString(AliEveEventManager::GetMaster()->GetTitle());
  dataPathSIM.Append("/");

  AliMUONRecoCheck recoCheck(dataPathESD.Data(),dataPathSIM.Data());
  AliMUONVTrackStore* trackRefStore = recoCheck.ReconstructibleTracks(AliEveEventManager::GetMaster()->GetEventId());
  TIter next(trackRefStore->CreateIterator());
  AliMUONTrack* trackRef;

  TEveTrackList* lt = new TEveTrackList("Ref-Tracks");
  lt->SetMainColor(6);

  gEve->AddElement(lt);

  TEveRecTrack rt;
  Int_t i = 0;
  while ( ( trackRef = static_cast<AliMUONTrack*>(next()) ) )
  {
    rt.fLabel = i++;

    AliEveMUONTrack* track = new AliEveMUONTrack(&rt, lt->GetPropagator());

    track->MakeRefTrack(trackRef);

    gEve->AddElement(track, lt);
  }

}

//______________________________________________________________________________
void MUON_MC_tracks()
{
  AliRunLoader* rl =  AliEveEventManager::AssertRunLoader();
  rl->LoadKinematics();
  AliStack* stack = rl->Stack();

  Int_t nTracks  = stack->GetNtrack();

  TEveTrackList* lt = new TEveTrackList("MC-Tracks");
  lt->SetMainColor(6);
  //lt->SetMUON();

  gEve->AddElement(lt);

  TParticle *part;
  TEveRecTrack rt;

  Int_t nHitTracks = g_muon_data->GetNTrackList();
  Int_t index;
  for (Int_t i = 0; i < nHitTracks; i++)
  {
    index = g_muon_data->GetTrack(i);
    if (index >= nTracks) {
      AliInfoGeneral("MUON_displaySimu.C", "TEveHit track index larger than number in stack!");
      continue;
    }

    part = stack->Particle(index);
    if (part->P() < 0.001) continue;  // skip momenta < 1.0 MeV/c
    rt.fLabel = i;

    AliEveMUONTrack* track = new AliEveMUONTrack(&rt, lt->GetPropagator());

    track->MakeMCTrack(part);

    gEve->AddElement(track, lt);
  }

  rl->UnloadKinematics();
}

 MUON_displaySimu.C:1
 MUON_displaySimu.C:2
 MUON_displaySimu.C:3
 MUON_displaySimu.C:4
 MUON_displaySimu.C:5
 MUON_displaySimu.C:6
 MUON_displaySimu.C:7
 MUON_displaySimu.C:8
 MUON_displaySimu.C:9
 MUON_displaySimu.C:10
 MUON_displaySimu.C:11
 MUON_displaySimu.C:12
 MUON_displaySimu.C:13
 MUON_displaySimu.C:14
 MUON_displaySimu.C:15
 MUON_displaySimu.C:16
 MUON_displaySimu.C:17
 MUON_displaySimu.C:18
 MUON_displaySimu.C:19
 MUON_displaySimu.C:20
 MUON_displaySimu.C:21
 MUON_displaySimu.C:22
 MUON_displaySimu.C:23
 MUON_displaySimu.C:24
 MUON_displaySimu.C:25
 MUON_displaySimu.C:26
 MUON_displaySimu.C:27
 MUON_displaySimu.C:28
 MUON_displaySimu.C:29
 MUON_displaySimu.C:30
 MUON_displaySimu.C:31
 MUON_displaySimu.C:32
 MUON_displaySimu.C:33
 MUON_displaySimu.C:34
 MUON_displaySimu.C:35
 MUON_displaySimu.C:36
 MUON_displaySimu.C:37
 MUON_displaySimu.C:38
 MUON_displaySimu.C:39
 MUON_displaySimu.C:40
 MUON_displaySimu.C:41
 MUON_displaySimu.C:42
 MUON_displaySimu.C:43
 MUON_displaySimu.C:44
 MUON_displaySimu.C:45
 MUON_displaySimu.C:46
 MUON_displaySimu.C:47
 MUON_displaySimu.C:48
 MUON_displaySimu.C:49
 MUON_displaySimu.C:50
 MUON_displaySimu.C:51
 MUON_displaySimu.C:52
 MUON_displaySimu.C:53
 MUON_displaySimu.C:54
 MUON_displaySimu.C:55
 MUON_displaySimu.C:56
 MUON_displaySimu.C:57
 MUON_displaySimu.C:58
 MUON_displaySimu.C:59
 MUON_displaySimu.C:60
 MUON_displaySimu.C:61
 MUON_displaySimu.C:62
 MUON_displaySimu.C:63
 MUON_displaySimu.C:64
 MUON_displaySimu.C:65
 MUON_displaySimu.C:66
 MUON_displaySimu.C:67
 MUON_displaySimu.C:68
 MUON_displaySimu.C:69
 MUON_displaySimu.C:70
 MUON_displaySimu.C:71
 MUON_displaySimu.C:72
 MUON_displaySimu.C:73
 MUON_displaySimu.C:74
 MUON_displaySimu.C:75
 MUON_displaySimu.C:76
 MUON_displaySimu.C:77
 MUON_displaySimu.C:78
 MUON_displaySimu.C:79
 MUON_displaySimu.C:80
 MUON_displaySimu.C:81
 MUON_displaySimu.C:82
 MUON_displaySimu.C:83
 MUON_displaySimu.C:84
 MUON_displaySimu.C:85
 MUON_displaySimu.C:86
 MUON_displaySimu.C:87
 MUON_displaySimu.C:88
 MUON_displaySimu.C:89
 MUON_displaySimu.C:90
 MUON_displaySimu.C:91
 MUON_displaySimu.C:92
 MUON_displaySimu.C:93
 MUON_displaySimu.C:94
 MUON_displaySimu.C:95
 MUON_displaySimu.C:96
 MUON_displaySimu.C:97
 MUON_displaySimu.C:98
 MUON_displaySimu.C:99
 MUON_displaySimu.C:100
 MUON_displaySimu.C:101
 MUON_displaySimu.C:102
 MUON_displaySimu.C:103
 MUON_displaySimu.C:104
 MUON_displaySimu.C:105
 MUON_displaySimu.C:106
 MUON_displaySimu.C:107
 MUON_displaySimu.C:108
 MUON_displaySimu.C:109
 MUON_displaySimu.C:110
 MUON_displaySimu.C:111
 MUON_displaySimu.C:112
 MUON_displaySimu.C:113
 MUON_displaySimu.C:114
 MUON_displaySimu.C:115
 MUON_displaySimu.C:116
 MUON_displaySimu.C:117
 MUON_displaySimu.C:118
 MUON_displaySimu.C:119
 MUON_displaySimu.C:120
 MUON_displaySimu.C:121
 MUON_displaySimu.C:122
 MUON_displaySimu.C:123
 MUON_displaySimu.C:124
 MUON_displaySimu.C:125
 MUON_displaySimu.C:126
 MUON_displaySimu.C:127
 MUON_displaySimu.C:128
 MUON_displaySimu.C:129
 MUON_displaySimu.C:130
 MUON_displaySimu.C:131
 MUON_displaySimu.C:132
 MUON_displaySimu.C:133
 MUON_displaySimu.C:134
 MUON_displaySimu.C:135
 MUON_displaySimu.C:136
 MUON_displaySimu.C:137
 MUON_displaySimu.C:138
 MUON_displaySimu.C:139
 MUON_displaySimu.C:140
 MUON_displaySimu.C:141
 MUON_displaySimu.C:142
 MUON_displaySimu.C:143
 MUON_displaySimu.C:144
 MUON_displaySimu.C:145
 MUON_displaySimu.C:146
 MUON_displaySimu.C:147
 MUON_displaySimu.C:148
 MUON_displaySimu.C:149
 MUON_displaySimu.C:150
 MUON_displaySimu.C:151
 MUON_displaySimu.C:152
 MUON_displaySimu.C:153
 MUON_displaySimu.C:154
 MUON_displaySimu.C:155
 MUON_displaySimu.C:156
 MUON_displaySimu.C:157
 MUON_displaySimu.C:158
 MUON_displaySimu.C:159
 MUON_displaySimu.C:160
 MUON_displaySimu.C:161
 MUON_displaySimu.C:162
 MUON_displaySimu.C:163
 MUON_displaySimu.C:164
 MUON_displaySimu.C:165
 MUON_displaySimu.C:166
 MUON_displaySimu.C:167
 MUON_displaySimu.C:168
 MUON_displaySimu.C:169
 MUON_displaySimu.C:170
 MUON_displaySimu.C:171
 MUON_displaySimu.C:172
 MUON_displaySimu.C:173
 MUON_displaySimu.C:174
 MUON_displaySimu.C:175
 MUON_displaySimu.C:176
 MUON_displaySimu.C:177
 MUON_displaySimu.C:178
 MUON_displaySimu.C:179
 MUON_displaySimu.C:180
 MUON_displaySimu.C:181
 MUON_displaySimu.C:182
 MUON_displaySimu.C:183
 MUON_displaySimu.C:184
 MUON_displaySimu.C:185
 MUON_displaySimu.C:186
 MUON_displaySimu.C:187
 MUON_displaySimu.C:188
 MUON_displaySimu.C:189
 MUON_displaySimu.C:190
 MUON_displaySimu.C:191
 MUON_displaySimu.C:192
 MUON_displaySimu.C:193
 MUON_displaySimu.C:194
 MUON_displaySimu.C:195
 MUON_displaySimu.C:196
 MUON_displaySimu.C:197
 MUON_displaySimu.C:198
 MUON_displaySimu.C:199
 MUON_displaySimu.C:200
 MUON_displaySimu.C:201
 MUON_displaySimu.C:202
 MUON_displaySimu.C:203
 MUON_displaySimu.C:204
 MUON_displaySimu.C:205
 MUON_displaySimu.C:206
 MUON_displaySimu.C:207
 MUON_displaySimu.C:208
 MUON_displaySimu.C:209
 MUON_displaySimu.C:210
 MUON_displaySimu.C:211
 MUON_displaySimu.C:212
 MUON_displaySimu.C:213
 MUON_displaySimu.C:214
 MUON_displaySimu.C:215
 MUON_displaySimu.C:216
 MUON_displaySimu.C:217
 MUON_displaySimu.C:218
 MUON_displaySimu.C:219
 MUON_displaySimu.C:220
 MUON_displaySimu.C:221
 MUON_displaySimu.C:222
 MUON_displaySimu.C:223
 MUON_displaySimu.C:224
 MUON_displaySimu.C:225
 MUON_displaySimu.C:226
 MUON_displaySimu.C:227
 MUON_displaySimu.C:228
 MUON_displaySimu.C:229
 MUON_displaySimu.C:230
 MUON_displaySimu.C:231
 MUON_displaySimu.C:232
 MUON_displaySimu.C:233
 MUON_displaySimu.C:234
 MUON_displaySimu.C:235
 MUON_displaySimu.C:236
 MUON_displaySimu.C:237
 MUON_displaySimu.C:238
 MUON_displaySimu.C:239
 MUON_displaySimu.C:240
 MUON_displaySimu.C:241
 MUON_displaySimu.C:242
 MUON_displaySimu.C:243
 MUON_displaySimu.C:244
 MUON_displaySimu.C:245
 MUON_displaySimu.C:246
 MUON_displaySimu.C:247
 MUON_displaySimu.C:248
 MUON_displaySimu.C:249
 MUON_displaySimu.C:250
 MUON_displaySimu.C:251
 MUON_displaySimu.C:252
 MUON_displaySimu.C:253
 MUON_displaySimu.C:254
 MUON_displaySimu.C:255
 MUON_displaySimu.C:256
 MUON_displaySimu.C:257
 MUON_displaySimu.C:258
 MUON_displaySimu.C:259
 MUON_displaySimu.C:260
 MUON_displaySimu.C:261
 MUON_displaySimu.C:262
 MUON_displaySimu.C:263
 MUON_displaySimu.C:264
 MUON_displaySimu.C:265
 MUON_displaySimu.C:266
 MUON_displaySimu.C:267
 MUON_displaySimu.C:268
 MUON_displaySimu.C:269
 MUON_displaySimu.C:270
 MUON_displaySimu.C:271
 MUON_displaySimu.C:272
 MUON_displaySimu.C:273
 MUON_displaySimu.C:274
 MUON_displaySimu.C:275