ROOT logo
// @(#)root/g4root:$Id: TG4RootNavMgr.cxx 20882 2007-11-19 11:31:26Z rdm $
// Author: Andrei Gheata   07/08/06

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TG4RootNavMgr                                                        //
//                                                                      //
// Manager class creating a G4Navigator based on a ROOT geometry.       //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TGeoManager.h"
#include "TG4RootNavigator.h"
#include "TG4RootDetectorConstruction.h"
#include "TG4RootNavMgr.h"

#include "G4RunManager.hh"
#include "G4TransportationManager.hh"
#include "G4PropagatorInField.hh"

ClassImp(TG4RootNavMgr)

TG4RootNavMgr *TG4RootNavMgr::fRootNavMgr = 0;

//______________________________________________________________________________
TG4RootNavMgr::TG4RootNavMgr()
              :TObject(),
               fGeometry(0),
               fNavigator(0),
               fDetConstruction(0),
               fConnected(kFALSE)
{
// Dummy ctor.
}

//______________________________________________________________________________
TG4RootNavMgr::TG4RootNavMgr(TGeoManager *geom)
              :TObject(),
               fGeometry(0),
               fNavigator(0),
               fDetConstruction(0),
               fConnected(kFALSE)
{
// Default ctor.
   fDetConstruction = new TG4RootDetectorConstruction(geom);
   SetNavigator(new TG4RootNavigator);
}

//______________________________________________________________________________
TG4RootNavMgr::~TG4RootNavMgr()
{
// Destructor.
//   if (fNavigator) delete fNavigator;
   if (fDetConstruction) delete fDetConstruction;
   fRootNavMgr = 0;
}

//______________________________________________________________________________
TG4RootNavMgr *TG4RootNavMgr::GetInstance(TGeoManager *geom)
{
// Get the pointer to the singleton. If none, create one based on 'geom'.
   if (fRootNavMgr) return fRootNavMgr;
   // Check if we have to create one.
   if (!geom) return NULL;
   fRootNavMgr = new TG4RootNavMgr(geom);
   return fRootNavMgr;
}

//______________________________________________________________________________
Bool_t TG4RootNavMgr::ConnectToG4()
{
// Connect detector construction class to G4 run manager.
   if (fConnected) {
      Info("ConnectToG4", "Already connected");
      return kTRUE;
   }   
   if (!fDetConstruction) {
      Error("ConnectToG4", "No detector construction set !");
      return kFALSE;
   }   
   
   if (!fNavigator) {
      Error("ConnectToG4", "Navigator has to be created befor connecting to G4 !!!");
      return kFALSE;
   }   

   G4RunManager *runManager = G4RunManager::GetRunManager();
   if (!runManager) {
      Error("ConnectToG4", "Unable to connect: G4RunManager not instantiated");
      return kFALSE;
   }
   runManager->SetUserInitialization(fDetConstruction);
   Info("ConnectToG4", "ROOT detector construction class connected to G4RunManager");
   fConnected = kTRUE;
   return kTRUE;
}   

//______________________________________________________________________________
void TG4RootNavMgr::SetNavigator(TG4RootNavigator *nav)
{
// Connect a navigator to G4.
   if (fConnected) {
      Error("SetNavigator", "Navigator set after instantiation of G4RunManager. Won't set!!!");
      return;
   }   
   G4TransportationManager *trMgr = G4TransportationManager::GetTransportationManager();
//   G4Navigator *oldNav = trMgr->GetNavigatorForTracking();
   trMgr->SetNavigatorForTracking(nav);
   G4FieldManager *fieldMgr = trMgr->GetPropagatorInField()->GetCurrentFieldManager();
   delete trMgr->GetPropagatorInField();
   trMgr->SetPropagatorInField(new G4PropagatorInField(nav, fieldMgr));
   trMgr->ActivateNavigator(nav);
   fNavigator = nav;
//   trMgr->DeRegisterNavigator(oldNav);
   Info("SetNavigator", "TG4RootNavigator created and registered to G4TransportationManager");
}

//______________________________________________________________________________
void TG4RootNavMgr::Initialize(TVirtualUserPostDetConstruction *sdinit)
{
// Construct G4 geometry based on TGeo geometry. 
   Info("Initialize", "Creating G4 hierarchy ...");
   if (fDetConstruction) fDetConstruction->Initialize(sdinit);
}

//______________________________________________________________________________
void TG4RootNavMgr::LocateGlobalPointAndSetup(Double_t *pt, Double_t *dir)
{
// Test the corresponding navigation method.
   G4ThreeVector point(pt[0], pt[1], pt[2]);
   G4VPhysicalVolume *pVol = 0;
   if (dir) {
      G4ThreeVector direction(dir[0], dir[1], dir[2]);
      pVol = fNavigator->LocateGlobalPointAndSetup(point, &direction);
   } else {
      pVol = fNavigator->LocateGlobalPointAndSetup(point);
   }
   fNavigator->PrintState();
}   

//______________________________________________________________________________
void TG4RootNavMgr::SetVerboseLevel(Int_t level)
{
// Set navigator verbosity level.
   fNavigator->SetVerboseLevel(level);
}

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