ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

// $Id$
//
/// \ingroup macros
/// \file MUONGenerateGentleGeometry.C
/// \brief Macro for generating a simplified geometry used by the
///  event display alieve. The generated file gentle_geo_muon.root
///  must be placed in EVE/alice-data/. The input is the sensitive
///  volumes list file svmap.dat and the geometry file geometry.root
///
/// To be run from aliroot:
///
/// .x MUONGenerateGentleGeometry.C
///
///
/// \author: M. Tadel, CERN and B. Vulpescu LPC, Clermont-Ferrand

#if !defined(__CINT__) || defined(__MAKECINT__)

#include <TSystem.h>
#include <TEveManager.h>
#include <TEveGeoNode.h>
#include <TGeoManager.h>
#include <TGeoNode.h>
#include <TString.h>
#include <TObjArray.h>
#include <Riostream.h>

#endif

void AddNodes(TGeoNode *node, TEveGeoNode *parent, Int_t depth, Int_t depthmax,
              TObjArray *list);

void MUONGenerateGentleGeometry() {

  gSystem->Load("libGeom");

  TEveManager::Create();

  TGeoManager::Import("geometry.root");
  TGeoNode* tnode = gGeoManager->GetTopNode();
  TEveGeoTopNode* eve_tnode = new TEveGeoTopNode(gGeoManager, tnode);
  tnode->SetVisibility(kFALSE);
  eve_tnode->SetVisLevel(0);

  gEve->AddGlobalElement(eve_tnode);

  TString path;
  TObjArray *list;
  Int_t depth;

  Char_t line[256];
  ifstream in("data/svmap.dat", ios::in);

  while (!in.eof()) {
    
    in >> line;
    
    path = TString(line);
    if (!path.Contains("ALIC")) continue;

    list = path.Tokenize("/");
    depth = list->GetEntries();
    AddNodes(tnode,eve_tnode,depth,depth,list);
  }

  eve_tnode->SaveExtract("gentle_geo_muon.root", "Gentle MUON", kTRUE);

}

