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
00030
00031
00032
00033
00034
00035
00036 #include <string.h>
00037
00038 #include <tpia_target.h>
00039 #include <tpia_misc.h>
00040
00041 #if defined __cplusplus
00042 namespace GIDI {
00043 using namespace GIDI;
00044 #endif
00045
00046
00047
00048
00049 int tpia_angularEnergy_initialize( statusMessageReporting *smr, tpia_angularEnergy *angularEnergy ) {
00050
00051 memset( angularEnergy, 0, sizeof( tpia_angularEnergy ) );
00052 if( tpia_frame_setFromString( smr, "", "", 0, &(angularEnergy->frame) ) ) return( 1 );
00053 angularEnergy->binned.numberOfEs = 0;
00054 angularEnergy->binned.energies = NULL;
00055 return( 0 );
00056 }
00057
00058
00059
00060 int tpia_angularEnergy_release( statusMessageReporting *smr, tpia_angularEnergy *angularEnergy ) {
00061
00062 int i;
00063
00064 for( i = 0; i < angularEnergy->binned.numberOfEs; i++ ) xData_free( smr, angularEnergy->binned.energies[i].energies );
00065
00066 angularEnergy->binned.energies = (tpia_EqualProbableBinSpectra*) xData_free( smr, angularEnergy->binned.energies );
00067 tpia_angularEnergy_initialize( smr, angularEnergy );
00068 return( 0 );
00069 }
00070
00071
00072
00073 int tpia_angularEnergy_getFromElement( statusMessageReporting *smr, xData_element *angularEnergyElement, tpia_angularEnergy *angularEnergy ) {
00074
00075 int i, j, status = 1;
00076 xData_Int nBins, size, n, index;
00077 xData_element *epbElement, *element;
00078 xData_elementList *list;
00079 tpia_EqualProbableBinSpectra *mus;
00080
00081 xData_addToAccessed( smr, angularEnergyElement, 1 );
00082 if( ( tpia_frame_setFromElement( smr, angularEnergyElement, 4, &(angularEnergy->frame) ) ) != 0 ) return( 1 );
00083
00084 if( ( epbElement = xData_getOneElementByTagName( smr, angularEnergyElement, (char*)"equalProbableBins", 0 ) ) == NULL ) return( 1 );
00085 xData_addToAccessed( smr, epbElement, 1 );
00086 if( xData_convertAttributeTo_xData_Int( smr, epbElement, "nBins", &nBins ) != 0 ) {
00087 tpia_misc_setMessageError_Element( smr, NULL, epbElement, __FILE__, __LINE__, 1, "missing or invalid nBins attribute" );
00088 return( 1 );
00089 }
00090 list = xData_getElementsByTagNameAndSort( smr, epbElement, "energy", NULL, NULL );
00091 if( list->n == 0 ) {
00092 tpia_misc_setMessageError_Element( smr, NULL, epbElement, __FILE__, __LINE__, 1, "bins does not contain any energy elements" ); }
00093 else {
00094 size = list->n * sizeof( tpia_EqualProbableBinSpectra );
00095 angularEnergy->binned.nBins = (int) nBins;
00096
00097 if( ( angularEnergy->binned.energies = (tpia_EqualProbableBinSpectra*) xData_malloc2( smr, size, 1, "energies" ) ) != NULL ) {
00098 status = 0;
00099 for( i = 0, mus = angularEnergy->binned.energies; i < list->n; i++, mus++ ) {
00100 mus->iValue = 0;
00101 element = list->items[i].element;
00102 if( xData_convertAttributeTo_xData_Int( smr, element, "index", &index ) != 0 ) {
00103 tpia_misc_setMessageError_Element( smr, NULL, element, __FILE__, __LINE__, 1, "missing or invalid index attribute" );
00104 status = 1;
00105 break;
00106 }
00107 if( index != i ) {
00108 tpia_misc_setMessageError_Element( smr, NULL, element, __FILE__, __LINE__, 1, "index = %lld is not incremental", index );
00109 status = 1;
00110 break;
00111 }
00112 if( ( j = xData_convertAttributeToDouble( smr, element, "value", &(mus->dValue) ) ) != 0 ) {
00113 if( j == 1 ) {
00114 tpia_misc_setMessageError_Element( smr, NULL, element, __FILE__, __LINE__, 1, "element does not have value attribute" ); }
00115 else {
00116 tpia_misc_setMessageError_Element( smr, NULL, element, __FILE__, __LINE__, 1, "failed to convert value attribute to double" );
00117 }
00118 status = 1;
00119 break;
00120 }
00121 if( ( mus->energies = tpia_misc_getEqualProbableBins( smr, element, "mu", nBins, &n ) ) == NULL ) {
00122 status = 1;
00123 break; }
00124 else {
00125 mus->numberOfEs = n;
00126 }
00127 angularEnergy->binned.numberOfEs++;
00128 }
00129 }
00130 }
00131 xData_freeElementList( smr, list );
00132 return( status );
00133 }
00134
00135
00136
00137 int tpia_angularEnergy_SampleEp( statusMessageReporting *smr, tpia_angularEnergy *angularEnergy, tpia_decaySamplingInfo *decaySamplingInfo ) {
00138
00139 int iE1, iE2;
00140 tpia_EqualProbableBinSpectra *energies = angularEnergy->binned.energies;
00141 double Ep, Ep1, Ep2, f, e_in = decaySamplingInfo->e_in;
00142
00143
00144
00145
00146
00147 if( !smr_isOk( smr ) ) return( 1 );
00148 if( angularEnergy->binned.numberOfEs == 0 ) return( 1 );
00149 for( iE2 = 0; iE2 < angularEnergy->binned.numberOfEs; iE2++ ) if( energies[iE2].dValue >= e_in ) break;
00150 if( iE2 == 0 ) {
00151 iE1 = iE2; }
00152 else if( iE2 == angularEnergy->binned.numberOfEs ) {
00153 iE1 = iE2 = angularEnergy->binned.numberOfEs - 1; }
00154 else {
00155 iE1 = iE2 - 1;
00156 }
00157 tpia_misc_sampleEqualProbableBin( smr, decaySamplingInfo, decaySamplingInfo->mu, angularEnergy->binned.nBins, &(energies[iE1]), &Ep1 );
00158 if( iE1 == iE2 ) {
00159 Ep = Ep1; }
00160 else {
00161 tpia_misc_sampleEqualProbableBin( smr, decaySamplingInfo, decaySamplingInfo->mu, angularEnergy->binned.nBins, &(energies[iE2]), &Ep2 );
00162 f = ( energies[iE2].dValue - e_in ) / ( energies[iE2].dValue - energies[iE1].dValue );
00163 Ep = f * Ep1 + ( 1 - f ) * Ep2;
00164 }
00165 decaySamplingInfo->Ep = Ep;
00166
00167 return( 0 );
00168 }
00169
00170 #if defined __cplusplus
00171 }
00172 #endif