#include <Riostream.h>
#include <TMath.h>
#include <TEllipse.h>
#include <TNamed.h>
#include <TObjArray.h>
#include <TF1.h>
#include <TRandom.h>
#include "AliGlauberNucleon.h"
#include "AliGlauberNucleus.h"
using std::cout;
using std::endl;
using std::cerr;
ClassImp(AliGlauberNucleus)
AliGlauberNucleus::AliGlauberNucleus(Option_t* iname, Int_t iN, Double_t iR, Double_t ia, Double_t iw, TF1* ifunc) :
TNamed(iname,""),
fN(iN),
fR(iR),
fA(ia),
fW(iw),
fMinDist(-1),
fF(0),
fTrials(0),
fFunction(ifunc),
fNucleons(NULL)
{
if (fN==0) {
cout << "Setting up nucleus " << iname << endl;
Lookup(iname);
}
}
AliGlauberNucleus::~AliGlauberNucleus()
{
if (fNucleons) {
delete fNucleons;
}
delete fFunction;
}
AliGlauberNucleus::AliGlauberNucleus(const AliGlauberNucleus& in):
TNamed(in),
fN(in.fN),
fR(in.fR),
fA(in.fA),
fW(in.fW),
fMinDist(in.fMinDist),
fF(in.fF),
fTrials(in.fTrials),
fFunction(in.fFunction),
fNucleons(NULL)
{
if (in.fNucleons)
fNucleons=static_cast<TObjArray*>((in.fNucleons)->Clone());
}
AliGlauberNucleus& AliGlauberNucleus::operator=(const AliGlauberNucleus& in)
{
if (&in==this) return *this;
fN=in.fN;
fR=in.fR;
fA=in.fA;
fW=in.fW;
fMinDist=in.fMinDist;
fF=in.fF;
fTrials=in.fTrials;
fFunction=in.fFunction;
delete fNucleons;
fNucleons=static_cast<TObjArray*>((in.fNucleons)->Clone());
fNucleons->SetOwner();
return *this;
}
void AliGlauberNucleus::Draw(Double_t xs, Int_t col)
{
Double_t r = 0.5*sqrt(xs/TMath::Pi()/10.);
TEllipse e;
e.SetLineColor(col);
e.SetFillColor(0);
e.SetLineWidth(1);
for (Int_t i = 0;i<fNucleons->GetEntries();++i) {
AliGlauberNucleon* gn = (AliGlauberNucleon*) fNucleons->UncheckedAt(i);
e.SetLineStyle(1);
if (gn->IsSpectator()) e.SetLineStyle(3);
e.DrawEllipse(gn->GetX(),gn->GetY(),r,r,0,360,0,"");
}
}
void AliGlauberNucleus::Lookup(Option_t* name)
{
SetName(name);
if (TString(name) == "p") {fN = 1; fR = 0.6; fA = 0; fW = 0; fF = 0;}
else if (TString(name) == "d") {fN = 2; fR = 0.01; fA = 0.5882; fW = 0; fF = 1;}
else if (TString(name) == "dh") {fN = 2; fR = 0.01; fA = 0.5882; fW = 0; fF = 3;}
else if (TString(name) == "dhh") {fN = 2; fR = 0.01; fA = 0.5882; fW = 0; fF = 4;}
else if (TString(name) == "O") {fN = 16; fR = 2.608; fA = 0.513; fW = -0.051; fF = 1;}
else if (TString(name) == "Si") {fN = 28; fR = 3.34; fA = 0.580; fW = -0.233; fF = 1;}
else if (TString(name) == "S") {fN = 32; fR = 2.54; fA = 2.191; fW = 0.16; fF = 2;}
else if (TString(name) == "Ca") {fN = 40; fR = 3.766; fA = 0.586; fW = -0.161; fF = 1;}
else if (TString(name) == "Ni") {fN = 58; fR = 4.309; fA = 0.517; fW = -0.1308; fF = 1;}
else if (TString(name) == "Cu") {fN = 63; fR = 4.2; fA = 0.596; fW = 0; fF = 1;}
else if (TString(name) == "W") {fN = 186; fR = 6.58; fA = 0.480; fW = 0; fF = 1;}
else if (TString(name) == "Au") {fN = 197; fR = 6.38; fA = 0.535; fW = 0; fF = 1;}
else if (TString(name) == "Pb") {fN = 208; fR = 6.62; fA = 0.546; fW = 0; fF = 1;}
else if (TString(name) == "U") {fN = 238; fR = 6.81; fA = 0.6; fW = 0; fF = 1;}
else {
cout << "Could not find nucleus " << name << endl;
return;
}
switch (fF)
{
case 0:
fFunction = new TF1("prot","x*x*exp(-x/[0])",0,10);
fFunction->SetParameter(0,fR);
break;
case 1:
fFunction = new TF1(name,"x*x*(1+[2]*(x/[0])**2)/(1+exp((x-[0])/[1]))",0,15);
fFunction->SetParameters(fR,fA,fW);
break;
case 2:
fFunction = new TF1("3pg","x*x*(1+[2]*(x/[0])**2)/(1+exp((x**2-[0]**2)/[1]**2))",0,15);
fFunction->SetParameters(fR,fA,fW);
break;
case 3:
fFunction = new TF1("f3","x*x*([0]*[1]*([0]+[1]))/(2*pi*(pow([0]-[1],2)))*pow((exp(-[0]*x)-exp(-[1]*x))/x,2)",0,10);
fFunction->SetParameters(1/4.38,1/.85);
break;
case 4:
fFunction = new TF1("f4","x*x*([0]*[1]*([0]+[1]))/(2*pi*(pow([0]-[1],2)))*pow((exp(-[0]*x)-exp(-[1]*x))/x,2)",0,20);
fFunction->SetParameters(2/4.38,2/.85);
break;
default:
cerr << "Could not find function type " << fF << endl;
return;
}
}
void AliGlauberNucleus::SetR(Double_t ir)
{
fR = ir;
switch (fF)
{
case 0:
fFunction->SetParameter(0,fR);
break;
case 1:
fFunction->SetParameter(0,fR);
break;
case 2:
fFunction->SetParameter(0,fR);
break;
}
}
void AliGlauberNucleus::SetA(Double_t ia)
{
fA = ia;
switch (fF)
{
case 0:
break;
case 1:
fFunction->SetParameter(1,fA);
break;
case 2:
fFunction->SetParameter(1,fA);
break;
}
}
void AliGlauberNucleus::SetW(Double_t iw)
{
fW = iw;
switch (fF)
{
case 0:
break;
case 1:
fFunction->SetParameter(2,fW);
break;
case 2:
fFunction->SetParameter(2,fW);
break;
}
}
void AliGlauberNucleus::ThrowNucleons(Double_t xshift)
{
if (fNucleons==0) {
fNucleons=new TObjArray(fN);
fNucleons->SetOwner();
for(Int_t i=0;i<fN;i++) {
AliGlauberNucleon *nucleon=new AliGlauberNucleon();
fNucleons->Add(nucleon);
}
}
fTrials = 0;
Double_t sumx=0;
Double_t sumy=0;
Double_t sumz=0;
Bool_t hulthen = (TString(GetName())=="dh");
if (fN==2 && hulthen) {
Double_t r = fFunction->GetRandom()/2;
Double_t phi = gRandom->Rndm() * 2 * TMath::Pi() ;
Double_t ctheta = 2*gRandom->Rndm() - 1 ;
Double_t stheta = sqrt(1-ctheta*ctheta);
AliGlauberNucleon *nucleon1=(AliGlauberNucleon*)(fNucleons->UncheckedAt(0));
AliGlauberNucleon *nucleon2=(AliGlauberNucleon*)(fNucleons->UncheckedAt(1));
nucleon1->Reset();
nucleon1->SetXYZ(r * stheta * cos(phi) + xshift,
r * stheta * sin(phi),
r * ctheta);
nucleon2->Reset();
nucleon2->SetXYZ(-nucleon1->GetX() + 2*xshift,
-nucleon1->GetY(),
-nucleon1->GetZ());
fTrials = 1;
return;
}
for (Int_t i = 0; i<fN; i++) {
AliGlauberNucleon *nucleon=(AliGlauberNucleon*)(fNucleons->UncheckedAt(i));
nucleon->Reset();
while(1) {
fTrials++;
Double_t r = fFunction->GetRandom();
Double_t phi = gRandom->Rndm() * 2 * TMath::Pi() ;
Double_t ctheta = 2*gRandom->Rndm() - 1 ;
Double_t stheta = TMath::Sqrt(1-ctheta*ctheta);
Double_t x = r * stheta * cos(phi) + xshift;
Double_t y = r * stheta * sin(phi);
Double_t z = r * ctheta;
nucleon->SetXYZ(x,y,z);
if(fMinDist<0) break;
Bool_t test=1;
for (Int_t j = 0; j<i; j++) {
AliGlauberNucleon *other=(AliGlauberNucleon*)fNucleons->UncheckedAt(j);
Double_t xo=other->GetX();
Double_t yo=other->GetY();
Double_t zo=other->GetZ();
Double_t dist = TMath::Sqrt((x-xo)*(x-xo)+
(y-yo)*(y-yo)+
(z-zo)*(z-zo));
if(dist<fMinDist) {
test=0;
break;
}
}
if (test) break;
}
sumx += nucleon->GetX();
sumy += nucleon->GetY();
sumz += nucleon->GetZ();
}
if(1) {
sumx = sumx/fN;
sumy = sumy/fN;
sumz = sumz/fN;
for (Int_t i = 0; i<fN; i++) {
AliGlauberNucleon *nucleon=(AliGlauberNucleon*)(fNucleons->UncheckedAt(i));
nucleon->SetXYZ(nucleon->GetX()-sumx-xshift,
nucleon->GetY()-sumy,
nucleon->GetZ()-sumz);
}
}
}
AliGlauberNucleus.cxx:100 AliGlauberNucleus.cxx:101 AliGlauberNucleus.cxx:102 AliGlauberNucleus.cxx:103 AliGlauberNucleus.cxx:104 AliGlauberNucleus.cxx:105 AliGlauberNucleus.cxx:106 AliGlauberNucleus.cxx:107 AliGlauberNucleus.cxx:108 AliGlauberNucleus.cxx:109 AliGlauberNucleus.cxx:110 AliGlauberNucleus.cxx:111 AliGlauberNucleus.cxx:112 AliGlauberNucleus.cxx:113 AliGlauberNucleus.cxx:114 AliGlauberNucleus.cxx:115 AliGlauberNucleus.cxx:116 AliGlauberNucleus.cxx:117 AliGlauberNucleus.cxx:118 AliGlauberNucleus.cxx:119 AliGlauberNucleus.cxx:120 AliGlauberNucleus.cxx:121 AliGlauberNucleus.cxx:122 AliGlauberNucleus.cxx:123 AliGlauberNucleus.cxx:124 AliGlauberNucleus.cxx:125 AliGlauberNucleus.cxx:126 AliGlauberNucleus.cxx:127 AliGlauberNucleus.cxx:128 AliGlauberNucleus.cxx:129 AliGlauberNucleus.cxx:130 AliGlauberNucleus.cxx:131 AliGlauberNucleus.cxx:132 AliGlauberNucleus.cxx:133 AliGlauberNucleus.cxx:134 AliGlauberNucleus.cxx:135 AliGlauberNucleus.cxx:136 AliGlauberNucleus.cxx:137 AliGlauberNucleus.cxx:138 AliGlauberNucleus.cxx:139 AliGlauberNucleus.cxx:140 AliGlauberNucleus.cxx:141 AliGlauberNucleus.cxx:142 AliGlauberNucleus.cxx:143 AliGlauberNucleus.cxx:144 AliGlauberNucleus.cxx:145 AliGlauberNucleus.cxx:146 AliGlauberNucleus.cxx:147 AliGlauberNucleus.cxx:148 AliGlauberNucleus.cxx:149 AliGlauberNucleus.cxx:150 AliGlauberNucleus.cxx:151 AliGlauberNucleus.cxx:152 AliGlauberNucleus.cxx:153 AliGlauberNucleus.cxx:154 AliGlauberNucleus.cxx:155 AliGlauberNucleus.cxx:156 AliGlauberNucleus.cxx:157 AliGlauberNucleus.cxx:158 AliGlauberNucleus.cxx:159 AliGlauberNucleus.cxx:160 AliGlauberNucleus.cxx:161 AliGlauberNucleus.cxx:162 AliGlauberNucleus.cxx:163 AliGlauberNucleus.cxx:164 AliGlauberNucleus.cxx:165 AliGlauberNucleus.cxx:166 AliGlauberNucleus.cxx:167 AliGlauberNucleus.cxx:168 AliGlauberNucleus.cxx:169 AliGlauberNucleus.cxx:170 AliGlauberNucleus.cxx:171 AliGlauberNucleus.cxx:172 AliGlauberNucleus.cxx:173 AliGlauberNucleus.cxx:174 AliGlauberNucleus.cxx:175 AliGlauberNucleus.cxx:176 AliGlauberNucleus.cxx:177 AliGlauberNucleus.cxx:178 AliGlauberNucleus.cxx:179 AliGlauberNucleus.cxx:180 AliGlauberNucleus.cxx:181 AliGlauberNucleus.cxx:182 AliGlauberNucleus.cxx:183 AliGlauberNucleus.cxx:184 AliGlauberNucleus.cxx:185 AliGlauberNucleus.cxx:186 AliGlauberNucleus.cxx:187 AliGlauberNucleus.cxx:188 AliGlauberNucleus.cxx:189 AliGlauberNucleus.cxx:190 AliGlauberNucleus.cxx:191 AliGlauberNucleus.cxx:192 AliGlauberNucleus.cxx:193 AliGlauberNucleus.cxx:194 AliGlauberNucleus.cxx:195 AliGlauberNucleus.cxx:196 AliGlauberNucleus.cxx:197 AliGlauberNucleus.cxx:198 AliGlauberNucleus.cxx:199 AliGlauberNucleus.cxx:200 AliGlauberNucleus.cxx:201 AliGlauberNucleus.cxx:202 AliGlauberNucleus.cxx:203 AliGlauberNucleus.cxx:204 AliGlauberNucleus.cxx:205 AliGlauberNucleus.cxx:206 AliGlauberNucleus.cxx:207 AliGlauberNucleus.cxx:208 AliGlauberNucleus.cxx:209 AliGlauberNucleus.cxx:210 AliGlauberNucleus.cxx:211 AliGlauberNucleus.cxx:212 AliGlauberNucleus.cxx:213 AliGlauberNucleus.cxx:214 AliGlauberNucleus.cxx:215 AliGlauberNucleus.cxx:216 AliGlauberNucleus.cxx:217 AliGlauberNucleus.cxx:218 AliGlauberNucleus.cxx:219 AliGlauberNucleus.cxx:220 AliGlauberNucleus.cxx:221 AliGlauberNucleus.cxx:222 AliGlauberNucleus.cxx:223 AliGlauberNucleus.cxx:224 AliGlauberNucleus.cxx:225 AliGlauberNucleus.cxx:226 AliGlauberNucleus.cxx:227 AliGlauberNucleus.cxx:228 AliGlauberNucleus.cxx:229 AliGlauberNucleus.cxx:230 AliGlauberNucleus.cxx:231 AliGlauberNucleus.cxx:232 AliGlauberNucleus.cxx:233 AliGlauberNucleus.cxx:234 AliGlauberNucleus.cxx:235 AliGlauberNucleus.cxx:236 AliGlauberNucleus.cxx:237 AliGlauberNucleus.cxx:238 AliGlauberNucleus.cxx:239 AliGlauberNucleus.cxx:240 AliGlauberNucleus.cxx:241 AliGlauberNucleus.cxx:242 AliGlauberNucleus.cxx:243 AliGlauberNucleus.cxx:244 AliGlauberNucleus.cxx:245 AliGlauberNucleus.cxx:246 AliGlauberNucleus.cxx:247 AliGlauberNucleus.cxx:248 AliGlauberNucleus.cxx:249 AliGlauberNucleus.cxx:250 AliGlauberNucleus.cxx:251 AliGlauberNucleus.cxx:252 AliGlauberNucleus.cxx:253 AliGlauberNucleus.cxx:254 AliGlauberNucleus.cxx:255 AliGlauberNucleus.cxx:256 AliGlauberNucleus.cxx:257 AliGlauberNucleus.cxx:258 AliGlauberNucleus.cxx:259 AliGlauberNucleus.cxx:260 AliGlauberNucleus.cxx:261 AliGlauberNucleus.cxx:262 AliGlauberNucleus.cxx:263 AliGlauberNucleus.cxx:264 AliGlauberNucleus.cxx:265 AliGlauberNucleus.cxx:266 AliGlauberNucleus.cxx:267 AliGlauberNucleus.cxx:268 AliGlauberNucleus.cxx:269 AliGlauberNucleus.cxx:270 AliGlauberNucleus.cxx:271 AliGlauberNucleus.cxx:272 AliGlauberNucleus.cxx:273 AliGlauberNucleus.cxx:274 AliGlauberNucleus.cxx:275 AliGlauberNucleus.cxx:276 AliGlauberNucleus.cxx:277 AliGlauberNucleus.cxx:278 AliGlauberNucleus.cxx:279 AliGlauberNucleus.cxx:280 AliGlauberNucleus.cxx:281 AliGlauberNucleus.cxx:282 AliGlauberNucleus.cxx:283 AliGlauberNucleus.cxx:284 AliGlauberNucleus.cxx:285 AliGlauberNucleus.cxx:286 AliGlauberNucleus.cxx:287 AliGlauberNucleus.cxx:288 AliGlauberNucleus.cxx:289 AliGlauberNucleus.cxx:290 AliGlauberNucleus.cxx:291 AliGlauberNucleus.cxx:292 AliGlauberNucleus.cxx:293 AliGlauberNucleus.cxx:294 AliGlauberNucleus.cxx:295 AliGlauberNucleus.cxx:296 AliGlauberNucleus.cxx:297 AliGlauberNucleus.cxx:298 AliGlauberNucleus.cxx:299 AliGlauberNucleus.cxx:300 AliGlauberNucleus.cxx:301 AliGlauberNucleus.cxx:302 AliGlauberNucleus.cxx:303 AliGlauberNucleus.cxx:304 AliGlauberNucleus.cxx:305 AliGlauberNucleus.cxx:306 AliGlauberNucleus.cxx:307 AliGlauberNucleus.cxx:308 AliGlauberNucleus.cxx:309 AliGlauberNucleus.cxx:310 AliGlauberNucleus.cxx:311 AliGlauberNucleus.cxx:312 AliGlauberNucleus.cxx:313 AliGlauberNucleus.cxx:314 AliGlauberNucleus.cxx:315 AliGlauberNucleus.cxx:316 AliGlauberNucleus.cxx:317