Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4HtmlPPReporter.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25
26#include "G4HtmlPPReporter.hh"
27
28#include "G4DecayTable.hh"
30#include "G4ParticleTable.hh"
31#include "G4SystemOfUnits.hh"
32#include "G4Tokenizer.hh"
33#include "G4VDecayChannel.hh"
34#include "G4ios.hh"
35#include "globals.hh"
36
37#include <iomanip>
38
40{
41 SparseOption(option);
42
43 GenerateIndex();
44
45 for (const auto& i : pList) {
46 G4ParticleDefinition* particle =
47 G4ParticleTable::GetParticleTable()->FindParticle(i->GetParticleName());
48 GeneratePropertyTable(particle);
49 }
50}
51
52void G4HtmlPPReporter::SparseOption(const G4String& option)
53{
54 G4Tokenizer savedToken(option);
55
56 // 1st option : base directory
57 baseDir = savedToken();
58 if (!baseDir.empty()) {
59 if (baseDir.back() != '/') {
60 baseDir += "/";
61 }
62 }
63 comment = savedToken();
64}
65
66void G4HtmlPPReporter::GenerateIndex()
67{
68 //--- open index file -----
69 G4String fileName = baseDir + "index.html";
70 std::ofstream outFile(fileName, std::ios::out);
71 outFile.setf(std::ios::scientific, std::ios::floatfield);
72
73 // header
74 PrintHeader(outFile);
75
76 // comment
77 outFile << "<! -- " << comment << " -- !> " << G4endl;
78 outFile << G4endl;
79
80 outFile << sTABLE << '"' << "80%" << '"' << " > " << G4endl;
81
82 // Raw #1
83 outFile << sTR;
84 outFile << sTD << sLFONT << "Code" << eLFONT << eTD;
85 outFile << sTD << sLFONT << "Name" << eLFONT << eTD;
86 outFile << sTD << sLFONT << "Mass" << eLFONT << eTD;
87 outFile << sTD << sLFONT << "Charge" << eLFONT << eTD;
88 outFile << sTD << sLFONT << "Life Time" << eLFONT << eTD;
89 outFile << sTD << sLFONT << "Anti-Particle" << eLFONT << eTD;
90 outFile << eTR << G4endl;
91 ;
92
93 // Raw #2
94 outFile << sTR;
95 outFile << sTD << " " << eTD;
96 outFile << sTD << " " << eTD;
97 outFile << sTD << " [GeV/c" << sSUP << "2" << eSUP << "]" << eTD;
98 outFile << sTD << " " << eTD;
99 outFile << sTD << " [ns]" << eTD;
100 outFile << sTD << " " << eTD;
101 outFile << eTR << G4endl;
102 ;
103
104 for (const auto& i : pList) {
105 if (i->GetPDGEncoding() < 0) continue;
106
107 outFile << sTR << G4endl;
108 ;
109 // column 1 : endcoding
110 outFile << sTD << i->GetPDGEncoding() << eTD << G4endl;
111 ;
112 // column 2 : name
113 G4String name = i->GetParticleName();
114
115 G4String fname = name + ".html";
116 // exception
117 if (name == "J/psi") fname = "jpsi.html";
118
119 outFile << sTD;
120 outFile << "<A HREF=" << '"' << fname << '"' << ">";
121 outFile << name << "</A>" << eTD << G4endl;
122
123 // column 3 mass
124 outFile << sTD << i->GetPDGMass() / GeV << eTD << G4endl;
125
126 // column 4 charge
127 outFile << sTD << i->GetPDGCharge() / eplus << eTD << G4endl;
128
129 // column 5 life time
130 outFile << sTD << i->GetPDGLifeTime() / ns << eTD << G4endl;
131
132 // column 6 AntiParticle
133 if ((i->GetAntiPDGEncoding() != 0) && (i->GetAntiPDGEncoding() != i->GetPDGEncoding())) {
134 G4ParticleDefinition* anti_particle =
135 G4ParticleTable::GetParticleTable()->FindParticle(i->GetAntiPDGEncoding());
136
137 outFile << sTD << anti_particle->GetParticleName() << eTD << G4endl;
138 ;
139 }
140
141 // end raw
142 outFile << eTR << G4endl;
143 ;
144 }
145
146 outFile << eTABLE << G4endl;
147
148 // footer
149 PrintFooter(outFile);
150}
151
152void G4HtmlPPReporter::GeneratePropertyTable(const G4ParticleDefinition* particle)
153{
154 if (particle->GetPDGEncoding() < 0) return;
155
156 G4String name = particle->GetParticleName();
157 //--- open index file -----
158 G4String fileName = baseDir + name + ".html";
159 // exception
160 if (name == "J/psi") fileName = baseDir + "jpsi.html";
161 std::ofstream outFile(fileName, std::ios::out);
162 outFile.setf(std::ios::scientific, std::ios::floatfield);
163 outFile << std::setprecision(7) << G4endl;
164
165 PrintHeader(outFile);
166
167 // particle name
168 outFile << "<H2>" << name << "</H2>" << G4endl;
169 outFile << "<HR>" << G4endl;
170
171 // encoding, type
172 outFile << sTABLE << '"' << "40%" << '"' << " > " << G4endl;
173 outFile << sTR << sTD << sB << "PDG encoding" << eB << eTD;
174 outFile << sTD << particle->GetPDGEncoding() << eTD << eTR << G4endl;
175 outFile << sTR << sTD << sB << "Type" << eB << eTD;
176 outFile << sTD << particle->GetParticleType() << eTD << eTR << G4endl;
177 outFile << eTABLE << G4endl;
178 outFile << "<HR>" << G4endl;
179
180 // Properties
181 outFile << sTABLE << '"' << "60%" << '"' << " > " << G4endl;
182 // mass
183 outFile << sTR << sTD << sB << "Mass" << eB << eTD;
184 outFile << sTD << particle->GetPDGMass() / GeV;
185 outFile << " [GeV/c" << sSUP << "2" << eSUP << "]" << eTD << eTR << G4endl;
186 // width
187 outFile << sTR << sTD << sB << "Width" << eB << eTD;
188 outFile << sTD << particle->GetPDGWidth() / GeV;
189 outFile << " [GeV/c" << sSUP << "2" << eSUP << "]" << eTD << eTR << G4endl;
190 // IJPC
191 outFile << sTR << sTD << sB << "I J" << sSUP << "PC" << eSUP << eB << eTD;
192 if (particle->GetPDGiIsospin() < 0) {
193 outFile << sTD << " ";
194 }
195 else if (particle->GetPDGiIsospin() == 1) {
196 outFile << sTD << "1/2 ";
197 }
198 else if (particle->GetPDGiIsospin() == 3) {
199 outFile << sTD << "3/2 ";
200 }
201 else {
202 outFile << sTD << particle->GetPDGiIsospin() / 2 << " ";
203 }
204 if (particle->GetPDGiSpin() == 1) {
205 outFile << "1/2";
206 }
207 else if (particle->GetPDGiSpin() == 3) {
208 outFile << "3/2";
209 }
210 else if (particle->GetPDGiSpin() == 5) {
211 outFile << "5/2";
212 }
213 else if (particle->GetPDGiSpin() == 7) {
214 outFile << "7/2";
215 }
216 else if (particle->GetPDGiSpin() == 9) {
217 outFile << "9/2";
218 }
219 else if (particle->GetPDGiSpin() == 11) {
220 outFile << "11/2";
221 }
222 else if (particle->GetPDGiSpin() == 13) {
223 outFile << "13/2";
224 }
225 else {
226 outFile << particle->GetPDGiSpin() / 2;
227 }
228 outFile << sSUP << sSYMBOL;
229 if (particle->GetPDGiParity() == +1) {
230 outFile << "+";
231 }
232 else if (particle->GetPDGiParity() == -1) {
233 outFile << "-";
234 }
235 else {
236 outFile << " ";
237 }
238 if (particle->GetPDGiConjugation() == +1) {
239 outFile << "+";
240 }
241 else if (particle->GetPDGiConjugation() == -1) {
242 outFile << "-";
243 }
244 else {
245 outFile << " ";
246 }
247 outFile << eSYMBOL << eSUP;
248 outFile << eTD << eTR << G4endl;
249 // charge
250 outFile << sTR << sTD << sB << "Charge" << eB << eTD;
251 outFile << sTD << particle->GetPDGCharge() / eplus;
252 outFile << eTD << eTR << G4endl;
253 // Magnetic Moment
254 outFile << sTR << sTD << sB << "Magnetic Moment" << eB << eTD;
255 if (particle->GetPDGMagneticMoment() != 0.0) {
256 outFile << sTD << particle->GetPDGMagneticMoment() / MeV * tesla;
257 outFile << "[MeV/T]" << eTD << eTR << G4endl;
258 }
259 else {
260 outFile << sTD << " not defined ";
261 outFile << eTD << eTR << G4endl;
262 }
263 // life time
264 outFile << sTR << sTD << sB << "Life Time" << eB << eTD;
265 if (particle->GetPDGLifeTime() > 0.0) {
266 outFile << sTD << particle->GetPDGLifeTime() / second;
267 outFile << "[sec]" << eTD << G4endl;
268 }
269 else {
270 if (particle->GetPDGStable()) {
271 outFile << sTD << "stable" << eTD;
272 }
273 else if (particle->IsShortLived()) {
274 outFile << sTD << "short-lived" << eTD;
275 }
276 else {
277 outFile << sTD << "not Defined" << eTD;
278 }
279 }
280 outFile << eTR << G4endl;
281
282 outFile << eTABLE << G4endl;
283 outFile << "<HR>" << G4endl;
284
285 // Qurak content
286 outFile << "<H2>"
287 << " Quark Content "
288 << "</H2>" << G4endl;
289
290 outFile << sTABLE << '"' << "60%" << '"' << " > " << G4endl;
291
292 outFile << sTR;
293 outFile << sTD << sB << "flavour " << eB << eTD;
294 outFile << sTD << sB << " quark " << eB << eTD;
295 outFile << sTD << sB << " anti-quark " << eB << eTD;
296 outFile << eTR;
297
298 static const char* quarkName[6] = {"d", "u", "s", "c", "b", "t"};
299 for (G4int flv = 0; flv < 6; flv++) {
300 outFile << sTR;
301 outFile << sTD << sB << quarkName[flv] << eB << eTD;
302 outFile << sTD << sB << particle->GetQuarkContent(flv + 1) << eB << eTD;
303 outFile << sTD << sB << particle->GetAntiQuarkContent(flv + 1) << eB << eTD;
304 outFile << eTR;
305 }
306 outFile << eTABLE << G4endl;
307 outFile << "<HR>" << G4endl;
308
309 // Decay Table
310 G4DecayTable* dcyTable = particle->GetDecayTable();
311 if (dcyTable != nullptr) {
312 outFile << "<H2>"
313 << " Decay Table "
314 << "</H2>" << G4endl;
315
316 outFile << sTABLE << '"' << "80%" << '"' << " > " << G4endl;
317
318 outFile << sTR;
319 outFile << sTD << sB << "BR" << eB << eTD;
320 outFile << sTD << sB << "kinematics" << eB << eTD;
321 outFile << eTR;
322
323 for (G4int i = 0; i < dcyTable->entries(); i++) {
324 G4VDecayChannel* channel = dcyTable->GetDecayChannel(i);
325 outFile << sTR << G4endl;
326 ;
327 // column 1 : BR
328 outFile << sTD << channel->GetBR() << eTD;
329 // column 2 : Kinematics
330 outFile << sTD << channel->GetKinematicsName() << eTD;
331 // column 3.. : daughters
332 for (G4int j = 0; j < channel->GetNumberOfDaughters(); j++) {
333 outFile << sTD << channel->GetDaughter(j)->GetParticleName() << eTD;
334 }
335 outFile << eTR << G4endl;
336 }
337 outFile << eTABLE << G4endl;
338 outFile << "<HR>" << G4endl;
339 }
340
341 outFile << sB;
342 outFile << "<A HREF=" << '"' << "index.html" << '"' << ">back to index</A>";
343 outFile << eB << G4endl;
344
345 PrintFooter(outFile);
346}
347
348void G4HtmlPPReporter::PrintHeader(std::ofstream& outFile)
349{
350 outFile << "<HTML>" << G4endl;
351 outFile << "<HEAD>" << G4endl;
352 outFile << " <META HTTP-EQUIV="
353 << "\""
354 << " Content-Type"
355 << "\"";
356 outFile << " CONTENT="
357 << "\""
358 << "text/html; charset=iso-8859-1"
359 << "\""
360 << ">" << G4endl;
361 outFile << " <TITLE>Geant4 Particle List </TITLE>" << G4endl;
362 outFile << "</HEAD>" << G4endl;
363 outFile << "<! -- Generated automatically by Geant4, "
364 << " -- !>" << G4endl;
365 outFile << "<BODY>" << G4endl;
366}
367
368void G4HtmlPPReporter::PrintFooter(std::ofstream& outFile)
369{
370 outFile << "<HR>" << G4endl;
371 outFile << "</BODY>" << G4endl;
372 outFile << "</HTML>" << G4endl;
373}
374
375const char* G4HtmlPPReporter::sTABLE = "<TABLE WIDTH=";
376const char* G4HtmlPPReporter::eTABLE = "</TABLE>";
377const char* G4HtmlPPReporter::sTR = "<TR>";
378const char* G4HtmlPPReporter::eTR = "</TR>";
379const char* G4HtmlPPReporter::sTD = "<TD>";
380const char* G4HtmlPPReporter::eTD = "</TD>";
381const char* G4HtmlPPReporter::sB = "<B>";
382const char* G4HtmlPPReporter::eB = "</B>";
383const char* G4HtmlPPReporter::sLFONT = "<FONT SIZE = +1>";
384const char* G4HtmlPPReporter::eLFONT = "</FONT>";
385const char* G4HtmlPPReporter::sSYMBOL = "<FONT FACE = \"symbol\" >";
386const char* G4HtmlPPReporter::eSYMBOL = "</FONT>";
387const char* G4HtmlPPReporter::sSUP = "<SUP>";
388const char* G4HtmlPPReporter::eSUP = "</SUP>";
389const char* G4HtmlPPReporter::sSUB = "<SUB>";
390const char* G4HtmlPPReporter::eSUB = "</SUB>";
int G4int
Definition G4Types.hh:85
#define G4endl
Definition G4ios.hh:67
G4VDecayChannel * GetDecayChannel(G4int index) const
G4int entries() const
void Print(const G4String &option="") override
G4double GetPDGMagneticMoment() const
G4bool GetPDGStable() const
const G4String & GetParticleType() const
G4int GetQuarkContent(G4int flavor) const
G4DecayTable * GetDecayTable() const
G4double GetPDGLifeTime() const
const G4String & GetParticleName() const
G4int GetAntiQuarkContent(G4int flavor) const
G4ParticleDefinition * FindParticle(G4int PDGEncoding)
static G4ParticleTable * GetParticleTable()
G4double GetBR() const
const G4String & GetKinematicsName() const
G4int GetNumberOfDaughters() const
G4ParticleDefinition * GetDaughter(G4int anIndex)
const char * name(G4int ptype)