BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
MpdPHSDGenerator.cxx
Go to the documentation of this file.
1/**
2 *@class MpdPHSDGenerator
3 *@author V.Voronyuk <vadimv@jinr.ru>
4 * MpdPHSDGenerator reads newer (instead of default) output (phsd.dat/phsd.dat.gz)
5 * of HSD/PHSD transport model.
6 **/
7
8#include "MpdPHSDGenerator.h"
9
10#include "FairMCEventHeader.h"
11#include "MpdMCEventHeader.h"
12#include "constants.h" //AZ
13
14#include <TDatabasePDG.h> //AZ
15#include <TMath.h>
16#include <stdio.h>
17#include <stdlib.h>
18
19// ---------------------------------------------------------------------
21 /* It is better to leave empty */
22};
23// ---------------------------------------------------------------------
24MpdPHSDGenerator::MpdPHSDGenerator(const char* filename /*= "phsd.dat.gz"*/)
25{
26 fgzFile = gzopen(filename, "rb"); // zlib
27 if (!fgzFile) {
28 printf("-E- MpdPHSDGenerator: can not open file: %s\n", filename);
29 exit(1);
30 }
31 printf("-I- MpdPHSDGenerator: open %s\n", filename);
32
33 fPsiRP = 0.;
34 fisRP = kTRUE; // by default RP is random
35 frandom = new TRandom2();
36 frandom->SetSeed(0);
37};
38// ---------------------------------------------------------------------
40{
41 if (fgzFile) {
42 gzclose(fgzFile);
43 fgzFile = NULL;
44 }
45 delete frandom;
46};
47// ---------------------------------------------------------------------
48Bool_t MpdPHSDGenerator::ReadEvent(FairPrimaryGenerator* primGen)
49{
50 if (!ReadHeader()) {
51 printf("-I- MpdPHSDGenerator: End of file reached.\n");
52 return kFALSE; // end of file
53 }
54
55 /* set random Reaction Plane angle */
56 if (fisRP) {
57 fPsiRP = frandom->Uniform(2.0 * TMath::Pi());
58 }
59 // printf("-I- MpdPHSDGenerator: RP angle = %e\n",fPsiRP);
60
61 /* Set event impact parameter in MCEventHeader if not yet done */
62 FairMCEventHeader* eventHeader = primGen->GetEvent();
63 if (eventHeader && (!eventHeader->IsSet())) {
64 eventHeader->SetB(fb);
65 eventHeader->MarkSet(kTRUE);
66 // fill extra
67 MpdMCEventHeader* extraEventHeader = dynamic_cast<MpdMCEventHeader*>(eventHeader);
68 if (extraEventHeader) {
69 extraEventHeader->SetPhi(fPsiRP);
70 }
71 }
72 // AZ
73 Double_t kProtonMass = TDatabasePDG::Instance()->GetParticle(2212)->Mass();
74 Double_t ekin = 4.0;
75 Double_t eBeam = ekin + kProtonMass;
76 Double_t pBeam = TMath::Sqrt(eBeam * eBeam - kProtonMass * kProtonMass);
77 Double_t betaCM = pBeam / (eBeam + kProtonMass);
78 Double_t gammaCM = TMath::Sqrt(1. / (1. - betaCM * betaCM));
79 // AZ
80
81 /* read tracks */
82 for (Int_t i = 1; i <= fntr; i++) {
83 // AZ Int_t ipdg; Float_t px,py,pz;
84 Int_t ipdg;
85 Float_t px, py, pz, ee; // AZ
86 /* read track */
87 gzgets(fgzFile, fbuffer, 256);
88 if (gzeof(fgzFile)) {
89 printf("-E- MpdPHSDGenerator: unexpected end of file\n");
90 exit(1);
91 }
92 /* scan values */
93 // AZ int res=sscanf(fbuffer,"%d %*d %e %e %e",&ipdg,&px,&py,&pz);
94 // AZ if (res!=4) {printf("-E- MpdPHSDGenerator: selftest error in track, scan %d of 4\n",res); exit(1);}
95 int res = sscanf(fbuffer, "%d %*d %e %e %e %e", &ipdg, &px, &py, &pz, &ee); // AZ
96 if (res != 5) {
97 printf("-E- MpdPHSDGenerator: selftest error in track, scan %d of 5\n", res);
98 exit(1);
99 } // AZ
100 if (ipdg == 0) {
101 printf("-W- MpdPHSDGenerator: particle with pdg=0\n");
102 continue;
103 }
104 if (!TDatabasePDG::Instance()->GetParticle(ipdg)) {
105 std::cout << "\033[31m -W- ---------- MpdPHSDGenerator: particle with pdg " << ipdg << " not found \033[0m"
106 << std::endl;
107 continue;
108 } // AZ
109
110 // replacement of heavy particles for Geant4
111 // this decays will be improved in the next versions of PHSD
112 if (ipdg == +413)
113 ipdg = +421; // D*+ -> D0
114 if (ipdg == -413)
115 ipdg = -421; // D*- -> D0_bar
116 if (ipdg == +423)
117 ipdg = +421; // D*0 -> D0
118 if (ipdg == -423)
119 ipdg = -421; // D*0_bar -> D0_bar
120 if (ipdg == +4214)
121 ipdg = +4122; // Sigma*_c+ -> Lambda_c+
122 if (ipdg == -4214)
123 ipdg = -4122; // Sigma*_c- -> Lambda_c-
124 if (ipdg == +4114)
125 ipdg = +4122; // Sigma*_c0 -> Lambda_c+
126 if (ipdg == -4114)
127 ipdg = -4122; // Sigma*_c0 -> Lambda_c-
128 if (ipdg == +4224)
129 ipdg = +4122; // Sigma*_c++ -> Lambda_c+
130 if (ipdg == -4224)
131 ipdg = -4122; // Sigma*_c-- -> Lambda_c-
132
133 // AZ - Lorentz transformation to lab
135 // Double_t mass = TDatabasePDG::Instance()->GetParticle(ipdg)->Mass();
136 // Double_t e = sqrt(mass * mass + px * px + py * py + pz * pz);
137 pz = gammaCM * (pz + betaCM * ee);
138 }
139 // AZ
140 /* rotate RP angle */
141 if (fPsiRP != 0.) {
142 Double_t cosPsi = TMath::Cos(fPsiRP);
143 Double_t sinPsi = TMath::Sin(fPsiRP);
144 Double_t px1 = px * cosPsi - py * sinPsi;
145 Double_t py1 = px * sinPsi + py * cosPsi;
146 px = px1;
147 py = py1;
148 }
149
150 /* add track to simulation */
151 primGen->AddTrack(ipdg, px, py, pz, 0., 0., 0.);
152 }
153
154 return kTRUE;
155};
156// ---------------------------------------------------------------------
158{
159 /* read header */
160 gzgets(fgzFile, fbuffer, 256); // 1st line
161 if (gzeof(fgzFile))
162 return kFALSE; // end of file reached
163 int res = sscanf(fbuffer, "%d %*d %*d %e", &fntr, &fb);
164 if (res != 2) {
165 printf("-E- MpdPHSDGenerator: selftest error in header, scan %d of 2\n", res);
166 exit(1);
167 }
168 gzgets(fgzFile, fbuffer, 256); // 2nd line
169 if (gzeof(fgzFile)) {
170 printf("-E- MpdPHSDGenerator: unexpected end of file\n");
171 exit(1);
172 }
173 return kTRUE;
174};
175// ---------------------------------------------------------------------
177{
178 gzgets(fgzFile, fbuffer, 256);
179 if (gzeof(fgzFile)) {
180 printf("-E- MpdPHSDGenerator: unexpected end of file\n");
181 exit(1);
182 }
183};
184// ---------------------------------------------------------------------
186{
187 for (Int_t k = 1; k <= n; ++k) {
188 if (!ReadHeader())
189 return kFALSE; // end of file
190 for (Int_t i = 1; i <= fntr; ++i)
191 SkipTrack();
192 }
193 return kTRUE;
194};
195// ---------------------------------------------------------------------
int i
Definition P4_F32vec4.h:22
bool Bool_t
int Int_t
float Float_t
constexpr Bool_t kFALSE
double Double_t
constexpr Bool_t kTRUE
MpdMCEventHeader.h.
void SetPhi(Double_t phi)
Modifiers.
char fbuffer[256]
file
Bool_t ReadEvent(FairPrimaryGenerator *primGen)
Read event.
Bool_t fisRP
reaction plane angle
void SkipTrack()
read event header, return kTRUE if successful
Bool_t ReadHeader()
random/fixed reaction plane
TRandom2 * frandom
reading buffer
gzFile fgzFile
impact parameter in given event
Float_t fb
number of tracks in given event
virtual ~MpdPHSDGenerator()
Destructor.
Bool_t SkipEvents(Int_t n)
Skip n events, return kTRUE if successful.
static TDatabasePDG * Instance()
TParticlePDG * GetParticle(const char *name) const
Double_t Mass() const
const CoordinateSystem gCoordinateSystem
Definition constants.h:6
@ sysLaboratory
Definition constants.h:4
*brief user defined string literal for JSON values *sa std::size_t n
Definition json.hpp:20362
Double_t Sqrt(Double_t x)
Double_t Cos(Double_t)
constexpr Double_t Pi()
Double_t Sin(Double_t)