1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
19 // Realisation of AliLhcProcess for the fast simulation of the
20 // Intra Beam Scattering process
21 // in transverse and longitudinal direction.
22 // Author: Andreas Morsch
23 // andreas.morsch@cern.ch
31 #include <TMultiGraph.h>
33 #include "AliLhcProcessIBS.h"
35 #include "AliLhcIRegion.h"
36 #include "AliLhcBeam.h"
38 ClassImp(AliLhcProcessIBS)
40 Double_t func(Double_t *x, Double_t *par);
42 AliLhcProcessIBS::AliLhcProcessIBS(AliLHC* lhc, const char* name, const char* title)
43 :AliLhcProcess(lhc,name,title),
54 AliLhcProcessIBS::AliLhcProcessIBS(const AliLhcProcessIBS& ibs):
67 AliLhcProcessIBS::~AliLhcProcessIBS()
73 void AliLhcProcessIBS::Init()
76 const Float_t r0=1.535e-16;
78 printf("\n Initializing Process %s", GetName());
79 printf("\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
81 fIRegions = fAccelerator->IRegions();
83 for (Int_t i = 0; i < 2; i++) {
84 fBeam[i] = fAccelerator->Beam(i);
85 fR[i] = r0*fBeam[i]->Z()*fBeam[i]->Z()/fBeam[i]->A();
86 fE[i] = 0.938*fBeam[i]->A();
90 void AliLhcProcessIBS::Evolve(Float_t dt)
93 // Evolve by one time step dt
94 printf("\n Here process %s %f:", GetName(), dt);
95 for (Int_t i=0; i<2; i++) {
97 Float_t sige = fBeam[i]->EnergySpread();
98 Float_t avbeta = fAccelerator->AverageBeta();
99 Float_t avd = fAccelerator->AverageDisp();
101 Float_t gamma = fBeam[i]->Gamma();
102 Float_t epsx = fBeam[i]->Emittance()*gamma;
104 Float_t epse = fBeam[i]->LongEmittance();
105 Float_t sigxb = TMath::Sqrt(epsx/gamma*avbeta);
106 Float_t sigx = TMath::Sqrt(sigxb*sigxb+(avd*avd*sige*sige));
107 Float_t ssigx = TMath::Sqrt(epsx/gamma/avbeta);
109 Float_t ssigy = ssigx;
111 Float_t asd = fBeam[i]->N()*fR[i]*fR[i]*fE[i]/
112 (16.*TMath::Pi()*gamma*epsx*epsy*epse);
115 Float_t d = sige*avd/sigx;
117 Float_t at = sige*TMath::Sqrt((1.-d)*(1.+d))/(gamma*ssigx);
118 Float_t bt = sige*TMath::Sqrt((1.-d)*(1.+d))/(gamma*ssigy);
119 Float_t ct = sige*TMath::Sqrt((1.-d)*(1.+d))*TMath::Sqrt(4.*sigy/fR[i]);
125 TF1 *fct = new TF1("func",func, 0., 1., 3);
127 Float_t f = (Float_t) 8.0*TMath::Pi()*
128 fct->Integral(0., 1., par, 1.e-5);
130 const Double_t osq2=1./TMath::Sqrt(2.);
131 fTaux = 1./(asd*f*(d-osq2*at)*(d+osq2*at));
132 fTaue = 1./(asd*f*((1.-d)*(1.+d)));
133 // printf("\n taux, taue %f %f", taux, taue);
134 // Float_t tauy = -2./at*at/asd/f;
135 fBeam[i]->IncreaseEmittance(dt/fTaux, dt/fTaue);
140 void AliLhcProcessIBS::SetMonitor(Int_t n)
142 // Initialize Monitor
143 if (fTauxArray) delete fTauxArray;
144 if (fTaueArray) delete fTaueArray;
145 fTauxArray = new Float_t[n];
146 fTaueArray = new Float_t[n];
150 void AliLhcProcessIBS::Record()
152 // Record monitor quantities
153 fTauxArray[fAccelerator->Nt()] = fTaux/3600.;
154 fTaueArray[fAccelerator->Nt()] = fTaue/3600.;
158 void AliLhcProcessIBS::DrawPlots()
160 // Draw monitor plots
161 Float_t* t = fAccelerator->TimeA();
163 TH1 *t1 = new TH1F("t1","Hor. IBS growth time",fNmax,0,t[fNmax]);
165 t1->SetMaximum(fTauxArray[fNmax]*1.1);
167 t1->GetXaxis()->SetTitle("t (h)");
168 t1->GetYaxis()->SetTitle("tau_x (t)");
170 TH1 *t2 = new TH1F("t2","Long. IBS growth time",fNmax,0,t[fNmax]);
172 t2->SetMaximum(fTaueArray[fNmax]*1.1);
174 t2->GetXaxis()->SetTitle("t (h)");
175 t2->GetYaxis()->SetTitle("tau_l (t)");
177 TGraph* grTaux = new TGraph(fNmax, fAccelerator->TimeA(), fTauxArray);
178 grTaux->SetHistogram(t1);
180 TGraph* grTaue = new TGraph(fNmax, fAccelerator->TimeA(), fTaueArray);
181 grTaue->SetHistogram(t2);
182 grTaue->SetLineStyle(2);
184 TMultiGraph* mg = new TMultiGraph();
188 TCanvas *c3 = new TCanvas("c3","IBS", 200, 10, 700, 500);
191 mg->GetXaxis()->SetTitle("t (h)");
192 mg->GetYaxis()->SetTitle("IBS Growth Time (h)");
200 AliLhcProcessIBS& AliLhcProcessIBS::operator=(const AliLhcProcessIBS & /*rhs*/)
202 // Assignment operator
206 Double_t func(Double_t *x, Double_t *par)
210 Double_t cc = par[2];
212 const Double_t kbc = 0.5772;
216 Double_t p=1.0/TMath::Sqrt(x2+a*a*x1);
217 Double_t q=1.0/TMath::Sqrt(x2+b*b*x1);
218 return (1.0-3.0*x2)*p*q*(2.0*TMath::Log(0.5*cc*(p+q))-kbc);