// @(#)root/vmc:$Id$
// Authors: Ivana Hrivnacova, Rene Brun , Federico Carminati 13/04/2002

/*************************************************************************
 * Copyright (C) 2006, Rene Brun and Fons Rademakers.                    *
 * Copyright (C) 2002, ALICE Experiment at CERN.                         *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "TVirtualMC.h"

//______________________________________________________________________________
//   Virtual MC provides a virtual interface to Monte Carlo.
//   It enables the user to build a virtual Monte Carlo application
//   independent of any actual underlying Monte Carlo implementation itself.
//
//   A user will have to implement a class derived from the abstract
//   Monte Carlo application class, and provide functions like
//   ConstructGeometry(), BeginEvent(), FinishEvent(), ... .
//   The concrete Monte Carlo (Geant3, Geant4) is selected at run time -
//   when processing a ROOT macro where the concrete Monte Carlo is instantiated.
//______________________________________________________________________________

ClassImp(TVirtualMC)

TMCThreadLocal TVirtualMC* TVirtualMC::fgMC=0;

//_____________________________________________________________________________
TVirtualMC::TVirtualMC(const char *name, const char *title,
                       Bool_t /*isRootGeometrySupported*/)
  : TNamed(name,title),
    fApplication(0),
    fStack(0),
    fDecayer(0),
    fRandom(0),
    fMagField(0)
{
   //
   // Standard constructor
   //
   if(fgMC) {
      Warning("TVirtualMC","Cannot initialise twice MonteCarlo class");
   } else {
      fgMC=this;

      fApplication = TVirtualMCApplication::Instance();

      if (!fApplication) {
         Error("TVirtualMC", "No user MC application is defined.");
      }

      fRandom = gRandom;
   }
}

//_____________________________________________________________________________
TVirtualMC::TVirtualMC()
  : TNamed(),
    fApplication(0),
    fStack(0),
    fDecayer(0),
    fRandom(0),
    fMagField(0)
{
   //
   // Default constructor
   //
}

//_____________________________________________________________________________
TVirtualMC::~TVirtualMC()
{
   //
   // Destructor
   //
   fgMC=0;
}

//
// methods
//

//_____________________________________________________________________________
TVirtualMC *TVirtualMC::GetMC()
{
   //static: return virtual MC object
   return fgMC;
}

//_____________________________________________________________________________
void TVirtualMC::SetStack(TVirtualMCStack* stack)
{
//
// Set particles stack.
//

   fStack = stack;
}

//_____________________________________________________________________________
void TVirtualMC::SetExternalDecayer(TVirtualMCDecayer* decayer)
{
//
// Set external decayer.
//

   fDecayer = decayer;
}

//_____________________________________________________________________________
void TVirtualMC::SetRandom(TRandom* random)
{
//
// Set random number generator.
//
   gRandom = random;
   fRandom = random;
}

