BmnRoot
Loading...
Searching...
No Matches
MpdPHSDGenerator.cxx
Go to the documentation of this file.
1
8#include <stdio.h>
9#include <stdlib.h>
10
11#include <TMath.h>
12
13#include "FairMCEventHeader.h"
14#include "MpdMCEventHeader.h"
15#include "MpdPHSDGenerator.h"
16#include "constants.h" //AZ
17
18#include <TDatabasePDG.h> //AZ
19
20// ---------------------------------------------------------------------
22{
23/* It is better to leave empty */
24};
25// ---------------------------------------------------------------------
26MpdPHSDGenerator::MpdPHSDGenerator(const char *filename="phsd.dat.gz")
27{
28 fgzFile = gzopen(filename,"rb"); // zlib
29 if (!fgzFile) {printf("-E- MpdPHSDGenerator: can not open file: %s\n",filename); exit(1);}
30 printf("-I- MpdPHSDGenerator: open %s\n",filename);
31
32 fPsiRP=0.;
33 fisRP=kTRUE; // by default RP is random
34 frandom = new TRandom2();
35 frandom->SetSeed(0);
36};
37// ---------------------------------------------------------------------
39{
40 if (fgzFile) {gzclose(fgzFile); fgzFile=NULL;}
41 delete frandom;
42};
43// ---------------------------------------------------------------------
44Bool_t MpdPHSDGenerator::ReadEvent(FairPrimaryGenerator *primGen)
45{
46 if (!ReadHeader())
47 {
48 printf("-I- MpdPHSDGenerator: End of file reached.\n");
49 return kFALSE; // end of file
50 }
51
52 /* set random Reaction Plane angle */
53 if (fisRP) {fPsiRP=frandom->Uniform(2.0*TMath::Pi());}
54 //printf("-I- MpdPHSDGenerator: RP angle = %e\n",fPsiRP);
55
56 /* Set event impact parameter in MCEventHeader if not yet done */
57 FairMCEventHeader *eventHeader = primGen->GetEvent();
58 if (eventHeader && (!eventHeader->IsSet()))
59 {
60 eventHeader->SetB(fb);
61 eventHeader->MarkSet(kTRUE);
62 // fill extra
63 MpdMCEventHeader *extraEventHeader = dynamic_cast<MpdMCEventHeader*> (eventHeader);
64 if (extraEventHeader)
65 {
66 extraEventHeader->SetPhi(fPsiRP);
67 }
68 }
69 //AZ
70 Double_t kProtonMass = TDatabasePDG::Instance()->GetParticle(2212)->Mass();
71 Double_t ekin = 4.0;
72 Double_t eBeam = ekin + kProtonMass;
73 Double_t pBeam = TMath::Sqrt(eBeam*eBeam - kProtonMass*kProtonMass);
74 Double_t betaCM = pBeam / (eBeam + kProtonMass);
75 Double_t gammaCM = TMath::Sqrt( 1. / ( 1. - betaCM*betaCM) );
76 //AZ
77
78 /* read tracks */
79 for(Int_t i=1; i<=fntr; i++)
80 {
81 //AZ Int_t ipdg; Float_t px,py,pz;
82 Int_t ipdg; Float_t px,py,pz,ee; //AZ
83 /* read track */
84 gzgets(fgzFile,fbuffer,256);
85 if (gzeof(fgzFile)) {printf("-E- MpdPHSDGenerator: unexpected end of file\n"); exit(1);}
86 /* scan values */
87 //AZ int res=sscanf(fbuffer,"%d %*d %e %e %e",&ipdg,&px,&py,&pz);
88 //AZ if (res!=4) {printf("-E- MpdPHSDGenerator: selftest error in track, scan %d of 4\n",res); exit(1);}
89 int res=sscanf(fbuffer,"%d %*d %e %e %e %e",&ipdg,&px,&py,&pz,&ee); //AZ
90 if (res!=5) {printf("-E- MpdPHSDGenerator: selftest error in track, scan %d of 5\n",res); exit(1);} //AZ
91 if (ipdg==0) {printf("-W- MpdPHSDGenerator: particle with pdg=0\n"); continue;}
92 if (!TDatabasePDG::Instance()->GetParticle(ipdg)) { std::cout << "\033[31m -W- ---------- MpdPHSDGenerator: particle with pdg " << ipdg << " not found \033[0m" << std::endl; continue; } //AZ
93
94 // replacement of heavy particles for Geant4
95 // this decays will be improved in the next versions of PHSD
96 if (ipdg==+413) ipdg=+421; // D*+ -> D0
97 if (ipdg==-413) ipdg=-421; // D*- -> D0_bar
98 if (ipdg==+423) ipdg=+421; // D*0 -> D0
99 if (ipdg==-423) ipdg=-421; // D*0_bar -> D0_bar
100 if (ipdg==+4214) ipdg=+4122; // Sigma*_c+ -> Lambda_c+
101 if (ipdg==-4214) ipdg=-4122; // Sigma*_c- -> Lambda_c-
102 if (ipdg==+4114) ipdg=+4122; // Sigma*_c0 -> Lambda_c+
103 if (ipdg==-4114) ipdg=-4122; // Sigma*_c0 -> Lambda_c-
104 if (ipdg==+4224) ipdg=+4122; // Sigma*_c++ -> Lambda_c+
105 if (ipdg==-4224) ipdg=-4122; // Sigma*_c-- -> Lambda_c-
106
107 //AZ - Lorentz transformation to lab
109 //Double_t mass = TDatabasePDG::Instance()->GetParticle(ipdg)->Mass();
110 //Double_t e = sqrt(mass * mass + px * px + py * py + pz * pz);
111 pz = gammaCM * (pz + betaCM * ee);
112 }
113 //AZ
114 /* rotate RP angle */
115 if (fPsiRP!=0.)
116 {
117 Double_t cosPsi = TMath::Cos(fPsiRP);
118 Double_t sinPsi = TMath::Sin(fPsiRP);
119 Double_t px1=px*cosPsi-py*sinPsi;
120 Double_t py1=px*sinPsi+py*cosPsi;
121 px=px1; py=py1;
122 }
123
124 /* add track to simulation */
125 primGen->AddTrack(ipdg, px, py, pz, 0., 0., 0.);
126 }
127
128 return kTRUE;
129};
130// ---------------------------------------------------------------------
131Bool_t MpdPHSDGenerator::ReadHeader()
132{
133 /* read header */
134 gzgets(fgzFile,fbuffer,256); // 1st line
135 if (gzeof(fgzFile)) return kFALSE; // end of file reached
136 int res=sscanf(fbuffer,"%d %*d %*d %e",&fntr,&fb);
137 if (res!=2) {printf("-E- MpdPHSDGenerator: selftest error in header, scan %d of 2\n",res); exit(1);}
138 gzgets(fgzFile,fbuffer,256); // 2nd line
139 if (gzeof(fgzFile)) {printf("-E- MpdPHSDGenerator: unexpected end of file\n"); exit(1);}
140 return kTRUE;
141};
142// ---------------------------------------------------------------------
143void MpdPHSDGenerator::SkipTrack()
144{
145 gzgets(fgzFile,fbuffer,256);
146 if (gzeof(fgzFile)) {printf("-E- MpdPHSDGenerator: unexpected end of file\n"); exit(1);}
147};
148// ---------------------------------------------------------------------
150{
151 for (Int_t k=1; k<=n; ++k)
152 {
153 if (!ReadHeader()) return kFALSE; // end of file
154 for (Int_t i=1; i<=fntr; ++i) SkipTrack();
155 }
156 return kTRUE;
157};
158// ---------------------------------------------------------------------
const Double_t kProtonMass
int i
Definition P4_F32vec4.h:22
void SetPhi(Double_t phi)
Bool_t ReadEvent(FairPrimaryGenerator *primGen)
Bool_t SkipEvents(Int_t n)
const CoordinateSystem gCoordinateSystem
Definition constants.h:2
@ sysLaboratory
Definition constants.h:1