X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=EVGEN%2FAliGenCocktail.cxx;h=b0284fda2fd12ecc5690d2e0db45f9784dc9bff9;hb=1277586c7014d97dc9facd1a0750e2134313ca38;hp=04b9aa7a8e0786568438001aae5ceb368b44f840;hpb=fe4da5cc22f890b04843f1aebec0f1bf4f9c3fc9;p=u%2Fmrichter%2FAliRoot.git diff --git a/EVGEN/AliGenCocktail.cxx b/EVGEN/AliGenCocktail.cxx index 04b9aa7a8e0..b0284fda2fd 100644 --- a/EVGEN/AliGenCocktail.cxx +++ b/EVGEN/AliGenCocktail.cxx @@ -1,110 +1,255 @@ -#include "AliGenerator.h" +/************************************************************************** + * 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$ */ + +// Container class for AliGenerator through recursion. +// Container is itself an AliGenerator. +// What is stored are not the pointers to the generators directly but to objects of type +// AliGenCocktail entry. +// The class provides also iterator functionality. +// Author: andreas.morsch@cern.ch +// + +#include +#include + #include "AliGenCocktail.h" -#include "TGeant3.h" +#include "AliGenCocktailEntry.h" +#include "AliCollisionGeometry.h" #include "AliRun.h" -#include -#include -#include -#include -ClassImp(AliGenCocktailEntry) -void AliGenCocktailEntry::PrintInfo() -{ -printf("\n Generator: %s Generated Events: %d First: %d Last: %d", - (const char *) fName, fGenerator->NumberParticles(), fFirst, fLast); -} +#include "AliMC.h" +#include "AliGenCocktailEventHeader.h" ClassImp(AliGenCocktail) AliGenCocktail::AliGenCocktail() - :AliGenerator() + :AliGenerator(), + fNGenerators(0), + fTotalRate(0.), + fRandom(kFALSE), + fUsePerEventRate(kFALSE), + fProb(0), + fEntries(0), + flnk1(0), + flnk2(0), + fHeader(0) { - fEntries = new TList; - fNGenerators=0; +// Constructor + fName = "Cocktail"; + fTitle= "Particle Generator using cocktail of generators"; } - AliGenCocktail::~AliGenCocktail() { +// Destructor delete fEntries; + fEntries = 0; + // delete fHeader; // It is removed in AliRunLoader + fHeader = 0; } void AliGenCocktail:: -AddGenerator(AliGenerator *Generator, TString Name, Float_t RateExp) +AddGenerator(AliGenerator *Generator, const char* Name, Float_t RateExp) { // +// Add a generator to the list +// First check that list exists + if (!fEntries) fEntries = new TList(); + fTotalRate += RateExp; +// // Forward parameters to the new generator - Generator->SetPtRange(fPtMin,fPtMax); - Generator->SetMomentumRange(fPMin,fPMax); - Generator->SetYRange(fYMin,fYMax); - Generator-> - SetPhiRange(fPhiMin*180/TMath::Pi(),fPhiMax*180/TMath::Pi()); - Generator-> - SetThetaRange(fThetaMin*180/TMath::Pi(),fThetaMax*180/TMath::Pi()); - Generator-> - SetOrigin(fOrigin[0], fOrigin[1], fOrigin[2]); - Generator-> - SetSigma(fOsigma[0], fOsigma[1], fOsigma[2]); + if(TestBit(kPtRange) && !(Generator->TestBit(kPtRange)) && !(Generator->TestBit(kMomentumRange))) + Generator->SetPtRange(fPtMin,fPtMax); + if(TestBit(kMomentumRange) && !(Generator->TestBit(kPtRange)) && !(Generator->TestBit(kMomentumRange))) + Generator->SetMomentumRange(fPMin,fPMax); + + if (!(Generator->TestBit(kYRange))) + Generator->SetYRange(fYMin,fYMax); + if (!(Generator->TestBit(kPhiRange))) + Generator->SetPhiRange(fPhiMin*180/TMath::Pi(),fPhiMax*180/TMath::Pi()); + if (!(Generator->TestBit(kThetaRange))) + Generator->SetThetaRange(fThetaMin*180/TMath::Pi(),fThetaMax*180/TMath::Pi()); + if (!(Generator->TestBit(kVertexRange))) { + Generator->SetOrigin(fOrigin[0], fOrigin[1], fOrigin[2]); + Generator->SetSigma(fOsigma[0], fOsigma[1], fOsigma[2]); + Generator->SetVertexSmear(fVertexSmear); + Generator->SetVertexSource(kContainer); + } + Generator->SetTrackingFlag(fTrackIt); + Generator->SetContainer(this); + + // // Add generator to list - AliGenCocktailEntry *Entry = + char theName[256]; + snprintf(theName, 256, "%s_%d",Name, fNGenerators); + Generator->SetName(theName); + + AliGenCocktailEntry *entry = new AliGenCocktailEntry(Generator, Name, RateExp); - fEntries->Add(Entry); + + fEntries->Add(entry); fNGenerators++; - } + flnk1 = 0; + flnk2 = 0; + fRandom = kFALSE; + fHeader = 0; +} void AliGenCocktail::Init() - { - TIter next(fEntries); - AliGenCocktailEntry *Entry; - // - // Loop over generators and initialize - while((Entry = (AliGenCocktailEntry*)next())) { - Entry->Generator()->Init(); - } - } +{ +// Initialisation + TIter next(fEntries); + AliGenCocktailEntry *entry; + // + // Loop over generators and initialize + while((entry = (AliGenCocktailEntry*)next())) { + if (fStack) entry->Generator()->SetStack(fStack); + entry->Generator()->Init(); + } + + next.Reset(); + + if (fRandom) { + fProb.Set(fNGenerators); + next.Reset(); + Float_t sum = 0.; + while((entry = (AliGenCocktailEntry*)next())) { + sum += entry->Rate(); + } + + next.Reset(); + Int_t i = 0; + Float_t psum = 0.; + while((entry = (AliGenCocktailEntry*)next())) { + psum += entry->Rate() / sum; + fProb[i++] = psum; + } + } + next.Reset(); +} + + void AliGenCocktail::FinishRun() +{ +// Initialisation + TIter next(fEntries); + AliGenCocktailEntry *entry; + // + // Loop over generators and initialize + while((entry = (AliGenCocktailEntry*)next())) { + entry->Generator()->FinishRun(); + } +} void AliGenCocktail::Generate() - { - TIter next(fEntries); - AliGenCocktailEntry *Entry; - AliGenCocktailEntry *e1; - AliGenCocktailEntry *e2; - TClonesArray *PartArray = gAlice->Particles(); - // - // Loop over generators and generate events - Int_t igen=0; - while((Entry = (AliGenCocktailEntry*)next())) { - igen++; - if (igen ==1) { - Entry->SetFirst(0); - } else { - Entry->SetFirst((PartArray->GetEntriesFast())+1); - } - Entry->Generator()->Generate(); - Entry->SetLast(PartArray->GetEntriesFast()); - } - next.Reset(); - while((Entry = (AliGenCocktailEntry*)next())) { - Entry->PrintInfo(); - } - for (Entry=FirstGenerator(); - Entry; - Entry=NextGenerator() - ) { - Entry->PrintInfo(); - } - for (FirstGeneratorPair(e1,e2); - (e1&&e2); - NextGeneratorPair(e1,e2) - ){ - printf("\n -----------------------------"); - e1->PrintInfo(); - e2->PrintInfo(); - } - } +{ +// +// Generate event + TIter next(fEntries); + AliGenCocktailEntry *entry = 0; + AliGenCocktailEntry *preventry = 0; + AliGenerator* gen = 0; + if (fHeader) delete fHeader; + + + fHeader = new AliGenCocktailEventHeader("Cocktail Header"); + + const TObjArray *partArray = gAlice->GetMCApp()->Particles(); + +// +// Generate the vertex position used by all generators +// + if(fVertexSmear == kPerEvent) Vertex(); + + TArrayF eventVertex; + eventVertex.Set(3); + for (Int_t j=0; j < 3; j++) eventVertex[j] = fVertex[j]; + + if (!fRandom) { + // + // Loop over generators and generate events + Int_t igen=0; + while((entry = (AliGenCocktailEntry*)next())) { + if (fUsePerEventRate && (gRandom->Rndm() > entry->Rate())) continue; + + igen++; + if (igen ==1) { + entry->SetFirst(0); + } else { + entry->SetFirst((partArray->GetEntriesFast())+1); + } +// +// Handle case in which current generator needs collision geometry from previous generator +// + gen = entry->Generator(); + if (gen->NeedsCollisionGeometry()) + { + if (preventry && preventry->Generator()->ProvidesCollisionGeometry()) + { + gen->SetCollisionGeometry(preventry->Generator()->CollisionGeometry()); + } else { + Fatal("Generate()", "No Collision Geometry Provided"); + } + } + entry->Generator()->SetVertex(fVertex.At(0), fVertex.At(1), fVertex.At(2)); + entry->Generator()->Generate(); + entry->SetLast(partArray->GetEntriesFast()); + preventry = entry; + } + } else if (fRandom) { + // + // Select a generator randomly + // + Int_t i; + Float_t p0 = gRandom->Rndm(); + + for (i = 0; i < fNGenerators; i++) { + if (p0 < fProb[i]) break; + } + + entry = (AliGenCocktailEntry*) fEntries->At(i); + entry->SetFirst(0); + gen = entry->Generator(); + gen->SetVertex(fVertex.At(0), fVertex.At(1), fVertex.At(2)); + gen->Generate(); + entry->SetLast(partArray->GetEntriesFast()); + } + + next.Reset(); + +// Event Vertex + fHeader->SetPrimaryVertex(eventVertex); + fHeader->CalcNProduced(); + gAlice->SetGenEventHeader(fHeader); +} + +void AliGenCocktail::SetVertexSmear(VertexSmear_t smear) +{ +// Set vertex smearing and propagate it to the generators + + AliGenerator::SetVertexSmear(smear); + TIter next(fEntries); + while (AliGenCocktailEntry* entry = (AliGenCocktailEntry*)next()) { + entry->Generator()->SetVertexSmear(smear); + } +} AliGenCocktailEntry * AliGenCocktail::FirstGenerator() { +// Iterator over generators: Initialisation flnk1 = fEntries->FirstLink(); if (flnk1) { return (AliGenCocktailEntry*) (flnk1->GetObject()); @@ -115,6 +260,7 @@ AliGenCocktailEntry * AliGenCocktail::FirstGenerator() AliGenCocktailEntry* AliGenCocktail::NextGenerator() { +// Iterator over generators: Increment flnk1 = flnk1->Next(); if (flnk1) { return (AliGenCocktailEntry*) (flnk1->GetObject()); @@ -126,6 +272,7 @@ AliGenCocktailEntry* AliGenCocktail::NextGenerator() void AliGenCocktail:: FirstGeneratorPair(AliGenCocktailEntry*& e1, AliGenCocktailEntry*& e2) { +// Iterator over generator pairs: Initialisation flnk2 = flnk1 = fEntries->FirstLink(); if (flnk1) { e2 = e1 = (AliGenCocktailEntry*) (flnk1->GetObject()); @@ -137,6 +284,7 @@ FirstGeneratorPair(AliGenCocktailEntry*& e1, AliGenCocktailEntry*& e2) void AliGenCocktail:: NextGeneratorPair(AliGenCocktailEntry*& e1, AliGenCocktailEntry*& e2) { +// Iterator over generators: Increment flnk2 = flnk2->Next(); if (flnk2) { e1 = (AliGenCocktailEntry*) (flnk1->GetObject()); @@ -153,32 +301,12 @@ NextGeneratorPair(AliGenCocktailEntry*& e1, AliGenCocktailEntry*& e2) } } - -void AliGenCocktail::Streamer(TBuffer &R__b) +void AliGenCocktail::AddHeader(AliGenEventHeader* header) { - // Stream an object of class AliGenCocktail. - TIter next(fEntries); - AliGenCocktailEntry *Entry; - - if (R__b.IsReading()) { - Version_t R__v = R__b.ReadVersion(); if (R__v) { } - AliGenerator::Streamer(R__b); - R__b >> fNGenerators; - R__b >> fEntries; -// Stream generation related information - while((Entry = (AliGenCocktailEntry*)next())) { - Entry->Streamer(R__b); - } - } else { - R__b.WriteVersion(AliGenCocktail::IsA()); - AliGenerator::Streamer(R__b); - R__b << fNGenerators; - R__b << fEntries; -// Stream generation related information - while((Entry = (AliGenCocktailEntry*)next())) { - Entry->Streamer(R__b); - } - } +// Add a header to the list + if (fHeader) fHeader->AddHeader(header); } + +