Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/optical/src/G4OpRayleigh.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 /processes/optical/src/G4OpRayleigh.cc (Version 11.3.0) and /processes/optical/src/G4OpRayleigh.cc (Version 9.2.p2)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
 26 //                                                 26 //
                                                   >>  27 // $Id: G4OpRayleigh.cc,v 1.17 2008/10/24 19:51:12 gum Exp $
                                                   >>  28 // GEANT4 tag $Name: geant4-09-02 $
 27 //                                                 29 //
 28 //                                             <<  30 // 
 29 //////////////////////////////////////////////     31 ////////////////////////////////////////////////////////////////////////
 30 // Optical Photon Rayleigh Scattering Class Im     32 // Optical Photon Rayleigh Scattering Class Implementation
 31 //////////////////////////////////////////////     33 ////////////////////////////////////////////////////////////////////////
 32 //                                                 34 //
 33 // File:        G4OpRayleigh.cc                <<  35 // File:        G4OpRayleigh.cc 
 34 // Description: Discrete Process -- Rayleigh s <<  36 // Description: Discrete Process -- Rayleigh scattering of optical 
 35 //    photons                                  <<  37 //    photons  
 36 // Version:     1.0                                38 // Version:     1.0
 37 // Created:     1996-05-31                     <<  39 // Created:     1996-05-31  
 38 // Author:      Juliet Armstrong                   40 // Author:      Juliet Armstrong
 39 // Updated:     2014-10-10 -  This version cal <<  41 // Updated:     2005-07-28 - add G4ProcessType to constructor
 40 //              length for more materials than << 
 41 //              default is kept). To do this t << 
 42 //              ISOTHERMAL_COMPRESSIBILITY as  << 
 43 //              optionally an RS_SCALE_LENGTH  << 
 44 //              from Philip Graham (Queen Mary << 
 45 //              2010-06-11 - Fix Bug 207; Than << 
 46 //              (Kellogg Radiation Lab of Calt << 
 47 //              2005-07-28 - add G4ProcessType << 
 48 //              2001-10-18 by Peter Gumplinger     42 //              2001-10-18 by Peter Gumplinger
 49 //              eliminate unused variable warn     43 //              eliminate unused variable warning on Linux (gcc-2.95.2)
 50 //              2001-09-18 by mma                  44 //              2001-09-18 by mma
 51 //              >numOfMaterials=G4Material::Ge <<  45 //    >numOfMaterials=G4Material::GetNumberOfMaterials() in BuildPhy
 52 //              2001-01-30 by Peter Gumplinger     46 //              2001-01-30 by Peter Gumplinger
 53 //              > allow for positiv and negati     47 //              > allow for positiv and negative CosTheta and force the
 54 //              > new momentum direction to be     48 //              > new momentum direction to be in the same plane as the
 55 //              > new and old polarization vec     49 //              > new and old polarization vectors
 56 //              2001-01-29 by Peter Gumplinger     50 //              2001-01-29 by Peter Gumplinger
 57 //              > fix calculation of SinTheta      51 //              > fix calculation of SinTheta (from CosTheta)
 58 //              1997-04-09 by Peter Gumplinger     52 //              1997-04-09 by Peter Gumplinger
 59 //              > new physics/tracking scheme      53 //              > new physics/tracking scheme
                                                   >>  54 // mail:        gum@triumf.ca
 60 //                                                 55 //
 61 //////////////////////////////////////////////     56 ////////////////////////////////////////////////////////////////////////
 62                                                    57 
 63 #include "G4OpRayleigh.hh"                     << 
 64 #include "G4ios.hh"                                58 #include "G4ios.hh"
 65 #include "G4PhysicalConstants.hh"              << 
 66 #include "G4SystemOfUnits.hh"                  << 
 67 #include "G4OpticalParameters.hh"              << 
 68 #include "G4OpProcessSubType.hh"                   59 #include "G4OpProcessSubType.hh"
 69                                                    60 
 70 //....oooOO0OOooo........oooOO0OOooo........oo <<  61 #include "G4OpRayleigh.hh"
                                                   >>  62 
                                                   >>  63 /////////////////////////
                                                   >>  64 // Class Implementation
                                                   >>  65 /////////////////////////
                                                   >>  66 
                                                   >>  67         //////////////
                                                   >>  68         // Operators
                                                   >>  69         //////////////
                                                   >>  70 
                                                   >>  71 // G4OpRayleigh::operator=(const G4OpRayleigh &right)
                                                   >>  72 // {
                                                   >>  73 // }
                                                   >>  74 
                                                   >>  75         /////////////////
                                                   >>  76         // Constructors
                                                   >>  77         /////////////////
                                                   >>  78 
 71 G4OpRayleigh::G4OpRayleigh(const G4String& pro     79 G4OpRayleigh::G4OpRayleigh(const G4String& processName, G4ProcessType type)
 72   : G4VDiscreteProcess(processName, type)      <<  80            : G4VDiscreteProcess(processName, type)
 73 {                                                  81 {
 74   Initialise();                                <<  82         SetProcessSubType(fOpRayleigh);
 75   SetProcessSubType(fOpRayleigh);              <<  83 
 76   thePhysicsTable = nullptr;                   <<  84         thePhysicsTable = 0;
 77                                                <<  85 
 78   if(verboseLevel > 0)                         <<  86         DefaultWater = false;
 79   {                                            <<  87 
 80     G4cout << GetProcessName() << " is created <<  88         if (verboseLevel>0) {
 81   }                                            <<  89            G4cout << GetProcessName() << " is created " << G4endl;
                                                   >>  90         }
                                                   >>  91 
                                                   >>  92         BuildThePhysicsTable();
 82 }                                                  93 }
 83                                                    94 
 84 //....oooOO0OOooo........oooOO0OOooo........oo <<  95 // G4OpRayleigh::G4OpRayleigh(const G4OpRayleigh &right)
                                                   >>  96 // {
                                                   >>  97 // }
                                                   >>  98 
                                                   >>  99         ////////////////
                                                   >> 100         // Destructors
                                                   >> 101         ////////////////
                                                   >> 102 
 85 G4OpRayleigh::~G4OpRayleigh()                     103 G4OpRayleigh::~G4OpRayleigh()
 86 {                                                 104 {
 87   // VI: inside this PhysicsTable all properti << 105         if (thePhysicsTable!= 0) {
 88   //     it is not possible to destroy         << 106            thePhysicsTable->clearAndDestroy();
 89   delete thePhysicsTable;                      << 107            delete thePhysicsTable;
                                                   >> 108         }
 90 }                                                 109 }
 91                                                   110 
 92 //....oooOO0OOooo........oooOO0OOooo........oo << 111         ////////////
 93 void G4OpRayleigh::PreparePhysicsTable(const G << 112         // Methods
 94 {                                              << 113         ////////////
 95   Initialise();                                << 
 96 }                                              << 
 97                                                   114 
 98 //....oooOO0OOooo........oooOO0OOooo........oo << 115 // PostStepDoIt
 99 void G4OpRayleigh::Initialise()                << 116 // -------------
                                                   >> 117 //
                                                   >> 118 G4VParticleChange* 
                                                   >> 119 G4OpRayleigh::PostStepDoIt(const G4Track& aTrack, const G4Step& aStep)
100 {                                                 120 {
101   SetVerboseLevel(G4OpticalParameters::Instanc << 121         aParticleChange.Initialize(aTrack);
102 }                                              << 
103                                                   122 
104 //....oooOO0OOooo........oooOO0OOooo........oo << 123         const G4DynamicParticle* aParticle = aTrack.GetDynamicParticle();
105 G4VParticleChange* G4OpRayleigh::PostStepDoIt( << 
106                                                << 
107 {                                              << 
108   aParticleChange.Initialize(aTrack);          << 
109   const G4DynamicParticle* aParticle = aTrack. << 
110                                                   124 
111   if(verboseLevel > 1)                         << 125         if (verboseLevel>0) {
112   {                                            << 126     G4cout << "Scattering Photon!" << G4endl;
113     G4cout << "OpRayleigh: Scattering Photon!" << 127     G4cout << "Old Momentum Direction: "
114            << "Old Momentum Direction: " << aP << 128              << aParticle->GetMomentumDirection() << G4endl;
115            << G4endl << "Old Polarization: " < << 129     G4cout << "Old Polarization: "
116            << G4endl;                          << 130          << aParticle->GetPolarization() << G4endl;
117   }                                            << 131   }
118                                                << 
119   G4double cosTheta;                           << 
120   G4ThreeVector oldMomDir, newMomDir;          << 
121   G4ThreeVector oldPol, newPol;                << 
122   G4double rand;                               << 
123   G4double cost, sint, sinphi, cosphi;         << 
124                                                << 
125   do                                           << 
126   {                                            << 
127     // Try to simulate the scattered photon mo << 
128     // w.r.t. the initial photon momentum dire << 
129     cost = G4UniformRand();                    << 
130     sint = std::sqrt(1. - cost * cost);        << 
131     // consider for the angle 90-180 degrees   << 
132     if(G4UniformRand() < 0.5)                  << 
133       cost = -cost;                            << 
134                                                << 
135     // simulate the phi angle                  << 
136     rand   = twopi * G4UniformRand();          << 
137     sinphi = std::sin(rand);                   << 
138     cosphi = std::cos(rand);                   << 
139                                                << 
140     // construct the new momentum direction    << 
141     newMomDir.set(sint * cosphi, sint * sinphi << 
142     oldMomDir = aParticle->GetMomentumDirectio << 
143     newMomDir.rotateUz(oldMomDir);             << 
144                                                << 
145     // calculate the new polarization directio << 
146     // The new polarization needs to be in the << 
147     // momentum direction and the old polariza << 
148     oldPol = aParticle->GetPolarization();     << 
149     newPol = (oldPol - newMomDir.dot(oldPol) * << 
150                                                << 
151     // There is a corner case, where the new m << 
152     // is the same as old polarization directi << 
153     // random generate the azimuthal angle w.r << 
154     if(newPol.mag() == 0.)                     << 
155     {                                          << 
156       rand = G4UniformRand() * twopi;          << 
157       newPol.set(std::cos(rand), std::sin(rand << 
158       newPol.rotateUz(newMomDir);              << 
159     }                                          << 
160     else                                       << 
161     {                                          << 
162       // There are two directions perpendicula << 
163       if(G4UniformRand() < 0.5)                << 
164         newPol = -newPol;                      << 
165     }                                          << 
166                                                << 
167     // simulate according to the distribution  << 
168     cosTheta = newPol.dot(oldPol);             << 
169     // Loop checking, 13-Aug-2015, Peter Gumpl << 
170   } while(std::pow(cosTheta, 2) < G4UniformRan << 
171                                                << 
172   aParticleChange.ProposePolarization(newPol); << 
173   aParticleChange.ProposeMomentumDirection(new << 
174                                                << 
175   if(verboseLevel > 1)                         << 
176   {                                            << 
177     G4cout << "New Polarization: " << newPol < << 
178            << "Polarization Change: " << *(aPa << 
179            << G4endl << "New Momentum Directio << 
180            << "Momentum Change: " << *(aPartic << 
181            << G4endl;                          << 
182   }                                            << 
183                                                   132 
184   return G4VDiscreteProcess::PostStepDoIt(aTra << 133   // find polar angle w.r.t. old polarization vector
185 }                                              << 
186                                                   134 
187 //....oooOO0OOooo........oooOO0OOooo........oo << 135   G4double rand = G4UniformRand();
188 void G4OpRayleigh::BuildPhysicsTable(const G4P << 136 
189 {                                              << 137   G4double CosTheta = std::pow(rand, 1./3.);
190   if(thePhysicsTable)                          << 138   G4double SinTheta = std::sqrt(1.-CosTheta*CosTheta);
191   {                                            << 139 
192     // thePhysicsTable->clearAndDestroy();     << 140         if(G4UniformRand() < 0.5)CosTheta = -CosTheta;
193     delete thePhysicsTable;                    << 141 
194     thePhysicsTable = nullptr;                 << 142   // find azimuthal angle w.r.t old polarization vector 
195   }                                            << 143 
196                                                << 144   rand = G4UniformRand();
197   const G4MaterialTable* theMaterialTable = G4 << 145 
198   const size_t numOfMaterials             = G4 << 146   G4double Phi = twopi*rand;
199   thePhysicsTable                         = ne << 147   G4double SinPhi = std::sin(Phi); 
200                                                << 148   G4double CosPhi = std::cos(Phi); 
201   for(size_t i = 0; i < numOfMaterials; ++i)   << 149   
202   {                                            << 150   G4double unit_x = SinTheta * CosPhi; 
203     G4Material* material               = (*the << 151   G4double unit_y = SinTheta * SinPhi;  
204     G4MaterialPropertiesTable* matProp = mater << 152   G4double unit_z = CosTheta; 
205     G4PhysicsFreeVector* rayleigh = nullptr;   << 153   
206     if(matProp)                                << 154         G4ThreeVector NewPolarization (unit_x,unit_y,unit_z);
207     {                                          << 155 
208       rayleigh = matProp->GetProperty(kRAYLEIG << 156         // Rotate new polarization direction into global reference system 
209       if(rayleigh == nullptr)                  << 157 
210         rayleigh = CalculateRayleighMeanFreePa << 158   G4ThreeVector OldPolarization = aParticle->GetPolarization();
211     }                                          << 159         OldPolarization = OldPolarization.unit();
212     thePhysicsTable->insertAt(i, rayleigh);    << 160 
213   }                                            << 161   NewPolarization.rotateUz(OldPolarization);
                                                   >> 162         NewPolarization = NewPolarization.unit();
                                                   >> 163   
                                                   >> 164         // -- new momentum direction is normal to the new
                                                   >> 165         // polarization vector and in the same plane as the
                                                   >> 166         // old and new polarization vectors --
                                                   >> 167 
                                                   >> 168         G4ThreeVector NewMomentumDirection = 
                                                   >> 169                               OldPolarization - NewPolarization * CosTheta;
                                                   >> 170 
                                                   >> 171         if(G4UniformRand() < 0.5)NewMomentumDirection = -NewMomentumDirection;
                                                   >> 172         NewMomentumDirection = NewMomentumDirection.unit();
                                                   >> 173 
                                                   >> 174   aParticleChange.ProposePolarization(NewPolarization);
                                                   >> 175 
                                                   >> 176   aParticleChange.ProposeMomentumDirection(NewMomentumDirection);
                                                   >> 177 
                                                   >> 178         if (verboseLevel>0) {
                                                   >> 179     G4cout << "New Polarization: " 
                                                   >> 180          << NewPolarization << G4endl;
                                                   >> 181     G4cout << "Polarization Change: "
                                                   >> 182          << *(aParticleChange.GetPolarization()) << G4endl;  
                                                   >> 183     G4cout << "New Momentum Direction: " 
                                                   >> 184          << NewMomentumDirection << G4endl;
                                                   >> 185     G4cout << "Momentum Change: "
                                                   >> 186          << *(aParticleChange.GetMomentumDirection()) << G4endl; 
                                                   >> 187   }
                                                   >> 188 
                                                   >> 189         return G4VDiscreteProcess::PostStepDoIt(aTrack, aStep);
214 }                                                 190 }
215                                                   191 
216 //....oooOO0OOooo........oooOO0OOooo........oo << 192 // BuildThePhysicsTable for the Rayleigh Scattering process
217 G4double G4OpRayleigh::GetMeanFreePath(const G << 193 // --------------------------------------------------------
218                                        G4Force << 194 //
                                                   >> 195 void G4OpRayleigh::BuildThePhysicsTable()
219 {                                                 196 {
220   auto rayleigh = static_cast<G4PhysicsFreeVec << 197 //      Builds a table of scattering lengths for each material
221       (*thePhysicsTable)(aTrack.GetMaterial()- << 198 
                                                   >> 199         if (thePhysicsTable) return;
222                                                   200 
223   G4double rsLength = DBL_MAX;                 << 201         const G4MaterialTable* theMaterialTable=
224   if(rayleigh)                                 << 202                                G4Material::GetMaterialTable();
225   {                                            << 203         G4int numOfMaterials = G4Material::GetNumberOfMaterials();
226     rsLength = rayleigh->Value(aTrack.GetDynam << 204 
227                                idx_rslength);  << 205         // create a new physics table
228   }                                            << 206 
229   return rsLength;                             << 207         thePhysicsTable = new G4PhysicsTable(numOfMaterials);
                                                   >> 208 
                                                   >> 209         // loop for materials
                                                   >> 210 
                                                   >> 211         for (G4int i=0 ; i < numOfMaterials; i++)
                                                   >> 212         {
                                                   >> 213             G4PhysicsOrderedFreeVector* ScatteringLengths =
                                                   >> 214                                 new G4PhysicsOrderedFreeVector();
                                                   >> 215 
                                                   >> 216             G4MaterialPropertiesTable *aMaterialPropertiesTable =
                                                   >> 217                          (*theMaterialTable)[i]->GetMaterialPropertiesTable();
                                                   >> 218                                                                                 
                                                   >> 219             if(aMaterialPropertiesTable){
                                                   >> 220 
                                                   >> 221               G4MaterialPropertyVector* AttenuationLengthVector =
                                                   >> 222                             aMaterialPropertiesTable->GetProperty("RAYLEIGH");
                                                   >> 223 
                                                   >> 224               if(!AttenuationLengthVector){
                                                   >> 225 
                                                   >> 226                 if ((*theMaterialTable)[i]->GetName() == "Water")
                                                   >> 227                 {
                                                   >> 228        // Call utility routine to Generate
                                                   >> 229        // Rayleigh Scattering Lengths
                                                   >> 230 
                                                   >> 231                    DefaultWater = true;
                                                   >> 232 
                                                   >> 233        ScatteringLengths =
                                                   >> 234        RayleighAttenuationLengthGenerator(aMaterialPropertiesTable);
                                                   >> 235                 }
                                                   >> 236               }
                                                   >> 237       }
                                                   >> 238 
                                                   >> 239       thePhysicsTable->insertAt(i,ScatteringLengths);
                                                   >> 240         } 
230 }                                                 241 }
231                                                   242 
232 //....oooOO0OOooo........oooOO0OOooo........oo << 243 // GetMeanFreePath()
233 G4PhysicsFreeVector* G4OpRayleigh::CalculateRa << 244 // -----------------
234   const G4Material* material) const            << 245 //
                                                   >> 246 G4double G4OpRayleigh::GetMeanFreePath(const G4Track& aTrack,
                                                   >> 247                                      G4double ,
                                                   >> 248                                      G4ForceCondition* )
235 {                                                 249 {
236   G4MaterialPropertiesTable* MPT = material->G << 250         const G4DynamicParticle* aParticle = aTrack.GetDynamicParticle();
                                                   >> 251         const G4Material* aMaterial = aTrack.GetMaterial();
                                                   >> 252 
                                                   >> 253         G4double thePhotonEnergy = aParticle->GetTotalEnergy();
237                                                   254 
238   // Retrieve the beta_T or isothermal compres << 255         G4double AttenuationLength = DBL_MAX;
239   // compatibility use a constant if the mater << 
240   // doesn't have an ISOTHERMAL_COMPRESSIBILIT << 
241   G4double betat;                              << 
242   if(material->GetName() == "Water")           << 
243   {                                            << 
244     betat = 7.658e-23 * m3 / MeV;              << 
245   }                                            << 
246   else if(MPT->ConstPropertyExists(kISOTHERMAL << 
247   {                                            << 
248     betat = MPT->GetConstProperty(kISOTHERMAL_ << 
249   }                                            << 
250   else                                         << 
251   {                                            << 
252     return nullptr;                            << 
253   }                                            << 
254                                                << 
255   // If the material doesn't have a RINDEX pro << 
256   G4MaterialPropertyVector* rIndex = MPT->GetP << 
257   if(rIndex == nullptr)                        << 
258     return nullptr;                            << 
259                                                << 
260   // Retrieve the optional scale factor (scale << 
261   G4double scaleFactor = 1.0;                  << 
262   if(MPT->ConstPropertyExists(kRS_SCALE_FACTOR << 
263   {                                            << 
264     scaleFactor = MPT->GetConstProperty(kRS_SC << 
265   }                                            << 
266                                                << 
267   // Retrieve the material temperature. For ba << 
268   // constant if the material is "Water"       << 
269   G4double temperature;                        << 
270   if(material->GetName() == "Water")           << 
271   {                                            << 
272     temperature =                              << 
273       283.15 * kelvin;  // Temperature of wate << 
274   }                                            << 
275   else                                         << 
276   {                                            << 
277     temperature = material->GetTemperature();  << 
278   }                                            << 
279                                                << 
280   auto rayleighMFPs = new G4PhysicsFreeVector( << 
281   // This calculates the meanFreePath via the  << 
282   const G4double c1 =                          << 
283     scaleFactor * betat * temperature * k_Bolt << 
284                                                << 
285   for(size_t uRIndex = 0; uRIndex < rIndex->Ge << 
286   {                                            << 
287     const G4double energy        = rIndex->Ene << 
288     const G4double rIndexSquared = (*rIndex)[u << 
289     const G4double xlambda       = h_Planck *  << 
290     const G4double c2            = std::pow(tw << 
291     const G4double c3 =                        << 
292       std::pow(((rIndexSquared - 1.0) * (rInde << 
293                                                << 
294     const G4double meanFreePath = 1.0 / (c1 *  << 
295                                                << 
296     if(verboseLevel > 0)                       << 
297     {                                          << 
298       G4cout << energy << "MeV\t" << meanFreeP << 
299     }                                          << 
300                                                   256 
301     rayleighMFPs->InsertValues(energy, meanFre << 257         if (aMaterial->GetName() == "Water" && DefaultWater){
302   }                                            << 
303                                                   258 
304   return rayleighMFPs;                         << 259            G4bool isOutRange;
                                                   >> 260 
                                                   >> 261            AttenuationLength =
                                                   >> 262                 (*thePhysicsTable)(aMaterial->GetIndex())->
                                                   >> 263                            GetValue(thePhotonEnergy, isOutRange);
                                                   >> 264         }
                                                   >> 265         else {
                                                   >> 266 
                                                   >> 267            G4MaterialPropertiesTable* aMaterialPropertyTable =
                                                   >> 268                            aMaterial->GetMaterialPropertiesTable();
                                                   >> 269 
                                                   >> 270            if(aMaterialPropertyTable){
                                                   >> 271              G4MaterialPropertyVector* AttenuationLengthVector =
                                                   >> 272                    aMaterialPropertyTable->GetProperty("RAYLEIGH");
                                                   >> 273              if(AttenuationLengthVector){
                                                   >> 274                AttenuationLength = AttenuationLengthVector ->
                                                   >> 275                                     GetProperty(thePhotonEnergy);
                                                   >> 276              }
                                                   >> 277              else{
                                                   >> 278 //               G4cout << "No Rayleigh scattering length specified" << G4endl;
                                                   >> 279              }
                                                   >> 280            }
                                                   >> 281            else{
                                                   >> 282 //             G4cout << "No Rayleigh scattering length specified" << G4endl; 
                                                   >> 283            }
                                                   >> 284         }
                                                   >> 285 
                                                   >> 286         return AttenuationLength;
305 }                                                 287 }
306                                                   288 
307 //....oooOO0OOooo........oooOO0OOooo........oo << 289 // RayleighAttenuationLengthGenerator()
308 void G4OpRayleigh::SetVerboseLevel(G4int verbo << 290 // ------------------------------------
                                                   >> 291 // Private method to compute Rayleigh Scattering Lengths (for water)
                                                   >> 292 //
                                                   >> 293 G4PhysicsOrderedFreeVector* 
                                                   >> 294 G4OpRayleigh::RayleighAttenuationLengthGenerator(G4MaterialPropertiesTable *aMPT) 
309 {                                                 295 {
310   verboseLevel = verbose;                      << 296         // Physical Constants
311   G4OpticalParameters::Instance()->SetRayleigh << 297 
                                                   >> 298         // isothermal compressibility of water
                                                   >> 299         G4double betat = 7.658e-23*m3/MeV;
                                                   >> 300 
                                                   >> 301         // K Boltzman
                                                   >> 302         G4double kboltz = 8.61739e-11*MeV/kelvin;
                                                   >> 303 
                                                   >> 304         // Temperature of water is 10 degrees celsius
                                                   >> 305         // conversion to kelvin:
                                                   >> 306         // TCelsius = TKelvin - 273.15 => 273.15 + 10 = 283.15
                                                   >> 307         G4double temp = 283.15*kelvin;
                                                   >> 308 
                                                   >> 309         // Retrieve vectors for refraction index
                                                   >> 310         // and photon energy from the material properties table
                                                   >> 311 
                                                   >> 312         G4MaterialPropertyVector* Rindex = aMPT->GetProperty("RINDEX");
                                                   >> 313 
                                                   >> 314         G4double refsq;
                                                   >> 315         G4double e;
                                                   >> 316         G4double xlambda;
                                                   >> 317         G4double c1, c2, c3, c4;
                                                   >> 318         G4double Dist;
                                                   >> 319         G4double refraction_index;
                                                   >> 320 
                                                   >> 321         G4PhysicsOrderedFreeVector *RayleighScatteringLengths = 
                                                   >> 322         new G4PhysicsOrderedFreeVector();
                                                   >> 323 
                                                   >> 324         if (Rindex ) {
                                                   >> 325 
                                                   >> 326            Rindex->ResetIterator();
                                                   >> 327 
                                                   >> 328            while (++(*Rindex)) {
                                                   >> 329 
                                                   >> 330                 e = (Rindex->GetPhotonEnergy());
                                                   >> 331 
                                                   >> 332                 refraction_index = Rindex->GetProperty();
                                                   >> 333                 refsq = refraction_index*refraction_index;
                                                   >> 334                 xlambda = h_Planck*c_light/e;
                                                   >> 335 
                                                   >> 336           if (verboseLevel>0) {
                                                   >> 337                   G4cout << Rindex->GetPhotonEnergy() << " MeV\t";
                                                   >> 338                   G4cout << xlambda << " mm\t";
                                                   >> 339     }
                                                   >> 340 
                                                   >> 341                 c1 = 1 / (6.0 * pi);
                                                   >> 342                 c2 = std::pow((2.0 * pi / xlambda), 4);
                                                   >> 343                 c3 = std::pow( ( (refsq - 1.0) * (refsq + 2.0) / 3.0 ), 2);
                                                   >> 344                 c4 = betat * temp * kboltz;
                                                   >> 345 
                                                   >> 346                 Dist = 1.0 / (c1*c2*c3*c4);
                                                   >> 347 
                                                   >> 348           if (verboseLevel>0) {
                                                   >> 349                   G4cout << Dist << " mm" << G4endl;
                                                   >> 350     }
                                                   >> 351                 RayleighScatteringLengths->
                                                   >> 352       InsertValues(Rindex->GetPhotonEnergy(), Dist);
                                                   >> 353            }
                                                   >> 354 
                                                   >> 355         }
                                                   >> 356 
                                                   >> 357   return RayleighScatteringLengths;
312 }                                                 358 }
313                                                   359