Skip to content
Snippets Groups Projects
initAClick.C 3.37 KiB
Newer Older
Markus Frank's avatar
Markus Frank committed
//==========================================================================
Markus Frank's avatar
Markus Frank committed
//  AIDA Detector description implementation 
Markus Frank's avatar
Markus Frank committed
//--------------------------------------------------------------------------
// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
// All rights reserved.
//
// For the licensing terms see $DD4hepINSTALL/LICENSE.
// For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
//
// Author     : M.Frank
//
//==========================================================================

// ROOT include files
#include "TInterpreter.h"
#include "TSystem.h"
#include "RVersion.h"
Markus Frank's avatar
Markus Frank committed

// C/C++ include files
#include <iostream>
#include <string>

Markus Frank's avatar
Markus Frank committed
std::string make_str(const char* data)  {
  if ( !data )   {
Markus Frank's avatar
Markus Frank committed
    std::cout << "make_str:  '" << (data ? data : "Bad-Pointer") << "'" << std::endl;
    return std::string("");
Markus Frank's avatar
Markus Frank committed
  return std::string(data);
Markus Frank's avatar
Markus Frank committed
/// Process a single command in the ROOT interpreter
Markus Frank's avatar
Markus Frank committed
int processCommand(const char* command, bool end_process)   {
  int status;
  // Disabling auto-parse is a hack required by a bug in ROOT
Markus Frank's avatar
Markus Frank committed
#if ROOT_VERSION_CODE >= ROOT_VERSION(6,0,0)
Markus Frank's avatar
Markus Frank committed
  gInterpreter->SetClassAutoparsing(false);
  status = gInterpreter->ProcessLine(command);
  gInterpreter->SetClassAutoparsing(true);
Markus Frank's avatar
Markus Frank committed
#else
  status = gInterpreter->ProcessLine(command);
#endif
Markus Frank's avatar
Markus Frank committed
  ::printf("+++ Status(%s) = %d\n",command,status);
  if ( end_process )  {
    gInterpreter->ProcessLine("gSystem->Exit(0)");
  }
Markus Frank's avatar
Markus Frank committed
  return status;
}

Markus Frank's avatar
Markus Frank committed
/// Process a ROOT AClick given a file
Markus Frank's avatar
Markus Frank committed
int processMacro(const char* macro, bool end_process)   {
Markus Frank's avatar
Markus Frank committed
  std::string cmd = ".X ";
Markus Frank's avatar
Markus Frank committed
  cmd += macro;
  cmd += ".C+()";
  return processCommand(cmd.c_str(), end_process);
Markus Frank's avatar
Markus Frank committed
/// Initialize the ROOT environment to compile and execute a ROOT AClick
int initAClick(const char* command=0)  {
Markus Frank's avatar
Markus Frank committed
  std::string rootsys = make_str(gSystem->Getenv("ROOTSYS"));
  std::string geant4  = make_str(gSystem->Getenv("G4INSTALL"));
Markus Frank's avatar
Markus Frank committed
  std::string dd4hep  = make_str(gSystem->Getenv("DD4hepINSTALL"));
  std::string clhep   = make_str(gSystem->Getenv("CLHEP_ROOT_DIR"));
  std::string libs    = " -L"+rootsys+"/lib";
  std::string inc     = " -I"+dd4hep+"/examples/DDG4/examples -I"+dd4hep + " -I"+dd4hep+"/include";
  if ( !geant4.empty() )  {
    inc  += " -I"+geant4+"/include/Geant4";
#ifdef __APPLE__
    libs += (" -L"+geant4+"/lib");
Marko Petric's avatar
Marko Petric committed
    libs += (" -L"+geant4+"/lib -L"+geant4+"/lib64");
  }
  if ( !clhep.empty() )  {
    // A bit unclear how to deal with CLHEP libraries here, 
    // if CLHEP is not included in Geant4...
    inc += " -I"+clhep+"/include";
    std::string clhep_lib = make_str(gSystem->Getenv("CLHEP_LIBRARY_PATH"));
    if ( !clhep_lib.empty() ) libs += " -L"+clhep_lib+"/lib";
  inc += " -Wno-shadow -g -O0" + defs;
#ifndef __APPLE__
  libs += " -lCore -lMathCore -pthread -lm -ldl -rdynamic";
  libs += " " +dd4hep+"/lib/libDD4hepGaudiPluginMgr.so";
  libs += " " +dd4hep+"/lib/libDDCore.so";
  libs += " " +dd4hep+"/lib/libDDG4.so";
  gSystem->Load("libDD4hepGaudiPluginMgr.so");
Markus Frank's avatar
Markus Frank committed
  gSystem->AddIncludePath(inc.c_str());
  gSystem->AddLinkedLibs(libs.c_str());
Markus Frank's avatar
Markus Frank committed
  std::cout << "+++ Includes:   " << gSystem->GetIncludePath() << std::endl;
  std::cout << "+++ Linked libs:" << gSystem->GetLinkedLibs()  << std::endl;
  int ret = 0;  // gSystem->Load("libDDG4Plugins");
  if ( 0 == ret )   {
    if ( command )  {
Markus Frank's avatar
Markus Frank committed
      processCommand(command, true);
  return ret;