X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=THerwig%2FAliGenHerwig.cxx;h=033108893e4a065fbd122ceeac1bda876d43198c;hb=1c65aa1a5683a0d8e8b0bfeebc1f56517c20219c;hp=3ace77fef9033676c83b125f537d067247b4c5c5;hpb=7cdba479ac84d9e3621351018a6917570b21b797;p=u%2Fmrichter%2FAliRoot.git diff --git a/THerwig/AliGenHerwig.cxx b/THerwig/AliGenHerwig.cxx index 3ace77fef90..033108893e4 100644 --- a/THerwig/AliGenHerwig.cxx +++ b/THerwig/AliGenHerwig.cxx @@ -20,53 +20,116 @@ // The main Herwig options are accessable for the user through this interface. // Uses the THerwig implementation of TGenerator. -#include "AliGenHerwig.h" -#include "AliRun.h" +#include +#include #include -#include "THerwig6.h" -#include "Riostream.h" +#include + +#include "AliGenHerwig.h" +#include "AliGenHerwigEventHeader.h" +#include "AliHerwigRndm.h" +#include "AliMC.h" +#include "AliRun.h" +#include "driver.h" - ClassImp(AliGenHerwig) +ClassImp(AliGenHerwig) -static TRandom * sRandom; -AliGenHerwig::AliGenHerwig() + AliGenHerwig::AliGenHerwig() : + AliGenMC(), + fAutPDF("LHAPDF"), + fModPDF(19070), + fStrucFunc(kCTEQ5L), + fKeep(0), + fDecaysOff(1), + fTrigger(0), + fSelectAll(0), + fFlavor(0), + fMomentum1(7000), + fMomentum2(7000), + fKineBias(1), + fTrials(0), + fXsection(0), + fHerwig(0x0), + fProcess(0), + fPtHardMin(0.), + fPtHardMax(9999.), + fPtRMS(0.), + fMaxPr(10), + fMaxErrors(1000), + fEnSoft(1), + fEv1Pr(0), + fEv2Pr(0), + fFileName(0), + fEtaMinParton(-20.), + fEtaMaxParton(20.), + fPhiMinParton(0.), + fPhiMaxParton(2.* TMath::Pi()), + fEtaMinGamma(-20.), + fEtaMaxGamma(20.), + fPhiMinGamma(0.), + fPhiMaxGamma(2. * TMath::Pi()), + fHeader(0) { // Constructor + fEnergyCMS = 14000; } AliGenHerwig::AliGenHerwig(Int_t npart) - :AliGenMC(npart) + :AliGenMC(npart), + fAutPDF("LHAPDF"), + fModPDF(19070), + fStrucFunc(kCTEQ5L), + fKeep(0), + fDecaysOff(1), + fTrigger(0), + fSelectAll(0), + fFlavor(0), + fMomentum1(7000), + fMomentum2(7000), + fKineBias(1), + fTrials(0), + fXsection(0), + fHerwig(0x0), + fProcess(0), + fPtHardMin(0.), + fPtHardMax(9999.), + fPtRMS(0.), + fMaxPr(10), + fMaxErrors(1000), + fEnSoft(1), + fEv1Pr(0), + fEv2Pr(0), + fFileName(0), + fEtaMinParton(-20.), + fEtaMaxParton(20.), + fPhiMinParton(0.), + fPhiMaxParton(2.* TMath::Pi()), + fEtaMinGamma(-20.), + fEtaMaxGamma(20.), + fPhiMinGamma(0.), + fPhiMaxGamma(2. * TMath::Pi()), + fHeader(0) { - SetBeamMomenta(); + fEnergyCMS = 14000; SetTarget(); SetProjectile(); - SetStrucFunc(kGRVLO98); - fKeep=0; - fTrigger=0; - fDecaysOff=1; - fSelectAll=0; - fFlavor=0; - fPtHardMin=10.; - fPtRMS=0.0; - fEnSoft=1.0; - fMaxPr=1; - fMaxErrors=1000; -// Set random number - if (!sRandom) sRandom=fRandom; + // Set random number generator + AliHerwigRndm::SetHerwigRandom(GetRandom()); } -AliGenHerwig::AliGenHerwig(const AliGenHerwig & Herwig) +AliGenHerwig::~AliGenHerwig() { -// copy constructor +// Destructor } - -AliGenHerwig::~AliGenHerwig() +void AliGenHerwig::SetEventListRange(Int_t eventFirst, Int_t eventLast) { -// Destructor + fEv1Pr = eventFirst; + fEv2Pr = eventLast; + if ( fEv2Pr == -1 ) fEv2Pr = fEv1Pr; } void AliGenHerwig::Init() @@ -75,65 +138,128 @@ void AliGenHerwig::Init() fTarget.Resize(8); fProjectile.Resize(8); SetMC(new THerwig6()); - fHerwig=(THerwig6*) fgMCEvGen; + fHerwig=(THerwig6*) fMCEvGen; // initialize common blocks - fHerwig->Initialize(fProjectile, fTarget, fMomentum1, fMomentum2, fProcess); + fHerwig->Initialize(fProjectile.Data(), fTarget.Data(), fMomentum1, fMomentum2, fProcess); // // reset parameters according to user needs InitPDF(); fHerwig->SetPTMIN(fPtHardMin); + fHerwig->SetPTMAX(fPtHardMax); fHerwig->SetPTRMS(fPtRMS); fHerwig->SetMAXPR(fMaxPr); fHerwig->SetMAXER(fMaxErrors); fHerwig->SetENSOF(fEnSoft); +// C---D,U,S,C,B,T QUARK AND GLUON MASSES (IN THAT ORDER) +// RMASS(1)=0.32 +// RMASS(2)=0.32 +// RMASS(3)=0.5 +// RMASS(4)=1.55 +// RMASS(5)=4.75 +// RMASS(6)=174.3 +// RMASS(13)=0.75 + + fHerwig->SetRMASS(4,1.2); + fHerwig->SetRMASS(5,4.75); + + if ( fProcess < 0 ) strncpy(VVJIN.QQIN,fFileName.Data(), 49); + + //fHerwig->Hwusta("PI0 "); + // compute parameter dependent constants fHerwig->PrepareRun(); } +void AliGenHerwig::InitJimmy() +{ +// Initialisation + fTarget.Resize(8); + fProjectile.Resize(8); + SetMC(new THerwig6()); + fHerwig=(THerwig6*) fMCEvGen; + // initialize common blocks + fHerwig->InitializeJimmy(fProjectile, fTarget, fMomentum1, fMomentum2, fProcess); + // reset parameters according to user needs + InitPDF(); + fHerwig->SetPTMIN(fPtHardMin); + fHerwig->SetPTRMS(fPtRMS); + fHerwig->SetMAXPR(fMaxPr); + fHerwig->SetMAXER(fMaxErrors); + fHerwig->SetENSOF(fEnSoft); + +// C---D,U,S,C,B,T QUARK AND GLUON MASSES (IN THAT ORDER) +// RMASS(1)=0.32 +// RMASS(2)=0.32 +// RMASS(3)=0.5 +// RMASS(4)=1.55 +// RMASS(5)=4.75 +// RMASS(6)=174.3 +// RMASS(13)=0.75 + + fHerwig->SetRMASS(4,1.2); + fHerwig->SetRMASS(5,4.75); + + if ( fProcess < 0 ) strncpy(VVJIN.QQIN,fFileName.Data(), 49); + + // fHerwig->Hwusta("PI0 "); + + // compute parameter dependent constants + fHerwig->PrepareRunJimmy(); +} + void AliGenHerwig::InitPDF() { switch(fStrucFunc) { - case kGRVLO: - fModPDF=5; - fAutPDF="GRV"; +// ONLY USES LHAPDF STRUCTURE FUNCTIONS + case kGRVLO98: + fModPDF=80060; + fAutPDF="HWLHAPDF"; break; - case kGRVHO: - fModPDF=6; - fAutPDF="GRV"; + case kCTEQ6: + fModPDF=10040; + fAutPDF="HWLHAPDF"; break; - case kGRVLO98: - fModPDF=12; - fAutPDF="GRV"; + case kCTEQ61: + fModPDF=10100; + fAutPDF="HWLHAPDF"; + break; + case kCTEQ6m: + fModPDF=10050; + fAutPDF="HWLHAPDF"; break; - case kMRSDminus: - fModPDF=31; - fAutPDF="MRS"; + case kCTEQ6l: + fModPDF=10041; + fAutPDF="HWLHAPDF"; break; - case kMRSD0: - fModPDF=30; - fAutPDF="MRS"; + case kCTEQ6ll: + fModPDF=10042; + fAutPDF="HWLHAPDF"; break; - case kMRSG: - fModPDF=41; - fAutPDF="MRS"; + case kCTEQ5M: + fModPDF=19050; + fAutPDF="HWLHAPDF"; break; - case kMRSTcgLO: - fModPDF=72; - fAutPDF="MRS"; + case kCTEQ5L: + fModPDF=19070; + fAutPDF="HWLHAPDF"; break; case kCTEQ4M: - fModPDF=34; - fAutPDF="CTEQ"; + fModPDF=19150; + fAutPDF="HWLHAPDF"; break; - case kCTEQ5L: - fModPDF=46; - fAutPDF="CTEQ"; + case kCTEQ4L: + fModPDF=19170; + fAutPDF="HWLHAPDF"; break; +// case kMRST2004nlo: +// fModPDF=20400; +// fAutPDF="HWLHAPDF"; +// break; default: cerr << "This structure function is not inplemented " << fStrucFunc << endl; break; } - fAutPDF.Resize(20); + fAutPDF.Resize(20); fHerwig->SetMODPDF(1,fModPDF); fHerwig->SetMODPDF(2,fModPDF); fHerwig->SetAUTPDF(1,fAutPDF); @@ -144,32 +270,26 @@ void AliGenHerwig::Generate() { // Generate one event - Float_t polar[3] = {0,0,0}; - Float_t origin[3]= {0,0,0}; - Float_t origin0[3]= {0,0,0}; - Float_t p[4], random[6]; - + Float_t polar[3] = {0,0,0}; + Float_t origin[3] = {0,0,0}; + Float_t p[4]; + static TClonesArray *particles; // converts from mm/c to s const Float_t kconv=0.001/2.999792458e8; // Int_t nt=0; Int_t jev=0; - Int_t j, kf, ks, imo; + Int_t kf, ks, imo; kf=0; - + if(!particles) particles=new TClonesArray("TParticle",10000); - + fTrials=0; - for (j=0;j<3;j++) origin0[j]=fOrigin[j]; - if(fVertexSmear==kPerEvent) { - Rndm(random,6); - for (j=0;j<3;j++) { - origin0[j]+=fOsigma[j]*TMath::Cos(2*random[2*j]*TMath::Pi())* - TMath::Sqrt(-2*TMath::Log(random[2*j+1])); - } - } - + + // Set collision vertex position + if (fVertexSmear == kPerEvent) Vertex(); + while(1) { fHerwig->GenerateEvent(); @@ -177,73 +297,138 @@ void AliGenHerwig::Generate() fHerwig->ImportParticles(particles,"All"); Int_t np = particles->GetEntriesFast()-1; if (np == 0 ) continue; + + //Check hard partons or direct gamma in kine range + + if (fProcess == kHeJets || fProcess == kHeDirectGamma) { + TParticle* parton1 = (TParticle *) particles->At(6); + TParticle* parton2 = (TParticle *) particles->At(7); + if (!CheckParton(parton1, parton2)) continue ; + } + + // + if (gAlice) { + if (gAlice->GetEvNumber()>=fEv1Pr && + gAlice->GetEvNumber()<=fEv2Pr) fHerwig->PrintEvt(); + + } + - Int_t nc=0; + Int_t nc = 0; + fNprimaries = 0; Int_t * newPos = new Int_t[np]; for (Int_t i = 0; iAt(i); imo = iparticle->GetFirstMother(); kf = iparticle->GetPdgCode(); ks = iparticle->GetStatusCode(); - if (ks != 3 && - KinematicSelection(iparticle,0)) + if (ks != 3 && + KinematicSelection(iparticle,0)) { nc++; p[0]=iparticle->Px(); p[1]=iparticle->Py(); p[2]=iparticle->Pz(); p[3]=iparticle->Energy(); - origin[0]=origin0[0]+iparticle->Vx()/10; - origin[1]=origin0[1]+iparticle->Vy()/10; - origin[2]=origin0[2]+iparticle->Vz()/10; + + origin[0] = fVertex[0] + iparticle->Vx()/10; // [cm] + origin[1] = fVertex[1] + iparticle->Vy()/10; // [cm] + origin[2] = fVertex[2] + iparticle->Vz()/10; // [cm] + Float_t tof = kconv*iparticle->T(); Int_t iparent = (imo > -1) ? newPos[imo] : -1; Int_t trackIt = (ks == 1) && fTrackIt; - gAlice->SetTrack(trackIt, iparent, kf, - p[0], p[1], p[2], p[3], - origin[0], origin[1], origin[2], - tof, - polar[0], polar[1], polar[2], - kPPrimary, nt, 1., ks); + PushTrack(trackIt, iparent, kf, + p[0], p[1], p[2], p[3], + origin[0], origin[1], origin[2], + tof, + polar[0], polar[1], polar[2], + kPPrimary, nt, fHerwig->GetEVWGT(), ks); KeepTrack(nt); newPos[i]=nt; + fNprimaries++; } // end of if: selection of particle } // end of for: particle loop if (newPos) delete[] newPos; - printf("\n I've put %i particles on the stack \n",nc); - // MakeHeader(); - printf("nc: %d %d\n", nc, fNpart); - if (nc > 0) { jev+=nc; if (jev >= fNpart || fNpart == -1) { fKineBias=Float_t(fNpart)/Float_t(fTrials); - printf("\n Trials: %i %i %i\n",fTrials, fNpart, jev); break; } } } +// + MakeHeader(); +// SetHighWaterMark(nt); // adjust weight due to kinematic selection AdjustWeights(); // get cross-section fXsection=fHerwig->GetAVWGT(); + //printf(">> trials << %d\n",fTrials); +} + +Bool_t AliGenHerwig::CheckParton(TParticle* parton1, TParticle* parton2) +{ +// Check the kinematic trigger condition +// +//Select events with parton max energy + if(fPtHardMax < parton1->Pt()) return kFALSE; + +// Select events within angular window + Double_t eta[2]; + eta[0] = parton1->Eta(); + eta[1] = parton2->Eta(); + Double_t phi[2]; + phi[0] = parton1->Phi(); + phi[1] = parton2->Phi(); + Int_t pdg[2]; + pdg[0] = parton1->GetPdgCode(); + pdg[1] = parton2->GetPdgCode(); + printf("min %f, max %f\n",fPtHardMin, fPtHardMax); + printf("Parton 1: %s, pT= %2.2f, eta = %1.2f, phi = %2.2f\n", parton1->GetName(),parton1->Pt(), eta[0],phi[0]*TMath::RadToDeg()); + printf("Parton 2: %s, pT= %2.2f, eta = %1.2f, phi = %2.2f\n", parton2->GetName(),parton2->Pt(), eta[1],phi[1]*TMath::RadToDeg()); + + if (fProcess == kHeJets) { + //Check if one of the 2 outgoing partons are in the eta-phi window + for(Int_t i = 0; i < 2; i++) + if ((eta[i] < fEtaMaxParton && eta[i] > fEtaMinParton) && + (phi[i] < fPhiMaxParton && phi[i] > fPhiMinParton)) return kTRUE ; + } + + else { + //Check if the gamma and the jet are in the eta-phi window + Int_t igj = 0; + Int_t ijj = 0; + if(pdg[0] == 22) ijj=1; + else igj=1; + if ((eta[ijj] < fEtaMaxParton && eta[ijj] > fEtaMinParton) && + (phi[ijj] < fPhiMaxParton && phi[ijj] > fPhiMinParton)) { + + if ((eta[igj] < fEtaMaxGamma && eta[igj] > fEtaMinGamma) && + (phi[igj] < fPhiMaxGamma && phi[igj] > fPhiMinGamma)) return kTRUE; + + } + } + + return kFALSE ; } void AliGenHerwig::AdjustWeights() { // Adjust the weights after generation of all events TParticle *part; - Int_t ntrack=gAlice->GetNtrack(); + Int_t ntrack=gAlice->GetMCApp()->GetNtrack(); for (Int_t i=0; iParticle(i); + part= gAlice->GetMCApp()->Particle(i); part->SetWeight(part->GetWeight()*fKineBias); } } - + void AliGenHerwig::KeepFullEvent() { @@ -263,9 +448,9 @@ Bool_t AliGenHerwig::DaughtersSelection(TParticle* iparticle, TClonesArray* part Bool_t selected=kFALSE; if (hasDaughters) { imin=iparticle->GetFirstDaughter(); - imax=iparticle->GetLastDaughter(); + imax=iparticle->GetLastDaughter(); for (i=imin; i<= imax; i++){ - TParticle * jparticle = (TParticle *) particles->At(i); + TParticle * jparticle = (TParticle *) particles->At(i); Int_t ip=jparticle->GetPdgCode(); if (KinematicSelection(jparticle,0)&&SelectFlavor(ip)) { selected=kTRUE; break; @@ -287,7 +472,7 @@ Bool_t AliGenHerwig::SelectFlavor(Int_t pid) // 4: charm and beauty // 5: beauty if (fFlavor == 0) return kTRUE; - + Int_t ifl=TMath::Abs(pid/100); if (ifl > 10) ifl/=10; return (fFlavor == ifl); @@ -298,9 +483,9 @@ Bool_t AliGenHerwig::Stable(TParticle* particle) // Return true for a stable particle // Int_t kf = TMath::Abs(particle->GetPdgCode()); - + if ( (particle->GetFirstDaughter() < 0 ) || (kf == 1000*fFlavor+122)) - + { return kTRUE; } else { @@ -313,14 +498,39 @@ void AliGenHerwig::FinishRun() fHerwig->Hwefin(); } - -AliGenHerwig& AliGenHerwig::operator=(const AliGenHerwig& rhs) +void AliGenHerwig::FinishRunJimmy() { -// Assignment operator - return *this; + fHerwig->Hwefin(); + fHerwig->Jmefin(); + } -extern "C" { - Double_t hwr_() {return sRandom->Rndm();} +void AliGenHerwig::MakeHeader() +{ +// +// Make header for the simulated event +// + if (fHeader) delete fHeader; + fHeader = new AliGenHerwigEventHeader("Herwig"); +// +// Event type + ((AliGenHerwigEventHeader*) fHeader)->SetProcessType(fHerwig->GetIHPRO()); +// +// Number of trials + ((AliGenHerwigEventHeader*) fHeader)->SetTrials(fTrials); +// +// Event weight (cross section) + ((AliGenHerwigEventHeader*) fHeader)->SetWeight(fHerwig->GetEVWGT()); +// +// Event Vertex + fHeader->SetPrimaryVertex(fVertex); + +// +// Number of primaries + fHeader->SetNProduced(fNprimaries); +// Pass header +// + AddHeader(fHeader); + fHeader = 0x0; }