/*
$Log$
+Revision 1.46 2003/01/07 14:12:33 morsch
+Provides collision geometry.
+
+Revision 1.45 2002/12/16 09:44:49 morsch
+Default for fRadiation is 3.
+
+Revision 1.44 2002/10/14 14:55:35 hristov
+Merging the VirtualMC branch to the main development branch (HEAD)
+
+Revision 1.42.4.1 2002/08/28 15:06:50 alibrary
+Updating to v3-09-01
+
+Revision 1.43 2002/08/09 12:09:52 morsch
+Direct gamma trigger correctly included.
+
+Revision 1.42 2002/03/12 11:07:08 morsch
+Add status code of particle to SetTrack call.
+
+Revision 1.41 2002/03/05 11:25:33 morsch
+- New quenching options
+- Correction in CheckTrigger()
+
+Revision 1.40 2002/02/12 11:05:53 morsch
+Get daughter indices right.
+
Revision 1.39 2002/02/12 09:16:39 morsch
Correction in SelectFlavor()
//
// andreas.morsch@cern.ch
-#include "AliGenHijing.h"
-#include "AliGenHijingEventHeader.h"
-#include "AliRun.h"
-#include "AliPDG.h"
-
#include <TArrayI.h>
-#include <TParticle.h>
-#include <THijing.h>
#include <TGraph.h>
+#include <THijing.h>
#include <TLorentzVector.h>
+#include <TPDGCode.h>
+#include <TParticle.h>
+
+#include "AliGenHijing.h"
+#include "AliGenHijingEventHeader.h"
+#include "AliRun.h"
- ClassImp(AliGenHijing)
+ ClassImp(AliGenHijing)
AliGenHijing::AliGenHijing()
:AliGenMC()
{
// Constructor
- fHijing = 0;
- fDsigmaDb = 0;
- fDnDb = 0;
+ fParticles = 0;
+ fHijing = 0;
+ fDsigmaDb = 0;
+ fDnDb = 0;
}
AliGenHijing::AliGenHijing(Int_t npart)
fDsigmaDb = 0;
fDnDb = 0;
fPtMinJet = -2.5;
- fRadiation = 1;
+ fRadiation = 3;
fEventVertex.Set(3);
//
SetSimpleJets();
SetNoGammas();
-
+//
+ fParticles = new TClonesArray("TParticle",10000);
//
// Set random number generator
sRandom = fRandom;
// Destructor
if ( fDsigmaDb) delete fDsigmaDb;
if ( fDnDb) delete fDnDb;
+ delete fParticles;
}
void AliGenHijing::Init()
fHijing=(THijing*) fgMCEvGen;
fHijing->SetIHPR2(2, fRadiation);
fHijing->SetIHPR2(3, fTrigger);
- fHijing->SetIHPR2(4, fQuench);
fHijing->SetIHPR2(6, fShadowing);
fHijing->SetIHPR2(12, fDecaysOff);
fHijing->SetIHPR2(21, fKeep);
fHijing->SetHIPR1(10, fPtMinJet);
fHijing->SetHIPR1(50, fSimpleJet);
+//
+// Quenching
+//
+//
+// fQuench = 0: no quenching
+// fQuench = 1: hijing default
+// fQuench = 2: new LHC parameters for HIPR1(11) and HIPR1(14)
+// fQuench = 3: new RHIC parameters for HIPR1(11) and HIPR1(14)
+// fQuench = 4: new LHC parameters with log(e) dependence
+// fQuench = 5: new RHIC parameters with log(e) dependence
+ fHijing->SetIHPR2(50, 0);
+ if (fQuench > 0)
+ fHijing->SetIHPR2(4, 1);
+ else
+ fHijing->SetIHPR2(4, 0);
+// New LHC parameters from Xin-Nian Wang
+ if (fQuench == 2) {
+ fHijing->SetHIPR1(14, 1.1);
+ fHijing->SetHIPR1(11, 3.7);
+ } else if (fQuench == 3) {
+ fHijing->SetHIPR1(14, 0.20);
+ fHijing->SetHIPR1(11, 2.5);
+ } else if (fQuench == 4) {
+ fHijing->SetIHPR2(50, 1);
+ fHijing->SetHIPR1(14, 4.*0.34);
+ fHijing->SetHIPR1(11, 3.7);
+ } else if (fQuench == 5) {
+ fHijing->SetIHPR2(50, 1);
+ fHijing->SetHIPR1(14, 0.34);
+ fHijing->SetHIPR1(11, 2.5);
+ }
+
+
+
+//
+// Initialize Hijing
+//
fHijing->Initialize();
//
if (fEvaluate) EvaluateCrossSections();
//
-//
-// Initialize random generator
}
void AliGenHijing::Generate()
Float_t p[3], random[6];
Float_t tof;
- static TClonesArray *particles;
// converts from mm/c to s
const Float_t kconv = 0.001/2.999792458e8;
//
Int_t j, kf, ks, imo;
kf = 0;
- if(!particles) particles = new TClonesArray("TParticle",10000);
+
fTrials = 0;
for (j = 0;j < 3; j++) origin0[j] = fOrigin[j];
// --------------------------------------------------------------------------
fHijing->GenerateEvent();
fTrials++;
+ fHijing->ImportParticles(fParticles,"All");
if (fTrigger != kNoTrigger) {
if (!CheckTrigger()) continue;
}
-
- fHijing->ImportParticles(particles,"All");
- if (fLHC) Boost(particles);
+ if (fLHC) Boost();
- Int_t np = particles->GetEntriesFast();
+ Int_t np = fParticles->GetEntriesFast();
printf("\n **************************************************%d\n",np);
Int_t nc = 0;
if (np == 0 ) continue;
// Get event vertex
//
- TParticle * iparticle = (TParticle *) particles->At(0);
+ TParticle * iparticle = (TParticle *) fParticles->At(0);
fEventVertex[0] = origin0[0];
fEventVertex[1] = origin0[1];
fEventVertex[2] = origin0[2];
//
for (i = 0; i < np; i++) {
- iparticle = (TParticle *) particles->At(i);
+ iparticle = (TParticle *) fParticles->At(i);
+
// Is this a parent particle ?
if (Stable(iparticle)) continue;
//
if (!fSelectAll) selected = KinematicSelection(iparticle, 0) &&
SelectFlavor(kf);
- hasSelectedDaughters = DaughtersSelection(iparticle, particles);
+ hasSelectedDaughters = DaughtersSelection(iparticle);
//
// Put particle on the stack if it is either selected or
// it is the mother of at least one seleted particle
//
for (i = 0; i<np; i++) {
- TParticle * iparticle = (TParticle *) particles->At(i);
+ TParticle * iparticle = (TParticle *) fParticles->At(i);
// Is this a final state particle ?
if (!Stable(iparticle)) continue;
Bool_t selected = kTRUE;
kf = iparticle->GetPdgCode();
ks = iparticle->GetStatusCode();
+
// --------------------------------------------------------------------------
// Count spectator neutrons and protons
if(ks == 0 || ks == 1 || ks == 10 || ks == 11){
// Write particles to stack
//
for (i = 0; i<np; i++) {
- TParticle * iparticle = (TParticle *) particles->At(i);
+ TParticle * iparticle = (TParticle *) fParticles->At(i);
Bool_t hasMother = (iparticle->GetFirstMother() >=0);
Bool_t hasDaughter = (iparticle->GetFirstDaughter() >=0);
if (pSelected[i]) {
kf = iparticle->GetPdgCode();
+ ks = iparticle->GetStatusCode();
p[0] = iparticle->Px();
p[1] = iparticle->Py();
p[2] = iparticle->Pz();
TParticle* mother = 0;
if (hasMother) {
imo = iparticle->GetFirstMother();
- mother = (TParticle *) particles->At(imo);
+ mother = (TParticle *) fParticles->At(imo);
imo = (mother->GetPdgCode() != 92) ? imo = newPos[imo] : -1;
} // if has mother
Bool_t tFlag = (fTrackIt && !hasDaughter);
SetTrack(tFlag,imo,kf,p,origin,polar,
- tof,kPNoProcess,nt);
+ tof,kPNoProcess,nt, 1., ks);
KeepTrack(nt);
newPos[i] = nt;
} // if selected
fDnDb = new TGraph(i, b, si2);
}
-Bool_t AliGenHijing::DaughtersSelection(TParticle* iparticle, TClonesArray* particles)
+Bool_t AliGenHijing::DaughtersSelection(TParticle* iparticle)
{
//
// Looks recursively if one of the daughters has been selected
imin = iparticle->GetFirstDaughter();
imax = iparticle->GetLastDaughter();
for (i = imin; i <= imax; i++){
- TParticle * jparticle = (TParticle *) particles->At(i);
+ TParticle * jparticle = (TParticle *) fParticles->At(i);
Int_t ip = jparticle->GetPdgCode();
if (KinematicSelection(jparticle,0)&&SelectFlavor(ip)) {
selected=kTRUE; break;
}
- if (DaughtersSelection(jparticle, particles)) {selected=kTRUE; break; }
+ if (DaughtersSelection(jparticle)) {selected=kTRUE; break; }
}
} else {
return kFALSE;
}
-void AliGenHijing::Boost(TClonesArray* particles)
+void AliGenHijing::Boost()
{
//
// Boost cms into LHC lab frame
printf("\n Boosting particles to lab frame %f %f %f", dy, beta, gamma);
Int_t i;
- Int_t np = particles->GetEntriesFast();
+ Int_t np = fParticles->GetEntriesFast();
for (i = 0; i < np; i++)
{
- TParticle* iparticle = (TParticle*) particles->At(i);
+ TParticle* iparticle = (TParticle*) fParticles->At(i);
Double_t e = iparticle->Energy();
Double_t px = iparticle->Px();
((AliGenHijingEventHeader*) header)->SetTrials(fTrials);
// Event Vertex
header->SetPrimaryVertex(fEventVertex);
- gAlice->SetGenEventHeader(header);
+ gAlice->SetGenEventHeader(header);
+ fCollisionGeometry = (AliGenHijingEventHeader*) header;
}
Bool_t AliGenHijing::CheckTrigger()
{
// Check the kinematic trigger condition
-//
- TLorentzVector* jet1 = new TLorentzVector(fHijing->GetHINT1(26),
- fHijing->GetHINT1(27),
- fHijing->GetHINT1(28),
- fHijing->GetHINT1(29));
-
- TLorentzVector* jet2 = new TLorentzVector(fHijing->GetHINT1(36),
- fHijing->GetHINT1(37),
- fHijing->GetHINT1(38),
- fHijing->GetHINT1(39));
- Double_t eta1 = jet1->Eta();
- Double_t eta2 = jet2->Eta();
- Double_t phi1 = jet1->Phi();
- Double_t phi2 = jet2->Phi();
+//
Bool_t triggered = kFALSE;
- //Check eta range first...
- if ((eta1 < fEtaMaxJet && eta1 > fEtaMinJet) ||
- (eta2 < fEtaMaxJet && eta2 > fEtaMinJet))
- {
- //Eta is okay, now check phi range
- if ((phi1 < fPhiMaxJet && phi1 > fPhiMinJet) ||
- (phi2 < fPhiMaxJet && phi2 > fPhiMinJet))
- {
+
+ if (fTrigger == 1) {
+//
+// jet-jet Trigger
+
+ TLorentzVector* jet1 = new TLorentzVector(fHijing->GetHINT1(26),
+ fHijing->GetHINT1(27),
+ fHijing->GetHINT1(28),
+ fHijing->GetHINT1(29));
+
+ TLorentzVector* jet2 = new TLorentzVector(fHijing->GetHINT1(36),
+ fHijing->GetHINT1(37),
+ fHijing->GetHINT1(38),
+ fHijing->GetHINT1(39));
+ Double_t eta1 = jet1->Eta();
+ Double_t eta2 = jet2->Eta();
+ Double_t phi1 = jet1->Phi();
+ Double_t phi2 = jet2->Phi();
+// printf("\n Trigger: %f %f %f %f",
+// fEtaMinJet, fEtaMaxJet, fPhiMinJet, fPhiMaxJet);
+ if (
+ (eta1 < fEtaMaxJet && eta1 > fEtaMinJet &&
+ phi1 < fPhiMaxJet && phi1 > fPhiMinJet)
+ ||
+ (eta2 < fEtaMaxJet && eta2 > fEtaMinJet &&
+ phi2 < fPhiMaxJet && phi2 > fPhiMinJet)
+ )
triggered = kTRUE;
- }
- }
+ } else if (fTrigger == 2) {
+// Gamma Jet
+//
+ Int_t np = fParticles->GetEntriesFast();
+ for (Int_t i = 0; i < np; i++) {
+ TParticle* part = (TParticle*) fParticles->At(i);
+ Int_t kf = part->GetPdgCode();
+ Int_t ks = part->GetStatusCode();
+ if (kf == 22 && ks == 40) {
+ Float_t phi = part->Phi();
+ Float_t eta = part->Eta();
+ if (eta < fEtaMaxJet &&
+ eta > fEtaMinJet &&
+ phi < fPhiMaxJet &&
+ phi > fPhiMinJet) {
+ triggered = 1;
+ break;
+ } // check phi,eta within limits
+ } // direct gamma ?
+ } // particle loop
+ } // fTrigger == 2
return triggered;
}