00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef G4NeutronHPArbitaryTab_h
00030 #define G4NeutronHPArbitaryTab_h 1
00031
00032 #include <fstream>
00033 #include <CLHEP/Units/SystemOfUnits.h>
00034
00035 #include "globals.hh"
00036 #include "G4ios.hh"
00037 #include "Randomize.hh"
00038 #include "G4NeutronHPVector.hh"
00039 #include "G4VNeutronHPEDis.hh"
00040 #include "G4InterpolationManager.hh"
00041
00042
00043
00044 class G4NeutronHPArbitaryTab : public G4VNeutronHPEDis
00045 {
00046 public:
00047 G4NeutronHPArbitaryTab()
00048 {
00049 theDistFunc = 0;
00050 }
00051 ~G4NeutronHPArbitaryTab()
00052 {
00053 if(theDistFunc!=0) delete [] theDistFunc;
00054 }
00055
00056 inline void Init(std::ifstream & theData)
00057 {
00058 G4int i;
00059 theFractionalProb.Init(theData, CLHEP::eV);
00060 theData >> nDistFunc;
00061 theDistFunc = new G4NeutronHPVector [nDistFunc];
00062 theManager.Init(theData);
00063 G4double currentEnergy;
00064 for(i=0; i<nDistFunc; i++)
00065 {
00066 theData >> currentEnergy;
00067 theDistFunc[i].SetLabel(currentEnergy*CLHEP::eV);
00068 theDistFunc[i].Init(theData, CLHEP::eV);
00069
00070
00071
00072
00073
00074 }
00075
00076
00077
00078
00079 for(i=0; i<nDistFunc; i++){
00080 G4int np=theDistFunc[i].GetVectorLength();
00081 theLowThreshold[i]=theDistFunc[i].GetEnergy(0);
00082 theHighThreshold[i]=theDistFunc[i].GetEnergy(np-1);
00083 for(G4int j=0;j<np-1;j++){
00084 if(theDistFunc[i].GetXsec(j+1)>1.e-20){
00085 theLowThreshold[i]=theDistFunc[i].GetEnergy(j);
00086 break;
00087 }
00088 }
00089 for(G4int j=1;j<np;j++){
00090 if(theDistFunc[i].GetXsec(j-1)>1.e-20){
00091 theHighThreshold[i]=theDistFunc[i].GetEnergy(j);
00092 }
00093 }
00094 }
00095
00096 }
00097
00098 inline G4double GetFractionalProbability(G4double anEnergy)
00099 {
00100 return theFractionalProb.GetY(anEnergy);
00101 }
00102
00103 G4double Sample(G4double anEnergy) ;
00104
00105 private:
00106
00107 G4NeutronHPVector theFractionalProb;
00108 G4int nDistFunc;
00109 G4InterpolationManager theManager;
00110 G4NeutronHPVector * theDistFunc;
00111 G4NeutronHPVector theBuffer;
00112
00113
00114 G4double theLowThreshold[1000];
00115 G4double theHighThreshold[1000];
00116
00117
00118 };
00119
00120 #endif