Geant4 Cross Reference |
1 /* 1 2 # <<BEGIN-copyright>> 3 # <<END-copyright>> 4 */ 5 #include <stdio.h> 6 #include <stdlib.h> 7 #include <string.h> 8 #include <cmath> 9 #include <ctype.h> 10 11 #ifdef WIN32 12 #include <direct.h> 13 #else 14 #include <unistd.h> 15 #endif 16 17 #include <ptwXY.h> 18 #include <xDataTOM_importXML_private.h> 19 20 #include "MCGIDI.h" 21 #include "MCGIDI_misc.h" 22 #include "MCGIDI_fromTOM.h" 23 24 #if defined __cplusplus 25 namespace GIDI { 26 using namespace GIDI; 27 #endif 28 29 struct ZSymbol { 30 int Z; 31 char const *symbol; 32 }; 33 34 static struct ZSymbol ZSymbols[] = { { 0, 35 { 7, "N" }, { 8, "O" }, { 9, 36 { 16, "S" }, { 17, "Cl" }, { 18, 37 { 25, "Mn" }, { 26, "Fe" }, { 27, 38 { 34, "Se" }, { 35, "Br" }, { 36, 39 { 43, "Tc" }, { 44, "Ru" }, { 45, 40 { 52, "Te" }, { 53, "I" }, { 54, 41 { 61, "Pm" }, { 62, "Sm" }, { 63, 42 { 70, "Yb" }, { 71, "Lu" }, { 72, 43 { 79, "Au" }, { 80, "Hg" }, { 81, 44 { 88, "Ra" }, { 89, "Ac" }, { 90, 45 { 97, "Bk" }, { 98, "Cf" }, { 99, 46 { 106, "Sg" }, { 107, "Bh" }, { 108, 47 48 static int MCGIDI_miscNameToZAm_getLevel( stat 49 static ptwXYPoints *MCGIDI_misc_Data2ptwXYPoin 50 int length, double *data, char const *from 51 /* 52 ********************************************** 53 */ 54 int MCGIDI_misc_NumberOfZSymbols( void ) { 55 56 return( sizeof( ZSymbols ) / sizeof( struc 57 } 58 /* 59 ********************************************** 60 */ 61 const char *MCGIDI_misc_ZToSymbol( int iZ ) { 62 63 if( ( iZ < 0 ) || ( iZ >= MCGIDI_misc_Numb 64 return( ZSymbols[iZ].symbol ); 65 } 66 /* 67 ********************************************** 68 */ 69 int MCGIDI_misc_symbolToZ( const char *Z ) { 70 71 int i, n = MCGIDI_misc_NumberOfZSymbols( ) 72 73 for( i = 0; i < n; i++ ) { 74 if( strcmp( Z, ZSymbols[i].symbol ) == 75 } 76 return( -1 ); 77 } 78 /* 79 ********************************************** 80 */ 81 int MCGIDI_miscNameToZAm( statusMessageReporti 82 83 const char *p; 84 char s[1024] = "", *q, *e; /* Note 1) ro 85 86 if( strlen( name ) >= ( sizeof( s ) - 1 ) 87 smr_setReportError2( smr, smr_unknownI 88 return( 1 ); 89 } 90 91 *Z = *A = *m = *level = 0; 92 if( ( !strncmp( "FissionProduct", name, 14 93 *Z = 99; 94 *A = 120; 95 return( 0 ); 96 } 97 if( strcmp( "gamma", name ) == 0 ) return( 98 if( strcmp( "n", name ) == 0 ) { *A = 1; r 99 100 for( p = name, q = s; ( *p != 0 ) && !isdi 101 if( *p == 0 ) { 102 smr_setReportError2( smr, smr_unknownI 103 return( 1 ); 104 } 105 *q = 0; 106 if( ( *Z = MCGIDI_misc_symbolToZ( s ) ) < 107 smr_setReportError2( smr, smr_unknownI 108 else { /* Getting here im 109 if( *p == '_' ) { 110 if( strncmp( p, "_natural", 8 ) == 111 p += 8; 112 if( *p ) *level = MCGIDI_miscN 113 else { 114 smr_setReportError2( smr, smr_ 115 } } 116 else { 117 for( q = s; isdigit( *p ); p++, q+ 118 *q = 0; 119 if( strcmp( s, "natural" ) == 0 ) 120 e = s; 121 while( *e ) e++; /* Loop check 122 else { 123 *A = (int) strtol( s, &e, 10 ) 124 } 125 if( *e != 0 ) { 126 smr_setReportError2( smr, smr_ 127 else { /* Getting here im 128 if( *p ) *level = MCGIDI_miscN 129 } 130 } 131 } 132 133 return( !smr_isOk( smr ) ); 134 } 135 /* 136 ********************************************** 137 */ 138 static int MCGIDI_miscNameToZAm_getLevel( stat 139 140 int level = 0; 141 char *e; 142 143 if( *p == '_' ) { 144 p++; 145 switch( *p ) { 146 case 'e' : 147 p++; 148 level = (int) strtol( p, &e, 10 ); 149 if( *e != 0 ) smr_setReportError2( 150 break; 151 case 'c' : 152 level = MCGIDI_particleLevel_conti 153 break; 154 case 's' : 155 level = MCGIDI_particleLevel_sum; 156 break; 157 default : 158 smr_setReportError2( smr, smr_unkn 159 } } 160 else { 161 smr_setReportError2( smr, smr_unknownI 162 } 163 return( level ); 164 } 165 /* 166 ********************************************** 167 */ 168 char const *MCGIDI_misc_pointerToTOMAttributeI 169 xDataTOM_attributionList *attributes, 170 171 char const *value; 172 173 if( !smr_isOk( smr ) ) return( NULL ); 174 if( ( value = xDataTOMAL_getAttributesValu 175 if( required ) { 176 smr_setReportError( smr, NULL, fil 177 } 178 } 179 return( value ); 180 } 181 /* 182 ********************************************** 183 */ 184 char const *MCGIDI_misc_pointerToAttributeIfAl 185 xDataTOM_attributionList *attributes, 186 187 char const *value; 188 189 if( !smr_isOk( smr ) ) return( NULL ); 190 if( ( value = xDataTOMAL_getAttributesValu 191 if( required ) { 192 if( element != NULL ) { 193 MCGIDI_misc_setMessageError_El 194 else { 195 smr_setReportError( smr, NULL, 196 } 197 } 198 } 199 return( value ); 200 } 201 /* 202 ********************************************** 203 */ 204 int MCGIDI_misc_setMessageError_Element( statu 205 const char *fmt, ... ) { 206 207 int status = 0; 208 va_list args; 209 char *msg; 210 211 va_start( args, fmt ); 212 msg = smr_vallocateFormatMessage( fmt, &ar 213 va_end( args ); 214 if( msg == NULL ) { 215 status = 1; 216 va_start( args, fmt ); 217 smr_vsetReportError( smr, userInterfac 218 va_end( args ); } 219 else { 220 status = smr_setReportError( smr, user 221 smr_freeMemory( (void **) &msg ); 222 } 223 return( status ); 224 } 225 /* 226 ********************************************** 227 */ 228 xDataTOM_Int MCGIDI_misc_binarySearch( xDataTO 229 /* 230 * Returns -2 is d < first point of ds, -1 if 231 */ 232 xDataTOM_Int imin = 0, imid, imax = n - 1; 233 234 if( d < ds[0] ) return( -2 ); 235 if( d > ds[n-1] ) return( -1 ); 236 while( 1 ) { // Loop checking, 11.06.2015, 237 imid = ( imin + imax ) >> 1; 238 if( imid == imin ) break; 239 if( d < ds[imid] ) { 240 imax = imid; } 241 else { 242 imin = imid; 243 } 244 } 245 return( imin ); 246 } 247 /* 248 ********************************************** 249 */ 250 char *MCGIDI_misc_getAbsPath( statusMessageRep 251 /* 252 * User must free returned string. 253 */ 254 int n = (int) strlen( fileName ) + 1, nCwd 255 char *absPath, cwd[4 * 1024] = "", *p, *ne 256 257 if( fileName[0] != '/' ) { 258 //if( getcwd( cwd, sizeof( cwd ) + 1 ) 259 //TK modified above line for compiler( 260 if( getcwd( cwd, sizeof( cwd ) ) == NU 261 smr_setReportError2p( smr, smr_unk 262 return( NULL ); 263 } 264 nCwd = (int) strlen( cwd ); 265 n += nCwd + 1; 266 } 267 if( ( absPath = (char *) smr_malloc2( smr, 268 if( fileName[0] != '/' ) { 269 strcpy( absPath, cwd ); 270 strcat( absPath, "/" ); 271 strcat( absPath, fileName ); } 272 else { 273 strcpy( absPath, fileName ); 274 } 275 276 while( 1 ) { 277 if( ( needle = strstr( absPath, "/./" 278 p = needle; 279 for( needle += 2; *needle; p++, needle 280 *p = 0; 281 } 282 while( 1 ) { 283 if( ( needle = strstr( absPath, "/../" 284 p = needle - 1; 285 while( ( p > absPath ) && ( *p != '/' 286 if( *p != '/' ) break; 287 if( p == absPath ) break; 288 for( needle += 3; *needle; p++, needle 289 *p = 0; 290 } 291 return( absPath ); 292 } 293 /* 294 ********************************************** 295 */ 296 int MCGIDI_misc_copyXMLAttributesToTOM( status 297 298 int i; 299 xDataXML_attribute *attribute; 300 301 xDataTOMAL_initial( smr, TOM ); 302 for( i = 0; ; i++ ) { 303 if( ( attribute = xDataXML_attributeBy 304 if( xDataTOMAL_addAttribute( smr, TOM, 305 } 306 return( 0 ); 307 308 err: 309 xDataTOMAL_release( TOM ); 310 return( 1 ); 311 } 312 /* 313 ********************************************** 314 */ 315 enum xDataTOM_frame MCGIDI_misc_getProductFram 316 317 char const *frameString; 318 enum xDataTOM_frame frame = xDataTOM_frame 319 320 if( ( frameString = xDataTOM_getAttributes 321 if( ( frame = xDataTOM_axis_stringToFr 322 smr_setReportError2( smr, smr_unkn 323 } 324 } 325 return( frame ); 326 } 327 /* 328 ********************************************** 329 */ 330 int MCGIDI_misc_PQUStringToDouble( statusMessa 331 /* 332 * Currently, white spaces are not allowed af 333 * 334 * Examples of allowed strings are: "2.39e6 e 335 */ 336 char const *s = str; 337 char *e; 338 339 340 while( isspace( *s ) ) s++; // Loop checki 341 *value = strtod( s, &e ) * conversion; 342 if( e == s ) { 343 smr_setReportError2( smr, smr_unknownI 344 return( 1 ); 345 } 346 while( isspace( *e ) ) e++; // Loop checki 347 if( strcmp( e, unit ) != 0 ) { 348 smr_setReportError2( smr, smr_unknownI 349 return( 1 ); 350 } 351 return( 0 ); 352 } 353 /* 354 ********************************************** 355 */ 356 int MCGIDI_misc_PQUStringToDoubleInUnitOf( sta 357 /* 358 * Currently, white spaces are not allowed af 359 * 360 * Examples of allowed strings are: "2.39e6 e 361 */ 362 char const *s1 = str; 363 char *e1; 364 double factor; 365 366 while( isspace( *s1 ) ) s1++; // Loop chec 367 *value = strtod( s1, &e1 ); 368 if( e1 == s1 ) { 369 smr_setReportError2( smr, smr_unknownI 370 return( 1 ); 371 } 372 while( isspace( *e1 ) ) e1++; // Loop chec 373 374 factor = MCGIDI_misc_getUnitConversionFact 375 *value *= factor; 376 return( !smr_isOk( smr ) ); 377 } 378 /* 379 ********************************************** 380 */ 381 double MCGIDI_misc_getUnitConversionFactor( st 382 /* 383 * This is a kludge until units are better su 384 */ 385 if( strcmp( fromUnit, toUnit ) == 0 ) retu 386 387 if( strcmp( fromUnit, "eV" ) == 0 ) { 388 if( strcmp( toUnit, "MeV" ) == 0 ) ret 389 else if( strcmp( fromUnit, "MeV" ) == 0 ) 390 if( strcmp( toUnit, "eV" ) == 0 ) retu 391 else if( strcmp( fromUnit, "1/eV" ) == 0 ) 392 if( strcmp( toUnit, "1/MeV" ) == 0 ) r 393 else if( strcmp( fromUnit, "1/MeV" ) == 0 394 if( strcmp( toUnit, "1/eV" ) == 0 ) re 395 else if( strcmp( fromUnit, "K" ) == 0 ) { 396 if( strcmp( toUnit, "MeV/k" ) == 0 ) r 397 } 398 399 smr_setReportError2( smr, smr_unknownID, 1 400 return( 1.0 ); 401 } 402 /* 403 ********************************************** 404 */ 405 ptwXYPoints *MCGIDI_misc_dataFromXYs2ptwXYPoin 406 ptwXY_interpolation interpolation, cha 407 408 int length; 409 double *data; 410 char const *fromUnits[2]; 411 412 fromUnits[0] = xDataTOM_subAxes_getUnit( s 413 if( !smr_isOk( smr ) ) return( NULL ); 414 fromUnits[1] = xDataTOM_subAxes_getUnit( s 415 if( !smr_isOk( smr ) ) return( NULL ); 416 417 length = xDataTOM_XYs_getData( XYs, &data 418 419 return( MCGIDI_misc_Data2ptwXYPointsInUnit 420 } 421 /* 422 ********************************************** 423 */ 424 ptwXYPoints *MCGIDI_misc_dataFromElement2ptwXY 425 426 int length; 427 double *data; 428 xDataTOM_axes *axes = &(linear->xDataInfo. 429 char const *fromUnits[2]; 430 ptwXY_interpolation interpolation; 431 432 if( axes->numberOfAxes != 2 ) { 433 smr_setReportError2( smr, smr_unknownI 434 return( NULL ); 435 } 436 437 if( MCGIDI_fromTOM_interpolation( smr, lin 438 fromUnits[0] = axes->axis[0].unit; 439 fromUnits[1] = axes->axis[1].unit; 440 441 length = xDataTOM_XYs_getDataFromXDataInfo 442 return( MCGIDI_misc_Data2ptwXYPointsInUnit 443 } 444 /* 445 ********************************************** 446 */ 447 static ptwXYPoints *MCGIDI_misc_Data2ptwXYPoin 448 int length, double *data, char const * 449 450 double xFactor, yFactor; 451 ptwXYPoints *ptwXY = NULL; 452 nfu_status status; 453 454 xFactor = MCGIDI_misc_getUnitConversionFac 455 if( !smr_isOk( smr ) ) goto err; 456 yFactor = MCGIDI_misc_getUnitConversionFac 457 if( !smr_isOk( smr ) ) goto err; 458 459 460 ptwXY = ptwXY_create( interpolation, NULL, 461 if( status != nfu_Okay ) { 462 smr_setReportError2( smr, smr_unknownI 463 goto err; 464 } 465 466 if( ( xFactor != 1. ) || ( yFactor != 1. ) 467 if( ( status = ptwXY_scaleOffsetXAndY( 468 smr_setReportError2( smr, smr_unkn 469 goto err; 470 } 471 } 472 473 return( ptwXY ); 474 475 err: 476 if( ptwXY != NULL ) ptwXY_free( ptwXY ); 477 return( NULL ); 478 } 479 /* 480 ********************************************** 481 */ 482 void MCGIDI_misc_updateTransportabilitiesMap( 483 484 transportabilitiesMap::iterator iter = tra 485 486 if( iter != transportabilities->end( ) ) { 487 switch ( iter->second ) { 488 case MCGIDI_transportability_unknown : 489 break; 490 case MCGIDI_transportability_none : 491 switch( transportability ) { 492 case MCGIDI_transportability_u 493 case MCGIDI_transportability_n 494 transportability = MCGIDI_ 495 break; 496 case MCGIDI_transportability_p 497 break; 498 case MCGIDI_transportability_f 499 transportability = MCGIDI_ 500 break; 501 } 502 break; 503 case MCGIDI_transportability_partial : 504 transportability = MCGIDI_transpor 505 break; 506 case MCGIDI_transportability_full : 507 switch( transportability ) { 508 case MCGIDI_transportability_n 509 case MCGIDI_transportability_p 510 transportability = MCGIDI_ 511 break; 512 case MCGIDI_transportability_u 513 case MCGIDI_transportability_f 514 break; 515 } 516 break; 517 } 518 } 519 (*transportabilities)[PoPID] = transportab 520 } 521 /* 522 ********************************************** 523 */ 524 void MCGIDI_misc_updateTransportabilitiesMap2( 525 526 MCGIDI_misc_updateTransportabilitiesMap( t 527 } 528 529 #if defined __cplusplus 530 } 531 #endif 532 533