#include "TMath.h"
#include "TPDGCode.h"
#include "TMCProcess.h"
#include "TList.h"
#include "TVector3.h"
#include "TParticle.h"
#include "AliStack.h"
#include "AliRun.h"
#include "AliLog.h"
#include "AliMC.h"
#include "AliGenLightNuclei.h"
ClassImp(AliGenLightNuclei)
AliGenLightNuclei::AliGenLightNuclei()
:AliGenCocktail()
,fP0(0.200)
,fGenDeuterons(kTRUE)
,fGenTritons(kTRUE)
,fGenHe3Nuclei(kTRUE)
,fGenHe4Nuclei(kTRUE)
{
}
AliGenLightNuclei::~AliGenLightNuclei()
{
}
void AliGenLightNuclei::Generate()
{
AliGenCocktail::Generate();
TList* protons = new TList();
TList* neutrons = new TList();
TList* antiprotons = new TList();
TList* antineutrons = new TList();
for (Int_t i=0; i < fStack->GetNprimary(); ++i)
{
TParticle* iParticle = fStack->Particle(i);
if(iParticle->GetStatusCode() != 1) continue;
switch(iParticle->GetPdgCode())
{
case kProton:
protons->Add(iParticle);
break;
case kNeutron:
neutrons->Add(iParticle);
break;
case kProtonBar:
antiprotons->Add(iParticle);
break;
case kNeutronBar:
antineutrons->Add(iParticle);
break;
default:
break;
}
}
protons->SetOwner(kFALSE);
neutrons->SetOwner(kFALSE);
antiprotons->SetOwner(kFALSE);
antineutrons->SetOwner(kFALSE);
if(fGenHe4Nuclei)
{
this->GenerateHe4Nuclei(protons, neutrons);
this->GenerateHe4Nuclei(antiprotons, antineutrons);
}
if(fGenHe3Nuclei)
{
this->GenerateHe3Nuclei(protons, neutrons);
this->GenerateHe3Nuclei(antiprotons, antineutrons);
}
if(fGenTritons)
{
this->GenerateTritons(protons, neutrons);
this->GenerateTritons(antiprotons, antineutrons);
}
if(fGenDeuterons)
{
this->GenerateDeuterons(protons, neutrons);
this->GenerateDeuterons(antiprotons, antineutrons);
}
protons->Clear("nodelete");
neutrons->Clear("nodelete");
antiprotons->Clear("nodelete");
antineutrons->Clear("nodelete");
delete protons;
delete neutrons;
delete antiprotons;
delete antineutrons;
}
Bool_t AliGenLightNuclei::Coalescence(const TParticle* n1, const TParticle* n2) const
{
Double_t deltaP = 2.*this->GetPcm(n1->Px(), n1->Py(), n1->Pz(), n1->GetMass(),
n2->Px(), n2->Py(), n2->Pz(), n2->GetMass());
return ( deltaP < fP0);
}
TParticle* AliGenLightNuclei::FindPartner(const TParticle* n0, const TList* nucleons, const TParticle* nx) const
{
TIter n_next(nucleons);
while(TParticle* n1 = dynamic_cast<TParticle*>( n_next()) )
{
if(n1 == 0) continue;
if(n1 == nx) continue;
if(n1->GetStatusCode() == kCluster) continue;
if( !this->Coalescence(n0, n1) ) continue;
return n1;
}
return 0;
}
Int_t AliGenLightNuclei::GenerateDeuterons(const TList* protons, const TList* neutrons)
{
Int_t npart = 0;
TIter p_next(protons);
while(TParticle* n0 = dynamic_cast<TParticle*>(p_next()) )
{
if(n0 == 0) continue;
if(n0->GetStatusCode() == kCluster) continue;
TParticle* partner = this->FindPartner(n0, neutrons, 0);
if(partner == 0) continue;
this->PushDeuteron(n0, partner);
++npart;
}
return npart;
}
Int_t AliGenLightNuclei::GenerateTritons(const TList* protons, const TList* neutrons)
{
Int_t npart = 0;
TIter p_next(protons);
while(TParticle* n0 = dynamic_cast<TParticle*>(p_next()) )
{
if(n0 == 0) continue;
if(n0->GetStatusCode() == kCluster) continue;
TParticle* partner1 = this->FindPartner(n0, neutrons, 0);
if(partner1 == 0) continue;
TParticle* partner2 = this->FindPartner(n0, neutrons, partner1);
if(partner2 == 0) continue;
if(!this->Coalescence(partner1, partner2)) continue;
this->PushTriton(n0, partner1, partner2);
++npart;
}
return npart;
}
Int_t AliGenLightNuclei::GenerateHe3Nuclei(const TList* protons, const TList* neutrons)
{
Int_t npart = 0;
TIter p_next(protons);
while(TParticle* n0 = dynamic_cast<TParticle*>(p_next()) )
{
if(n0 == 0) continue;
if(n0->GetStatusCode() == kCluster) continue;
TParticle* partner1 = this->FindPartner(n0, neutrons, 0);
if(partner1 == 0) continue;
TParticle* partner2 = this->FindPartner(n0, protons, n0);
if(partner2 == 0) continue;
if(!this->Coalescence(partner1, partner2)) continue;
this->PushHe3Nucleus(n0, partner1, partner2);
++npart;
}
return npart;
}
Int_t AliGenLightNuclei::GenerateHe4Nuclei(const TList* protons, const TList* neutrons)
{
Int_t npart = 0;
TIter p_next(protons);
while(TParticle* n0 = dynamic_cast<TParticle*>(p_next()) )
{
if(n0 == 0) continue;
if(n0->GetStatusCode() == kCluster) continue;
TParticle* partner1 = this->FindPartner(n0, neutrons, 0);
if(partner1 == 0) continue;
TParticle* partner2 = this->FindPartner(n0, protons, n0);
if(partner2 == 0) continue;
TParticle* partner3 = this->FindPartner(n0, neutrons, partner1);
if(partner3 == 0) continue;
if(!this->Coalescence(partner1, partner2)) continue;
if(!this->Coalescence(partner1, partner3)) continue;
if(!this->Coalescence(partner2, partner3)) continue;
this->PushHe4Nucleus(n0, partner1, partner2, partner3 );
++npart;
}
return npart;
}
void AliGenLightNuclei::PushDeuteron(TParticle* parent1, TParticle* parent2)
{
Int_t pdg = ( parent1->GetPdgCode() > 0 ) ? kDeuteron : kAntiDeuteron;
this->PushNucleus(pdg, 1.87561282, parent1, parent2);
}
void AliGenLightNuclei::PushTriton(TParticle* parent1, TParticle* parent2, TParticle* parent3)
{
Int_t pdg = ( parent1->GetPdgCode() > 0 ) ? kTriton : kAntiTriton;
this->PushNucleus(pdg, 2.80925, parent1, parent2, parent3);
}
void AliGenLightNuclei::PushHe3Nucleus(TParticle* parent1, TParticle* parent2, TParticle* parent3)
{
Int_t pdg = ( parent1->GetPdgCode() > 0 ) ? kHe3Nucleus : kAntiHe3Nucleus;
this->PushNucleus(pdg, 2.80923, parent1, parent2, parent3);
}
void AliGenLightNuclei::PushHe4Nucleus(TParticle* parent1, TParticle* parent2, TParticle* parent3, TParticle* parent4)
{
Int_t pdg = ( parent1->GetPdgCode() > 0 ) ? kAlpha : kAntiAlpha;
this->PushNucleus(pdg, 3.727417, parent1, parent2, parent3, parent4);
}
void AliGenLightNuclei::PushNucleus(Int_t pdg, Double_t mass, TParticle* parent1, TParticle* parent2, TParticle* parent3, TParticle* parent4)
{
Int_t ntrk;
TVector3 p1(parent1->Px(), parent1->Py(), parent1->Pz());
TVector3 p2(parent2->Px(), parent2->Py(), parent2->Pz());
TVector3 p3(0, 0, 0);
TVector3 p4(0, 0, 0);
if(parent3 != 0) p3.SetXYZ(parent3->Px(), parent3->Py(), parent3->Pz());
if(parent4 != 0) p4.SetXYZ(parent4->Px(), parent4->Py(), parent4->Pz());
TVector3 pN = p1+p2+p3+p4;
Double_t energy = TMath::Sqrt(pN.Mag2() + mass*mass);
TVector3 vN(parent1->Vx(), parent1->Vy(), parent1->Vz());
Double_t weight = 1;
Int_t is = 1;
fStack->PushTrack(1, -1, pdg,
pN.X(), pN.Y(), pN.Z(), energy,
vN.X(), vN.Y(), vN.Z(), parent1->T(),
0., 0., 0., kPNCapture, ntrk, weight, is);
parent1->SetStatusCode(kCluster);
parent2->SetStatusCode(kCluster);
if(parent3 != 0) parent3->SetStatusCode(kCluster);
if(parent4 != 0) parent4->SetStatusCode(kCluster);
parent1->SetBit(kDoneBit);
parent2->SetBit(kDoneBit);
if(parent3 != 0) parent3->SetBit(kDoneBit);
if(parent4 != 0) parent4->SetBit(kDoneBit);
}
Double_t AliGenLightNuclei::GetS(Double_t p1x, Double_t p1y, Double_t p1z, Double_t m1, Double_t p2x, Double_t p2y, Double_t p2z, Double_t m2) const
{
Double_t E1 = TMath::Sqrt( p1x*p1x + p1y*p1y + p1z*p1z + m1*m1);
Double_t E2 = TMath::Sqrt( p2x*p2x + p2y*p2y + p2z*p2z + m2*m2);
return (E1+E2)*(E1+E2) - ((p1x+p2x)*(p1x+p2x) + (p1y+p2y)*(p1y+p2y) + (p1z+p2z)*(p1z+p2z));
}
Double_t AliGenLightNuclei::GetPcm(Double_t p1x, Double_t p1y, Double_t p1z, Double_t m1, Double_t p2x, Double_t p2y, Double_t p2z, Double_t m2) const
{
Double_t s = this->GetS(p1x, p1y, p1z, m1, p2x, p2y, p2z, m2);
return TMath::Sqrt( (s-(m1-m2)*(m1-m2))*(s-(m1+m2)*(m1+m2)) )/(2.*TMath::Sqrt(s));
}
AliGenLightNuclei.cxx:100 AliGenLightNuclei.cxx:101 AliGenLightNuclei.cxx:102 AliGenLightNuclei.cxx:103 AliGenLightNuclei.cxx:104 AliGenLightNuclei.cxx:105 AliGenLightNuclei.cxx:106 AliGenLightNuclei.cxx:107 AliGenLightNuclei.cxx:108 AliGenLightNuclei.cxx:109 AliGenLightNuclei.cxx:110 AliGenLightNuclei.cxx:111 AliGenLightNuclei.cxx:112 AliGenLightNuclei.cxx:113 AliGenLightNuclei.cxx:114 AliGenLightNuclei.cxx:115 AliGenLightNuclei.cxx:116 AliGenLightNuclei.cxx:117 AliGenLightNuclei.cxx:118 AliGenLightNuclei.cxx:119 AliGenLightNuclei.cxx:120 AliGenLightNuclei.cxx:121 AliGenLightNuclei.cxx:122 AliGenLightNuclei.cxx:123 AliGenLightNuclei.cxx:124 AliGenLightNuclei.cxx:125 AliGenLightNuclei.cxx:126 AliGenLightNuclei.cxx:127 AliGenLightNuclei.cxx:128 AliGenLightNuclei.cxx:129 AliGenLightNuclei.cxx:130 AliGenLightNuclei.cxx:131 AliGenLightNuclei.cxx:132 AliGenLightNuclei.cxx:133 AliGenLightNuclei.cxx:134 AliGenLightNuclei.cxx:135 AliGenLightNuclei.cxx:136 AliGenLightNuclei.cxx:137 AliGenLightNuclei.cxx:138 AliGenLightNuclei.cxx:139 AliGenLightNuclei.cxx:140 AliGenLightNuclei.cxx:141 AliGenLightNuclei.cxx:142 AliGenLightNuclei.cxx:143 AliGenLightNuclei.cxx:144 AliGenLightNuclei.cxx:145 AliGenLightNuclei.cxx:146 AliGenLightNuclei.cxx:147 AliGenLightNuclei.cxx:148 AliGenLightNuclei.cxx:149 AliGenLightNuclei.cxx:150 AliGenLightNuclei.cxx:151 AliGenLightNuclei.cxx:152 AliGenLightNuclei.cxx:153 AliGenLightNuclei.cxx:154 AliGenLightNuclei.cxx:155 AliGenLightNuclei.cxx:156 AliGenLightNuclei.cxx:157 AliGenLightNuclei.cxx:158 AliGenLightNuclei.cxx:159 AliGenLightNuclei.cxx:160 AliGenLightNuclei.cxx:161 AliGenLightNuclei.cxx:162 AliGenLightNuclei.cxx:163 AliGenLightNuclei.cxx:164 AliGenLightNuclei.cxx:165 AliGenLightNuclei.cxx:166 AliGenLightNuclei.cxx:167 AliGenLightNuclei.cxx:168 AliGenLightNuclei.cxx:169 AliGenLightNuclei.cxx:170 AliGenLightNuclei.cxx:171 AliGenLightNuclei.cxx:172 AliGenLightNuclei.cxx:173 AliGenLightNuclei.cxx:174 AliGenLightNuclei.cxx:175 AliGenLightNuclei.cxx:176 AliGenLightNuclei.cxx:177 AliGenLightNuclei.cxx:178 AliGenLightNuclei.cxx:179 AliGenLightNuclei.cxx:180 AliGenLightNuclei.cxx:181 AliGenLightNuclei.cxx:182 AliGenLightNuclei.cxx:183 AliGenLightNuclei.cxx:184 AliGenLightNuclei.cxx:185 AliGenLightNuclei.cxx:186 AliGenLightNuclei.cxx:187 AliGenLightNuclei.cxx:188 AliGenLightNuclei.cxx:189 AliGenLightNuclei.cxx:190 AliGenLightNuclei.cxx:191 AliGenLightNuclei.cxx:192 AliGenLightNuclei.cxx:193 AliGenLightNuclei.cxx:194 AliGenLightNuclei.cxx:195 AliGenLightNuclei.cxx:196 AliGenLightNuclei.cxx:197 AliGenLightNuclei.cxx:198 AliGenLightNuclei.cxx:199 AliGenLightNuclei.cxx:200 AliGenLightNuclei.cxx:201 AliGenLightNuclei.cxx:202 AliGenLightNuclei.cxx:203 AliGenLightNuclei.cxx:204 AliGenLightNuclei.cxx:205 AliGenLightNuclei.cxx:206 AliGenLightNuclei.cxx:207 AliGenLightNuclei.cxx:208 AliGenLightNuclei.cxx:209 AliGenLightNuclei.cxx:210 AliGenLightNuclei.cxx:211 AliGenLightNuclei.cxx:212 AliGenLightNuclei.cxx:213 AliGenLightNuclei.cxx:214 AliGenLightNuclei.cxx:215 AliGenLightNuclei.cxx:216 AliGenLightNuclei.cxx:217 AliGenLightNuclei.cxx:218 AliGenLightNuclei.cxx:219 AliGenLightNuclei.cxx:220 AliGenLightNuclei.cxx:221 AliGenLightNuclei.cxx:222 AliGenLightNuclei.cxx:223 AliGenLightNuclei.cxx:224 AliGenLightNuclei.cxx:225 AliGenLightNuclei.cxx:226 AliGenLightNuclei.cxx:227 AliGenLightNuclei.cxx:228 AliGenLightNuclei.cxx:229 AliGenLightNuclei.cxx:230 AliGenLightNuclei.cxx:231 AliGenLightNuclei.cxx:232 AliGenLightNuclei.cxx:233 AliGenLightNuclei.cxx:234 AliGenLightNuclei.cxx:235 AliGenLightNuclei.cxx:236 AliGenLightNuclei.cxx:237 AliGenLightNuclei.cxx:238 AliGenLightNuclei.cxx:239 AliGenLightNuclei.cxx:240 AliGenLightNuclei.cxx:241 AliGenLightNuclei.cxx:242 AliGenLightNuclei.cxx:243 AliGenLightNuclei.cxx:244 AliGenLightNuclei.cxx:245 AliGenLightNuclei.cxx:246 AliGenLightNuclei.cxx:247 AliGenLightNuclei.cxx:248 AliGenLightNuclei.cxx:249 AliGenLightNuclei.cxx:250 AliGenLightNuclei.cxx:251 AliGenLightNuclei.cxx:252 AliGenLightNuclei.cxx:253 AliGenLightNuclei.cxx:254 AliGenLightNuclei.cxx:255 AliGenLightNuclei.cxx:256 AliGenLightNuclei.cxx:257 AliGenLightNuclei.cxx:258 AliGenLightNuclei.cxx:259 AliGenLightNuclei.cxx:260 AliGenLightNuclei.cxx:261 AliGenLightNuclei.cxx:262 AliGenLightNuclei.cxx:263 AliGenLightNuclei.cxx:264 AliGenLightNuclei.cxx:265 AliGenLightNuclei.cxx:266 AliGenLightNuclei.cxx:267 AliGenLightNuclei.cxx:268 AliGenLightNuclei.cxx:269 AliGenLightNuclei.cxx:270 AliGenLightNuclei.cxx:271 AliGenLightNuclei.cxx:272 AliGenLightNuclei.cxx:273 AliGenLightNuclei.cxx:274 AliGenLightNuclei.cxx:275 AliGenLightNuclei.cxx:276 AliGenLightNuclei.cxx:277 AliGenLightNuclei.cxx:278 AliGenLightNuclei.cxx:279 AliGenLightNuclei.cxx:280 AliGenLightNuclei.cxx:281 AliGenLightNuclei.cxx:282 AliGenLightNuclei.cxx:283 AliGenLightNuclei.cxx:284 AliGenLightNuclei.cxx:285 AliGenLightNuclei.cxx:286 AliGenLightNuclei.cxx:287 AliGenLightNuclei.cxx:288 AliGenLightNuclei.cxx:289 AliGenLightNuclei.cxx:290 AliGenLightNuclei.cxx:291 AliGenLightNuclei.cxx:292 AliGenLightNuclei.cxx:293 AliGenLightNuclei.cxx:294 AliGenLightNuclei.cxx:295 AliGenLightNuclei.cxx:296 AliGenLightNuclei.cxx:297 AliGenLightNuclei.cxx:298 AliGenLightNuclei.cxx:299 AliGenLightNuclei.cxx:300 AliGenLightNuclei.cxx:301 AliGenLightNuclei.cxx:302 AliGenLightNuclei.cxx:303 AliGenLightNuclei.cxx:304 AliGenLightNuclei.cxx:305 AliGenLightNuclei.cxx:306 AliGenLightNuclei.cxx:307 AliGenLightNuclei.cxx:308 AliGenLightNuclei.cxx:309 AliGenLightNuclei.cxx:310 AliGenLightNuclei.cxx:311 AliGenLightNuclei.cxx:312 AliGenLightNuclei.cxx:313 AliGenLightNuclei.cxx:314 AliGenLightNuclei.cxx:315 AliGenLightNuclei.cxx:316 AliGenLightNuclei.cxx:317 AliGenLightNuclei.cxx:318 AliGenLightNuclei.cxx:319 AliGenLightNuclei.cxx:320 AliGenLightNuclei.cxx:321 AliGenLightNuclei.cxx:322 AliGenLightNuclei.cxx:323 AliGenLightNuclei.cxx:324 AliGenLightNuclei.cxx:325 AliGenLightNuclei.cxx:326 AliGenLightNuclei.cxx:327 AliGenLightNuclei.cxx:328 AliGenLightNuclei.cxx:329 AliGenLightNuclei.cxx:330 AliGenLightNuclei.cxx:331 AliGenLightNuclei.cxx:332 AliGenLightNuclei.cxx:333 AliGenLightNuclei.cxx:334 AliGenLightNuclei.cxx:335 AliGenLightNuclei.cxx:336 AliGenLightNuclei.cxx:337 AliGenLightNuclei.cxx:338 AliGenLightNuclei.cxx:339 AliGenLightNuclei.cxx:340 AliGenLightNuclei.cxx:341 AliGenLightNuclei.cxx:342 AliGenLightNuclei.cxx:343 AliGenLightNuclei.cxx:344 AliGenLightNuclei.cxx:345 AliGenLightNuclei.cxx:346 AliGenLightNuclei.cxx:347 AliGenLightNuclei.cxx:348 AliGenLightNuclei.cxx:349 AliGenLightNuclei.cxx:350 AliGenLightNuclei.cxx:351 AliGenLightNuclei.cxx:352 AliGenLightNuclei.cxx:353 AliGenLightNuclei.cxx:354 AliGenLightNuclei.cxx:355 AliGenLightNuclei.cxx:356 AliGenLightNuclei.cxx:357 AliGenLightNuclei.cxx:358 AliGenLightNuclei.cxx:359 AliGenLightNuclei.cxx:360 AliGenLightNuclei.cxx:361 AliGenLightNuclei.cxx:362 AliGenLightNuclei.cxx:363 AliGenLightNuclei.cxx:364 AliGenLightNuclei.cxx:365 AliGenLightNuclei.cxx:366 AliGenLightNuclei.cxx:367 AliGenLightNuclei.cxx:368 AliGenLightNuclei.cxx:369 AliGenLightNuclei.cxx:370 AliGenLightNuclei.cxx:371 AliGenLightNuclei.cxx:372 AliGenLightNuclei.cxx:373 AliGenLightNuclei.cxx:374 AliGenLightNuclei.cxx:375 AliGenLightNuclei.cxx:376 AliGenLightNuclei.cxx:377 AliGenLightNuclei.cxx:378 AliGenLightNuclei.cxx:379 AliGenLightNuclei.cxx:380 AliGenLightNuclei.cxx:381 AliGenLightNuclei.cxx:382 AliGenLightNuclei.cxx:383 AliGenLightNuclei.cxx:384 AliGenLightNuclei.cxx:385 AliGenLightNuclei.cxx:386 AliGenLightNuclei.cxx:387 AliGenLightNuclei.cxx:388 AliGenLightNuclei.cxx:389 AliGenLightNuclei.cxx:390 AliGenLightNuclei.cxx:391 AliGenLightNuclei.cxx:392 AliGenLightNuclei.cxx:393 AliGenLightNuclei.cxx:394 AliGenLightNuclei.cxx:395 AliGenLightNuclei.cxx:396 AliGenLightNuclei.cxx:397 AliGenLightNuclei.cxx:398 AliGenLightNuclei.cxx:399 AliGenLightNuclei.cxx:400 AliGenLightNuclei.cxx:401 AliGenLightNuclei.cxx:402 AliGenLightNuclei.cxx:403 AliGenLightNuclei.cxx:404 AliGenLightNuclei.cxx:405 AliGenLightNuclei.cxx:406 AliGenLightNuclei.cxx:407 AliGenLightNuclei.cxx:408 AliGenLightNuclei.cxx:409 AliGenLightNuclei.cxx:410 AliGenLightNuclei.cxx:411 AliGenLightNuclei.cxx:412 AliGenLightNuclei.cxx:413 AliGenLightNuclei.cxx:414 AliGenLightNuclei.cxx:415 AliGenLightNuclei.cxx:416 AliGenLightNuclei.cxx:417 AliGenLightNuclei.cxx:418 AliGenLightNuclei.cxx:419 AliGenLightNuclei.cxx:420 AliGenLightNuclei.cxx:421 AliGenLightNuclei.cxx:422 AliGenLightNuclei.cxx:423 AliGenLightNuclei.cxx:424 AliGenLightNuclei.cxx:425 AliGenLightNuclei.cxx:426 AliGenLightNuclei.cxx:427 AliGenLightNuclei.cxx:428 AliGenLightNuclei.cxx:429 AliGenLightNuclei.cxx:430 AliGenLightNuclei.cxx:431 AliGenLightNuclei.cxx:432 AliGenLightNuclei.cxx:433 AliGenLightNuclei.cxx:434 AliGenLightNuclei.cxx:435 AliGenLightNuclei.cxx:436