ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4gsmixt.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4gsmixt.cc
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 //
27 //
28 // by I.Hrivnacova, 27 Sep 99
29 
30 #include <iomanip>
31 #include <iomanip>
32 
33 #include "globals.hh"
34 #include "G4SystemOfUnits.hh"
35 
36 #include "G3toG4.hh"
37 #include "G3EleTable.hh"
38 #include "G3MatTable.hh"
39 #include "G4Material.hh"
40 #include "G4Isotope.hh"
41 
42 void PG4gsmixt(G4String *tokens)
43 {
44  // fill the parameter containers
45  G3fillParams(tokens,PTgsmixt);
46 
47  // interpret the parameters
48  G4String name = Spar[0].data();
49  G4int imate = Ipar[0];
50  G4int nlmat = Ipar[1];
51  //G4double dens = Rpar[0]*g/cm3;
52  G4double dens = Rpar[0];
53  G4double *a = Rpar + 1;
54  G4double *z = Rpar + 1+std::abs(nlmat);
55  G4double *wmat = Rpar + 1 + 2*std::abs(nlmat);
56 /*
57  for (int i=0; i<std::abs(nlmat); i++){
58  //Rpar[i]=Rpar[i]*g/mole;
59  Rpar[i]=Rpar[i];
60  };
61 */
62  G4gsmixt(imate,name,a,z,dens,nlmat,wmat);
63 }
64 
65 // replaced with G3EleTable
66 // only used G4Elements are created;
67 // !! no checking of given A of the element;
68 //
69 // extern G4Element* CreateElement(G4double zeff, G4double aeff, G4String matName);
70 
71 
73  G4double dens, G4int nlmat, G4double* wmat)
74 {
75  // in Geant3:
76  // After a call with ratios by number (negative number of elements),
77  // the ratio array is changed to the ratio by weight, so all successive
78  // calls with the same array must specify the number of elements as
79  // positive
80  G4int i=0;
81  if (nlmat<0) {
82  // in case of proportions given in atom counts (nlmat<0),
83  // the wmat[i] are converted to weight fractions
84  G4double aMol = 0.;
85  for (i=0; i<std::abs(nlmat); i++) {
86  // total molecular weight
87  aMol += wmat[i]*a[i];
88  }
89  if (aMol == 0.) {
90  G4String text = "G4mixt: Total molecular weight in " + name + " = 0.";
91  G4Exception("G4gsmixt()", "G3toG40016", FatalException, text);
92  return;
93  }
94  for (i=0; i<std::abs(nlmat); i++) {
95  // weight fractions
96  wmat[i] = wmat[i]*a[i]/aMol;
97  }
98  }
99 
100  // create material with given number of components
101  // (elements)
102 
104  = new G4Material(name, dens*g/cm3, std::abs(nlmat));
105  for (i=0; i<std::abs(nlmat); i++) {
106  // add units
107  // G4Element* element = G4Element(z[i], a[i]*g/mole, name);
108  G4Element* element = G3Ele.GetEle(z[i]);
109  material->AddElement(element, wmat[i]);
110  }
111 
112  // add the material to the List
113  G3Mat.put(imate, material);
114 }
115 
116 /*
117 void G4gsmixt(G4int imate, G4String name, G4double a[], G4double z[],
118  G4double dens, G4int nlmat, G4double wmat[]){
119  G4int nmate = std::abs(nlmat);
120  G4String sname = name.strip(G4String::both);
121  G4double theDensity = dens*g/cm3;
122 
123  G4Material* theMixture = new G4Material(name, dens, nmate);
124  G4bool ok=true;
125  for (int i=0; i< nmate; i++){
126  G4Element* theElement = G3Ele.GetEle(z[i]);
127  if (nlmat>0) {
128  G4double fractionmass = wmat[i];
129  ok = ok && std::abs(fractionmass)<=1.;
130  theMixture->AddElement(theElement, fractionmass);
131  } else if (nlmat<0) {
132  G4int natoms = wmat[i];
133  ok = ok && wmat[i] == natoms;
134  theMixture->AddElement(theElement, natoms);
135  } else {
136  ok=false;
137  }
138  }
139  if (ok) {
140  G3Mat.put(imate, theMixture);
141  } else {
142  if (nlmat>0) {
143  G4cerr << "G4gsmixt: for mixture '" << name
144  << "' some |weights|>1 : " << G4endl;
145  for (G4int i=0;i<nlmat; i++) {
146  G4cerr << "Component " << std::setw(3) << i+1 << " fraction: "
147  << std::setw(10) << wmat[i] << G4endl;
148  }
149  } else if (nlmat<0) {
150  G4cerr << "G4gsmixt: for mixture '" << name
151  << "' some #natoms are non-integer: " << G4endl;
152  for (G4int i=0;i<nlmat; i++) {
153  G4cerr << "Component " << std::setw(3) << i+1 << " #atoms "
154  << std::setw(10) << wmat[i] << G4endl;
155  }
156  } else {
157  G4cerr << "G4gsmixt: Number of components for mixture '"
158  << name << "' (" << nlmat << ") not allowed." << G4endl;
159  }
160  }
161 }
162 */
163 
164 
165