From c9a8628a9613863465159048125ca92c9f62e4e7 Mon Sep 17 00:00:00 2001 From: morsch Date: Mon, 24 Mar 2003 16:49:23 +0000 Subject: [PATCH] Slow nucleon generator and model. --- EVGEN/AliGenSlowNucleons.cxx | 245 +++++++++++++++++++++++++++++++ EVGEN/AliGenSlowNucleons.h | 67 +++++++++ EVGEN/AliSlowNucleonModel.cxx | 23 +++ EVGEN/AliSlowNucleonModel.h | 29 ++++ EVGEN/AliSlowNucleonModelExp.cxx | 91 ++++++++++++ EVGEN/AliSlowNucleonModelExp.h | 35 +++++ EVGEN/EVGENLinkDef.h | 6 +- EVGEN/libEVGEN.pkg | 4 +- 8 files changed, 495 insertions(+), 5 deletions(-) create mode 100644 EVGEN/AliGenSlowNucleons.cxx create mode 100644 EVGEN/AliGenSlowNucleons.h create mode 100644 EVGEN/AliSlowNucleonModel.cxx create mode 100644 EVGEN/AliSlowNucleonModel.h create mode 100644 EVGEN/AliSlowNucleonModelExp.cxx create mode 100644 EVGEN/AliSlowNucleonModelExp.h diff --git a/EVGEN/AliGenSlowNucleons.cxx b/EVGEN/AliGenSlowNucleons.cxx new file mode 100644 index 00000000000..ba0388521cb --- /dev/null +++ b/EVGEN/AliGenSlowNucleons.cxx @@ -0,0 +1,245 @@ +/************************************************************************** + * 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. * + **************************************************************************/ + +/* +$Log$ +*/ + +/* + Generator for slow nucluons in pA interactions. + Source is modelled by a relativistic Maxwell distributions. + Original code by Ferenc Sikler + */ + +#include +#include +#include + +#include "AliCollisionGeometry.h" +#include "AliGenSlowNucleons.h" +#include "AliSlowNucleonModel.h" + + ClassImp(AliGenSlowNucleons) + + AliGenSlowNucleons::AliGenSlowNucleons():AliGenerator(-1) +{ +// Default constructor + fSlowNucleonModel = 0; + fCollisionGeometry = 0; +} + +AliGenSlowNucleons::AliGenSlowNucleons(Int_t npart) + :AliGenerator(npart) +{ +// Constructor + fName = "SlowNucleons"; + fTitle = "Generator for gray particles in pA collisions"; + SetPmax(); + SetTarget(); + SetNominalCmsEnergy(); + SetCharge(); + SetTemperature(); + SetBetaSource(); + fSlowNucleonModel = new AliSlowNucleonModel(); + fCollisionGeometry = 0; + fDebug = 0; +} + +//____________________________________________________________ +AliGenSlowNucleons::~AliGenSlowNucleons() +{ +// Destructor + delete fSlowNucleonModel; +} + + +void AliGenSlowNucleons::Init() +{ + // + // Initialization + // + Float_t kMass = TDatabasePDG::Instance()->GetParticle(kProton)->Mass(); + fMomentum = fCMS/2. * fZTarget / fATarget; + fBeta = fMomentum / TMath::Sqrt(kMass * kMass + fMomentum * fMomentum); + if (fDebug) { + fDebugHist = new TH2F("DebugHist", "N_heavy vs nu", 50, 0., 50., 50, 0., 50.); + } +} + +void AliGenSlowNucleons::FinishRun() +{ + if (fDebug) { + fDebugHist->Draw(); + } +} + + +void AliGenSlowNucleons::Generate() +{ + // + // Generate one event + // + // + // Communication with Gray Particle Model + // + Int_t ngp, ngn, nbp, nbn; + + Float_t b = fCollisionGeometry->ImpactParameter(); + Int_t nn = fCollisionGeometry->NN(); + Int_t nwn = fCollisionGeometry->NwN(); + Int_t nnw = fCollisionGeometry->NNw(); + Int_t nwnw = fCollisionGeometry->NwNw(); + + printf("AliGenSlowNucleons: Impact parameter from Collision Geometry %f %d %d %d %d\n", + b, nn, nwn, nnw, nwnw); + + fSlowNucleonModel->GetNumberOfSlowNucleons(fCollisionGeometry, ngp, ngn, nbp, nbn); + + if (fDebug) { + printf("nucleons %d %d %d %d \n", ngp, ngn, nbp, nbn); + + fDebugHist->Fill(Float_t(ngp + ngn + nbp + nbn), fCollisionGeometry->NwN(), 1.); + } + + + // + Float_t p[3]; + Float_t origin[3] = {0., 0., 0.}; + Float_t polar [3] = {0., 0., 0.}; + Int_t nt, i; + Int_t kf; +// +// Gray protons +// + fCharge = 1; + kf = kProton; + for(i = 0; i < ngp; i++) { + GenerateSlow(fCharge, fTemperatureG, fBetaSourceG, p); + SetTrack(fTrackIt, -1, kf, p, origin, polar, + 0., kPNoProcess, nt, 1.); + KeepTrack(nt); + } +// +// Gray neutrons +// + fCharge = 0; + kf = kNeutron; + for(i = 0; i < ngn; i++) { + GenerateSlow(fCharge, fTemperatureG, fBetaSourceG, p); + SetTrack(fTrackIt, -1, kf, p, origin, polar, + 0., kPNoProcess, nt, 1.); + KeepTrack(nt); + } +// +// Black protons +// + fCharge = 1; + kf = kProton; + for(i = 0; i < nbp; i++) { + GenerateSlow(fCharge, fTemperatureB, fBetaSourceB, p); + SetTrack(fTrackIt, -1, kf, p, origin, polar, + 0., kPNoProcess, nt, 1.); + KeepTrack(nt); + } +// +// Black neutrons +// + fCharge = 0; + kf = kNeutron; + for(i = 0; i < nbn; i++) { + GenerateSlow(fCharge, fTemperatureB, fBetaSourceB, p); + SetTrack(fTrackIt, -1, kf, p, origin, polar, + 0., kPNoProcess, nt, 1.); + KeepTrack(nt); + } +} + + + + +void AliGenSlowNucleons::GenerateSlow(Int_t charge, Double_t T, Double_t beta, Float_t* q) +/* + Emit a slow nucleon with "temperature" T [GeV], + from a source moving with velocity beta + Three-momentum [GeV/c] is given back in q[3] +*/ + +{ + Double_t m, pmax, p, f, theta, phi; + + TDatabasePDG * pdg = TDatabasePDG::Instance(); + const Double_t kMassProton = pdg->GetParticle(kProton) ->Mass(); + const Double_t kMassNeutron = pdg->GetParticle(kNeutron)->Mass(); + + /* Select nucleon type */ + if(charge == 0) m = kMassNeutron; + else m = kMassProton; + + /* Momentum at maximum of Maxwell-distribution */ + + pmax = TMath::Sqrt(2*T*(T+sqrt(T*T+m*m))); + + /* Try until proper momentum */ + /* for lack of primitive function of the Maxwell-distribution */ + /* a brute force trial-accept loop, normalized at pmax */ + + do + { + p = Rndm() * fPmax; + f = Maxwell(m, p, T) / Maxwell(m , pmax, T); + } + while(f < Rndm()); + + /* Spherical symmetric emission */ + theta = TMath::ACos(2. * Rndm() - 1.); + phi = 2. * TMath::Pi() * Rndm(); + + /* Determine momentum components in system of the moving source */ + q[0] = p * TMath::Sin(theta) * TMath::Cos(phi); + q[1] = p * TMath::Sin(theta) * TMath::Sin(phi); + q[2] = p * TMath::Cos(theta); + + /* Transform to system of the target nucleus */ + /* beta is passed as negative, because the gray nucleons are slowed down */ + Lorentz(m, -beta, q); + + /* Transform to laboratory system */ + Lorentz(m, fBeta, q); +} + +Double_t AliGenSlowNucleons::Maxwell(Double_t m, Double_t p, Double_t T) +{ +/* Relativistic Maxwell-distribution */ + Double_t ekin; + ekin = TMath::Sqrt(p*p+m*m)-m; + return (p*p * exp(-ekin/T)); +} + + +void AliGenSlowNucleons::Lorentz(Double_t m, Double_t beta, Float_t* q) +{ +/* Lorentz transform in the direction of q[2] */ + + Double_t gamma = 1/sqrt(1-beta*beta); + Double_t energy = sqrt(m*m + q[0]*q[0] + q[1]*q[1] + q[2]*q[2]); + q[2] = gamma * (q[2] + beta*energy); +} + + + + + + + diff --git a/EVGEN/AliGenSlowNucleons.h b/EVGEN/AliGenSlowNucleons.h new file mode 100644 index 00000000000..aa48c3ed2b6 --- /dev/null +++ b/EVGEN/AliGenSlowNucleons.h @@ -0,0 +1,67 @@ +#ifndef ALIGENSLOWNUCLEONS_H +#define ALIGENSLOWNUCLEONS_H +/* Copyright(c) 198-1999, ALICE Experiment at CERN, All rights reserved. * + * See cxx source for full Copyright notice */ + +/* $Id$ */ + +#include "AliGenerator.h" +class AliSlowNucleonModel; +class TH2F; + + +class AliGenSlowNucleons : public AliGenerator +{ +public: + AliGenSlowNucleons(); + AliGenSlowNucleons(Int_t npart); + virtual ~AliGenSlowNucleons(); + virtual void Init(); + virtual void FinishRun(); + virtual void Generate(); + virtual void SetPmax(Float_t pmax = 10.) {fPmax = pmax;} + virtual void SetNominalCmsEnergy(Float_t energy = 14000.) {fCMS = energy;} + virtual void SetTarget(Float_t a=208, Float_t z=82) {fATarget = a; fZTarget = z;} + virtual void SetCharge(Int_t c = 1) {fCharge = c;} + virtual void SetTemperature(Double_t t1 = 0.04, Double_t t2 = 0.004) + {fTemperatureG = t1; fTemperatureB = t2;} + virtual void SetBetaSource(Double_t b1 = 0.05, Double_t b2 = 0.) + {fBetaSourceG = b1; fBetaSourceB = b2;} + // + virtual void SetSlowNucleonModel(AliSlowNucleonModel* model) + {fSlowNucleonModel = model;} + virtual Bool_t NeedsCollisionGeometry() const {return kTRUE;} + virtual void SetCollisionGeometry(AliCollisionGeometry* geom) + {fCollisionGeometry = geom;} + virtual void SetDebug(Int_t flag = 0) {fDebug = flag;} + + protected: + void GenerateSlow(Int_t charge, Double_t T, Double_t beta, Float_t* q); + Double_t Maxwell(Double_t m, Double_t p, Double_t t); + void Lorentz(Double_t m, Double_t beta, Float_t* q); + protected: + Float_t fCMS; // Center of mass energy + Float_t fMomentum; // Target nucleus momentum + Float_t fBeta; // Target nucleus beta + Float_t fPmax; // Maximum slow nucleon momentum + Float_t fATarget; // Target nucleus mass number + Float_t fZTarget; // Target nucleus charge number + Int_t fCharge; // Slow nucleon charge + Float_t fTemperatureG; // Source Temperature for gray nucleons + Float_t fBetaSourceG; // Source beta for gray nucleons + Float_t fTemperatureB; // Source Temperature for black nucleons + Float_t fBetaSourceB; // Source beta for black nucleons + Int_t fDebug; // Debug flag + TH2F* fDebugHist; // Histogram for debugging + + // + AliSlowNucleonModel* fSlowNucleonModel; // The slow nucleon model + ClassDef(AliGenSlowNucleons,1) // Slow Nucleon Generator +}; +#endif + + + + + + diff --git a/EVGEN/AliSlowNucleonModel.cxx b/EVGEN/AliSlowNucleonModel.cxx new file mode 100644 index 00000000000..91517175932 --- /dev/null +++ b/EVGEN/AliSlowNucleonModel.cxx @@ -0,0 +1,23 @@ +/************************************************************************** + * 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. * + **************************************************************************/ + +/* +$Log$ +*/ + + +#include "AliSlowNucleonModel.h" +#include "AliCollisionGeometry.h" +ClassImp(AliSlowNucleonModel) diff --git a/EVGEN/AliSlowNucleonModel.h b/EVGEN/AliSlowNucleonModel.h new file mode 100644 index 00000000000..0fc4997880e --- /dev/null +++ b/EVGEN/AliSlowNucleonModel.h @@ -0,0 +1,29 @@ +#ifndef ALISLOWNUCLEONMODEL_H +#define ALISLOWNUCLEONMODEL_H +/* Copyright(c) 198-1999, ALICE Experiment at CERN, All rights reserved. * + * See cxx source for full Copyright notice */ + +/* $Id$ */ + +#include "TObject.h" +class AliCollisionGeometry; + +class AliSlowNucleonModel : public TObject +{ +public: + AliSlowNucleonModel() {;} + virtual ~AliSlowNucleonModel(){;} + virtual void GetNumberOfSlowNucleons(AliCollisionGeometry* geo, + Int_t& ngp, Int_t& ngn, + Int_t& nbp, Int_t& nbn) {;} + + protected: + ClassDef(AliSlowNucleonModel,1) // Gray Particle Model +}; +#endif + + + + + + diff --git a/EVGEN/AliSlowNucleonModelExp.cxx b/EVGEN/AliSlowNucleonModelExp.cxx new file mode 100644 index 00000000000..a7f4f3c0e6a --- /dev/null +++ b/EVGEN/AliSlowNucleonModelExp.cxx @@ -0,0 +1,91 @@ +/************************************************************************** + * 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. * + **************************************************************************/ + +/* +$Log$ +*/ + + +// Experimental data inspired Gray Particle Model for p-Pb collisions +// +// The number of gray nucleons is proportional to the number of collisions. +// The number of black nucleons is proportional to the number of collisions +// Fluctuations are calculated from a binomial distribution. +// + +#include "AliSlowNucleonModelExp.h" +#include "AliCollisionGeometry.h" +#include + +ClassImp(AliSlowNucleonModelExp) + +AliSlowNucleonModelExp::AliSlowNucleonModelExp() +{ +// Default constructor + fP = 82; + fN = 208 - 82; + fAlphaGray = 2.; + fAlphaBlack = 4.; +} + + +void AliSlowNucleonModelExp::GetNumberOfSlowNucleons(AliCollisionGeometry* geo, + Int_t& ngp, Int_t& ngn, Int_t & nbp, Int_t & nbn) +{ +// +// Return the number of black and gray nucleons +// +// Number of collisions + + Int_t nu = geo->NwN() + geo->NNw(); + +// Mean number of gray nucleons + + Float_t nGray = fAlphaGray * nu; + Float_t nGrayNeutrons = nGray * fN / (fN + fP); + Float_t nGrayProtons = nGray - nGrayNeutrons; + +// Mean number of black nucleons + Float_t nBlack = fAlphaBlack * nu; + Float_t nBlackNeutrons = nBlack * fN / (fN + fP); + Float_t nBlackProtons = nBlack - nBlackNeutrons; + +// Actual number (including fluctuations) from binomial distribution + Double_t p; + +// gray neutrons + p = nGrayNeutrons/fN; + ngn = gRandom->Binomial((Int_t) fN, p); + +// gray protons + p = nGrayProtons/fP; + ngp = gRandom->Binomial((Int_t) fP, p); + +// black neutrons + p = nBlackNeutrons/fN; + nbn = gRandom->Binomial((Int_t) fN, p); + +// black protons + p = nBlackProtons/fP; + nbp = gRandom->Binomial((Int_t) fP, p); + +} + +void AliSlowNucleonModelExp::SetParameters(Float_t alpha1, Float_t alpha2) +{ + // Set the model parameters + fAlphaGray = alpha1; + fAlphaBlack = alpha2; +} diff --git a/EVGEN/AliSlowNucleonModelExp.h b/EVGEN/AliSlowNucleonModelExp.h new file mode 100644 index 00000000000..2a14b7415d5 --- /dev/null +++ b/EVGEN/AliSlowNucleonModelExp.h @@ -0,0 +1,35 @@ +#ifndef ALISLOWNUCLEONMODELEXP_H +#define ALISLOWNUCLEONMODELEXP_H +/* Copyright(c) 198-1999, ALICE Experiment at CERN, All rights reserved. * + * See cxx source for full Copyright notice */ + +/* $Id$ */ + +#include "AliSlowNucleonModel.h" + +class AliCollisionGeometry; + +class AliSlowNucleonModelExp : public AliSlowNucleonModel +{ + public: + AliSlowNucleonModelExp(); + virtual ~AliSlowNucleonModelExp(){;} + virtual void GetNumberOfSlowNucleons(AliCollisionGeometry* geo, + Int_t& ngp, Int_t& ngn, Int_t& nbp, Int_t& nbn); + virtual void SetParameters(Float_t alpha1, Float_t alpha2); + + protected: + Float_t fP; // Number of protons in the target + Float_t fN; // Number of neutrons in the target + Float_t fAlphaGray; // Proportionality between gray particles and number of collisions + Float_t fAlphaBlack; // Proportionality between black particles and number of collisions + + ClassDef(AliSlowNucleonModelExp,1) // Gray Particle Model (Experiment inspired) +}; +#endif + + + + + + diff --git a/EVGEN/EVGENLinkDef.h b/EVGEN/EVGENLinkDef.h index 5ff8c06a852..e031e985258 100644 --- a/EVGEN/EVGENLinkDef.h +++ b/EVGEN/EVGENLinkDef.h @@ -48,9 +48,9 @@ #pragma link C++ class AliGenAfterBurnerFlow+; #pragma link C++ class AliPartonicEnergyLoss+; #pragma link C++ class AliStructFuncType+; -#pragma link C++ class AliGenGrayParticles+; -#pragma link C++ class AliGrayParticleModel+; - +#pragma link C++ class AliGenSlowNucleons+; +#pragma link C++ class AliSlowNucleonModel+; +#pragma link C++ class AliSlowNucleonModelExp+; #endif diff --git a/EVGEN/libEVGEN.pkg b/EVGEN/libEVGEN.pkg index 75306a2bfde..1588c317673 100644 --- a/EVGEN/libEVGEN.pkg +++ b/EVGEN/libEVGEN.pkg @@ -15,9 +15,9 @@ SRCS = AliGenHIJINGpara.cxx AliGenBox.cxx AliGenFixed.cxx \ AliGenThetaSlice.cxx AliGenSTRANGElib.cxx AliGenBeamGas.cxx\ AliGenAfterBurnerFlow.cxx \ AliPartonicEnergyLoss.cxx\ - AliStructFuncType.cxx AliGenGrayParticles.cxx \ + AliStructFuncType.cxx AliGenSlowNucleons.cxx \ AliGenGeVSimEventHeader.cxx\ - AliGrayParticleModel.cxx + AliSlowNucleonModel.cxx AliSlowNucleonModelExp.cxx # Headerfiles for this particular package (Path respect to own directory) HDRS= $(SRCS:.cxx=.h) -- 2.31.1