Updated test script and added macros for running with Geant4.
authorivana <ivana@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 23 Mar 2010 09:53:14 +0000 (09:53 +0000)
committerivana <ivana@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 23 Mar 2010 09:53:14 +0000 (09:53 +0000)
MUON/AlirootRun_MUONtest.sh
MUON/commonConfig.C [new file with mode: 0644]
MUON/g3Config.C [new file with mode: 0644]
MUON/g4Config.C [new file with mode: 0644]
MUON/gen.C [new file with mode: 0644]
MUON/genExtFileConfig.C [new file with mode: 0644]
MUON/genTestConfig.C [new file with mode: 0644]

index ae3a376..3fbe7a7 100755 (executable)
@@ -12,7 +12,10 @@ NEVENTS=100 # will simulate 100 events
 
 #RECOPTIONS="SAVEDIGITS NOFASTDECODERS" # reconstruction options with non-high performance decoders
 RECOPTIONS="SAVEDIGITS" # default reconstruction options
-SIMCONFIG="$ALICE_ROOT/MUON/Config.C" # default simulation configuration file
+MC=""    # G3 Simulation with old Config.C 
+#MC="g3"  # G3 Simulation (with new config macros)
+#MC="g4"  # G4 Simulation (with new config macros)
+SIMCONFIG="$ALICE_ROOT/MUON/"$MC"Config.C"   # default simulation configuration file
 OUTDIR=""
 CURDIR=`pwd`
 
@@ -53,7 +56,11 @@ do
 done
 
 if [ ! -n "$OUTDIR" ]; then
-  OUTDIR="$CURDIR/test_out.$NEVENTS"
+  if [ "$MC" = "" ]; then
+    OUTDIR=$CURDIR"/test_out."$NEVENTS
+  else  
+    OUTDIR=$CURDIR"/"$MC"_test_out."$NEVENTS
+  fi  
 fi
 
 # look if there are some leftover options
