ROOT logo
// $Id$
//
// Root macro that opens a mini GUI for running aliroot with Geant4.
//      
//  To run aliroot with Geant4 using the g4menu.C:
//  aliroot
//  root [0] .x g4menu.C
//  --> First select "Geometry" to build geometry.root file
//  --> Then re-run aliroot and select "Run" button
//	    
// The Init button is kept for debugging purposes,
// it itializes MonteCarlo but it does not itialize
// completely ALICE framework. That's why to run simulation,
// you have to re-run aliroot and select Run button.
//
// The menu enables to start Geant4 interactive session:
//  --> Select "Geant4UI" button and use Geant4 interactive commands;
// To go back to Root UI, type exit.
//
// By I. Hrivnacova, IPN Orsay


#include <iostream>

void g4menu()
{

  // Load Geant4 libraries 
  if (!gInterpreter->IsLoaded("$ALICE/geant4_vmc/examples/macro/g4libs.C"))
    gROOT->LoadMacro("$ALICE/geant4_vmc/examples/macro/g4libs.C");
  gInterpreter->ProcessLine("g4libs()");

  // Load ALICE Geant4 library
  //cout << "Loading g4alice library ..." << endl;
  //gSystem->Load("libg4alice");

  // Menu
  TControlBar* menu = new TControlBar("vertical","Alice Geant4 menu");
  
  menu->AddButton("Geometry", "MakeGeometry()",  "Generate Root geometry file");
  menu->AddButton("Run G4",   "RunG4Simulation()",  "Process Alice run");
  menu->AddButton("Run G4 batch",   "RunG4Simulation(); >& g4.out",  "Process Alice run");
  menu->AddButton("Run G3",   "RunG3Simulation()",  "Process Alice run");
  menu->AddButton("Run G3 batch",   "RunG3Simulation(); >& g3.out",  "Process Alice run");
  menu->AddButton("Init",     "Init();",  "Initialize Alice for G4 simulation");
  menu->AddButton("Init batch","Init(); >& g4init.out",  "Initialize Alice for G4 simulation");
  menu->AddButton("Geant4UI", "StartGeant4UI()","Go to Geant4 Interactive session");
  menu->AddButton("AGDD",     "GenerateAGDD()","Generate XML (AGDD) file with geometry description");
  //menu->AddButton("GDML",     "GenerateGDML()","Generate XML (GDML) file with geometry description");
  menu->AddButton("Quit",     "Quit()", "Quit aliroot");
  gROOT->SaveContext();
  
  cout << endl
       << "**************************************************************" << endl
       << "  To run simulation:"                                           << endl
       << "  First select <Geometry> to build geometry.root file."         << endl
       << "  Then re-run aliroot and select <Run> button"                  << endl
       << endl
       << "  The <Init> button is kept for debugging purposes,"            << endl
       << "  it itializes MonteCarlo but it does not itialize"             << endl
       << "  completely ALICE framework. That's why to run simulation,"    << endl
       << "  you have to re-run aliroot and select Run button."            << endl
       << endl
       << "  The menu enables to start Geant4 interactive session:"        << endl
       << "  Select <Geant4UI> button and use Geant4 interactive commands" << endl
       << "  To go back to Root UI, type exit."                            << endl
       << "**************************************************************" << endl
       << endl;
  
  menu->Show();
}

void MakeGeometry()
{  
  AliCDBManager* man = AliCDBManager::Instance();
  man->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
  man->SetRun(1);

  // MC application initialization
  TString configFileName = "$ALICE_ROOT/macros/g4ConfigGeometry.C";
  gROOT->LoadMacro(configFileName.Data());
  gInterpreter->ProcessLine(gAlice->GetConfigFunction());
  gAlice->GetMCApp()->Init();
  
  // Generate geometry file
  //
  gGeoManager->Export("geometry.root");
  
  cout << endl
       << "Geometry file geometry.root has been generated." << endl
       << "You have to re-run aliroot and choose Run in g4menu." << endl;
       
  exit(0);     
}    


void Init()
{  
  AliCDBManager* man = AliCDBManager::Instance();
  man->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
  man->SetRun(0);
 
  // MC application initialization
  TString configFileName = "$ALICE_ROOT/macros/g4Config.C";
  gROOT->LoadMacro(configFileName.Data());
  gInterpreter->ProcessLine(gAlice->GetConfigFunction());
  gAlice->GetMCApp()->Init();

  ((TGeant4*)gMC)->ProcessGeantCommand("/mcDet/printMedia");

  cout << endl
       << "Only MonteCarlo initialization has been performed. " << endl
       << "To run simulation you have to re-run aliroot and choose Run in g4menu." << endl;
}    


