// Macro for running Fair with Geant3 or Geant4

void My_dvcs_full_run(TString base="test_3", int nEvents = 10 )
{

  TStopwatch timer;
  timer.Start();
  gDebug=0;


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


  FairRunSim *fRun = new FairRunSim();
  


  // set the MC version used
  // ------------------------
  fRun->SetName("TGeant3");



  // ----------------------------------------------------------------------
  // Set of input file directory
  base="/home/donghee/GSI/pandaroot/macro/dvcs/hepevt/"+base;  

  // Input file (Ascii)
  TString inFile =  base+".txt";
  // Output file (MC events)
  TString outFile = base+".full.mc.root";
  //Parameter file
  TString parFile = base+".full.param.root";

  
  fRun->SetOutputFile(outFile);





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

  fRun->SetMaterials("media_pnd.geo");
  
  // Create and add detectors
  //-------------------------
  
  FairModule *Cave= new PndCave("CAVE");
  Cave->SetGeometryFileName("pndcave.geo");
  fRun->AddModule(Cave); 
  
  FairModule *Magnet= new PndMagnet("MAGNET");
  Magnet->SetGeometryFileName("FullSolenoid.root");
  fRun->AddModule(Magnet);

  FairModule *Dipole= new PndMagnet("MAGNET");
  Dipole->SetGeometryFileName("dipole.geo");
  fRun->AddModule(Dipole);
 
  FairModule *Pipe= new PndPipe("PIPE");
  fRun->AddModule(Pipe);

  FairDetector *Tpc = new PndTpcDetector("TPC", kTRUE);
  Tpc->SetGeometryFileName("tpc.geo");
  fRun->AddModule(Tpc);

  FairDetector *Mvd = new PndMvdDetector("MVD", kTRUE);
  Mvd->SetGeometryFileName("MVD_v1.0_woPassiveTraps.root");
  fRun->AddModule(Mvd);
  
  PndEmc *Emc = new PndEmc("EMC",kTRUE);
  Emc->SetGeometryFileNameDouble("emc_module1245.dat","emc_module3new.root");
  fRun->AddModule(Emc);   
  
  FairDetector *Tof = new PndTof("TOF",kTRUE);
  Tof->SetGeometryFileName("tofbarrel.geo");
  fRun->AddModule(Tof);
 
  PndMdt *Muo = new PndMdt("MDT",kTRUE);
  Muo->SetMdtVersion("torino");
  Muo->SetGeometryFileName("muopars.root");
  fRun->AddModule(Muo);
 
  //PndDrc *Drc = new PndDrc("DIRC", kTRUE);
  //Drc->SetRunCherenkov(kFALSE); // for fast sim Cherenkov -> kFALSE
  //fRun->AddModule(Drc); 
  
  FairDetector *Dch = new PndDchDetector("DCH", kTRUE);
  Dch->SetGeometryFileName("dch.root"); //don't use this, is not working!
  //Dch->SetGeometryFileName("dch.geo"); //Geometry file in the directory of /pandaroot/geometry
  Dch->SetVerboseLevel(1);
  fRun->AddModule(Dch);
  
  FairDetector *Gem = new PndGemDetector("GEM", kTRUE);
  Gem->SetGeometryFileName("gem_4Stations.root");
  //Gem->SetGeometryFileName("gem.root");//don't exsit!
  Gem->SetVerboseLevel(0);//verboseLevel
  fRun->AddModule(Gem);
  //PndGemSmearingTask* mvdirec = new PndGemSmearingTask(0.1,0.1,0.05);
  //mvdirec->SetVerbose(0);
  //fRun->AddTask(mvdirec);


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

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

  PndPythiaGenerator* pygen=new PndPythiaGenerator(inFile.Data());
  primGen->AddGenerator(pygen); 



  fRun->SetStoreTraj(kTRUE);
  
  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);
  
  fRun->SetField(fField);
  
  fRun->Init();
  
  FairRuntimeDb *rtdb=fRun->GetRuntimeDb();
  Bool_t kParameterMerged=kTRUE;
     
  PndMultiFieldPar* Par = (PndMultiFieldPar*) rtdb->getContainer("PndMultiFieldPar");
  if (fField) {  Par->SetParameters(fField); }
  Par->setInputVersion(fRun->GetRunId(),1);
  Par->setChanged();

  FairParRootFileIo* output=new FairParRootFileIo(kParameterMerged);
  output->open(parFile.Data());
  rtdb->setOutput(output);
  rtdb->saveOutput();
  rtdb->print();

  fRun->Run(nEvents);
   
  timer.Stop();
   
  Double_t rtime = timer.RealTime();
  Double_t ctime = timer.CpuTime();
  printf("RealTime=%f seconds, CpuTime=%f seconds\n",rtime,ctime);
   
  cout << " Test passed" << endl;
  cout << " All ok " << endl;
  //exit(0);
 
 
 
 
}  
  
