// Macro for running Panda simulation  with Geant3  or Geant4
// This macro is supposed to run the full simulation of the panda detector
// to run the macro:
//
// root -l -b -q tut_sim.C 
//
// to run with different options:(e.g more events, different momentum, Geant4)
//
// root -l -b -q 'tut_sim.C(1000,"mydata","mydecay.dec",10.0,"TGeant4")'

//void tut_sim(Int_t nEvents = 100,  TString prefix = "signal", TString inputGenerator="pp_jpsi2pi_jpsi_mumu.dec", Double_t BeamMomentum = 6.231552, TString  SimEngine ="TGeant3")
void tut_sim_my(Int_t nEvents = 100,  TString prefix = "signal", TString inputGenerator="fort.16", Double_t BeamMomentum = 15.0, TString  SimEngine ="TGeant3") //*

{
  // TString inputGenerator = 
  // EvtGen -> "xxxxxxxx.dec" (parses dec-file for initial particle) or "xxxxxxx.dec:initial_particle"
  // DPM    -> "dpm_xxxxx"
  // FTF    -> "ftf_xxxxx"
  // BOX    -> "box:type(pdgcode,mult):p(min,max):tht(min,max):phi(min,max)"

  //----- Other parameter examples for inputGenerator -----------------------
  // inputGenerator = "dpm";
  // inputGenerator = "ftf";
  // inputGenerator = "box:type(211,1):p(1,1):tht(10,120):phi(0,360)";

  gSystem->Load("libPGen");     //*
  inputGenerator = "pythiaGen";   //*

  //-----User Settings:------------------------------------------------------
  TString parAsciiFile   = "all.par";      // the standard param. file
   
  //-------------------------------------------------------------------------
  // -----   Create the Simulation run manager ------------------------------
  PndMasterRunSim *fRun = new PndMasterRunSim();
  fRun->SetInput(inputGenerator);
  fRun->SetName(SimEngine);
  fRun->SetParamAsciiFile(parAsciiFile);
  fRun->SetNumberOfEvents(nEvents);
  fRun->SetBeamMom(BeamMomentum);
  // -----  Initialization   ------------------------------------------------
  fRun->Setup(prefix);
  // -----   Geometry   -----------------------------------------------------
  fRun->CreateGeometry();
  // -----   Event generator   ----------------------------------------------
  fRun->SetGenerator();

  // -----   Event filter setup   -------------------------------------------
  FairFilteredPrimaryGenerator *primGen = fRun->GetFilteredPrimaryGenerator();
  primGen->SetVerbose(0);
  
//  FairPrimaryGenerator* primGen = new FairPrimaryGenerator();
//  fRun->SetGenerator(primGen);

  
  PndPythia6Generator* pythiaGen = new PndPythia6Generator("fort.16"); 
  primGen->AddGenerator(pythiaGen);
  
  // ---- Example configuration for the event filter ------------------------
  
  //FairEvtFilterOnSingleParticleCounts* chrgFilter = new FairEvtFilterOnSingleParticleCounts("chrgFilter");
  //chrgFilter->AndMinCharge(4, FairEvtFilter::kCharged);
  //primGen->AndFilter(chrgFilter);  

  // -----   Add tasks   ----------------------------------------------------
  fRun->AddSimTasks();
  // -----   Intialise and run   --------------------------------------------
  fRun->Init();
  fRun->Run(nEvents); 
  fRun->Finish();
}