void RunG4Simulation()
{  
  AliSimulation sim("$ALICE_ROOT/macros/g4Config.C");
  sim.SetMakeSDigits("");
  sim.SetMakeDigits("");
  //sim.SetMakeDigitsFromHits("ITS TPC");
  //sim.SetMakeDigitsFromHits("ITS");
  sim.SetMakeDigitsFromHits("");
  sim.SetRunHLT("");
  sim.SetNumberOfEvents(1000);
  TStopwatch timer;
  timer.Start();
  sim.Run(1);
  timer.Stop();
  timer.Print();
}    

void RunG3Simulation()
{  
  AliSimulation sim("$ALICE_ROOT/macros/g3Config.C");
  sim.SetMakeSDigits("");
  sim.SetMakeDigits("");
  //sim.SetMakeDigitsFromHits("ITS TPC");
  //sim.SetMakeDigitsFromHits("ITS");
  sim.SetMakeDigitsFromHits("");
  sim.SetRunHLT("");
  sim.SetNumberOfEvents(1000);
  TStopwatch timer;
  timer.Start();
  sim.Run(1);
  timer.Stop();
  timer.Print();
}    

void StartGeant4UI()
{
  if (gMC) {
    // release Root terminal control

    // go into non-raw term mode
    Getlinem(kCleanUp, 0);
    
    // add test if gMC is TGeant4
    TGeant4* g4 = (TGeant4*)gMC;
  
    g4->StartGeantUI();

    // new Root prompt
    Getlinem(kInit, ((TRint*)gROOT->GetApplication())->GetPrompt());  
  }
  else {  
    cout << "Monte Carlo has not been yet created." << endl;
  }       
} 

