X-Git-Url: http://git.uio.no/git/?p=u%2Fmrichter%2FAliRoot.git;a=blobdiff_plain;f=EVGEN%2FAliGenCocktail.cxx;h=32fd1bb97f636482bc2b369e235853033abd2926;hp=1b570312cea887a50b1496b04d383dc110f2af5a;hb=6019801d3515affcaa9059878f6d68475694e653;hpb=1c56e3114fc17d10b32a74e05c8ff88b22cda902 diff --git a/EVGEN/AliGenCocktail.cxx b/EVGEN/AliGenCocktail.cxx index 1b570312cea..32fd1bb97f6 100644 --- a/EVGEN/AliGenCocktail.cxx +++ b/EVGEN/AliGenCocktail.cxx @@ -25,11 +25,13 @@ #include #include +#include #include "AliGenCocktail.h" #include "AliGenCocktailEntry.h" #include "AliCollisionGeometry.h" #include "AliRun.h" +#include "AliLog.h" #include "AliMC.h" #include "AliGenCocktailEventHeader.h" @@ -38,7 +40,8 @@ ClassImp(AliGenCocktail) AliGenCocktail::AliGenCocktail() :AliGenerator(), fNGenerators(0), - fRandom(kFALSE), + fTotalRate(0.), + fSRandom(kFALSE), fUsePerEventRate(kFALSE), fProb(0), fEntries(0), @@ -51,21 +54,6 @@ AliGenCocktail::AliGenCocktail() fTitle= "Particle Generator using cocktail of generators"; } -AliGenCocktail::AliGenCocktail(const AliGenCocktail & cocktail): - AliGenerator(cocktail), - fNGenerators(0), - fRandom(kFALSE), - fUsePerEventRate(kFALSE), - fProb(0), - fEntries(0), - flnk1(0), - flnk2(0), - fHeader(0) -{ -// Copy constructor - cocktail.Copy(*this); -} - AliGenCocktail::~AliGenCocktail() { // Destructor @@ -76,13 +64,13 @@ AliGenCocktail::~AliGenCocktail() } void AliGenCocktail:: -AddGenerator(AliGenerator *Generator, const char* Name, Float_t RateExp) +AddGenerator(AliGenerator *Generator, const char* Name, Float_t RateExp, TFormula* formula, Int_t ntimes) { // // Add a generator to the list // First check that list exists if (!fEntries) fEntries = new TList(); - + fTotalRate += RateExp; // // Forward parameters to the new generator if(TestBit(kPtRange) && !(Generator->TestBit(kPtRange)) && !(Generator->TestBit(kMomentumRange))) @@ -90,36 +78,37 @@ AddGenerator(AliGenerator *Generator, const char* Name, Float_t RateExp) if(TestBit(kMomentumRange) && !(Generator->TestBit(kPtRange)) && !(Generator->TestBit(kMomentumRange))) Generator->SetMomentumRange(fPMin,fPMax); - if (!(Generator->TestBit(kYRange))) + if (TestBit(kYRange) && !(Generator->TestBit(kYRange))) Generator->SetYRange(fYMin,fYMax); - if (!(Generator->TestBit(kPhiRange))) + if (TestBit(kPhiRange) && !(Generator->TestBit(kPhiRange))) Generator->SetPhiRange(fPhiMin*180/TMath::Pi(),fPhiMax*180/TMath::Pi()); - if (!(Generator->TestBit(kThetaRange))) + if (TestBit(kThetaRange) && !(Generator->TestBit(kThetaRange)) && !(Generator->TestBit(kEtaRange))) Generator->SetThetaRange(fThetaMin*180/TMath::Pi(),fThetaMax*180/TMath::Pi()); - if (!(Generator->TestBit(kVertexRange))) + 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->SetSigma(fOsigma[0], fOsigma[1], fOsigma[2]); + Generator->SetVertexSmear(fVertexSmear); + Generator->SetVertexSource(kContainer); + } Generator->SetTrackingFlag(fTrackIt); Generator->SetContainer(this); - + // // Add generator to list char theName[256]; - sprintf(theName, "%s_%d",Name, fNGenerators); + snprintf(theName, 256, "%s_%d",Name, fNGenerators); Generator->SetName(theName); AliGenCocktailEntry *entry = new AliGenCocktailEntry(Generator, Name, RateExp); - + if (formula) entry->SetFormula(formula); + entry->SetNTimes(ntimes); fEntries->Add(entry); fNGenerators++; flnk1 = 0; flnk2 = 0; - fRandom = kFALSE; + fSRandom = kFALSE; fHeader = 0; } @@ -137,7 +126,7 @@ AddGenerator(AliGenerator *Generator, const char* Name, Float_t RateExp) next.Reset(); - if (fRandom) { + if (fSRandom) { fProb.Set(fNGenerators); next.Reset(); Float_t sum = 0.; @@ -175,13 +164,14 @@ AddGenerator(AliGenerator *Generator, const char* Name, Float_t RateExp) TIter next(fEntries); AliGenCocktailEntry *entry = 0; AliGenCocktailEntry *preventry = 0; + AliGenCocktailEntry *collentry = 0; AliGenerator* gen = 0; if (fHeader) delete fHeader; fHeader = new AliGenCocktailEventHeader("Cocktail Header"); - TObjArray *partArray = gAlice->GetMCApp()->Particles(); + const TObjArray *partArray = gAlice->GetMCApp()->Particles(); // // Generate the vertex position used by all generators @@ -192,38 +182,63 @@ AddGenerator(AliGenerator *Generator, const char* Name, Float_t RateExp) eventVertex.Set(3); for (Int_t j=0; j < 3; j++) eventVertex[j] = fVertex[j]; - if (!fRandom) { + if (!fSRandom) { // // Loop over generators and generate events - Int_t igen=0; + 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()) + Int_t ntimes = entry->NTimes(); + if (fUsePerEventRate && (gRandom->Rndm() > entry->Rate())) continue; + + igen++; + if (igen ==1) { + entry->SetFirst(0); + } else { + entry->SetFirst((partArray->GetEntriesFast())+1); + } + gen = entry->Generator(); + if (gen->ProvidesCollisionGeometry()) collentry = entry; + // + // Handle case in which current generator needs collision geometry from previous generator + // + if (gen->NeedsCollisionGeometry() && (entry->Formula() == 0)) { - if (preventry && preventry->Generator()->ProvidesCollisionGeometry()) + if (preventry && preventry->Generator()->ProvidesCollisionGeometry()) { - gen->SetCollisionGeometry(preventry->Generator()->CollisionGeometry()); + gen->SetCollisionGeometry(preventry->Generator()->CollisionGeometry()); } else { - Fatal("Generate()", "No Collision Geometry Provided"); - } + Fatal("Generate()", "No Collision Geometry Provided"); + } + } + // + // Number of signals is calculated from Collision Geometry + // and entry with given centrality bin is selected + // + if (entry->Formula() != 0) + { + if (!collentry) { + Fatal("Generate()", "No Collision Geometry Provided"); + return; + } + AliCollisionGeometry* coll = (collentry->Generator())->CollisionGeometry(); + Float_t b = coll->ImpactParameter(); + Int_t nsig = Int_t(entry->Formula()->Eval(b)); + Int_t bin = entry->Bin() - 100; + if (bin > 0) { + if (bin != nsig) continue; + } else { + if (nsig < 1) nsig = 1; + AliInfo(Form("Signal Events %13.3f %5d %5d\n", b, coll->HardScatters(), nsig)); + ntimes = nsig; + } } - entry->Generator()->SetVertex(fVertex.At(0), fVertex.At(1), fVertex.At(2)); - entry->Generator()->Generate(); - entry->SetLast(partArray->GetEntriesFast()); - preventry = entry; - } - } else if (fRandom) { + gen->SetVertex(fVertex.At(0), fVertex.At(1), fVertex.At(2), fTime); + + gen->GenerateN(ntimes); + entry->SetLast(partArray->GetEntriesFast()); + preventry = entry; + } + } else if (fSRandom) { // // Select a generator randomly // @@ -237,16 +252,22 @@ AddGenerator(AliGenerator *Generator, const char* Name, Float_t RateExp) entry = (AliGenCocktailEntry*) fEntries->At(i); entry->SetFirst(0); gen = entry->Generator(); - entry->Generator()->SetVertex(fVertex.At(0), fVertex.At(1), fVertex.At(2)); - entry->Generator()->Generate(); + gen->SetVertex(fVertex.At(0), fVertex.At(1), fVertex.At(2), fTime); + gen->Generate(); entry->SetLast(partArray->GetEntriesFast()); } next.Reset(); -// Event Vertex + // Event Vertex fHeader->SetPrimaryVertex(eventVertex); - gAlice->SetGenEventHeader(fHeader); + fHeader->CalcNProduced(); + if (fContainer) { + fHeader->SetName(fName); + fContainer->AddHeader(fHeader); + } else { + gAlice->SetGenEventHeader(fHeader); + } } void AliGenCocktail::SetVertexSmear(VertexSmear_t smear) @@ -319,18 +340,7 @@ void AliGenCocktail::AddHeader(AliGenEventHeader* header) // Add a header to the list if (fHeader) fHeader->AddHeader(header); } - -AliGenCocktail& AliGenCocktail::operator=(const AliGenCocktail& rhs) -{ -// Assignment operator - rhs.Copy(*this); - return (*this); -} -void AliGenCocktail::Copy(TObject &) const -{ - Fatal("Copy","Not implemented!\n"); -}