00001
00002
00003
00004
00005 #include "Elecin.h"
00006
00007 #include <cmath>
00008 #include <stdlib.h>
00009 #include <stdio.h>
00010
00011 void Elecin::readPEGS(std::istream& fin, int m)
00012 {
00013 meke = m;
00014 fin >> xr0 >> teff0 >> blcc >> xcc;
00015 fin >> eke0 >> eke1;
00016 esig0 = new float[meke];
00017 esig1 = new float[meke];
00018 psig0 = new float[meke];
00019 psig1 = new float[meke];
00020 ededx0 = new float[meke];
00021 ededx1 = new float[meke];
00022 pdedx0 = new float[meke];
00023 pdedx1 = new float[meke];
00024 ebr10 = new float[meke];
00025 ebr11 = new float[meke];
00026 pbr10 = new float[meke];
00027 pbr11 = new float[meke];
00028 pbr20 = new float[meke];
00029 pbr21 = new float[meke];
00030 tmxs0 = new float[meke];
00031 tmxs1 = new float[meke];
00032
00033 for (int i=0; i< meke; i++)
00034 fin >> esig0[i] >> esig1[i]
00035 >> psig0[i] >> psig1[i]
00036 >> ededx0[i] >> ededx1[i]
00037 >> pdedx0[i] >> pdedx1[i]
00038 >> ebr10[i] >> ebr11[i]
00039 >> pbr10[i] >> pbr11[i]
00040 >> pbr20[i] >> pbr21[i]
00041 >> tmxs0[i] >> tmxs1[i];
00042 }
00043
00044 void Elecin::rescale(float dfact)
00045 {
00046
00047
00048
00049
00050 float dfacti=1.0/dfact;
00051
00052 for (int i=0; i< meke; i++)
00053 {
00054
00055
00056 esig0[i] *= dfacti;
00057 esig1[i] *= dfacti;
00058 psig0[i] *= dfacti;
00059 psig1[i] *= dfacti;
00060 ededx0[i] *= dfacti;
00061 ededx1[i] *= dfacti;
00062 pdedx0[i] *= dfacti;
00063 pdedx1[i] *= dfacti;
00064 tmxs0[i] *= dfact;
00065 tmxs1[i] *= dfact;
00066 }
00067 teff0 *= dfact;
00068
00069 blcc *= dfacti;
00070 xcc *= sqrt(dfacti);
00071 }
00072
00073 void Elecin::fixtmx(float estepe){
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103 if(estepe == 0) return;
00104
00105
00106 float ei = exp( (1.-eke0)/eke1);
00107 updateIndex(ei);
00108 float eil = loge;
00109
00110
00111
00112
00113
00114 float si=estepe*ei/ededx();
00115
00116 float eratio=-1./eke1;
00117
00118 for(int i=1; i<=meke-1; i++)
00119 {
00120 float eip1=exp(((i+1)-eke0)/eke1);
00121 updateIndex(eip1);
00122 float eip1l=loge; index=i-1; ;
00123
00124 float sip1=estepe*eip1/ededx();
00125
00126
00127
00128
00129
00130 tmxs1[i-1] = (si-sip1)/eratio;
00131 tmxs0[i-1] = si-tmxs1[i-1]*eil;
00132
00133 eil=eip1l; si=sip1;
00134 }
00135
00136 tmxs0[meke-1] = tmxs0[meke-2];
00137 tmxs1[meke-1] = tmxs1[meke-2];
00138 return;
00139 }
00140
00141 #define inline
00142
00143 inline void
00144 Elecin::updateIndex(float enew) const
00145 {
00146 if (enew == eold) return;
00147 Elecin * self = (Elecin *)this;
00148 self->loge = log(enew);
00149 self->index= (int)(eke1*loge + eke0 -1);
00150 if (index>=meke)
00151 {
00152 char strl[70];
00153 sprintf(strl, "Elecin: energy %9.3f too large for table: index %u , max %u",
00154 enew, self->index, meke);
00155
00156 WARNING(strl);
00157 self->index = meke-1;
00158 }
00159 self->eold = enew;
00160 }
00161 inline float Elecin::esig()const{return esig1[index]*loge + esig0[index];}
00162 inline float Elecin::psig()const{return psig1[index]*loge + psig0[index];}
00163 inline float Elecin::ededx()const{return ededx1[index]*loge +ededx0[index];}
00164 inline float Elecin::pdedx()const{return pdedx1[index]*loge +pdedx0[index];}
00165 inline float Elecin::ebr1()const{return ebr11[index]*loge + ebr10[index];}
00166 inline float Elecin::pbr1()const{return pbr11[index]*loge + pbr10[index];}
00167 inline float Elecin::pbr2()const{return pbr21[index]*loge + pbr20[index];}
00168 inline float Elecin::tmxs()const{return tmxs1[index]*loge + tmxs0[index];}
00169
00170 Elecin::~Elecin()
00171 {
00172 if( meke==0 ) return;
00173 delete [] esig0 ;
00174 delete [] esig1 ;
00175 delete [] psig0 ;
00176 delete [] psig1 ;
00177 delete [] ededx0 ;
00178 delete [] ededx1;
00179 delete [] pdedx0;
00180 delete [] pdedx1;
00181 delete [] ebr10 ;
00182 delete [] ebr11 ;
00183 delete [] pbr10 ;
00184 delete [] pbr11 ;
00185 delete [] pbr20 ;
00186 delete [] pbr21 ;
00187 delete [] tmxs0 ;
00188 delete [] tmxs1 ;
00189
00190 }