Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/particles/utils/src/G4HtmlPPReporter.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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"
 29 #include "G4ParticleDefinition.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 
 39 void G4HtmlPPReporter::Print(const G4String& option)
 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 
 52 void 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 
 66 void 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 
152 void 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 
348 void 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 
368 void G4HtmlPPReporter::PrintFooter(std::ofstream& outFile)
369 {
370   outFile << "<HR>" << G4endl;
371   outFile << "</BODY>" << G4endl;
372   outFile << "</HTML>" << G4endl;
373 }
374 
375 const char* G4HtmlPPReporter::sTABLE = "<TABLE WIDTH=";
376 const char* G4HtmlPPReporter::eTABLE = "</TABLE>";
377 const char* G4HtmlPPReporter::sTR = "<TR>";
378 const char* G4HtmlPPReporter::eTR = "</TR>";
379 const char* G4HtmlPPReporter::sTD = "<TD>";
380 const char* G4HtmlPPReporter::eTD = "</TD>";
381 const char* G4HtmlPPReporter::sB = "<B>";
382 const char* G4HtmlPPReporter::eB = "</B>";
383 const char* G4HtmlPPReporter::sLFONT = "<FONT SIZE = +1>";
384 const char* G4HtmlPPReporter::eLFONT = "</FONT>";
385 const char* G4HtmlPPReporter::sSYMBOL = "<FONT FACE = \"symbol\" >";
386 const char* G4HtmlPPReporter::eSYMBOL = "</FONT>";
387 const char* G4HtmlPPReporter::sSUP = "<SUP>";
388 const char* G4HtmlPPReporter::eSUP = "</SUP>";
389 const char* G4HtmlPPReporter::sSUB = "<SUB>";
390 const char* G4HtmlPPReporter::eSUB = "</SUB>";
391