Geant4  10.03
xDataTOM_interpolation.cc
Go to the documentation of this file.
1 /*
2 # <<BEGIN-copyright>>
3 # <<END-copyright>>
4 */
5 
6 #include <string.h>
7 #include "xDataTOM_private.h"
8 
9 #if defined __cplusplus
10 namespace GIDI {
11 using namespace GIDI;
12 #endif
13 
14 #define dependentAxis 1
15 #define allowByRegion 2
16 
17 static enum xDataTOM_interpolationFlag xDataTOM_interpolation_getFromString( statusMessageReporting *smr, char const *s, char const **e,
18  char const *str, int flag );
19 /*
20 ************************************************************
21 */
22 int xDataTOM_interpolation_set( statusMessageReporting *smr, xDataTOM_interpolation *interpolation, enum xDataTOM_interpolationFlag independent,
23  enum xDataTOM_interpolationFlag dependent, enum xDataTOM_interpolationQualifier qualifier ) {
24 
25  if( ( independent < xDataTOM_interpolationFlag_linear ) || ( independent > xDataTOM_interpolationFlag_byRegion ) ) {
26  smr_setReportError2( smr, xDataTOM_smrLibraryID, -1, "invalid independent interpolation = %d", independent );
27  return( 1 );
28  }
29  if( ( dependent < xDataTOM_interpolationFlag_linear ) || ( dependent > xDataTOM_interpolationFlag_flat ) ) {
30  smr_setReportError2( smr, xDataTOM_smrLibraryID, -1, "invalid dependent interpolation = %d", dependent );
31  return( 1 );
32  }
33  if( ( qualifier <= xDataTOM_interpolationQualifier_invalid ) || ( qualifier > xDataTOM_interpolationQualifier_correspondingPoints ) ) {
34  smr_setReportError2( smr, xDataTOM_smrLibraryID, -1, "invalid interpolation qualifier = %d", qualifier );
35  return( 1 );
36  }
37 
38  interpolation->independent = independent;
39  interpolation->dependent = dependent;
40  interpolation->qualifier = qualifier;
41  return( 0 );
42 }
43 /*
44 ************************************************************
45 */
46 int xDataTOM_interpolation_setFromString( statusMessageReporting *smr, xDataTOM_interpolation *interpolation, char const *str ) {
47 
48  int flag = 0;
49  char const *c, *e;
50  enum xDataTOM_interpolationQualifier qualifier = xDataTOM_interpolationQualifier_none;
51  enum xDataTOM_interpolationFlag independent, dependent;
52 
53  if( ( c = strchr( str, ':' ) ) != NULL ) {
54  if( strncmp( "unitBase:", str, 9 ) == 0 ) {
55  qualifier = xDataTOM_interpolationQualifier_unitBase; }
56  else if( strncmp( "correspondingPoints:", str, 20 ) == 0 ) {
57  qualifier = xDataTOM_interpolationQualifier_correspondingPoints; }
58  else {
59  smr_setReportError2( smr, xDataTOM_smrLibraryID, -1, "invalid interpolation string qualifier '%s'", str );
60  return( 1 );
61  }
62  c++; }
63  else {
64  c = str;
65  }
66  if( ( independent = xDataTOM_interpolation_getFromString( smr, c, &e, str, flag ) ) == xDataTOM_interpolationFlag_invalid ) return( 1 );
67  if( *e != ',' ) {
68  smr_setReportError2( smr, xDataTOM_smrLibraryID, -1, "missing ',' separator in interpolation string'%s'", str );
69  return( 1 );
70  }
71  c = ++e;
72  flag |= dependentAxis;
73  if( ( dependent = xDataTOM_interpolation_getFromString( smr, c, &e, str, flag ) ) == xDataTOM_interpolationFlag_invalid ) return( 1 );
74  xDataTOM_interpolation_set( smr, interpolation, independent, dependent, qualifier );
75  return( 0 );
76 }
77 /*
78 ************************************************************
79 */
80 static enum xDataTOM_interpolationFlag xDataTOM_interpolation_getFromString( statusMessageReporting *smr, char const *s, char const **e,
81  char const *str, int flag ) {
82 
83  if( strncmp( "linear", s, 6 ) == 0 ) { *e = &(s[6]); return( xDataTOM_interpolationFlag_linear ); }
84  if( strncmp( "log", s, 3 ) == 0 ) { *e = &(s[3]); return( xDataTOM_interpolationFlag_log ); }
85  if( flag | allowByRegion ) {
86  if( strncmp( "byRegion", s, 8 ) == 0 ) { *e = &(s[8]); return( xDataTOM_interpolationFlag_byRegion ); }
87  }
88  if( flag | dependentAxis ) {
89  if( strncmp( "flat", s, 4 ) == 0 ) { *e = &(s[4]); return( xDataTOM_interpolationFlag_flat ); }
90  }
91  smr_setReportError2( smr, xDataTOM_smrLibraryID, -1, "invalid interpolation component '%s' in string '%s'", s, str );
92  return( xDataTOM_interpolationFlag_invalid );
93 
94 /* Currently not supported.
95  otherToken = 'other'
96  chargedParticleToken = 'charged-particle'
97 */
98 }
99 /*
100 ************************************************************
101 */
102 int xDataTOM_interpolation_copy( statusMessageReporting *smr, xDataTOM_interpolation *desc, xDataTOM_interpolation *src ) {
103 
104  return( xDataTOM_interpolation_set( smr, desc, src->independent, src->dependent, src->qualifier ) );
105 }
106 
107 #if defined __cplusplus
108 }
109 #endif
int xDataTOM_interpolation_setFromString(statusMessageReporting *smr, xDataTOM_interpolation *interpolation, char const *str)
int xDataTOM_interpolation_copy(statusMessageReporting *smr, xDataTOM_interpolation *desc, xDataTOM_interpolation *src)
static constexpr double s
Definition: G4SIunits.hh:169
int xDataTOM_smrLibraryID
Definition: xDataTOM.cc:34
#define allowByRegion
#define dependentAxis
static enum xDataTOM_interpolationFlag xDataTOM_interpolation_getFromString(statusMessageReporting *smr, char const *s, char const **e, char const *str, int flag)
int xDataTOM_interpolation_set(statusMessageReporting *smr, xDataTOM_interpolation *interpolation, enum xDataTOM_interpolationFlag independent, enum xDataTOM_interpolationFlag dependent, enum xDataTOM_interpolationQualifier qualifier)