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 #include <tpia_target.h>
00038 #include <tpia_misc.h>
00039
00040 #if defined __cplusplus
00041 namespace GIDI {
00042 using namespace GIDI;
00043 #endif
00044
00045 static int _tpia_target_releaseAndReturnOne( statusMessageReporting *smr, tpia_target *target );
00046
00047
00048
00049 tpia_target *tpia_target_create( statusMessageReporting *smr ) {
00050
00051 tpia_target *target;
00052
00053
00054 if( ( target = (tpia_target*) xData_malloc2( smr, sizeof( tpia_target ), 0, "target" ) ) == NULL ) return( NULL );
00055 if( tpia_target_initialize( smr, target ) ) target = tpia_target_free( smr, target );
00056 return( target );
00057 }
00058
00059
00060
00061 int tpia_target_initialize( statusMessageReporting *smr, tpia_target *target ) {
00062
00063 memset( target, 0, sizeof( tpia_target ) );
00064 tpia_samplingMethods_initialize( smr, &(target->samplingMethods) );
00065 return( 0 );
00066 }
00067
00068
00069
00070 tpia_target *tpia_target_createRead( statusMessageReporting *smr, const char *fileName ) {
00071
00072 tpia_target *target;
00073
00074 if( ( target = tpia_target_create( smr ) ) == NULL ) return( NULL );
00075
00076 if( tpia_target_read( smr, target, fileName ) != 0 ) target = (tpia_target*) xData_free( smr, target );
00077 return( target );
00078 }
00079
00080
00081
00082 int tpia_target_readFromMap( statusMessageReporting *smr, tpia_target *target, tpia_map *map, const char *evaluation, const char *projectileName,
00083 const char *targetName ) {
00084
00085 char *targetPath;
00086
00087 if( ( targetPath = tpia_map_findTarget( smr, map, evaluation, projectileName, targetName ) ) == NULL ) return( 1 );
00088 return( tpia_target_read( smr, target, targetPath ) );
00089 }
00090
00091
00092
00093 tpia_target *tpia_target_createReadFromMap( statusMessageReporting *smr, tpia_map *map, const char *evaluation, const char *projectileName,
00094 const char *targetName ) {
00095
00096 char *targetPath;
00097 tpia_target *target;
00098
00099 targetPath = tpia_map_findTarget( smr, map, evaluation, projectileName, targetName );
00100 if( targetPath == NULL ) return( NULL );
00101 target = tpia_target_createRead( smr, targetPath );
00102 xData_free( smr, targetPath );
00103 return( target );
00104 }
00105
00106
00107
00108 tpia_target *tpia_target_free( statusMessageReporting *smr, tpia_target *target ) {
00109
00110 tpia_target_release( smr, target );
00111 xData_free( smr, target );
00112 return( NULL );
00113 }
00114
00115
00116
00117 int tpia_target_release( statusMessageReporting *smr, tpia_target *target ) {
00118
00119 int i;
00120
00121
00122 target->path = (char*) xData_free( smr, target->path );
00123
00124 target->absPath = (char*) xData_free( smr, target->absPath );
00125 xData_releaseAttributionList( smr, &(target->attributes) );
00126 for( i = 0; i < target->nHeatedTargets; i++ ) {
00127
00128 target->heatedTargets[i].path = (char*) xData_free( smr, target->heatedTargets[i].path );
00129
00130 target->heatedTargets[i].contents = (char*) xData_free( smr, target->heatedTargets[i].contents );
00131 if( target->heatedTargets[i].heatedTarget != NULL ) tpia_target_heated_free( smr, target->heatedTargets[i].heatedTarget );
00132 }
00133
00134 target->heatedTargets = (tpia_target_heated_info*) xData_free( smr, target->heatedTargets );
00135
00136 target->readHeatedTargets = (tpia_target_heated_info**) xData_free( smr, target->readHeatedTargets );
00137 tpia_target_initialize( smr, target );
00138 return( 0 );
00139 }
00140
00141
00142
00143 int tpia_target_read( statusMessageReporting *smr, tpia_target *target, const char *fileName ) {
00144
00145
00146
00147
00148 xData_document *doc;
00149 xData_element *element, *child;
00150 int i, iHeated, nHeated = 0, status = 1;
00151 double temperature;
00152
00153
00154 char *name;
00155 char const *contents;
00156
00157 tpia_target_initialize( smr, target );
00158 if( ( target->path = xDataMisc_allocateCopyString2( smr, fileName, "path" ) ) == NULL ) return( status );
00159 if( ( target->absPath = xDataMisc_getAbsPath( smr, fileName ) ) == NULL ) return( _tpia_target_releaseAndReturnOne( smr, target ) );
00160 if( ( doc = xData_parseReadFile( smr, fileName, NULL, NULL ) ) == NULL ) return( _tpia_target_releaseAndReturnOne( smr, target ) );
00161 element = xData_getDocumentsElement( doc );
00162 if( strcmp( element->name, "xTarget" ) != 0 ) {
00163 tpia_misc_setMessageError_Element( smr, NULL, element, __FILE__, __LINE__, 1, "input file's top element must be xTarget and not %s", element->name ); }
00164 else {
00165
00166
00167 xData_copyAttributionList( smr, &(target->attributes),&(element->attributes) );
00168 name = tpia_misc_pointerToAttributeIfAllOk2( smr, element, 1, &(target->attributes), "projectile" );
00169 if( smr_isOk( smr ) ) target->projectileID = tpia_particle_getInternalID( smr, name );
00170 if( smr_isOk( smr ) && ( name = tpia_misc_pointerToAttributeIfAllOk2( smr, element, 1, &(target->attributes), "target" ) ) != NULL ) {
00171 if( smr_isOk( smr ) && ( target->targetID = tpia_particle_getInternalID( smr, name ) ) != NULL ) {
00172 status = 0;
00173 for( nHeated = 0, child = xData_getFirstElement( element ); child != NULL; nHeated++, child = xData_getNextElement( child ) ) {
00174 if( strcmp( child->name, "target" ) != 0 ) {
00175 tpia_misc_setMessageError_Element( smr, NULL, element, __FILE__, __LINE__, 1, "element can only have target sub-elements%s",
00176 element->name );
00177 status = 1;
00178 break;
00179 }
00180 }
00181 if( status == 0 ) {
00182
00183 if( ( target->heatedTargets = (tpia_target_heated_info*) xData_malloc2( smr, nHeated * sizeof( tpia_target_heated_info ), 1, "heatedTargets" ) ) == NULL ) {
00184 status = 1; }
00185 else {
00186
00187 if( ( target->readHeatedTargets = (tpia_target_heated_info**) xData_malloc2( smr, nHeated * sizeof( tpia_target_heated_info * ), 1, "heatedTargets" ) ) == NULL )
00188 status = 1;
00189 }
00190 for( nHeated = 0, child = xData_getFirstElement( element ); ( status == 0 ) && ( child != NULL );
00191 nHeated++, child = xData_getNextElement( child ) ) {
00192 if( ( i = xData_convertAttributeToDouble( smr, child, "temperature", &temperature ) ) != 0 ) {
00193 if( i > 0 ) smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1, "target does not have a temperature attribute" );
00194 status = 1;
00195 break;
00196 }
00197 for( iHeated = 0; iHeated < nHeated; iHeated++ ) if( target->heatedTargets[iHeated].temperature > temperature ) break;
00198 if( iHeated < nHeated ) for( i = nHeated; i >= iHeated; i-- ) target->heatedTargets[i+1] = target->heatedTargets[i];
00199 target->heatedTargets[iHeated].temperature = temperature;
00200 target->heatedTargets[iHeated].path = NULL;
00201 target->heatedTargets[iHeated].contents = NULL;
00202 target->heatedTargets[iHeated].heatedTarget = NULL;
00203 if( ( contents = xData_getAttributesValueInElement( child, "contents" ) ) != NULL ) {
00204 if( ( target->heatedTargets[iHeated].contents = xDataMisc_allocateCopyString2( smr, contents, "contents" ) ) == NULL ) {
00205 status = 1;
00206 break;
00207 }
00208 }
00209 if( ( contents = xData_getAttributesValueInElement( child, "file" ) ) == NULL ) {
00210 status = 1;
00211 break;
00212 }
00213
00214 if((target->heatedTargets[iHeated].path = (char*) xData_malloc2(smr, strlen( target->absPath ) + strlen( contents ) + 2, 0, "path")) == NULL) {
00215 status = 1;
00216 break;
00217 }
00218 strcpy( target->heatedTargets[iHeated].path, target->absPath );
00219 *strrchr( target->heatedTargets[iHeated].path, '/' ) = 0;
00220 strcat( target->heatedTargets[iHeated].path, "/" );
00221 strcat( target->heatedTargets[iHeated].path, contents );
00222 target->nHeatedTargets++;
00223 }
00224 }
00225 }
00226 }
00227 }
00228 xData_parseFree( smr, doc );
00229 if( status == 0 ) {
00230 for( i = 0; i < nHeated; i++ ) target->heatedTargets[i].ordinal = i;
00231 for( i = 0; i < nHeated; i++ ) if( target->heatedTargets[i].contents == NULL ) break;
00232 if( i == nHeated ) i = 0;
00233 if( tpia_target_readHeatedTarget( smr, target, i, 0 ) == 0 ) {
00234 target->baseHeatedTarget = target->heatedTargets[i].heatedTarget; }
00235 else {
00236 tpia_target_release( NULL, target );
00237 status = 1;
00238 } }
00239 else {
00240 tpia_target_release( smr, target );
00241 }
00242 return( status );
00243 }
00244
00245
00246
00247
00248 char *tpia_target_getAttributesValue( statusMessageReporting *, tpia_target *target, char const *name ) {
00249
00250 return( xData_getAttributesValue( &(target->attributes), name ) );
00251 }
00252
00253
00254
00255
00256 int tpia_target_getTemperatures( statusMessageReporting *, tpia_target *target, double *temperatures ) {
00257
00258 int i;
00259
00260 if( temperatures != NULL ) for( i = 0; i < target->nHeatedTargets; i++ ) temperatures[i] = target->heatedTargets[i].temperature;
00261 return( target->nHeatedTargets );
00262 }
00263
00264
00265
00266 int tpia_target_readHeatedTarget( statusMessageReporting *smr, tpia_target *target, int index, int checkElememtsForAccess ) {
00267
00268 int i;
00269
00270 if( ( index < 0 ) || ( index >= target->nHeatedTargets ) ) {
00271 smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1, "temperature index = %d out of range (0 <= index < %d", index, target->nHeatedTargets );
00272 return( -1 );
00273 }
00274 if( target->heatedTargets[index].heatedTarget != NULL ) return( 1 );
00275 target->heatedTargets[index].heatedTarget = tpia_target_heated_createRead( smr, target->heatedTargets[index].path, checkElememtsForAccess );
00276 if( target->heatedTargets[index].heatedTarget != NULL ) {
00277 target->heatedTargets[index].heatedTarget->ordinal = target->heatedTargets[index].ordinal;
00278 for( i = target->nReadHeatedTargets; i > 0; i-- ) {
00279 if( target->readHeatedTargets[i-1]->temperature < target->heatedTargets[index].temperature ) break;
00280 target->readHeatedTargets[i] = target->readHeatedTargets[i-1];
00281 }
00282 target->readHeatedTargets[i] = &(target->heatedTargets[i]);
00283 target->nReadHeatedTargets++;
00284 }
00285 return( ( target->heatedTargets[index].heatedTarget == NULL ? -1 : 0 ) );
00286 }
00287
00288
00289
00290 tpia_target_heated *tpia_target_getHeatedTargetAtIndex_ReadIfNeeded( statusMessageReporting *smr, tpia_target *target, int index ) {
00291
00292 if( ( index < 0 ) || ( index >= target->nHeatedTargets ) ) {
00293 smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1, "temperature index = %d out of range (0 <= index < %d", index, target->nHeatedTargets );
00294 return( NULL );
00295 }
00296 if( target->heatedTargets[index].heatedTarget == NULL ) tpia_target_readHeatedTarget( smr, target, index, 0 );
00297 return( target->heatedTargets[index].heatedTarget );
00298 }
00299
00300
00301
00302 tpia_target_heated *tpia_target_getHeatedTargetAtTIndex( statusMessageReporting *smr, tpia_target *target, int index ) {
00303
00304 if( ( index < 0 ) || ( index >= target->nHeatedTargets ) ) {
00305 smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1, "temperature index = %d out of range (0 <= index < %d", index, target->nHeatedTargets );
00306 return( NULL );
00307 }
00308 if( target->heatedTargets[index].heatedTarget == NULL ) {
00309 smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1, "temperature index = %d not read in", index );
00310 return( NULL );
00311 }
00312 return( target->heatedTargets[index].heatedTarget );
00313 }
00314
00315
00316
00317 int tpia_target_numberOfChannels( statusMessageReporting *smr, tpia_target *target ) {
00318
00319 return( tpia_target_heated_numberOfChannels( smr, target->baseHeatedTarget ) );
00320 }
00321
00322
00323
00324 int tpia_target_numberOfProductionChannels( statusMessageReporting *smr, tpia_target *target ) {
00325
00326 return( tpia_target_heated_numberOfProductionChannels( smr, target->baseHeatedTarget ) );
00327 }
00328
00329
00330
00331 xData_Int tpia_target_getEnergyGridAtTIndex( statusMessageReporting *smr, tpia_target *target, int index, double **energyGrid ) {
00332
00333 tpia_target_heated *heated = tpia_target_getHeatedTargetAtTIndex( smr, target, index );
00334
00335 if( !smr_isOk( smr ) ) return( -1 );
00336 return( tpia_target_heated_getEnergyGrid( smr, heated, energyGrid ) );
00337 }
00338
00339
00340
00341 tpia_1dData *tpia_target_getTotalCrossSectionAtTIndex( statusMessageReporting *smr, tpia_target *target, int index, int crossSectionType ) {
00342
00343 tpia_target_heated *heated = tpia_target_getHeatedTargetAtTIndex( smr, target, index );
00344
00345 if( !smr_isOk( smr ) ) return( NULL );
00346 if( crossSectionType == tpia_crossSectionType_grouped ) {
00347 return( &(heated->totalCrossSectionGrouped) ); }
00348 else if( crossSectionType == tpia_crossSectionType_pointwise ) {
00349 return( &(heated->totalCrossSectionPointwise) );
00350 }
00351 smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1, "Invalue crossSectionType = %d", crossSectionType );
00352 return( NULL );
00353 }
00354
00355
00356
00357 double tpia_target_getTotalCrossSectionAtTAndE( statusMessageReporting *smr, tpia_target *target, double T, xData_Int iEg, double e_in,
00358 int crossSectionType ) {
00359
00360 int i;
00361 double xsec = 0., xsec1, xsec2;
00362
00363 for( i = 0; i < target->nReadHeatedTargets; i++ ) if( target->readHeatedTargets[i]->temperature > T ) break;
00364 if( i == 0 ) {
00365 xsec = tpia_target_heated_getTotalCrossSectionAtE( smr, target->readHeatedTargets[0]->heatedTarget, iEg, e_in, crossSectionType ); }
00366 else if( i == target->nReadHeatedTargets ) {
00367 xsec = tpia_target_heated_getTotalCrossSectionAtE( smr, target->readHeatedTargets[i-1]->heatedTarget, iEg, e_in, crossSectionType ); }
00368 else {
00369 xsec1 = tpia_target_heated_getTotalCrossSectionAtE( smr, target->readHeatedTargets[i-1]->heatedTarget, iEg, e_in, crossSectionType );
00370 xsec2 = tpia_target_heated_getTotalCrossSectionAtE( smr, target->readHeatedTargets[i ]->heatedTarget, iEg, e_in, crossSectionType );
00371 xsec = ( ( target->readHeatedTargets[i]->temperature - T ) * xsec1 + ( T - target->readHeatedTargets[i-1]->temperature ) * xsec2 ) /
00372 ( target->readHeatedTargets[i]->temperature - target->readHeatedTargets[i-1]->temperature );
00373 }
00374
00375 return( xsec );
00376 }
00377
00378
00379
00380 double tpia_target_getIndexChannelCrossSectionAtE( statusMessageReporting *smr, tpia_target *target, int index, double T, xData_Int iEg, double e_in,
00381 int crossSectionType ) {
00382
00383 int i;
00384 double xsec = 0., xsec1, xsec2;
00385
00386 for( i = 0; i < target->nReadHeatedTargets; i++ ) if( target->readHeatedTargets[i]->temperature > T ) break;
00387 if( i == 0 ) {
00388 xsec = tpia_target_heated_getIndexChannelCrossSectionAtE( smr, target->readHeatedTargets[0]->heatedTarget, index, iEg, e_in, crossSectionType ); }
00389 else if( i == target->nReadHeatedTargets ) {
00390 xsec = tpia_target_heated_getIndexChannelCrossSectionAtE( smr, target->readHeatedTargets[i-1]->heatedTarget, index, iEg, e_in, crossSectionType ); }
00391 else {
00392 xsec1 = tpia_target_heated_getIndexChannelCrossSectionAtE(smr, target->readHeatedTargets[i-1]->heatedTarget, index, iEg, e_in, crossSectionType);
00393 xsec2 = tpia_target_heated_getIndexChannelCrossSectionAtE(smr, target->readHeatedTargets[i ]->heatedTarget, index, iEg, e_in, crossSectionType);
00394 xsec = ( ( target->readHeatedTargets[i]->temperature - T ) * xsec1 + ( T - target->readHeatedTargets[i-1]->temperature ) * xsec2 ) /
00395 ( target->readHeatedTargets[i]->temperature - target->readHeatedTargets[i-1]->temperature );
00396 }
00397
00398 return( xsec );
00399 }
00400
00401
00402
00403
00404 int tpia_target_sampleIndexChannelProductsAtE( statusMessageReporting *smr, tpia_target *target, int index, double ,
00405 tpia_decaySamplingInfo *decaySamplingInfo, int nProductData, tpia_productOutgoingData *productData ) {
00406
00407 return( tpia_target_heated_sampleIndexChannelProductsAtE( smr, target->baseHeatedTarget, index, decaySamplingInfo,
00408 nProductData, productData ) );
00409 }
00410
00411
00412
00413 static int _tpia_target_releaseAndReturnOne( statusMessageReporting *smr, tpia_target *target ) {
00414
00415 tpia_target_release( smr, target );
00416 return( 1 );
00417 }
00418
00419 #if defined __cplusplus
00420 }
00421 #endif