//_____________________________________________________________________________
void TVirtualMC::SetMagField(TVirtualMagField* field)
{
//
// Set magnetic field.
//
   fMagField = field;
}
 TVirtualMC.cxx:1
 TVirtualMC.cxx:2
 TVirtualMC.cxx:3
 TVirtualMC.cxx:4
 TVirtualMC.cxx:5
 TVirtualMC.cxx:6
 TVirtualMC.cxx:7
 TVirtualMC.cxx:8
 TVirtualMC.cxx:9
 TVirtualMC.cxx:10
 TVirtualMC.cxx:11
 TVirtualMC.cxx:12
 TVirtualMC.cxx:13
 TVirtualMC.cxx:14
 TVirtualMC.cxx:15
 TVirtualMC.cxx:16
 TVirtualMC.cxx:17
 TVirtualMC.cxx:18
 TVirtualMC.cxx:19
 TVirtualMC.cxx:20
 TVirtualMC.cxx:21
 TVirtualMC.cxx:22
 TVirtualMC.cxx:23
 TVirtualMC.cxx:24
 TVirtualMC.cxx:25
 TVirtualMC.cxx:26
 TVirtualMC.cxx:27
 TVirtualMC.cxx:28
 TVirtualMC.cxx:29
 TVirtualMC.cxx:30
 TVirtualMC.cxx:31
 TVirtualMC.cxx:32
 TVirtualMC.cxx:33
 TVirtualMC.cxx:34
 TVirtualMC.cxx:35
 TVirtualMC.cxx:36
 TVirtualMC.cxx:37
 TVirtualMC.cxx:38
 TVirtualMC.cxx:39
 TVirtualMC.cxx:40
 TVirtualMC.cxx:41
 TVirtualMC.cxx:42
 TVirtualMC.cxx:43
 TVirtualMC.cxx:44
 TVirtualMC.cxx:45
 TVirtualMC.cxx:46
 TVirtualMC.cxx:47
 TVirtualMC.cxx:48
 TVirtualMC.cxx:49
 TVirtualMC.cxx:50
 TVirtualMC.cxx:51
 TVirtualMC.cxx:52
 TVirtualMC.cxx:53
 TVirtualMC.cxx:54
 TVirtualMC.cxx:55
 TVirtualMC.cxx:56
 TVirtualMC.cxx:57
 TVirtualMC.cxx:58
 TVirtualMC.cxx:59
 TVirtualMC.cxx:60
 TVirtualMC.cxx:61
 TVirtualMC.cxx:62
 TVirtualMC.cxx:63
 TVirtualMC.cxx:64
 TVirtualMC.cxx:65
 TVirtualMC.cxx:66
 TVirtualMC.cxx:67
 TVirtualMC.cxx:68
 TVirtualMC.cxx:69
 TVirtualMC.cxx:70
 TVirtualMC.cxx:71
 TVirtualMC.cxx:72
 TVirtualMC.cxx:73
 TVirtualMC.cxx:74
 TVirtualMC.cxx:75
 TVirtualMC.cxx:76
 TVirtualMC.cxx:77
 TVirtualMC.cxx:78
 TVirtualMC.cxx:79
 TVirtualMC.cxx:80
 TVirtualMC.cxx:81
 TVirtualMC.cxx:82
 TVirtualMC.cxx:83
 TVirtualMC.cxx:84
 TVirtualMC.cxx:85
 TVirtualMC.cxx:86
 TVirtualMC.cxx:87
 TVirtualMC.cxx:88
 TVirtualMC.cxx:89
 TVirtualMC.cxx:90
 TVirtualMC.cxx:91
 TVirtualMC.cxx:92
 TVirtualMC.cxx:93
 TVirtualMC.cxx:94
 TVirtualMC.cxx:95
 TVirtualMC.cxx:96
 TVirtualMC.cxx:97
 TVirtualMC.cxx:98
 TVirtualMC.cxx:99
 TVirtualMC.cxx:100
 TVirtualMC.cxx:101
 TVirtualMC.cxx:102
 TVirtualMC.cxx:103
 TVirtualMC.cxx:104
 TVirtualMC.cxx:105
 TVirtualMC.cxx:106
 TVirtualMC.cxx:107
 TVirtualMC.cxx:108
 TVirtualMC.cxx:109
 TVirtualMC.cxx:110
 TVirtualMC.cxx:111
 TVirtualMC.cxx:112
 TVirtualMC.cxx:113
 TVirtualMC.cxx:114
 TVirtualMC.cxx:115
 TVirtualMC.cxx:116
 TVirtualMC.cxx:117
 TVirtualMC.cxx:118
 TVirtualMC.cxx:119
 TVirtualMC.cxx:120
 TVirtualMC.cxx:121
 TVirtualMC.cxx:122
 TVirtualMC.cxx:123
 TVirtualMC.cxx:124
 TVirtualMC.cxx:125
 TVirtualMC.cxx:126
 TVirtualMC.cxx:127
 TVirtualMC.cxx:128
 TVirtualMC.cxx:129
 TVirtualMC.cxx:130