#include <TPDGCode.h>
#include <TLorentzVector.h>
#include <TClonesArray.h>
+#include <TParticle.h>
ClassImp(AliDecayerPythia)
fPythia(AliPythia::Instance()),
fDecay(kAll),
fHeavyFlavour(kTRUE),
- fLongLived(kFALSE)
+ fLongLived(kFALSE),
+ fPatchOmegaDalitz(0)
{
// Default Constructor
for (Int_t i=0; i< 501; i++) fBraPart[i]= 1.;
fPythia(0),
fDecay(kAll),
fHeavyFlavour(kTRUE),
- fLongLived(kFALSE)
+ fLongLived(kFALSE),
+ fPatchOmegaDalitz(0)
{
// Copy Constructor
decayer.Copy(*this);
+ for (Int_t i = 0; i < 501; i++) fBraPart[i] = 0.;
}
void AliDecayerPythia::Init()
fPythia->SetMDCY(fPythia->Pycomp(310) ,1, isw);
fPythia->SetMDCY(fPythia->Pycomp(3122),1, isw);
fPythia->SetMDCY(fPythia->Pycomp(3112),1, isw);
- fPythia->SetMDCY(fPythia->Pycomp(3212),1, isw);
+// fPythia->SetMDCY(fPythia->Pycomp(3212),1, isw); // Sigma0 decays elem.
fPythia->SetMDCY(fPythia->Pycomp(3222),1, isw);
fPythia->SetMDCY(fPythia->Pycomp(3312),1, isw);
fPythia->SetMDCY(fPythia->Pycomp(3322),1, isw);
Float_t energy = p->Energy();
Float_t theta = p->Theta();
Float_t phi = p->Phi();
-
- Lu1Ent(0, idpart, energy, theta, phi);
+ if (!fPatchOmegaDalitz) {
+ Lu1Ent(0, idpart, energy, theta, phi);
+ } else {
+ fPythia->SetMDCY(fPythia->Pycomp(111) ,1, 0);
+ Lu1Ent(0, idpart, energy, theta, phi);
+ fPythia->DalitzDecays();
+ fPythia->SetMDCY(fPythia->Pycomp(111) ,1, 1);
+ fPythia->Pyexec();
+ }
fPythia->GetPrimaries();
}
{
// Import the decay products
//
- return fPythia->ImportParticles(particles, "All");
+ const Float_t kconvT=0.001/2.999792458e8; // mm/c to seconds conversion
+ const Float_t kconvL=1./10; // mm to cm conversion
+ int np = fPythia->ImportParticles(particles, "All");
+ // pythia assigns decay time in mm/c, convert to seconds
+ for (int ip=1;ip<np;ip++) {
+ TParticle* prod = (TParticle*)particles->At(ip);
+ if (!prod) continue;
+ prod->SetProductionVertex(prod->Vx()*kconvL,prod->Vy()*kconvL,prod->Vz()*kconvL,kconvT*prod->T());
+ }
+ return np;
}
//
Decay_t decay=fDecay;
fPythia->SetMSTJ(21,2);
- if (decay == kNoDecayHeavy) return;
//
// select mode
ForceParticleDecay(100553,13,2);// Upsilon'
ForceParticleDecay(200553,13,2);// Upsilon''
break;
+ case kJpsiDiMuon:
+ ForceParticleDecay( 443,13,2); // J/Psi
+ break;
case kBSemiElectronic:
ForceParticleDecay( 511,11,1); // B0
ForceParticleDecay( 521,11,1); // B+/-
ForceParticleDecay(100553,11,2);// Upsilon'
ForceParticleDecay(200553,11,2);// Upsilon''
break;
+ case kPsiPrimeJpsiDiElectron:
+ products[0] = 443;
+ products[1] = 211;
+ mult[0] = 1;
+ mult[1] = 2;
+ ForceParticleDecay( 100443, products, mult, 2, 1);
+ ForceParticleDecay( 443,11,2);
+ break;
case kBJpsiDiMuon:
products[0] = 443;
ForceParticleDecay( 531,443,1); // B_s
ForceParticleDecay( 5122,443,1); // Lambda_b
break;
+ case kBJpsiUndecayed:
+ ForceParticleDecay( 511,443,1); // B0
+ ForceParticleDecay( 521,443,1); // B+/-
+ ForceParticleDecay( 531,443,1); // B_s
+ ForceParticleDecay( 5122,443,1); // Lambda_b
+ fPythia->SetMDCY(fPythia->Pycomp(443),1,0); // switch-off J/psi
+ break;
case kBPsiPrimeDiElectron:
ForceParticleDecay( 511,100443,1); // B0
ForceParticleDecay( 521,100443,1); // B+/-
break;
case kOmega:
ForceOmega();
+ break;
case kLambda:
ForceLambda();
+ break;
case kAll:
break;
case kNoDecay:
case kNoDecayHeavy:
case kNeutralPion:
break;
+ case kNoDecayBeauty:
+ SwitchOffBDecay();
+ break;
+ case kElectronEM:
+ ForceParticleDecay( 111,11,1); // pi^0
+ ForceParticleDecay( 221,11,1); // eta
+ ForceParticleDecay( 113,11,1); // rho
+ ForceParticleDecay( 223,11,1); // omega
+ ForceParticleDecay( 331,11,1); // etaprime
+ ForceParticleDecay( 333,11,1); // phi
+ break;
+ case kDiElectronEM:
+ ForceParticleDecay( 111,11,2); // pi^0
+ ForceParticleDecay( 221,11,2); // eta
+ ForceParticleDecay( 113,11,2); // rho
+ ForceParticleDecay( 223,11,2); // omega
+ ForceParticleDecay( 331,11,2); // etaprime
+ ForceParticleDecay( 333,11,2); // phi
+ break;
+ case kGammaEM:
+ ForceParticleDecay( 111,22,1); // pi^0
+ ForceParticleDecay( 221,22,1); // eta
+ ForceParticleDecay( 113,22,1); // rho
+ ForceParticleDecay( 223,22,1); // omega
+ ForceParticleDecay( 331,22,1); // etaprime
+ ForceParticleDecay( 333,22,1); // phi
+ break;
+ case kBeautyUpgrade:
+ ForceBeautyUpgrade();
+ break;
}
}
for (Int_t i = 156; i <= 160; i++) fPythia->SetMDME(i, 1, 0);
}
+void AliDecayerPythia::ForceBeautyUpgrade()
+{
+ //
+ // Force dedicated decay channels of signals ineresting
+ // for the ITS upgrade (Lb, Lc, Xi_c, B)
+ //
+
+ // Lb: 50% of them in Lc pi+ and the rest with a Lc in final state
+ if(gRandom->Rndm()<0.50) {
+ const Int_t prod3[3]={4122,211,0};
+ Int_t mult3[3]={1,1,1};
+ ForceParticleDecay(5122,prod3,mult3,3,1);
+ } else {
+ ForceParticleDecay( 5122, 4122, 1);
+ }
+ // Xi_c
+ ForceParticleDecay( 4232, 3312, 1);
+ // B+ -> D0pi+
+ const Int_t prod[2]={421,211};
+ Int_t mult[2]={1,1};
+ ForceParticleDecay(521,prod,mult,2,1);
+ // B0 -> D*-pi+
+ const Int_t prod2[2]={413,211};
+ ForceParticleDecay(511,prod2,mult,2,1);
+ // force charm hadronic decays (D mesons and Lc)
+ ForceHadronicD(0);
+}
+
void AliDecayerPythia::Lu1Ent(Int_t flag, Int_t idpart,
Double_t mom, Double_t theta, Double_t phi)
{
Int_t productsD[2] = {kProton, kPiPlus}, multD[2] = {1, 1};
ForceParticleDecay(iDeltaPP, productsD, multD, 2);
// for Lambda_c -> Lambda(1520) pi+ -> p K- pi+
- Int_t iLambda_1520 = 3124;
+ Int_t iLambda1520 = 3124;
Int_t productsL[2] = {kProton, kKMinus}, multL[2] = {1, 1};
- ForceParticleDecay(iLambda_1520, productsL, multL, 2);
+ ForceParticleDecay(iLambda1520, productsL, multL, 2);
// for Lambda_c -> Lambda pi+
Int_t iLambda=3122;
//for Lambda_c -> antiK0 p
};
Int_t decayP3[kNHadrons][4] =
{
- {-1 , -1 , -1 , -1},
+ {kPiPlus , iPhi , 0 , 0},
{kKMinus , kPiPlus, iRho0 , 0 },
{-1 , -1 , -1 , -1},
{-1 , -1 , -1 , -1},
// for Lambda_c -> Lambda_1520 pi+ -> p K- pi+, D0-> K*0 pi+ pi- -> K3pi
Int_t decayP4[kNHadrons][4] =
{
- {-1 , -1 , -1 , -1},
+ {iKstarbar0 , kKPlus , 0 , 0},
{iKstarbar0 , kPiPlus , kPiMinus, 0},
{-1 , -1 , -1 , -1},
{-1 , -1 , -1 , -1},
- {iLambda_1520, kPiPlus , 0 , 0}
+ {iLambda1520 , kPiPlus , 0 , 0}
};
// for Lambda_c -> Lambda pi+
Int_t decayP5[kNHadrons][4] =
if (norm > 0.) fBraPart[kc] /= norm;
}
-void AliDecayerPythia::ForceParticleDecay(Int_t particle, Int_t* products, Int_t* mult, Int_t npart)
+void AliDecayerPythia::ForceParticleDecay(Int_t particle, const Int_t* products, Int_t* mult, Int_t npart, Bool_t flag)
{
//
// Force decay of particle into products with multiplicity mult
for (Int_t i = 0; i < npart; i++) {
nprod += (CountProducts(channel, products[i]) >= mult[i]);
}
- if (nprod) {
+ if ((nprod && !flag) || ((nprod == npart) && flag)) {
fPythia->SetMDME(channel,1,1);
- } else {
+ } else { //
fPythia->SetMDME(channel,1,0);
fBraPart[kc] -= fPythia->GetBRAT(channel);
}
}
if (norm > 0.) fBraPart[kc] /= norm;
+
+
+
}
void AliDecayerPythia::DefineParticles()
}
+void AliDecayerPythia::SwitchOffBDecay()
+{
+// Switch off B-decays
+ Int_t heavyB[]={511,521,531,5122,5132,5232,5332};
+ for(int i=0;i<4;i++)
+ {
+ fPythia->SetMDCY(fPythia->Pycomp(heavyB[i]),1,0);
+ }
+}
+
Float_t AliDecayerPythia::GetPartialBranchingRatio(Int_t kf)
{
// Get branching ratio
}
-#ifdef never
-void AliDecayerPythia::Streamer(TBuffer &R__b)
-{
- // Stream an object of class AliDecayerPythia.
-
- if (R__b.IsReading()) {
- Version_t R__v = R__b.ReadVersion(); if (R__v) { }
- AliDecayer::Streamer(R__b);
- (AliPythia::Instance())->Streamer(R__b);
- R__b >> (Int_t&)fDecay;
- R__b.ReadStaticArray(fBraPart);
- } else {
- R__b.WriteVersion(AliDecayerPythia::IsA());
- AliDecayer::Streamer(R__b);
- R__b << fPythia;
- R__b << (Int_t)fDecay;
- R__b.WriteArray(fBraPart, 501);
- }
-}
-#endif
-
void AliDecayerPythia::Copy(TObject &) const
{
//