ROOT logo
/************************************************************************** 
 * 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: AliMCGenHandler.cxx 64675 2013-10-23 12:21:37Z hristov $ */

//-------------------------------------------------------------------------
//                          Class AliMCGenHandler
// This class can be used with the analysis framework to generate event on
// the fly and analyse them.
//      
// Origin: Andrei Gheata, Jan Fiete Grosse-Oetringhaus
//-------------------------------------------------------------------------

#include "AliMCGenHandler.h"
#include "AliMCEvent.h"
#include "AliPDG.h"
#include "AliHeader.h"
#include "AliStack.h"
#include "AliLog.h"
#include "AliGenerator.h"
#include "AliRunLoader.h"
#include "AliRun.h"
#include "AliAnalysisManager.h"

#include "TMacro.h"
#include "TInterpreter.h"

ClassImp(AliMCGenHandler)

AliMCGenHandler::AliMCGenHandler() :
    AliInputEventHandler(),
    fMCEvent(0),
    fEventNumber(0),
    fStack(0),
    fHeader(0),
    fGenerator(0),
    fSeedMode(0),
    fSeed(0),
    fGeneratorMacroPath(),
    fGeneratorMacroParameters(),
    fGeneratorCustomization(0)
{
  //
  // Default constructor
  //
  // Be sure to add all particles to the PDG database
  AliPDG::AddParticlesToPdgDataBase();
}

AliMCGenHandler::AliMCGenHandler(const char* name, const char* title) :
    AliInputEventHandler(name, title),
    fMCEvent(0),
    fEventNumber(0),
    fStack(0),
    fHeader(0),
    fGenerator(0),
    fSeedMode(0),
    fSeed(0),
    fGeneratorMacroPath(),
    fGeneratorMacroParameters(),
    fGeneratorCustomization(0)
{
  //
  // Constructor
  //
  // Be sure to add all particles to the PDG database
  AliPDG::AddParticlesToPdgDataBase();
}

AliMCGenHandler::~AliMCGenHandler()
{ 
    // Destructor
    delete fMCEvent;
    delete fGenerator;
}

Bool_t AliMCGenHandler::Init(Option_t* /*opt*/)
{ 
  // Initialize input
    //
    
    if (!fGenerator) {
      if (fGeneratorMacroPath.Length() == 0)
	AliFatal("fGeneratorMacroPath empty!");
      
      TString macroPath;
      macroPath.Form("$ALICE_ROOT/%s", fGeneratorMacroPath.Data());
      macroPath = gSystem->ExpandPathName(macroPath.Data());

      if (gSystem->AccessPathName(macroPath))
	  AliFatal(Form("Cannot find macro %s", macroPath.Data()));

      TMacro m(macroPath);
      Int_t error = 0;
      Long64_t retval = m.Exec(fGeneratorMacroParameters, &error);
      if (error != TInterpreter::kNoError)
	  AliFatal(Form("Macro interpretation %s failed", macroPath.Data()));

      if (retval<0)
	AliFatal(Form("The macro %s did not return a valid generator (1)", macroPath.Data()));

      fGenerator = reinterpret_cast<AliGenerator*>(retval);
      if (!fGenerator)
	AliFatal(Form("The macro %s did not return a valid generator (2)", macroPath.Data()));

      // customization from LEGO train
      if (fGeneratorCustomization) {
	fGeneratorCustomization->Exec(Form("(AliGenerator*) %p", fGenerator), &error);
	if (error != TInterpreter::kNoError)
	  AliFatal("Execution of generator customization failed");
      }
    }
    
    if (fSeedMode == 0)
      Printf("AliMCGenHandler::Init: Not setting any seed. Seed needs to be set externally!");
    else
    {
      if (fSeedMode == 1)
      {
	Printf("AliMCGenHandler::Init: Using manually set seed");
      }
      else if (fSeedMode == 2)
      {
	Printf("AliMCGenHandler::Init: Taking seed from current time");
	fSeed = time(0);
      }
      else if (fSeedMode == 3)
      {
	Printf("AliMCGenHandler::Init: Taking seed from AliEn job id");
	TString tmp(gSystem->Getenv("ALIEN_PROC_ID"));
	fSeed = tmp.Atoi();
	if (tmp.Length() == 0 || fSeed == 0)
	  AliFatal(Form("Could not retrieve AliEn job id for seed. The variable ALIEN_PROC_ID contains %s", tmp.Data()));
      }
      else
	AliFatal(Form("Seed mode %d unknown", fSeedMode));

      Printf("AliMCGenHandler::Init: Using seed: %d", fSeed);
      gRandom->SetSeed(fSeed);
      fGenerator->SetSeed(fSeed);
    }

    AliRunLoader* rl = AliRunLoader::Open("galice.root","FASTRUN","recreate");
    rl->MakeTree("E");
    gAlice->SetRunLoader(rl);
    rl->MakeStack();
    fStack = rl->Stack();
    fHeader = rl->GetHeader();
    
    fGenerator->SetStack(fStack);
    fGenerator->Init();
    
    fMCEvent = new AliMCEvent;

    return kTRUE;
}

