// Macro for running Cbm  with Geant3  or Geant4 (M. Al-Turany , D. Bertini)
// Modified 22/06/2005 D.Bertini
{
  TStopwatch timer;
  timer.Start();
  gDebug=0;
  int verboseLevel = 0;
  Int_t nEvents = 500;
  
  //FileNames
  TString simOutput="MvdMC.root";
  TString parOutput="MvdParams.root";

  // Load basic libraries
  gROOT->LoadMacro("$VMCWORKDIR/gconfig/basiclibs.C");
  basiclibs();

  // Load this example libraries
  gSystem->Load("libGeoBase");
  gSystem->Load("libParBase");
  gSystem->Load("libBase");
  gSystem->Load("libMCStack");
  gSystem->Load("libField");
  gSystem->Load("libPassive");
  gSystem->Load("libGen");
  gSystem->Load("libPGen");
  gSystem->Load("libMvd");

  CbmRunSim *fRun = new CbmRunSim();

  // set the MC version used
  // ------------------------

  fRun->SetName("TGeant4");
  // Choose the Geant Navigation System
  // fRun->SetGeoModel("G3Native");

  fRun->SetOutputFile(simOutput);

  // Set Material file Name
  //-----------------------

  fRun->SetMaterials("media_pnd.geo");

  // Create and add detectors
  //-------------------------

  CbmModule *Cave= new CbmCave("CAVE");
  Cave->SetGeometryFileName("pndcave.geo");
  fRun->AddModule(Cave); 

  CbmModule *Magnet= new CbmMagnet("MAGNET");
  Magnet->SetGeometryFileName("magnet.geo");
  fRun->AddModule(Magnet);

  CbmModule *Pipe= new CbmPipe("PIPE");
  Pipe->SetGeometryFileName("pipebeamtarget.geo");
  fRun->AddModule(Pipe);

//  CbmDetector *Stt= new CbmStt("STT", kTRUE);
//  Stt->SetGeometryFileName("straws_axial.geo");
//  fRun->AddModule(Stt);

//  CbmDetector *Emc = new CbmEmc("EMC",kTRUE);
//  Emc->SetGeometryFileName("emc_module12345.dat"); 
//  fRun->AddModule(Emc);

//  CbmDetector *Drc = new CbmDrc("DIRC", kTRUE);
//  Drc->SetGeometryFileName("dirc.geo"); 
//  fRun->AddModule(Drc);

  CbmDetector *Mvd = new MvdDetector("MVD", kTRUE);
//  Mvd->SetGeometryFileName("MVD_Rev14b_Corr+Dead.geo");
  Mvd->SetGeometryFileName("MVD14.root");
  Mvd->SetVerboseLevel(verboseLevel);
  fRun->AddModule(Mvd);


 // Create and Set Event Generator
 //-------------------------------

  CbmPrimaryGenerator* primGen = new CbmPrimaryGenerator();
  fRun->SetGenerator(primGen);

 // Urqmd  Generator
 //    CbmUrqmdGenerator* urqmdGen = new CbmUrqmdGenerator("../../input/00-03fm.100ev.f14");
 //    primGen->AddGenerator(urqmdGen);

 // Particle Generator (pdgid,mult, px,py,pz, vx,vy,vz)
   //  CbmParticleGenerator* partGen = new CbmParticleGenerator(211,1,1,0,3,kTRUE);
   //  primGen->AddGenerator(partGen);

 // Ion Generator
 //    CbmIonGenerator *fIongen= new CbmIonGenerator(79, 197,79,1, 0.,0., 25, 0.,0.,-1.);
 //    primGen->AddGenerator(fIongen);

 // Box Generator
/*     PndBoxGenerator *fBox = new PndBoxGenerator(211, 10);
     fBox->SetPRange(1,10);
     fBox->SetThetaRange(0,180);
     fBox->SetYRange(-100,100);
     fBox->SetCosTheta();
     primGen->AddGenerator(fBox);
*/
 // DPM Generator
PndDpmGenerator* dpmGen = new PndDpmGenerator("/home/kph/stockman/fairroot/cbmroot/pandaroot/pgenerators/DpmEvtGen/Background-micro.root");
 primGen->AddGenerator(dpmGen);

//PndUrqmdSmmGenerator* UrqmdGen = new PndUrqmdSmmGenerator("/home/kph/stockman/fairroot/cbmsoft/pandaroot/pgenerators/pbarAu_4_05_GeV_1.root");
// primGen->AddGenerator(UrqmdGen);


 // Field Map Definition
 // --------------------

   PndMultiField *fField= new PndMultiField();

   PndTransMap *map= new PndTransMap("TransMap", "R");
   PndDipoleMap *map1= new PndDipoleMap("DipoleMap", "R");
   PndSolenoidMap *map2= new PndSolenoidMap("SolenoidMap", "R");
   fField->AddField(map);
   fField->AddField(map1);
   fField->AddField(map2);

    fField->Init();

   fRun->SetStoreTraj(kFALSE);


   fRun->Init();

 // -Trajectories Visualization (TGeoManager Only )
 // -----------------------------------------------


 // Set cuts for storing the trajectpries
  /* CbmTrajFilter* trajFilter = CbmTrajFilter::Instance();
     trajFilter->SetStepSizeCut(0.01); // 1 cm
     trajFilter->SetVertexCut(-2000., -2000., 4., 2000., 2000., 100.);
     trajFilter->SetMomentumCutP(10e-3); // p_lab > 10 MeV
     trajFilter->SetEnergyCut(0., 1.02); // 0 < Etot < 1.04 GeV
     trajFilter->SetStorePrimaries(kTRUE);
     trajFilter->SetStoreSecondaries(kTRUE);
   */

  // Fill the Parameter containers for this run
  //-------------------------------------------

  CbmRuntimeDb *rtdb=fRun->GetRuntimeDb();
  Bool_t kParameterMerged=kTRUE;
  CbmParRootFileIo* output=new CbmParRootFileIo(kParameterMerged);
  output->open(parOutput.Data());
  rtdb->setOutput(output);
  
  // Transport nEvents
  // -----------------

  fRun->Run(nEvents);

  rtdb->saveOutput();
  rtdb->print();


  timer.Stop();
  Double_t rtime = timer.RealTime();
  Double_t ctime = timer.CpuTime();
  printf("RealTime=%f seconds, CpuTime=%f seconds\n",rtime,ctime);
}

