Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/dna/models/src/G4LEPTSDistribution.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 // G4LEPTSDistribution
 27 //
 28 // Author: Pedro Arce (CIEMAT), 2014
 29 // --------------------------------------------------------------------
 30 
 31 #include "G4LEPTSDistribution.hh"
 32 
 33 #include <stdio.h>
 34 #include <iostream> 
 35 
 36 void G4LEPTSDistribution::ReadFile(const G4String& fileName)
 37 {
 38   G4int eB, out, out2;
 39   G4float  float_data1,float_data2;
 40   G4double sum, esum;
 41   FILE * fp;
 42 
 43   for (eB=0; eB<10000; ++eB)
 44   {
 45     E[eB]=0.0;
 46     f[eB]=0.0;
 47     F[eB]=0.0;
 48     eF[eB]=0.0;
 49   }
 50 
 51   if ((fp=fopen(fileName.c_str(), "r"))==nullptr)
 52   {
 53     NoBins = 0;
 54     bFileFound = false;
 55     return;
 56   }
 57   
 58   bFileFound = true;
 59 
 60   out=1;
 61   eB=1;
 62   while (out==1)
 63   {
 64     out  = fscanf(fp,"%f \n",&float_data1);
 65     out2 = fscanf(fp,"%f \n",&float_data2);
 66     if (out==1 && out2==1)
 67     {
 68       E[eB]=(G4double)float_data1;
 69       f[eB]=(G4double)float_data2;
 70       ++eB;
 71     }
 72   }
 73 
 74   fclose(fp);
 75 
 76   NoBins=eB-1;  //=1272+1 or 9607+1;
 77 
 78   if( NoBins >= NMAX )
 79   {
 80     std::ostringstream message;
 81     message << "ERROR !!!!  Eloss NoBins = " << NoBins;
 82     G4Exception("G4LEPTSDistribution::ReadFile()", "ReadError",
 83                 FatalException, message); 
 84   }
 85 
 86   sum=0.0;
 87   esum=0.0;
 88   for (eB=0; eB<=NoBins; ++eB)
 89   {
 90     if( f[eB] > 0)
 91     {
 92       sum+=f[eB];
 93       esum+=E[eB]*f[eB];
 94     }
 95     F[eB]=sum;
 96     eF[eB]=esum;
 97   }
 98 
 99   for (eB=0; eB<=NoBins; ++eB)
100   {
101     eF[eB] = eF[eB]/F[eB];
102     F[eB] = F[eB]/F[NoBins];
103   }
104 }
105 
106 G4bool G4LEPTSDistribution::ReadFile( FILE* fp, G4int nData ) 
107 {
108 
109   G4int eB, out, out2;
110   G4float  float_data1,float_data2;
111   G4double sum, esum;
112 
113   for (eB=0; eB<10000; ++eB)
114   {
115     E[eB]=0.0;
116     f[eB]=0.0;
117     F[eB]=0.0;
118     eF[eB]=0.0;
119   }
120 
121   bFileFound = true;
122   out=1;
123   eB=1;
124 
125   for( G4int id = 0; id < nData; ++id )
126   {   
127     out  = fscanf(fp,"%f \n",&float_data1);
128     out2 = fscanf(fp,"%f \n",&float_data2);
129     if (out==1 && out2==1){
130       E[eB]=(G4double)float_data1;
131       f[eB]=(G4double)float_data2;
132       ++eB;
133     }
134     else
135     {
136       return true;
137     }
138   }
139     
140   NoBins=eB-1;  //=1272+1 or 9607+1;
141 
142   if( NoBins >= NMAX )
143   {
144     std::ostringstream message;
145     message << "ERROR !!!!  Eloss NoBins = " << NoBins;
146     G4Exception("G4LEPTSDistribution::ReadFile()", "ReadError",
147                 FatalException, message); 
148   }
149 
150   sum=0.0;
151   esum=0.0;
152   for (eB=0; eB<=NoBins; ++eB)
153   {
154     if( f[eB] > 0)
155     {
156       sum+=f[eB];
157       esum+=E[eB]*f[eB];
158     }
159     F[eB]=sum;
160     eF[eB]=esum;
161   }
162   
163   for (eB=0; eB<=NoBins; ++eB)
164   {
165     eF[eB] = eF[eB]/F[eB];
166     F[eB] = F[eB]/F[NoBins];
167   }
168 
169   return false;
170 }
171 
172 G4double G4LEPTSDistribution::Sample( G4double eMin, G4double eMax )
173 {
174   // Sample Energy from Cumulative distr. G4interval [eMin, eMax]
175 
176   if( eMin > eMax) return 0.0;
177 
178   G4int i,j,k=0, iMin, iMax;
179 
180   i=0; j=NoBins;
181   while ((j-i)>1)
182   {
183     k=(i+j)/2;
184     if( E[k] < eMax ) i=k;
185     else              j=k;
186   }
187   iMax = i;
188 
189   i=0; j=NoBins;
190   while ((j-i)>1)
191   {
192     k=(i+j)/2;
193     if( E[k] < eMin ) i=k;
194     else              j=k;
195   }
196   iMin = i;
197 
198   G4double rnd = F[iMin] + (F[iMax] - F[iMin]) * G4UniformRand();
199 
200   i=0; j=NoBins;
201   while ((j-i)>1)
202   {
203     k=(i+j)/2;
204     if( F[k]<rnd) i=k;
205     else          j=k;
206   }
207 
208   G4double Sampled = E[k];
209 
210   if(      Sampled < eMin) Sampled = eMin;
211   else if( Sampled > eMax) Sampled = eMax;
212 
213   return Sampled;
214 }
215