Bool_t AliMCGenHandler::BeginEvent(Long64_t /*entry*/)
{ 
    // Begin event

    fHeader->Reset(0, fEventNumber++);
    
    if (AliAnalysisManager::GetAnalysisManager()->GetDebugLevel() > 1)
      Printf("AliMCGenHandler::BeginEvent: Generating Event number %lld", fEventNumber);
      
    fGenerator->Generate();

    fHeader->SetStack(fStack);
    fHeader->SetNprimary(fStack->GetNprimary());
    fHeader->SetNtrack(fStack->GetNtrack());  

    fMCEvent->ConnectHeaderAndStack(fHeader);

    return kTRUE;
}

Bool_t AliMCGenHandler::FinishEvent()
{
    // Clean-up after each event
   
    fMCEvent->Stack()->Reset();

    return kTRUE;
}
 AliMCGenHandler.cxx:1
 AliMCGenHandler.cxx:2
 AliMCGenHandler.cxx:3
 AliMCGenHandler.cxx:4
 AliMCGenHandler.cxx:5
 AliMCGenHandler.cxx:6
 AliMCGenHandler.cxx:7
 AliMCGenHandler.cxx:8
 AliMCGenHandler.cxx:9
 AliMCGenHandler.cxx:10
 AliMCGenHandler.cxx:11
 AliMCGenHandler.cxx:12
 AliMCGenHandler.cxx:13
 AliMCGenHandler.cxx:14
 AliMCGenHandler.cxx:15
 AliMCGenHandler.cxx:16
 AliMCGenHandler.cxx:17
 AliMCGenHandler.cxx:18
 AliMCGenHandler.cxx:19
 AliMCGenHandler.cxx:20
 AliMCGenHandler.cxx:21
 AliMCGenHandler.cxx:22
 AliMCGenHandler.cxx:23
 AliMCGenHandler.cxx:24
 AliMCGenHandler.cxx:25
 AliMCGenHandler.cxx:26
 AliMCGenHandler.cxx:27
 AliMCGenHandler.cxx:28
 AliMCGenHandler.cxx:29
 AliMCGenHandler.cxx:30
 AliMCGenHandler.cxx:31
 AliMCGenHandler.cxx:32
 AliMCGenHandler.cxx:33
 AliMCGenHandler.cxx:34
 AliMCGenHandler.cxx:35
 AliMCGenHandler.cxx:36
 AliMCGenHandler.cxx:37
 AliMCGenHandler.cxx:38
 AliMCGenHandler.cxx:39
 AliMCGenHandler.cxx:40
 AliMCGenHandler.cxx:41
 AliMCGenHandler.cxx:42
 AliMCGenHandler.cxx:43
 AliMCGenHandler.cxx:44
 AliMCGenHandler.cxx:45
 AliMCGenHandler.cxx:46
 AliMCGenHandler.cxx:47
 AliMCGenHandler.cxx:48
 AliMCGenHandler.cxx:49
 AliMCGenHandler.cxx:50
 AliMCGenHandler.cxx:51
 AliMCGenHandler.cxx:52
 AliMCGenHandler.cxx:53
 AliMCGenHandler.cxx:54
 AliMCGenHandler.cxx:55
 AliMCGenHandler.cxx:56
 AliMCGenHandler.cxx:57
 AliMCGenHandler.cxx:58
 AliMCGenHandler.cxx:59
 AliMCGenHandler.cxx:60
 AliMCGenHandler.cxx:61
 AliMCGenHandler.cxx:62
 AliMCGenHandler.cxx:63
 AliMCGenHandler.cxx:64
 AliMCGenHandler.cxx:65
 AliMCGenHandler.cxx:66
 AliMCGenHandler.cxx:67
 AliMCGenHandler.cxx:68
 AliMCGenHandler.cxx:69
 AliMCGenHandler.cxx:70
 AliMCGenHandler.cxx:71
 AliMCGenHandler.cxx:72
 AliMCGenHandler.cxx:73
 AliMCGenHandler.cxx:74
 AliMCGenHandler.cxx:75
 AliMCGenHandler.cxx:76
 AliMCGenHandler.cxx:77
 AliMCGenHandler.cxx:78
 AliMCGenHandler.cxx:79
 AliMCGenHandler.cxx:80
 AliMCGenHandler.cxx:81
 AliMCGenHandler.cxx:82
 AliMCGenHandler.cxx:83
 AliMCGenHandler.cxx:84
 AliMCGenHandler.cxx:85
 AliMCGenHandler.cxx:86
 AliMCGenHandler.cxx:87
 AliMCGenHandler.cxx:88
 AliMCGenHandler.cxx:89
 AliMCGenHandler.cxx:90
 AliMCGenHandler.cxx:91
 AliMCGenHandler.cxx:92
 AliMCGenHandler.cxx:93
 AliMCGenHandler.cxx:94
 AliMCGenHandler.cxx:95
 AliMCGenHandler.cxx:96
 AliMCGenHandler.cxx:97
 AliMCGenHandler.cxx:98
 AliMCGenHandler.cxx:99
 AliMCGenHandler.cxx:100
 AliMCGenHandler.cxx:101
 AliMCGenHandler.cxx:102
 AliMCGenHandler.cxx:103
 AliMCGenHandler.cxx:104
 AliMCGenHandler.cxx:105
 AliMCGenHandler.cxx:106
 AliMCGenHandler.cxx:107
 AliMCGenHandler.cxx:108
 AliMCGenHandler.cxx:109
 AliMCGenHandler.cxx:110
 AliMCGenHandler.cxx:111
 AliMCGenHandler.cxx:112
 AliMCGenHandler.cxx:113
 AliMCGenHandler.cxx:114
 AliMCGenHandler.cxx:115
 AliMCGenHandler.cxx:116
 AliMCGenHandler.cxx:117
 AliMCGenHandler.cxx:118
 AliMCGenHandler.cxx:119
 AliMCGenHandler.cxx:120
 AliMCGenHandler.cxx:121
 AliMCGenHandler.cxx:122
 AliMCGenHandler.cxx:123
 AliMCGenHandler.cxx:124
 AliMCGenHandler.cxx:125
 AliMCGenHandler.cxx:126
 AliMCGenHandler.cxx:127
 AliMCGenHandler.cxx:128
 AliMCGenHandler.cxx:129
 AliMCGenHandler.cxx:130
 AliMCGenHandler.cxx:131
 AliMCGenHandler.cxx:132
 AliMCGenHandler.cxx:133
 AliMCGenHandler.cxx:134
 AliMCGenHandler.cxx:135
 AliMCGenHandler.cxx:136
 AliMCGenHandler.cxx:137
 AliMCGenHandler.cxx:138
 AliMCGenHandler.cxx:139
 AliMCGenHandler.cxx:140
 AliMCGenHandler.cxx:141
 AliMCGenHandler.cxx:142
 AliMCGenHandler.cxx:143
 AliMCGenHandler.cxx:144
 AliMCGenHandler.cxx:145
 AliMCGenHandler.cxx:146
 AliMCGenHandler.cxx:147
 AliMCGenHandler.cxx:148
 AliMCGenHandler.cxx:149
 AliMCGenHandler.cxx:150
 AliMCGenHandler.cxx:151
 AliMCGenHandler.cxx:152
 AliMCGenHandler.cxx:153
 AliMCGenHandler.cxx:154
 AliMCGenHandler.cxx:155
 AliMCGenHandler.cxx:156
 AliMCGenHandler.cxx:157
 AliMCGenHandler.cxx:158
 AliMCGenHandler.cxx:159
 AliMCGenHandler.cxx:160
 AliMCGenHandler.cxx:161
 AliMCGenHandler.cxx:162
 AliMCGenHandler.cxx:163
 AliMCGenHandler.cxx:164
 AliMCGenHandler.cxx:165
 AliMCGenHandler.cxx:166
 AliMCGenHandler.cxx:167
 AliMCGenHandler.cxx:168
 AliMCGenHandler.cxx:169
 AliMCGenHandler.cxx:170
 AliMCGenHandler.cxx:171
 AliMCGenHandler.cxx:172
 AliMCGenHandler.cxx:173
 AliMCGenHandler.cxx:174
 AliMCGenHandler.cxx:175
 AliMCGenHandler.cxx:176
 AliMCGenHandler.cxx:177
 AliMCGenHandler.cxx:178
 AliMCGenHandler.cxx:179
 AliMCGenHandler.cxx:180
 AliMCGenHandler.cxx:181
 AliMCGenHandler.cxx:182
 AliMCGenHandler.cxx:183
 AliMCGenHandler.cxx:184
 AliMCGenHandler.cxx:185
 AliMCGenHandler.cxx:186
 AliMCGenHandler.cxx:187
 AliMCGenHandler.cxx:188
 AliMCGenHandler.cxx:189
 AliMCGenHandler.cxx:190
 AliMCGenHandler.cxx:191
 AliMCGenHandler.cxx:192
 AliMCGenHandler.cxx:193
 AliMCGenHandler.cxx:194
 AliMCGenHandler.cxx:195
 AliMCGenHandler.cxx:196
 AliMCGenHandler.cxx:197