@@ -166,7 +173,18 @@ if [ "$SIMULATION" -eq 1 ]; then
     cp $OUTDIR/*QA*.root $OUTDIR/*.log $OUTDIR/$SIMDIR
     cp $OUTDIR/MUON*.root $OUTDIR/Kinematics*.root $OUTDIR/galice.root $OUTDIR/TrackRefs*.root $OUTDIR/$SIMDIR
   fi
-  
+
+  # save geometry file in a separate directory
+  if [ "$MC" = "g3" ]; then
+    rm -fr $ALICE_ROOT/MUON/geometry
+    mkdir $ALICE_ROOT/MUON/geometry
+    cp $OUTDIR/geometry.root $ALICE_ROOT/MUON/geometry
+  fi 
+
+  # copy input geometry file in a current directory
+  if [ "$MC" = "g4" ]; then
+    cp $ALICE_ROOT/MUON/geometry/geometry.root $OUTDIR
+  fi 
 fi
 
 ###############################################################################
diff --git a/MUON/commonConfig.C b/MUON/commonConfig.C
new file mode 100644 (file)
index 0000000..088d174
--- /dev/null
@@ -0,0 +1,153 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+/* $Id$ */
+
+/// \ingroup macros
+/// \file commonConfig.C
+/// \brief Configuration macro 
+/// for MUON spectrometer Monte Carlo simulation
+
+enum PprTrigConf_t {
+    kDefaultPPTrig, kDefaultPbPbTrig
+};
+
+const char * pprTrigConfName[] = {
+    "p-p","Pb-Pb"
+};
+
+// Options 
+static AliMagF::BMap_t smag = AliMagF::k5kG;
+static PprTrigConf_t strig = kDefaultPPTrig; // default PP trigger configuration
+static TString comment;
+
+// Functions
+void  LoadPythia();
+
+void commonConfig(Bool_t setRootGeometry = kFALSE,
+                  const char* digitstore="AliMUONDigitStoreV2S")
+{
+  cout << "Running commonConfig.C ... " << endl;
+
+  //=======================================================================
+  // Load Pythia libraries
+  //=======================================================================
+
+  LoadPythia();
+
+  //=======================================================================
+  // ALICE steering object (AliRunLoader)
+  //=======================================================================
+
+  // Set Root geometry file
+  if ( setRootGeometry ) {
+    AliSimulation::Instance()->SetGeometryFile("$ALICE_ROOT/MUON/geometry/geometry.root");
+  }
+
+  AliRunLoader* rl 
+    = AliRunLoader::Open("galice.root",
+                         AliConfig::GetDefaultEventFolderName(),
+                         "recreate");
+  if ( ! rl ) {
+    gAlice->Fatal("Config.C","Can not instatiate the Run Loader");
+    return;
+  }
+  rl->SetCompressionLevel(2);
+  rl->SetNumberOfEventsPerFile(100);
+  gAlice->SetRunLoader(rl);
+  
+  //======================================================================
+  // Trigger configuration
+  //=======================================================================
+
+  gAlice->SetTriggerDescriptor(pprTrigConfName[strig]);
+  cout << "Trigger configuration is set to  " << pprTrigConfName[strig] << endl;
+
+  // ============================= 
+  // Magnetic field
+  // ============================= 
+
+  // Field (L3 0.5 T)
+  // Field (L3 0.5 T)
+  TGeoGlobalMagField::Instance()->SetField(new AliMagF("Maps","Maps", -1., -1, AliMagF::k5kG));
+  //============================================================= 
+  //=================== Alice BODY parameters =============================
+  AliBODY *BODY = new AliBODY("BODY","Alice envelop");
+  //=================== ABSO parameters ============================
+  AliABSO *ABSO = new AliABSOv3("ABSO", "Muon Absorber");
+  //=================== DIPO parameters ============================
+  AliDIPO *DIPO = new AliDIPOv3("DIPO", "Dipole version 2");
+  //================== HALL parameters ============================
+  AliHALL *HALL = new AliHALLv3("HALL", "Alice Hall");
+  //=================== PIPE parameters ============================
+  AliPIPE *PIPE = new AliPIPEv3("PIPE", "Beam Pipe");
+  //=================== SHIL parameters ============================
+  AliSHIL *SHIL = new AliSHILv3("SHIL", "Shielding Version 2");
+
+  //=================== MUON Subsystem ===========================
+  AliMUON *MUON = new AliMUONv1("MUON", "default");
+
+  // The 3 switches below are to be used for the trigger code
+  // their default value is set in AliMUON.h
+  // activate trigger cluster-size (0=default, 1=cluster-size according to AliMUONResponseTriggerV1
+  //  MUON->SetTriggerResponseV1(0);
+  // activate 4/4 trigger coincidence (0=default (coinc 3/4), 1=coinc 4/4)
+  //  MUON->SetTriggerCoinc44(0);
+  // activate trigger chamber efficiency by cells (0=default, 1=trigger efficiency according to AliMUONTriggerEfficiencyCells
+  //  MUON->SetTriggerEffCells(0);
+
+  // Use SetDigitStoreClassName() to change the digitStore implementation used by (s)digitizer
+  MUON->SetDigitStoreClassName(digitstore);
+  
+  cout << "MUON DigitStore is " << MUON->DigitStoreClassName().Data() << endl;
+  
+  // Noise-only digits in tracker/trigger (0=no noise, 1=default (noise in tracker), 2=noise in tracker and trigger):
+  //MUON->SetDigitizerWithNoise(kFALSE);
+
+  // Use non-high performance raw data decoder 
+  //MUON->SetFastTrackerDecoder(kFALSE);  
+  //MUON->SetFastTriggerDecoder(kFALSE);  
+  
+  //
+  // If SetAlign, the detection elements transformations
+  // are taken from the input file and not from the code
+  // MUON->SetAlign("transform.dat");
+
+  // To generate and read scaler trigger events in rawdata
+  // MUON->SetTriggerScalerEvent();
+  
+  // To switch off the tail effect
+  // MUON->SetTailEffect(kFALSE);
+
+  // If you want to play with builders, first reset the geometry builder,
+  // and then add yours.
+  //  MUON->ResetGeometryBuilder();
+  //  MUON->AddGeometryBuilder(new AliMUONSt1GeometryBuilderV2(MUON));
+  //  MUON->AddGeometryBuilder(new AliMUONSt2GeometryBuilderV2(MUON));
+  //  MUON->AddGeometryBuilder(new AliMUONSlatGeometryBuilder(MUON));
+  //  MUON->AddGeometryBuilder(new AliMUONTriggerGeometryBuilder(MUON));
+
+  cout << "Running commonConfig.C finished ... " << endl;
+}
+
+void LoadPythia()
+{
+  // Load Pythia related libraries
+  gSystem->Load("liblhapdf.so");      // Parton density functions
+  gSystem->Load("libEGPythia6.so");   // TGenerator interface
+  gSystem->Load("libpythia6.so");     // Pythia
+  gSystem->Load("libAliPythia6.so");  // ALICE specific implementations
+}
diff --git a/MUON/g3Config.C b/MUON/g3Config.C
new file mode 100644 (file)
index 0000000..5aeb2b1
--- /dev/null
@@ -0,0 +1,54 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+/* $Id$ */
+
+/// \ingroup macros
+/// \file g3Config.C
+/// \brief Configuration macro for MUON spectrometer Geant3 simulation
+
+void Config()
+{
+  cout << "Running g3Config.C ... " << endl;
+
+  // AliRoot setup
+  //
+  gROOT->LoadMacro("$ALICE_ROOT/MUON/commonConfig.C");
+  commonConfig(kFALSE);
+
+  // Load Geant3 + Geant3 VMC libraries
+  //
+#if defined(__CINT__)
+    gSystem->Load("libgeant321");
+#endif
+
+  // Create TGeant3
+  //  
+  new  TGeant3TGeo("C++ Interface to Geant3");
+
+  // AliRoot event generator
+  // (it has to be created after MC, as it may use decayer via VMC)
+  //
+  gROOT->LoadMacro("$ALICE_ROOT/MUON/genTestConfig.C");
+  genConfig();
+
+  // From external file
+  //
+  //gROOT->LoadMacro("$ALICE_ROOT/MUON/genExtFileConfig.C");
+  //genConfig();
+
+
+  cout << "Running g3Config.C finished ... " << endl;
+}  
diff --git a/MUON/g4Config.C b/MUON/g4Config.C
new file mode 100644 (file)
index 0000000..91f38ac
--- /dev/null
@@ -0,0 +1,111 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+/* $Id$ */
+
+/// \ingroup macros
+/// \file g4Config.C
+/// \brief Configuration macro for MUON spectrometer Geant4 simulation
+///
+/// \author I. Hrivnacova, IPN Orsay
+       
+void Config()
+{
+  cout << "Running g4Config.C ... " << endl;
+
+  // AliRoot setup
+  //
+  gROOT->LoadMacro("$ALICE_ROOT/MUON/commonConfig.C");
+  commonConfig(kTRUE);
+
+  // Load Geant4 + Geant4 VMC libraries
+  //
+  if (gClassTable->GetID("TGeant4") == -1) {
+    // 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()");
+    }
+  }    
+
+  // Create Geant4 VMC
+  //  
+  TGeant4 *geant4 = 0;
+  if ( ! gMC ) {
+    TG4RunConfiguration* runConfiguration 
+      = new TG4RunConfiguration("geomRoot", 
+                                "QGSP_BERT_EMV", 
+                                "specialCuts+stepLimiter",
+                                 true);
+
+    geant4 = new TGeant4("TGeant4", "The Geant4 Monte Carlo", runConfiguration);
+    cout << "Geant4 has been created." << endl;
+  } 
+  else {
+    cout << "Monte Carlo has been already created." << endl;
+  }  
+
+  // Customization of Geant4 VMC
+  //
+
+  geant4->ProcessGeantCommand("/mcPhysics/rangeCuts 0.01 mm"); 
+  geant4->ProcessGeantCommand("/mcVerbose/all 1");  
+  geant4->ProcessGeantCommand("/mcTracking/loopVerbose 0");     
+  geant4->ProcessGeantCommand("/mcTracking/skipNeutrino true");
+
+  // Uncomment these lines when running with G4 native navigation
+  // (geomRootToGeant4)
+  //geant4->ProcessGeantCommand("/vgm/setNameSeparator /");
+  //geant4->ProcessGeantCommand("/mcControl/accountAssemblies true");
+
+  // Uncomment this line to get a detail info from each step 
+  // geant4->ProcessGeantCommand("/tracking/verbose 1");  
+  
+  // More info from the physics list
+  // the verbosity level is passed to all contained physics lists and their
+  // physics builders
+  //geant4->ProcessGeantCommand("/mcVerbose/composedPhysicsList 2");  
+  
+  // More info from optical processes
+  //geant4->ProcessGeantCommand("/mcVerbose/opticalPhysicsList 3");  
+  
+  // More info from geometry building
+  //geant4->ProcessGeantCommand("/mcVerbose/geometryManager 2");  
+
+  // More info from setting geometry properties (in materials and surfaces)
+  // for optical physics
+  //geant4->ProcessGeantCommand("/mcVerbose/opGeometryManager 1");  
+  
+  // More info about regions construction 
+  // and conversion of VMC cuts in cuts in range per regions 
+  // geant4->ProcessGeantCommand("/mcVerbose/regionsManager 2");
+  
+  // Suppress verbose info from tracks which reached maximum number of steps
+  // (default value is 30000)  
+  //geant4->ProcessGeantCommand("/mcTracking/loopVerbose 0"); 
+    
+  // AliRoot event generator
+  // (it has to be created after MC, as it may use decayer via VMC)
+  //
+  gROOT->LoadMacro("$ALICE_ROOT/MUON/genTestConfig.C");
+  genConfig();
+
+  // From external file
+  //
+  //gROOT->LoadMacro("$ALICE_ROOT/MUON/genExtFileConfig.C");
+  //genConfig();
+
+  cout << "Running g4Config.C finished ... " << endl;
+}
diff --git a/MUON/gen.C b/MUON/gen.C
new file mode 100644 (file)
index 0000000..7854ddc
--- /dev/null
@@ -0,0 +1,128 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+/* $Id$ */
+
+/// \ingroup macros
+/// \file gen.C
+/// \brief Configuration macro for generation of kinematics tree which 
+/// can be then used as an external event generator.
+///
+/// According to: $ALICE_ROOT/test/genkine/gen/fastGen.C
+
+#if !defined(__CINT__) || defined(__MAKECINT__)
+#include <Riostream.h>
+#include <TH1F.h>
+#include <TStopwatch.h>
+#include <TDatime.h>
+#include <TRandom.h>
+#include <TDatabasePDG.h>
+#include <TParticle.h>
+#include <TArrayI.h>
+
+#include "AliGenerator.h"
+#include "AliPDG.h"
+#include "AliRunLoader.h"
+#include "AliRun.h"
+#include "AliStack.h"
+#include "AliHeader.h"
+#include "PYTHIA6/AliGenPythia.h"
+#include "PYTHIA6/AliPythia.h"
+#endif
+
+void gen(Int_t nev = 1, 
+         const char* genConfig = "$ALICE_ROOT/MUON/genTestConfig.C")
+{
+  // Load libraries
+  // gSystem->SetIncludePath("-I$ROOTSYS/include -I$ALICE_ROOT/include -I$ALICE_ROOT");
+  gSystem->Load("liblhapdf.so");      // Parton density functions
+  gSystem->Load("libEGPythia6.so");   // TGenerator interface
+  gSystem->Load("libpythia6.so");     // Pythia
+  gSystem->Load("libAliPythia6.so");  // ALICE specific implementations
+
+  AliPDG::AddParticlesToPdgDataBase();
+  TDatabasePDG::Instance();
+
+  // Run loader
+  AliRunLoader* rl = AliRunLoader::Open("galice.root","FASTRUN","recreate");
+  
+  rl->SetCompressionLevel(2);
+  rl->SetNumberOfEventsPerFile(nev);
+  rl->LoadKinematics("RECREATE");
+  rl->MakeTree("E");
+  gAlice->SetRunLoader(rl);
+  
+  //  Create stack
+  rl->MakeStack();
+  AliStack* stack = rl->Stack();
+  
+  //  Header
+  AliHeader* header = rl->GetHeader();
+  
+  //  Create and Initialize Generator
+  gROOT->LoadMacro(genConfig);
+  AliGenerator* gener = genConfig();
+
+  // Go to galice.root
+  rl->CdGAFile();
+
+  // Forbid some decays. Do it after gener->Init(0, because
+  // the initialization of the generator includes reading of the decay table.
+  // ...
+
+  //
+  // Event Loop
+  //
+  
+  TStopwatch timer;
+  timer.Start();
+  for (Int_t iev = 0; iev < nev; iev++) {
+    
+    cout <<"Event number "<< iev << endl;
+    
+    // Initialize event
+    header->Reset(0,iev);
+    rl->SetEventNumber(iev);
+    stack->Reset();
+    rl->MakeTree("K");
+    
+    // Generate event
+    stack->Reset();
+    stack->ConnectTree(rl->TreeK());
+    gener->Generate();
+    cout << "Number of particles " << stack->GetNprimary() << endl;
+    
+    // Finish event
+    header->SetNprimary(stack->GetNprimary());
+    header->SetNtrack(stack->GetNtrack());  
+    
+    // I/O
+    stack->FinishEvent();
+    header->SetStack(stack);
+    rl->TreeE()->Fill();
+    rl->WriteKinematics("OVERWRITE");
+    
+  } // event loop
+  timer.Stop();
+  timer.Print();
+  
+  //                         Termination
+  //  Generator
+  gener->FinishRun();
+  //  Write file
+  rl->WriteHeader("OVERWRITE");
+  gener->Write();
+  rl->Write();
+}
diff --git a/MUON/genExtFileConfig.C b/MUON/genExtFileConfig.C
new file mode 100644 (file)
index 0000000..16c37df
--- /dev/null
@@ -0,0 +1,104 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+/* $Id$ */
+
+/// \ingroup macros
+/// \file genExtFileConfig.C
+/// \brief Configuration macro for event generator from external file
+/// for MUON spectrometer Monte Carlo simulation
+
+// Functions
+Float_t EtaToTheta(Float_t arg);
+AliGenerator* GeneratorFactory();
+
+void genConfig()
+{
+  cout << "Running genExtFileConfig.C ... " << endl;
+
+  //=======================================================================
+  // ******* GEANT STEERING parameters FOR ALICE SIMULATION *******
+  if ( gMC ) {
+    gMC->SetProcess("DCAY",1);
+    gMC->SetProcess("PAIR",1);
+    gMC->SetProcess("COMP",1);
+    gMC->SetProcess("PHOT",1);
+    gMC->SetProcess("PFIS",0);
+    gMC->SetProcess("DRAY",0);
+    gMC->SetProcess("ANNI",1);
+    gMC->SetProcess("BREM",1);
+    gMC->SetProcess("MUNU",1);
+    gMC->SetProcess("CKOV",1);
+    gMC->SetProcess("HADR",1);
+    gMC->SetProcess("LOSS",2);
+    gMC->SetProcess("MULS",1);
+    gMC->SetProcess("RAYL",1);
+    Float_t cut = 1.e-3;        // 1MeV cut by default
+    Float_t tofmax = 1.e10;
+    gMC->SetCut("CUTGAM", cut);
+    gMC->SetCut("CUTELE", cut);
+    gMC->SetCut("CUTNEU", cut);
+    gMC->SetCut("CUTHAD", cut);
+    gMC->SetCut("CUTMUO", cut);
+    gMC->SetCut("BCUTE",  cut); 
+    gMC->SetCut("BCUTM",  cut); 
+    gMC->SetCut("DCUTE",  cut); 
+    gMC->SetCut("DCUTM",  cut); 
+    gMC->SetCut("PPCUTM", cut);
+    gMC->SetCut("TOFMAX", tofmax); 
+  }
+
+  //=======================================================================
+  // External decayer
+  //=======================================================================
+
+  // Set External decayer
+  TVirtualMCDecayer *decayer = new AliDecayerPythia();
+  decayer->SetForceDecay(kAll);
+  decayer->Init();
+  if ( gMC ) gMC->SetExternalDecayer(decayer);
+  
+  //=======================================================================
+  // Event generator
+  //=======================================================================
+
+  // External generator configuration
+  AliGenerator* gener = GeneratorFactory();
+  gener->SetOrigin(0, 0, 0);    // vertex position
+  //gener->SetSigma(0, 0, 5.3);   // Sigma in (X,Y,Z) (cm) on IP position
+  //gener->SetCutVertexZ(1.);     // Truncate at 1 sigma
+  //gener->SetVertexSmear(kPerEvent); 
+  gener->SetTrackingFlag(1);
+  gener->Init();
+    
+  cout << "Running genExtFileConfig.C finished ... " << endl;
+}
+
+Float_t EtaToTheta(Float_t arg){
+  return (180./TMath::Pi())*2.*atan(exp(-arg));
+}
+
+AliGenerator* GeneratorFactory() {
+
+  AliGenExtFile *gener = new AliGenExtFile(-1);
+  AliGenReaderTreeK * reader = new AliGenReaderTreeK();
+
+  reader->SetFileName("galice.root");
+  reader->AddDir("$ALICE_ROOT/MUON/gen");
+  gener->SetReader(reader);
+     
+  return gener; 
+}
+
diff --git a/MUON/genTestConfig.C b/MUON/genTestConfig.C
new file mode 100644 (file)
index 0000000..a6bf8fd
--- /dev/null
@@ -0,0 +1,167 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+/* $Id$ */
+
+/// \ingroup macros
+/// \file genTestConfig.C
+/// \brief Configuration macro for event generator 
+/// for MUON spectrometer Monte Carlo simulation
+
+Float_t EtaToTheta(Float_t arg);
+
+AliGenerator* genConfig(char option[6]="param")
+{
+  cout << "Running genTestConfig.C ... " << endl;
+
+  //=======================================================================
+  // ******* GEANT STEERING parameters FOR ALICE SIMULATION *******
+  if ( gMC ) {
+    gMC->SetProcess("DCAY",1);
+    gMC->SetProcess("PAIR",1);
+    gMC->SetProcess("COMP",1);
+    gMC->SetProcess("PHOT",1);
+    gMC->SetProcess("PFIS",0);
+    gMC->SetProcess("DRAY",0);
+    gMC->SetProcess("ANNI",1);
+    gMC->SetProcess("BREM",1);
+    gMC->SetProcess("MUNU",1);
+    gMC->SetProcess("CKOV",1);
+    gMC->SetProcess("HADR",1);
+    gMC->SetProcess("LOSS",2);
+    gMC->SetProcess("MULS",1);
+    gMC->SetProcess("RAYL",1);
+    Float_t cut = 1.e-3;        // 1MeV cut by default
+    Float_t tofmax = 1.e10;
+    gMC->SetCut("CUTGAM", cut);
+    gMC->SetCut("CUTELE", cut);
+    gMC->SetCut("CUTNEU", cut);
+    gMC->SetCut("CUTHAD", cut);
+    gMC->SetCut("CUTMUO", cut);
+    gMC->SetCut("BCUTE",  cut); 
+    gMC->SetCut("BCUTM",  cut); 
+    gMC->SetCut("DCUTE",  cut); 
+    gMC->SetCut("DCUTM",  cut); 
+    gMC->SetCut("PPCUTM", cut);
+    gMC->SetCut("TOFMAX", tofmax); 
+  }
+
+  // Set External decayer
+  TVirtualMCDecayer *decayer = new AliDecayerPythia();
+  decayer->SetForceDecay(kAll);
+  decayer->Init();
+  if ( gMC ) gMC->SetExternalDecayer(decayer);
+  
+  //=======================================================================
+  // Examples of generators. Only option param is sistematically tested
+  if (!strcmp(option,"box")) {
+    AliGenBox * gener = new AliGenBox(1);
+    gener->SetMomentumRange(20.,20.1);
+    gener->SetPhiRange(0., 360.);         
+    gener->SetThetaRange(171.000,178.001);
+    gener->SetPart(kMuonMinus);           // Muons
+    gener->SetOrigin(0.,0., 0.);  //vertex position
+    gener->SetSigma(0.0, 0.0, 0.0);         //Sigma in (X,Y,Z) (cm) on IP position
+  }
+  if (!strcmp(option,"gun")) {
+    AliGenFixed *gener = new AliGenFixed(1);
+    gener->SetMomentum(10);
+    gener->SetPhiRange(0.);
+    gener->SetThetaRange(0.);
+    gener->SetOrigin(30,30,-1200);//vertex position
+    gener->SetPart(kMuonMinus);          //GEANT particle type  13 is muons
+  }
+  if (!strcmp(option,"scan")) {
+    AliGenScan *gener = new AliGenScan(-1);
+    gener->SetMomentumRange(10,10);
+    gener->SetPhiRange(0, 0);
+    gener->SetThetaRange(-180, -180);
+    //vertex position
+    //gener->SetSigma(1,1,0);           //Sigma in (X,Y,Z) (cm) on IP position
+    gener->SetPart(kRootino); 
+    gener->SetRange(100, -300., 300., 100, -300., 300., 1, 2000, 2000);
+  }  
+  if (!strcmp(option,"param")) {
+    AliGenParam *gener = new AliGenParam(1, AliGenMUONlib::kUpsilon);
+    gener->SetMomentumRange(0,999);
+    gener->SetPtRange(0,100.);
+    gener->SetPhiRange(0., 360.);
+    gener->SetCutOnChild(1);
+    gener->SetChildPhiRange(0.,360.);
+    gener->SetChildThetaRange(171.0,178.0);
+    gener->SetOrigin(0,0,0);          //vertex position    gener->SetSigma(0,0,0);           //Sigma in (X,Y,Z) (cm) on IP position
+    gener->SetForceDecay(kDiMuon);
+    gener->SetTrackingFlag(1);
+  }
+  if (!strcmp(option,"paramJpsi")) {
+    AliGenParam *gener = new AliGenParam(1, AliGenMUONlib::kJpsi);
+    gener->SetMomentumRange(0,999);
+    gener->SetPtRange(0,100.);
+    gener->SetPhiRange(0., 360.);
+    gener->SetCutOnChild(1);
+    gener->SetChildPhiRange(0.,360.);
+    gener->SetChildThetaRange(171.0,178.0);
+    gener->SetOrigin(0,0,0);
+    gener->SetForceDecay(kDiMuon);
+    gener->SetTrackingFlag(1);
+  }
+  if (!strcmp(option,"hijing")) { //Hijing generator from ConfigPPR in macros
+    AliGenHijing *gener = new AliGenHijing(-1);
+    // centre of mass energy 
+    gener->SetEnergyCMS(5500.);
+    // reference frame
+    gener->SetReferenceFrame("CMS");
+    // projectile
+    gener->SetProjectile("A", 208, 82);
+    gener->SetTarget    ("A", 208, 82);
+    // tell hijing to keep the full parent child chain
+    gener->KeepFullEvent();
+    // enable jet quenching
+    gener->SetJetQuenching(1);
+    // enable shadowing
+    gener->SetShadowing(1);
+    // neutral pion and heavy particle decays switched off
+    gener->SetDecaysOff(1);
+    // Don't track spectators
+    gener->SetSpectators(0);
+    // kinematic selection
+    gener->SetSelectAll(0);
+    // impact parameter range
+    gener->SetImpactParameterRange(0., 5.); // 0. - 5. fm corresponds to ~10% most central
+  }
+  if (!strcmp(option,"muoncocktail")) { // Muon cocktail for PbPb
+    AliGenMUONCocktail * gener = new AliGenMUONCocktail();
+    gener->SetPtRange(1.,100.);       // Transverse momentum range  
+    gener->SetPhiRange(0.,360.);    // Azimuthal angle range 
+    gener->SetYRange(-4.0,-2.5);
+    gener->SetMuonPtCut(0.5);
+    gener->SetMuonThetaCut(171.,178.);
+    gener->SetMuonMultiplicity(2);
+    gener->SetImpactParameterRange(0.,5.); // 10% most centra PbPb collisions
+    gener->SetVertexSmear(kPerTrack);  
+    gener->SetOrigin(0,0,0);        // Vertex position
+    gener->SetSigma(0,0,0.0);       // Sigma in (X,Y,Z) (cm) on IP position
+  }  
+
+  gener->SetDecayer(decayer);
+  gener->Init();
+  return gener;
+  
+  cout << "Running genGunConfig.C finished ... " << endl;
+}
+
+Float_t EtaToTheta(Float_t arg){
+  return (180./TMath::Pi())*2.*atan(exp(-arg));
+}