Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/examples/advanced/composite_calorimeter/src/CCalMaterial.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 ]

Diff markup

Differences between /examples/advanced/composite_calorimeter/src/CCalMaterial.cc (Version 11.3.0) and /examples/advanced/composite_calorimeter/src/CCalMaterial.cc (Version 8.0.p1)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                    <<   3 // * DISCLAIMER                                                       *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th <<   5 // * The following disclaimer summarizes all the specific disclaimers *
  6 // * the Geant4 Collaboration.  It is provided <<   6 // * of contributors to this software. The specific disclaimers,which *
  7 // * conditions of the Geant4 Software License <<   7 // * govern, are listed with their locations in:                      *
  8 // * LICENSE and available at  http://cern.ch/ <<   8 // *   http://cern.ch/geant4/license                                  *
  9 // * include a list of copyright holders.      << 
 10 // *                                                9 // *                                                                  *
 11 // * Neither the authors of this software syst     10 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     11 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     12 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     13 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file  <<  14 // * use.                                                             *
 16 // * for the full disclaimer and the limitatio << 
 17 // *                                               15 // *                                                                  *
 18 // * This  code  implementation is the result  <<  16 // * This  code  implementation is the  intellectual property  of the *
 19 // * technical work of the GEANT4 collaboratio <<  17 // * GEANT4 collaboration.                                            *
 20 // * By using,  copying,  modifying or  distri <<  18 // * By copying,  distributing  or modifying the Program (or any work *
 21 // * any work based  on the software)  you  ag <<  19 // * based  on  the Program)  you indicate  your  acceptance of  this *
 22 // * use  in  resulting  scientific  publicati <<  20 // * statement, and all its terms.                                    *
 23 // * acceptance of all terms of the Geant4 Sof << 
 24 // *******************************************     21 // ********************************************************************
 25 //                                                 22 //
 26 //////////////////////////////////////////////     23 ///////////////////////////////////////////////////////////////////////////////
 27 // File: CCalMaterial.cc                           24 // File: CCalMaterial.cc
 28 // Description: CCalMaterial transient class t     25 // Description: CCalMaterial transient class to store information from 
 29 //              material table (database) whic     26 //              material table (database) which is used to make a G4Material
 30 //////////////////////////////////////////////     27 ///////////////////////////////////////////////////////////////////////////////
 31 #include "CCalMaterial.hh"                         28 #include "CCalMaterial.hh"
 32                                                    29 
 33 //#define debug                                    30 //#define debug
 34                                                    31 
 35 CCalMaterial::CCalMaterial(G4String mat, G4dou <<  32 CCalMaterial::CCalMaterial(G4String mat, double dens, int nconst, 
 36                            CCalMaterial** cons <<  33          CCalMaterial** constituents, double* weights,
 37                            FractionType ft): n <<  34          FractionType ft): name(mat), density(dens) {
 38   nElem = 0;                                       35   nElem = 0;
 39                                                    36   
 40   G4int i=0;                                   <<  37   int i=0;
 41   for (i=0; i<nconst; i++)                         38   for (i=0; i<nconst; i++)
 42     nElem += constituents[i]->NElements();         39     nElem += constituents[i]->NElements();
 43                                                    40 
 44   theElements = new G4String[nElem];               41   theElements = new G4String[nElem];
 45   theWeights  = new G4double[nElem];           <<  42   theWeights  = new double[nElem];
 46                                                    43 
 47   G4double factor;                             <<  44   double factor;
 48   G4int nelem=0;                               <<  45   int nelem=0;
 49   for (i=0; i<nconst; i++) {                       46   for (i=0; i<nconst; i++) {
 50     if (ft==FTWeight)                              47     if (ft==FTWeight)
 51       factor=1.0;                                  48       factor=1.0;
 52     else                                           49     else
 53       factor=constituents[i]->Density();           50       factor=constituents[i]->Density();
 54     for (G4int j=0; j<constituents[i]->NElemen <<  51     for (int j=0; j<constituents[i]->NElements(); j++) {
 55       theElements[nelem] = constituents[i]->El     52       theElements[nelem] = constituents[i]->Element(j);
 56       theWeights[nelem]  = constituents[i]->We     53       theWeights[nelem]  = constituents[i]->Weight(j)* weights[i] * factor;
 57       nelem++;                                     54       nelem++;
 58     }                                              55     }
 59   }                                                56   }
 60                                                    57 
 61   if (density<0) { //Let's compute density         58   if (density<0) { //Let's compute density
 62     computeDensity(nconst, constituents, weigh     59     computeDensity(nconst, constituents, weights, ft);
 63   }                                                60   }
 64   closeMaterial();                                 61   closeMaterial();
 65 }                                                  62 }
 66                                                    63 
 67 CCalMaterial::CCalMaterial(const CCalMaterial&     64 CCalMaterial::CCalMaterial(const CCalMaterial& mat):
 68   name(mat.name), density(mat.density), nElem(     65   name(mat.name), density(mat.density), nElem(mat.nElem) {
 69   theElements = new G4String[nElem];               66   theElements = new G4String[nElem];
 70   theWeights  = new G4double[nElem];           <<  67   theWeights  = new double[nElem];
 71   for (G4int i=0; i<nElem; i++){               <<  68   for (int i=0; i<nElem; i++){
 72     theElements[i]=mat.theElements[i];             69     theElements[i]=mat.theElements[i];
 73     theWeights[i]=mat.theWeights[i];               70     theWeights[i]=mat.theWeights[i];
 74   }                                                71   }
 75 }                                                  72 }
 76                                                    73 
 77 CCalMaterial::~CCalMaterial() {                    74 CCalMaterial::~CCalMaterial() {
 78   if (theElements)                                 75   if (theElements)
 79     delete[] theElements;                          76     delete[] theElements;
 80   if (theWeights)                                  77   if (theWeights)
 81     delete[] theWeights;                           78     delete[] theWeights;
 82 }                                                  79 }
 83                                                    80 
 84 void CCalMaterial::computeDensity(G4int nconst <<  81 void CCalMaterial::computeDensity(int nconst, 
 85                                   CCalMaterial <<  82           CCalMaterial** constituents, 
 86                                   G4double* we <<  83           double* weights, FractionType ft) {
 87   G4double mass=0;                             <<  84   double mass=0;
 88   G4double volume=0;                           <<  85   double volume=0;
 89   for (G4int i=0; i<nconst; i++) {             <<  86   for (int i=0; i<nconst; i++) {
 90     if (ft==FTWeight) {                            87     if (ft==FTWeight) {
 91       mass+=weights[i];                            88       mass+=weights[i];
 92       volume+=(weights[i]/constituents[i]->Den     89       volume+=(weights[i]/constituents[i]->Density());
 93     }                                              90     }
 94     else { //by volume                             91     else { //by volume
 95       mass+=(weights[i]*constituents[i]->Densi     92       mass+=(weights[i]*constituents[i]->Density());
 96       volume+=weights[i];                          93       volume+=weights[i];
 97     }                                              94     }
 98   }                                                95   }
 99   density=mass/volume;                             96   density=mass/volume;
100 }                                                  97 }
101                                                    98 
102 CCalMaterial& CCalMaterial::operator=(const CC     99 CCalMaterial& CCalMaterial::operator=(const CCalMaterial& mat){
103   if(theElements)                                 100   if(theElements)
104     delete[] theElements;                         101     delete[] theElements;
105   if(theWeights)                                  102   if(theWeights)
106     delete[] theWeights;                          103     delete[] theWeights;
107                                                   104 
108   name=mat.name;                                  105   name=mat.name;
109   density=mat.density;                            106   density=mat.density;
110   nElem=mat.nElem;                                107   nElem=mat.nElem;
111                                                   108   
112   theElements = new G4String[nElem];              109   theElements = new G4String[nElem];
113   theWeights  = new G4double[nElem];           << 110   theWeights  = new double[nElem];
114   for (G4int i=0; i<nElem; i++){               << 111   for (int i=0; i<nElem; i++){
115     theElements[i]=mat.theElements[i];            112     theElements[i]=mat.theElements[i];
116     theWeights[i]=mat.theWeights[i];              113     theWeights[i]=mat.theWeights[i];
117   }                                               114   }
118   return *this;                                   115   return *this;
119 }                                                 116 }
120                                                   117 
121 G4bool CCalMaterial::operator==(const CCalMate    118 G4bool CCalMaterial::operator==(const CCalMaterial& mat) const{
122   return (name==mat.name);                        119   return (name==mat.name);
123 }                                                 120 }
124                                                   121 
125 G4bool CCalMaterial::operator!=(const CCalMate    122 G4bool CCalMaterial::operator!=(const CCalMaterial& mat) const{
126   return (name!=mat.name);                        123   return (name!=mat.name);
127 }                                                 124 }
128                                                   125 
129 void CCalMaterial::closeMaterial() {              126 void CCalMaterial::closeMaterial() {
130   G4int trueConst=0;                           << 127   int trueConst=0;
131                                                   128 
132   G4double norm=0;                             << 129   double norm=0;
133                                                   130 
134   for (G4int i=0; i<nElem; i++) {              << 131   for (int i=0; i<nElem; i++) {
135     norm+=theWeights[i];                          132     norm+=theWeights[i];
136     if (theElements[i]!="") {                     133     if (theElements[i]!="") {
137       trueConst++;                                134       trueConst++;
138       for (G4int j=i+1; j<nElem; j++) {        << 135       for (int j=i+1; j<nElem; j++) {
139         if(theElements[i]==theElements[j]){    << 136   if(theElements[i]==theElements[j]){
140           theWeights[i]+=theWeights[j];        << 137     theWeights[i]+=theWeights[j];
141           theElements[j]="";                   << 138     theElements[j]="";
142         }                                      << 139   }
143       }//for j                                    140       }//for j
144     } //if                                        141     } //if
145   }//for i                                        142   }//for i
146                                                   143 
147   if (trueConst != nElem) {                       144   if (trueConst != nElem) {
148     G4String* newConst = new G4String[trueCons    145     G4String* newConst = new G4String[trueConst];
149     G4double* newWeight = new G4double[trueCon << 146     double* newWeight = new double[trueConst];
150                                                   147     
151     G4int newi=0;                              << 148     int newi=0;
152     for(G4int i=0; i<nElem; i++){              << 149     for(int i=0; i<nElem; i++){
153       if (theElements[i]!="") {                   150       if (theElements[i]!="") {
154         newConst[newi]  = theElements[i];      << 151   newConst[newi]  = theElements[i];
155         newWeight[newi] = theWeights[i]/norm;  << 152   newWeight[newi] = theWeights[i]/norm;
156         newi++;                                << 153   newi++;
157       }                                           154       }
158     }                                             155     }
159                                                   156 
160 #ifdef debug                                      157 #ifdef debug    
161     G4cout << "\tGoing from " << nElem <<" con    158     G4cout << "\tGoing from " << nElem <<" constituents to " << trueConst << G4endl;
162 #endif                                            159 #endif
163     nElem=trueConst;                              160     nElem=trueConst;
164                                                   161     
165     delete[] theElements;                         162     delete[] theElements;
166     delete[] theWeights;                          163     delete[] theWeights;
167                                                   164 
168     theElements=newConst;                         165     theElements=newConst;
169     theWeights=newWeight;                         166     theWeights=newWeight;
170   }                                               167   }
171   else { //Let's normalize the weights            168   else { //Let's normalize the weights
172     for (G4int i=0; i<nElem; i++)              << 169     for (int i=0; i<nElem; i++)
173       theWeights[i] = theWeights[i]/norm;         170       theWeights[i] = theWeights[i]/norm;
174   }                                               171   }
175 }                                                 172 }
176                                                   173 
177 std::ostream& operator<<(std::ostream& os, con    174 std::ostream& operator<<(std::ostream& os, const CCalMaterial& mat) {
178   os << mat.name << G4endl;                       175   os << mat.name << G4endl;
179   os << "Density= " << mat.density << " g/cm3.    176   os << "Density= " << mat.density << " g/cm3. Number of Elements: "
180      << mat.nElem << G4endl;                      177      << mat.nElem << G4endl;
181   for (G4int i=0; i<mat.nElem; i++)            << 178   for (int i=0; i<mat.nElem; i++)
182     os << '\t' << mat.theElements[i] << '\t' <    179     os << '\t' << mat.theElements[i] << '\t' << mat.theWeights[i] << G4endl;
183   return os;                                      180   return os;
184 }                                                 181 }
185                                                   182