void GenerateAGDD()
{
  if (gMC) {
    // release Root terminal control

    // go into non-raw term mode
    //Getlinem(kCleanUp, 0);
    
    // add test if gMC is TGeant4
    TGeant4* g4 = (TGeant4*)gMC;
    
    g4->ProcessGeantCommand("/vgm/generateAGDD");

    // new Root prompt
    //Getlinem(kInit, ((TRint*)gROOT->GetApplication())->GetPrompt());  
  }
  else {  
    cout << "Monte Carlo has not been yet created." << endl;
  } 
}        
/*
void GenerateGDML()
{
  if (gMC) {
    // release Root terminal control

    // go into non-raw term mode
    //Getlinem(kCleanUp, 0);
    
    // add test if gMC is TGeant4
    TGeant4* g4 = (TGeant4*)gMC;
    
    g4->ProcessGeantCommand("/vgm/generateGDML");

    // new Root prompt
    //Getlinem(kInit, ((TRint*)gROOT->GetApplication())->GetPrompt());  
  }
  else {  
    cout << "Monte Carlo has not been yet created." << endl;
  } 
}        
*/
void Quit()
{
  delete AliRunLoader::Instance();
  delete gAlice;
  
  exit(0);
}  
 g4menu.C:1
 g4menu.C:2
 g4menu.C:3
 g4menu.C:4
 g4menu.C:5
 g4menu.C:6
 g4menu.C:7
 g4menu.C:8
 g4menu.C:9
 g4menu.C:10
 g4menu.C:11
 g4menu.C:12
 g4menu.C:13
 g4menu.C:14
 g4menu.C:15
 g4menu.C:16
 g4menu.C:17
 g4menu.C:18
 g4menu.C:19
 g4menu.C:20
 g4menu.C:21
 g4menu.C:22
 g4menu.C:23
 g4menu.C:24
 g4menu.C:25
 g4menu.C:26
 g4menu.C:27
 g4menu.C:28
 g4menu.C:29
 g4menu.C:30
 g4menu.C:31
 g4menu.C:32
 g4menu.C:33
 g4menu.C:34
 g4menu.C:35
 g4menu.C:36
 g4menu.C:37
 g4menu.C:38
 g4menu.C:39
 g4menu.C:40
 g4menu.C:41
 g4menu.C:42
 g4menu.C:43
 g4menu.C:44
 g4menu.C:45
 g4menu.C:46
 g4menu.C:47
 g4menu.C:48
 g4menu.C:49
 g4menu.C:50
 g4menu.C:51
 g4menu.C:52
 g4menu.C:53
 g4menu.C:54
 g4menu.C:55
 g4menu.C:56
 g4menu.C:57
 g4menu.C:58
 g4menu.C:59
 g4menu.C:60
 g4menu.C:61
 g4menu.C:62
 g4menu.C:63
 g4menu.C:64
 g4menu.C:65
 g4menu.C:66
 g4menu.C:67
 g4menu.C:68
 g4menu.C:69
 g4menu.C:70
 g4menu.C:71
 g4menu.C:72
 g4menu.C:73
 g4menu.C:74
 g4menu.C:75
 g4menu.C:76
 g4menu.C:77
 g4menu.C:78
 g4menu.C:79
 g4menu.C:80
 g4menu.C:81
 g4menu.C:82
 g4menu.C:83
 g4menu.C:84
 g4menu.C:85
 g4menu.C:86
 g4menu.C:87
 g4menu.C:88
 g4menu.C:89
 g4menu.C:90
 g4menu.C:91
 g4menu.C:92
 g4menu.C:93
 g4menu.C:94
 g4menu.C:95
 g4menu.C:96
 g4menu.C:97
 g4menu.C:98
 g4menu.C:99
 g4menu.C:100
 g4menu.C:101
 g4menu.C:102
 g4menu.C:103
 g4menu.C:104
 g4menu.C:105
 g4menu.C:106
 g4menu.C:107
 g4menu.C:108
 g4menu.C:109
 g4menu.C:110
 g4menu.C:111
 g4menu.C:112
 g4menu.C:113
 g4menu.C:114
 g4menu.C:115
 g4menu.C:116
 g4menu.C:117
 g4menu.C:118
 g4menu.C:119
 g4menu.C:120
 g4menu.C:121
 g4menu.C:122
 g4menu.C:123
 g4menu.C:124
 g4menu.C:125
 g4menu.C:126
 g4menu.C:127
 g4menu.C:128
 g4menu.C:129
 g4menu.C:130
 g4menu.C:131
 g4menu.C:132
 g4menu.C:133
 g4menu.C:134
 g4menu.C:135
 g4menu.C:136
 g4menu.C:137
 g4menu.C:138
 g4menu.C:139
 g4menu.C:140
 g4menu.C:141
 g4menu.C:142
 g4menu.C:143
 g4menu.C:144
 g4menu.C:145
 g4menu.C:146
 g4menu.C:147
 g4menu.C:148
 g4menu.C:149
 g4menu.C:150
 g4menu.C:151
 g4menu.C:152
 g4menu.C:153
 g4menu.C:154
 g4menu.C:155
 g4menu.C:156
 g4menu.C:157
 g4menu.C:158
 g4menu.C:159
 g4menu.C:160
 g4menu.C:161
 g4menu.C:162
 g4menu.C:163
 g4menu.C:164
 g4menu.C:165
 g4menu.C:166
 g4menu.C:167
 g4menu.C:168
 g4menu.C:169
 g4menu.C:170
 g4menu.C:171
 g4menu.C:172
 g4menu.C:173
 g4menu.C:174
 g4menu.C:175
 g4menu.C:176
 g4menu.C:177
 g4menu.C:178
 g4menu.C:179
 g4menu.C:180
 g4menu.C:181
 g4menu.C:182
 g4menu.C:183
 g4menu.C:184
 g4menu.C:185
 g4menu.C:186
 g4menu.C:187
 g4menu.C:188
 g4menu.C:189
 g4menu.C:190
 g4menu.C:191
 g4menu.C:192
 g4menu.C:193
 g4menu.C:194
 g4menu.C:195
 g4menu.C:196
 g4menu.C:197
 g4menu.C:198
 g4menu.C:199
 g4menu.C:200
 g4menu.C:201
 g4menu.C:202
 g4menu.C:203
 g4menu.C:204
 g4menu.C:205
 g4menu.C:206
 g4menu.C:207
 g4menu.C:208
 g4menu.C:209
 g4menu.C:210
 g4menu.C:211
 g4menu.C:212
 g4menu.C:213
 g4menu.C:214
 g4menu.C:215
 g4menu.C:216
 g4menu.C:217
 g4menu.C:218
 g4menu.C:219
 g4menu.C:220
 g4menu.C:221