--- /dev/null
+/**************************************************************************
+ * 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 <sikler@rmki.kfki.hu>
+ */
+
+#include <TDatabasePDG.h>
+#include <TPDGCode.h>
+#include <TH2F.h>
+
+#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);
+}
+
+
+
+
+
+
+
--- /dev/null
+#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
+
+
+
+
+
+
--- /dev/null
+/**************************************************************************
+ * 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)
--- /dev/null
+#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
+
+
+
+
+
+
--- /dev/null
+/**************************************************************************
+ * 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 <TRandom.h>
+
+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;
+}
--- /dev/null
+#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
+
+
+
+
+
+
#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
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)