fHeader = 0;
fReadFromFile = 0;
fEventTime = 0.;
+ fInteractionRate = 0.;
+ fTimeWindow = 0.;
+ fEventsTime = 0;
+ fCurSubEvent = 0;
fDecayer = new AliDecayerPythia();
SetEventListRange();
SetJetPhiRange();
SetJetEtRange();
SetGammaPhiRange();
SetGammaEtaRange();
+ SetTriggerParticle();
SetPtKick();
SetQuench();
SetHadronisation();
fSetNuclei = kFALSE;
+ fNewMIS = kFALSE;
+ fHFoff = kFALSE;
if (!AliPythiaRndm::GetPythiaRandom())
AliPythiaRndm::SetPythiaRandom(GetRandom());
}
fXsection = 0.;
fReadFromFile = 0;
fEventTime = 0.;
+ fInteractionRate = 0.;
+ fTimeWindow = 0.;
+ fEventsTime = 0;
+ fCurSubEvent = 0;
SetProcess();
SetStrucFunc();
SetForceDecay();
SetJetEtRange();
SetGammaPhiRange();
SetGammaEtaRange();
+ SetTriggerParticle();
SetJetReconstructionMode();
SetQuench();
SetHadronisation();
// Pycel
SetPycellParameters();
fSetNuclei = kFALSE;
+ fNewMIS = kFALSE;
+ fHFoff = kFALSE;
}
AliGenPythia::AliGenPythia(const AliGenPythia & Pythia)
AliGenPythia::~AliGenPythia()
{
// Destructor
+ if(fEventsTime) delete fEventsTime;
+}
+
+void AliGenPythia::SetInteractionRate(Float_t rate,Float_t timewindow)
+{
+// Generate pileup using user specified rate
+ fInteractionRate = rate;
+ fTimeWindow = timewindow;
+ GeneratePileup();
+}
+
+void AliGenPythia::GeneratePileup()
+{
+// Generate sub events time for pileup
+ fEventsTime = 0;
+ if(fInteractionRate == 0.) {
+ Warning("GeneratePileup","Zero interaction specified. Skipping pileup generation.\n");
+ return;
+ }
+
+ Int_t npart = NumberParticles();
+ if(npart < 0) {
+ Warning("GeneratePileup","Negative number of particles. Skipping pileup generation.\n");
+ return;
+ }
+
+ if(fEventsTime) delete fEventsTime;
+ fEventsTime = new TArrayF(npart);
+ TArrayF &array = *fEventsTime;
+ for(Int_t ipart = 0; ipart < npart; ipart++)
+ array[ipart] = 0.;
+
+ Float_t eventtime = 0.;
+ while(1)
+ {
+ eventtime += (AliPythiaRndm::GetPythiaRandom())->Exp(1./fInteractionRate);
+ if(eventtime > fTimeWindow) break;
+ array.Set(array.GetSize()+1);
+ array[array.GetSize()-1] = eventtime;
+ }
+
+ eventtime = 0.;
+ while(1)
+ {
+ eventtime -= (AliPythiaRndm::GetPythiaRandom())->Exp(1./fInteractionRate);
+ if(TMath::Abs(eventtime) > fTimeWindow) break;
+ array.Set(array.GetSize()+1);
+ array[array.GetSize()-1] = eventtime;
+ }
+
+ SetNumberParticles(fEventsTime->GetSize());
}
void AliGenPythia::SetPycellParameters(Float_t etamax, Int_t neta, Int_t nphi,
} else {
fRL = 0x0;
}
-
-
+// Switch off Heavy Flavors on request
+ if (fHFoff) {
+ fPythia->SetMSTP(58, 3);
+ fPythia->SetMSTJ(45, 3);
+ for (Int_t i = 156; i <= 160; i++) fPythia->SetMDME(i, 1, 0);
+ }
//
fPythia->ProcInit(fProcess,fEnergyCMS,fStrucFunc);
// Parent and Children Selection
switch (fProcess)
{
+ case kPyOldUEQ2ordered:
+ case kPyOldUEQ2ordered2:
+ case kPyOldPopcorn:
+ break;
case kPyCharm:
case kPyCharmUnforced:
case kPyCharmPbPbMNR:
case kPyDirectGamma:
break;
case kPyW:
+ case kPyZ:
break;
}
//
// Either produce new event or read partons from file
//
if (!fReadFromFile) {
- fPythia->Pyevnt();
+ if (!fNewMIS) {
+ fPythia->Pyevnt();
+ } else {
+ fPythia->Pyevnw();
+ }
fNpartons = fPythia->GetN();
} else {
printf("Loading Event %d\n",AliRunLoader::GetRunLoader()->GetEventNumber());
if (fProcess != kPyMb && fProcess != kPyJets &&
fProcess != kPyDirectGamma &&
fProcess != kPyMbNonDiffr &&
- fProcess != kPyW) {
+ fProcess != kPyW && fProcess != kPyZ ) {
for (i = 0; i < np; i++) {
TParticle* iparticle = (TParticle *) fParticles->At(i);
}
if (jev >= fNpart || fNpart == -1) {
fKineBias=Float_t(fNpart)/Float_t(fTrials);
- printf("\n Trials: %i %i %i\n",fTrials, fNpart, jev);
-
fQ += fPythia->GetVINT(51);
fX1 += fPythia->GetVINT(41);
fX2 += fPythia->GetVINT(42);
// converts from mm/c to s
const Float_t kconv=0.001/2.999792458e8;
-
-
Int_t np = (fHadronisation) ? fParticles->GetEntriesFast() : fNpartons;
if (!CheckTrigger(jet1, jet2)) return 0;
}
+ if (fTriggerParticle) {
+ Bool_t triggered = kFALSE;
+ for (i = 0; i < np; i++) {
+ TParticle * iparticle = (TParticle *) fParticles->At(i);
+ kf = CheckPDGCode(iparticle->GetPdgCode());
+ if (TMath::Abs(kf) != fTriggerParticle) continue;
+ if (iparticle->Pt() == 0.) continue;
+ if (TMath::Abs(iparticle->Eta()) > fTriggerEta) continue;
+ triggered = kTRUE;
+ break;
+ }
+ if (!triggered) return 0;
+ }
+
+
+ //Introducing child cuts in case kPyW, kPyZ, kPyMb, and kPyMbNonDiff
+ if ( (fProcess == kPyW || fProcess == kPyZ || fProcess == kPyMb || fProcess == kPyMbNonDiffr)
+ && (fCutOnChild == 1) ) {
+ if ( !CheckKinematicsOnChild() ) {
+ if (pParent) delete[] pParent;
+ return 0;
+ }
+ }
+
+
+
for (i = 0; i < np; i++) {
Int_t trackIt = 0;
TParticle * iparticle = (TParticle *) fParticles->At(i);
} // particle loop
if (pParent) delete[] pParent;
-
- printf("\n I've put %i particles on the stack \n",nc);
return 1;
}
((AliGenPythiaEventHeader*) fHeader)->SetXYJet(xp, yp);
((AliGenPythiaEventHeader*) fHeader)->SetZQuench(z);
}
-
//
-// Pass header to RunLoader
+// Store pt^hard
+ ((AliGenPythiaEventHeader*) fHeader)->SetPtHard(fPythia->GetVINT(47));
+//
+// Pass header
//
- AliRunLoader::GetRunLoader()->GetHeader()->SetGenEventHeader(fHeader);
+ AddHeader(fHeader);
}
-
+
+void AliGenPythia::AddHeader(AliGenEventHeader* header)
+{
+ // Add header to container or runloader
+ if (fContainer) {
+ fContainer->AddHeader(header);
+ } else {
+ AliRunLoader::GetRunLoader()->GetHeader()->SetGenEventHeader(header);
+ }
+}
+
Bool_t AliGenPythia::CheckTrigger(TParticle* jet1, TParticle* jet2)
{
}
return triggered;
}
+
+
+//Checking Kinematics on Child (status code 1, particle code ?, kin cuts
+Bool_t AliGenPythia::CheckKinematicsOnChild(){
+
+ Bool_t checking = kFALSE;
+ Int_t j, kcode, ks, km;
+ Int_t nPartAcc = 0; //number of particles in the acceptance range
+ Int_t numberOfAcceptedParticles = 1;
+ if (fNumberOfAcceptedParticles != 0) { numberOfAcceptedParticles = fNumberOfAcceptedParticles; }
+ Int_t npart = fParticles->GetEntriesFast();
+
+ for (j = 0; j<npart; j++) {
+ TParticle * jparticle = (TParticle *) fParticles->At(j);
+ kcode = TMath::Abs( CheckPDGCode(jparticle->GetPdgCode()) );
+ ks = jparticle->GetStatusCode();
+ km = jparticle->GetFirstMother();
+
+ if( (ks == 1) && (kcode == fPdgCodeParticleforAcceptanceCut) && (KinematicSelection(jparticle,1)) ){
+ nPartAcc++;
+ }
+ if( numberOfAcceptedParticles <= nPartAcc){
+ checking = kTRUE;
+ break;
+ }
+ }
+
+ return checking;
+}
+
AliGenPythia& AliGenPythia::operator=(const AliGenPythia& rhs)
{
void AliGenPythia::GetSubEventTime()
{
// Calculates time of the next subevent
- fEventTime += (AliPythiaRndm::GetPythiaRandom())->Exp(1./fInteractionRate);
+ fEventTime = 0.;
+ if (fEventsTime) {
+ TArrayF &array = *fEventsTime;
+ fEventTime = array[fCurSubEvent++];
+ }
+ // printf(" Event time: %d %f %p",fCurSubEvent,fEventTime,fEventsTime);
+ return;
}
#ifdef never