New TPC parameters
[u/mrichter/AliRoot.git] / THerwig / AliGenHerwig.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /* $Id$ */
17
18
19 // Generator using Herwig as an external generator
20 // The main Herwig options are accessable for the user through this interface.
21 // Uses the THerwig implementation of TGenerator.
22
23 #include "AliGenHerwig.h"
24 #include "AliHerwigRndm.h"
25 #include "AliRun.h"
26
27 #include <TParticle.h>
28 #include "THerwig6.h"
29
30 #include "Riostream.h"
31 #include "AliMC.h"
32
33 #include "driver.h"
34
35 ClassImp(AliGenHerwig)
36
37
38   AliGenHerwig::AliGenHerwig() :
39     AliGenMC(),
40     fAutPDF("GRV"),
41     fModPDF(5),
42     fStrucFunc(kGRVHO),
43     fKeep(0),
44     fDecaysOff(1),
45     fTrigger(0),
46     fSelectAll(0),
47     fFlavor(0),
48     fEnergyCMS(14000),
49     fMomentum1(7000),
50     fMomentum2(7000),
51     fKineBias(1),
52     fTrials(0),
53     fXsection(0),
54     fHerwig(0x0),
55     fProcess(0),
56     fPtHardMin(0),
57     fPtRMS(0),
58     fMaxPr(10),
59     fMaxErrors(1000),
60     fEnSoft(1),
61     fEv1Pr(0),
62     fEv2Pr(0)
63 {
64 // Constructor
65 }
66
67 AliGenHerwig::AliGenHerwig(Int_t npart)
68     :AliGenMC(npart)
69 {
70     SetBeamMomenta();
71     SetTarget();
72     SetProjectile();
73     SetStrucFunc(kGRVLO98);
74     fKeep=0;
75     fTrigger=0;
76     fDecaysOff=1;
77     fSelectAll=0;
78     fFlavor=0;
79     fPtHardMin=0.;
80     fPtRMS=0.0;
81     fEnSoft=1.0;
82     fMaxPr=10;
83     fMaxErrors=1000;
84     fEv1Pr=0;
85     fEv2Pr=0;
86     // Set random number generator   
87     AliHerwigRndm::SetHerwigRandom(GetRandom());
88 }
89
90 AliGenHerwig::AliGenHerwig(const AliGenHerwig & Herwig)
91     :AliGenMC(Herwig)
92 {
93 // Copy constructor
94     Herwig.Copy(*this);
95 }
96
97
98 AliGenHerwig::~AliGenHerwig()
99 {
100 // Destructor
101 }
102
103 void AliGenHerwig::SetEventListRange(Int_t eventFirst, Int_t eventLast)
104 {
105   fEv1Pr = ++eventFirst;
106   fEv2Pr = ++eventLast;
107   if ( fEv2Pr == -1 ) fEv2Pr = fEv2Pr;
108 }
109
110 void AliGenHerwig::Init()
111 {
112 // Initialisation
113   fTarget.Resize(8);
114   fProjectile.Resize(8);
115   SetMC(new THerwig6());
116   fHerwig=(THerwig6*) fMCEvGen;
117   // initialize common blocks
118   fHerwig->Initialize(fProjectile, fTarget, fMomentum1, fMomentum2, fProcess);
119   // reset parameters according to user needs
120   InitPDF();
121   fHerwig->SetPTMIN(fPtHardMin);
122   fHerwig->SetPTRMS(fPtRMS);
123   fHerwig->SetMAXPR(fMaxPr);
124   fHerwig->SetMAXER(fMaxErrors);
125   fHerwig->SetENSOF(fEnSoft);
126   
127   fHerwig->SetEV1PR(fEv1Pr);
128   fHerwig->SetEV2PR(fEv2Pr);
129
130 // C---D,U,S,C,B,T QUARK AND GLUON MASSES (IN THAT ORDER)
131 //       RMASS(1)=0.32
132 //       RMASS(2)=0.32
133 //       RMASS(3)=0.5
134 //       RMASS(4)=1.55
135 //       RMASS(5)=4.95
136 //       RMASS(6)=174.3
137 //       RMASS(13)=0.75
138
139   fHerwig->SetRMASS(4,1.2);
140   fHerwig->SetRMASS(5,4.75);
141   
142   if ( fProcess < 0 ) strncpy(VVJIN.QQIN,fFileName.Data(),50);
143
144   fHerwig->Hwusta("PI0     ");
145
146   // compute parameter dependent constants
147   fHerwig->PrepareRun();
148 }
149
150 void AliGenHerwig::InitPDF()
151 {
152   switch(fStrucFunc)
153     {
154     case kGRVLO:
155       fModPDF=5;
156       fAutPDF="GRV";
157       break;
158     case kGRVHO:
159       fModPDF=6;
160       fAutPDF="GRV";
161       break;
162     case kGRVLO98:
163       fModPDF=12;
164       fAutPDF="GRV";
165       break;
166     case kMRSDminus:
167       fModPDF=31;
168       fAutPDF="MRS";
169       break;
170     case kMRSD0:
171       fModPDF=30;
172       fAutPDF="MRS";
173       break;
174     case kMRSG:
175       fModPDF=41;
176       fAutPDF="MRS";
177       break;
178     case kMRSTcgLO:
179       fModPDF=72;
180       fAutPDF="MRS";
181       break;
182     case kCTEQ4M:
183       fModPDF=34;
184       fAutPDF="CTEQ";
185       break;
186     case kCTEQ5L:
187       fModPDF=46;
188       fAutPDF="CTEQ";
189       break;
190     case kCTEQ5M:
191       fModPDF=48;
192       fAutPDF="CTEQ";
193       break;
194     default:
195       cerr << "This structure function is not inplemented " << fStrucFunc << endl;
196       break;
197     }
198   fAutPDF.Resize(20);      
199   fHerwig->SetMODPDF(1,fModPDF);
200   fHerwig->SetMODPDF(2,fModPDF);
201   fHerwig->SetAUTPDF(1,fAutPDF);
202   fHerwig->SetAUTPDF(2,fAutPDF);
203 }
204
205 void AliGenHerwig::Generate()
206 {
207   // Generate one event
208
209   Float_t polar[3] =   {0,0,0};
210   Float_t origin[3]=   {0,0,0};
211   Float_t origin0[3]=  {0,0,0};
212   Float_t p[4], random[6];
213   
214   static TClonesArray *particles;
215   //  converts from mm/c to s
216   const Float_t kconv=0.001/2.999792458e8;
217   //
218   Int_t nt=0;
219   Int_t jev=0;
220   Int_t j, kf, ks, imo;
221   kf=0;
222   
223   if(!particles) particles=new TClonesArray("TParticle",10000);
224   
225   fTrials=0;
226   for (j=0;j<3;j++) origin0[j]=fOrigin[j];
227   if(fVertexSmear==kPerEvent) {
228     Rndm(random,6);
229     for (j=0;j<3;j++) {
230       origin0[j]+=fOsigma[j]*TMath::Cos(2*random[2*j]*TMath::Pi())*
231         TMath::Sqrt(-2*TMath::Log(random[2*j+1]));
232     }
233   }
234   
235   while(1)
236     {
237         fHerwig->GenerateEvent();
238         fTrials++;
239         fHerwig->ImportParticles(particles,"All");
240         Int_t np = particles->GetEntriesFast()-1;
241         if (np == 0 ) continue;
242         
243         Int_t nc=0;
244         
245         Int_t * newPos = new Int_t[np];
246         for (Int_t i = 0; i<np; i++) *(newPos+i)=-1;
247         
248         for (Int_t i = 0; i<np; i++) {
249             TParticle *  iparticle       = (TParticle *) particles->At(i);
250             imo = iparticle->GetFirstMother();
251             kf        = iparticle->GetPdgCode();
252             ks        = iparticle->GetStatusCode();
253             if (ks != 3 && 
254                 KinematicSelection(iparticle,0)) 
255             {
256                 nc++;
257                 p[0]=iparticle->Px();
258                 p[1]=iparticle->Py();
259                 p[2]=iparticle->Pz();
260                 p[3]=iparticle->Energy();
261                 origin[0]=origin0[0]+iparticle->Vx()/10;
262                 origin[1]=origin0[1]+iparticle->Vy()/10;
263                 origin[2]=origin0[2]+iparticle->Vz()/10;
264                 Float_t tof = kconv*iparticle->T();
265                 Int_t   iparent = (imo > -1) ? newPos[imo] : -1;
266                 Int_t   trackIt = (ks == 1) && fTrackIt;
267                 PushTrack(trackIt, iparent, kf,
268                           p[0], p[1], p[2], p[3],
269                           origin[0], origin[1], origin[2], 
270                           tof,
271                           polar[0], polar[1], polar[2],
272                           kPPrimary, nt, fHerwig->GetEVWGT(), ks);
273                 KeepTrack(nt);
274                 newPos[i]=nt;
275             } // end of if: selection of particle
276         } // end of for: particle loop
277         if (newPos) delete[] newPos;
278         //      MakeHeader();
279         if (nc > 0) {
280             jev+=nc;
281             if (jev >= fNpart || fNpart == -1) {
282                 fKineBias=Float_t(fNpart)/Float_t(fTrials);
283                 break;
284             }
285         }
286     }
287   SetHighWaterMark(nt);
288 //  adjust weight due to kinematic selection
289   AdjustWeights();
290 //  get cross-section
291   fXsection=fHerwig->GetAVWGT();
292 }
293
294 void AliGenHerwig::AdjustWeights()
295 {
296 // Adjust the weights after generation of all events
297     TParticle *part;
298     Int_t ntrack=gAlice->GetMCApp()->GetNtrack();
299     for (Int_t i=0; i<ntrack; i++) {
300         part= gAlice->GetMCApp()->Particle(i);
301         part->SetWeight(part->GetWeight()*fKineBias);
302     }
303 }
304  
305
306 void AliGenHerwig::KeepFullEvent()
307 {
308     fKeep=1;
309 }
310
311 Bool_t AliGenHerwig::DaughtersSelection(TParticle* iparticle, TClonesArray* particles)
312 {
313 //
314 // Looks recursively if one of the daughters has been selected
315 //
316 //    printf("\n Consider daughters %d:",iparticle->GetPdgCode());
317     Int_t imin=-1;
318     Int_t imax=-1;
319     Int_t i;
320     Bool_t hasDaughters= (iparticle->GetFirstDaughter() >=0);
321     Bool_t selected=kFALSE;
322     if (hasDaughters) {
323         imin=iparticle->GetFirstDaughter();
324         imax=iparticle->GetLastDaughter();       
325         for (i=imin; i<= imax; i++){
326             TParticle *  jparticle       = (TParticle *) particles->At(i);      
327             Int_t ip=jparticle->GetPdgCode();
328             if (KinematicSelection(jparticle,0)&&SelectFlavor(ip)) {
329                 selected=kTRUE; break;
330             }
331             if (DaughtersSelection(jparticle, particles)) {selected=kTRUE; break; }
332         }
333     } else {
334         return kFALSE;
335     }
336
337     return selected;
338 }
339
340
341 Bool_t AliGenHerwig::SelectFlavor(Int_t pid)
342 {
343 // Select flavor of particle
344 // 0: all
345 // 4: charm and beauty
346 // 5: beauty
347     if (fFlavor == 0) return kTRUE;
348     
349     Int_t ifl=TMath::Abs(pid/100);
350     if (ifl > 10) ifl/=10;
351     return (fFlavor == ifl);
352 }
353
354 Bool_t AliGenHerwig::Stable(TParticle*  particle)
355 {
356 // Return true for a stable particle
357 //
358     Int_t kf = TMath::Abs(particle->GetPdgCode());
359     
360     if ( (particle->GetFirstDaughter() < 0 ) || (kf == 1000*fFlavor+122))
361          
362     {
363         return kTRUE;
364     } else {
365         return kFALSE;
366     }
367 }
368
369 void AliGenHerwig::FinishRun()
370 {
371   fHerwig->Hwefin();
372 }
373
374
375 AliGenHerwig& AliGenHerwig::operator=(const  AliGenHerwig& rhs)
376 {
377 // Assignment operator
378     rhs.Copy(*this);
379     return (*this);
380 }
381
382