//_____________________________________________________________________________
void AddNodes(TGeoNode *node, TEveGeoNode *parent, Int_t depth, Int_t depthmax, 
              TObjArray *list)
{  
  if (--depth <= 0)
    return;
  
  TObjString *nname = (TObjString*)list->At(depthmax-depth);
  TString sname = nname->GetString();

  TObjArray *nlist = node->GetVolume()->GetNodes();
  if (nlist == 0x0) return;
  Int_t     nNodes = nlist->GetEntries();
 
 for (Int_t in = 0; in < nNodes; in++)
 {
    TGeoNode *node2 = (TGeoNode*) nlist->At(in);
    TEveGeoNode *son;
    if (strcmp(node2->GetName(),sname.Data()) == 0)
    {
      son = dynamic_cast<TEveGeoNode*>(parent->FindChild(nname->GetName()));
      if (!son)
      {
	son = new TEveGeoNode(node2);
	parent->AddElement(son);
      }
    } else {
      continue;
    }
    AddNodes(node2,son, depth, depthmax, list);
  }

}
 MUONGenerateGentleGeometry.C:1
 MUONGenerateGentleGeometry.C:2
 MUONGenerateGentleGeometry.C:3
 MUONGenerateGentleGeometry.C:4
 MUONGenerateGentleGeometry.C:5
 MUONGenerateGentleGeometry.C:6
 MUONGenerateGentleGeometry.C:7
 MUONGenerateGentleGeometry.C:8
 MUONGenerateGentleGeometry.C:9
 MUONGenerateGentleGeometry.C:10
 MUONGenerateGentleGeometry.C:11
 MUONGenerateGentleGeometry.C:12
 MUONGenerateGentleGeometry.C:13
 MUONGenerateGentleGeometry.C:14
 MUONGenerateGentleGeometry.C:15
 MUONGenerateGentleGeometry.C:16
 MUONGenerateGentleGeometry.C:17
 MUONGenerateGentleGeometry.C:18
 MUONGenerateGentleGeometry.C:19
 MUONGenerateGentleGeometry.C:20
 MUONGenerateGentleGeometry.C:21
 MUONGenerateGentleGeometry.C:22
 MUONGenerateGentleGeometry.C:23
 MUONGenerateGentleGeometry.C:24
 MUONGenerateGentleGeometry.C:25
 MUONGenerateGentleGeometry.C:26
 MUONGenerateGentleGeometry.C:27
 MUONGenerateGentleGeometry.C:28
 MUONGenerateGentleGeometry.C:29
 MUONGenerateGentleGeometry.C:30
 MUONGenerateGentleGeometry.C:31
 MUONGenerateGentleGeometry.C:32
 MUONGenerateGentleGeometry.C:33
 MUONGenerateGentleGeometry.C:34
 MUONGenerateGentleGeometry.C:35
 MUONGenerateGentleGeometry.C:36
 MUONGenerateGentleGeometry.C:37
 MUONGenerateGentleGeometry.C:38
 MUONGenerateGentleGeometry.C:39
 MUONGenerateGentleGeometry.C:40
 MUONGenerateGentleGeometry.C:41
 MUONGenerateGentleGeometry.C:42
 MUONGenerateGentleGeometry.C:43
 MUONGenerateGentleGeometry.C:44
 MUONGenerateGentleGeometry.C:45
 MUONGenerateGentleGeometry.C:46
 MUONGenerateGentleGeometry.C:47
 MUONGenerateGentleGeometry.C:48
 MUONGenerateGentleGeometry.C:49
 MUONGenerateGentleGeometry.C:50
 MUONGenerateGentleGeometry.C:51
 MUONGenerateGentleGeometry.C:52
 MUONGenerateGentleGeometry.C:53
 MUONGenerateGentleGeometry.C:54
 MUONGenerateGentleGeometry.C:55
 MUONGenerateGentleGeometry.C:56
 MUONGenerateGentleGeometry.C:57
 MUONGenerateGentleGeometry.C:58
 MUONGenerateGentleGeometry.C:59
 MUONGenerateGentleGeometry.C:60
 MUONGenerateGentleGeometry.C:61
 MUONGenerateGentleGeometry.C:62
 MUONGenerateGentleGeometry.C:63
 MUONGenerateGentleGeometry.C:64
 MUONGenerateGentleGeometry.C:65
 MUONGenerateGentleGeometry.C:66
 MUONGenerateGentleGeometry.C:67
 MUONGenerateGentleGeometry.C:68
 MUONGenerateGentleGeometry.C:69
 MUONGenerateGentleGeometry.C:70
 MUONGenerateGentleGeometry.C:71
 MUONGenerateGentleGeometry.C:72
 MUONGenerateGentleGeometry.C:73
 MUONGenerateGentleGeometry.C:74
 MUONGenerateGentleGeometry.C:75
 MUONGenerateGentleGeometry.C:76
 MUONGenerateGentleGeometry.C:77
 MUONGenerateGentleGeometry.C:78
 MUONGenerateGentleGeometry.C:79
 MUONGenerateGentleGeometry.C:80
 MUONGenerateGentleGeometry.C:81
 MUONGenerateGentleGeometry.C:82
 MUONGenerateGentleGeometry.C:83
 MUONGenerateGentleGeometry.C:84
 MUONGenerateGentleGeometry.C:85
 MUONGenerateGentleGeometry.C:86
 MUONGenerateGentleGeometry.C:87
 MUONGenerateGentleGeometry.C:88
 MUONGenerateGentleGeometry.C:89
 MUONGenerateGentleGeometry.C:90
 MUONGenerateGentleGeometry.C:91
 MUONGenerateGentleGeometry.C:92
 MUONGenerateGentleGeometry.C:93
 MUONGenerateGentleGeometry.C:94
 MUONGenerateGentleGeometry.C:95
 MUONGenerateGentleGeometry.C:96
 MUONGenerateGentleGeometry.C:97
 MUONGenerateGentleGeometry.C:98
 MUONGenerateGentleGeometry.C:99
 MUONGenerateGentleGeometry.C:100
 MUONGenerateGentleGeometry.C:101
 MUONGenerateGentleGeometry.C:102
 MUONGenerateGentleGeometry.C:103
 MUONGenerateGentleGeometry.C:104
 MUONGenerateGentleGeometry.C:105
 MUONGenerateGentleGeometry.C:106
 MUONGenerateGentleGeometry.C:107
 MUONGenerateGentleGeometry.C:108
 MUONGenerateGentleGeometry.C:109
 MUONGenerateGentleGeometry.C:110
 MUONGenerateGentleGeometry.C:111
 MUONGenerateGentleGeometry.C:112
 MUONGenerateGentleGeometry.C:113
 MUONGenerateGentleGeometry.C:114
 MUONGenerateGentleGeometry.C:115
 MUONGenerateGentleGeometry.C:116
 MUONGenerateGentleGeometry.C:117
 MUONGenerateGentleGeometry.C:118