@@ -37,9 +37,10 @@ class Distribution:
3737 y_errs (list): List of y error arrays.
3838 y_err_labels (str): Labels for y errors.
3939 rows (int): Number of data points.
40- statistical_err (np.ndarray): Statistical errors.
41- systematic_offset_err (np.ndarray): Systematic offset errors.
42- systematic_norm_err (np.ndarray): Systematic normalization errors.
40+ statistical_err (float): Statistical errors.
41+ systematic_offset_err (float): Systematic offset errors.
42+ systematic_norm_err (float): Systematic normalization errors.
43+ other_fields (dict): any other optional fields,
4344 """
4445
4546 def __init__ (
@@ -52,8 +53,9 @@ def __init__(
5253 x_err : np .ndarray ,
5354 y : np .ndarray ,
5455 statistical_err : np .ndarray ,
55- systematic_norm_err : np .ndarray ,
56- systematic_offset_err : np .ndarray ,
56+ systematic_norm_err : float ,
57+ systematic_offset_err : float ,
58+ other_fields : dict = {},
5759 xbounds = (- np .inf , np .inf ),
5860 ):
5961 """
@@ -76,10 +78,12 @@ def __init__(
7678 Array of y values.
7779 statistical_err: np.ndarray
7880 Statistical errors.
79- systematic_norm_err: np.ndarray
80- Systematic normalization errors.
81- systematic_offset_err: np.ndarray
82- Systematic offset errors.
81+ systematic_norm_err: float
82+ Systematic normalization error
83+ systematic_offset_err: float
84+ Systematic offset error
85+ other_fields: dict
86+ any other optional fields,
8387 xbounds: tuple, optional
8488 Bounds for x values. Defaults to (-np.inf, np.inf).
8589 """
@@ -103,9 +107,10 @@ def __init__(
103107
104108 self .notes = []
105109
106- self .statistical_err = statistical_err [sort_by_x ]
107- self .systematic_norm_err = systematic_norm_err [sort_by_x ]
108- self .systematic_offset_err = systematic_offset_err [sort_by_x ]
110+ self .statistical_err = statistical_err
111+ self .systematic_norm_err = systematic_norm_err
112+ self .systematic_offset_err = systematic_offset_err
113+ self .other_fields = other_fields
109114
110115 @classmethod
111116 def parse_errs_and_init (
@@ -205,6 +210,7 @@ def parse_errs_and_init(
205210 statistical_err ,
206211 systematic_norm_err ,
207212 systematic_offset_err ,
213+ other_fields = {label : field for label , field in zip (y_err_labels , y_errs )},
208214 xbounds = xbounds ,
209215 )
210216
@@ -272,29 +278,24 @@ def determine_error_categories(
272278 err = y_errs [index ]
273279 ratio = err / y
274280 if np .allclose (err , err [0 ]):
275- systematic_offset_err .append (err )
276- else :
277- systematic_norm_err .append (ratio )
281+ systematic_offset_err .append (err [ 0 ] )
282+ elif np . allclose ( ratio , ratio [ 0 ]) :
283+ systematic_norm_err .append (ratio [ 0 ] )
278284
279285 if systematic_norm_err == []:
280- systematic_norm_err = [ np . zeros (( rows ))]
286+ systematic_norm_err = 0
281287 if systematic_offset_err == []:
282- systematic_offset_err = [np .zeros ((rows ))]
283-
284- systematic_norm_err = np .array (systematic_norm_err )
285- systematic_offset_err = np .array (systematic_offset_err )
288+ systematic_offset_err = 0
286289
287290 if systematic_err_treatment == "independent" :
288- systematic_offset_err = np .sqrt (np .sum (systematic_offset_err ** 2 , axis = 0 ))
289- systematic_norm_err = np .sqrt (np .sum (systematic_norm_err ** 2 , axis = 0 ))
291+ systematic_offset_err = np .sqrt (np .sum (np . array ( systematic_offset_err ) ** 2 ))
292+ systematic_norm_err = np .sqrt (np .sum (np . array ( systematic_norm_err ) ** 2 ))
290293 else :
291294 raise ValueError (
292295 f"Unknown systematic_err_treatment option: { systematic_err_treatment } "
293296 )
294297
295298 assert statistical_err .shape == (rows ,)
296- assert systematic_norm_err .shape == (rows ,)
297- assert systematic_offset_err .shape == (rows ,)
298299
299300 return (
300301 statistical_err ,
@@ -348,6 +349,7 @@ def parse_errs_and_init(
348349 d .statistical_err ,
349350 d .systematic_norm_err ,
350351 d .systematic_offset_err ,
352+ d .other_fields ,
351353 )
352354
353355 @classmethod
@@ -430,13 +432,11 @@ def to_dataframe(self, citation: str = "") -> pd.DataFrame:
430432 data ["data" ]["x_err" ] = self .x_err .tolist ()
431433
432434 if not np .allclose (self .systematic_norm_err , 0 ):
433- data ["data" ][
434- "systematic_normalization_error"
435- ] = self . systematic_norm_err . tolist ( )
435+ data ["data" ]["systematic_normalization_error" ] = float (
436+ self . systematic_norm_err
437+ )
436438 if not np .allclose (self .systematic_offset_err , 0 ):
437- data ["data" ][
438- "systematic_offset_error"
439- ] = self .systematic_offset_err .tolist ()
439+ data ["data" ]["systematic_offset_error" ] = float (self .systematic_offset_err )
440440
441441 return pd .DataFrame ([data ])
442442
@@ -462,16 +462,21 @@ def from_dataframe(cls, dataframe: pd.DataFrame):
462462 x_err = np .zeros_like (x )
463463
464464 if "systematic_normalization_error" in row ["data" ]:
465- systematic_norm_err = np . array (
465+ systematic_norm_err = float (
466466 row ["data" ]["systematic_normalization_error" ]
467467 )
468468 else :
469- systematic_norm_err = np . zeros_like ( y )
469+ systematic_norm_err = 0
470470
471471 if "systematic_offset_error" in row ["data" ]:
472- systematic_offset_err = np . array (row ["data" ]["systematic_offset_error" ])
472+ systematic_offset_err = float (row ["data" ]["systematic_offset_error" ])
473473 else :
474- systematic_offset_err = np .zeros_like (y )
474+ systematic_offset_err = 0
475+
476+ other_fields = {}
477+ if "other_fields" in row ["data" ]:
478+ for key , field in row ["data" ]["other_fields" ]:
479+ other_fields [key ] = np .array (field )
475480
476481 measurements .append (
477482 cls (
@@ -485,6 +490,7 @@ def from_dataframe(cls, dataframe: pd.DataFrame):
485490 statistical_err ,
486491 systematic_norm_err ,
487492 systematic_offset_err ,
493+ other_fields ,
488494 )
489495 )
490496 return measurements
@@ -548,6 +554,7 @@ def parse_errs_and_init(
548554 d .statistical_err ,
549555 d .systematic_norm_err ,
550556 d .systematic_offset_err ,
557+ d .other_fields ,
551558 )
552559
553560 @classmethod
@@ -731,13 +738,11 @@ def to_dataframe(self, citation: str = "") -> pd.DataFrame:
731738 data ["data" ]["x_err" ] = self .x_err .tolist ()
732739
733740 if not np .allclose (self .systematic_norm_err , 0 ):
734- data ["data" ][
735- "systematic_normalization_error"
736- ] = self . systematic_norm_err . tolist ( )
741+ data ["data" ]["systematic_normalization_error" ] = float (
742+ self . systematic_norm_err
743+ )
737744 if not np .allclose (self .systematic_offset_err , 0 ):
738- data ["data" ][
739- "systematic_offset_error"
740- ] = self .systematic_offset_err .tolist ()
745+ data ["data" ]["systematic_offset_error" ] = float (self .systematic_offset_err )
741746
742747 return pd .DataFrame ([data ])
743748
@@ -764,16 +769,16 @@ def from_dataframe(cls, dataframe: pd.DataFrame):
764769 x_err = np .zeros_like (x )
765770
766771 if "systematic_normalization_error" in row ["data" ]:
767- systematic_norm_err = np . array (
772+ systematic_norm_err = float (
768773 row ["data" ]["systematic_normalization_error" ]
769774 )
770775 else :
771- systematic_norm_err = np . zeros_like ( y )
776+ systematic_norm_err = 0
772777
773778 if "systematic_offset_error" in row ["data" ]:
774- systematic_offset_err = np . array (row ["data" ]["systematic_offset_error" ])
779+ systematic_offset_err = float (row ["data" ]["systematic_offset_error" ])
775780 else :
776- systematic_offset_err = np . zeros_like ( y )
781+ systematic_offset_err = 0
777782
778783 if (
779784 "ex_energy" in row
@@ -788,6 +793,11 @@ def from_dataframe(cls, dataframe: pd.DataFrame):
788793 Ex_err = 0.0
789794 Ex_units = "MeV"
790795
796+ other_fields = {}
797+ if "other_fields" in row ["data" ]:
798+ for key , field in row ["data" ]["other_fields" ]:
799+ other_fields [key ] = np .array (field )
800+
791801 measurements .append (
792802 AngularDistribution (
793803 energy ,
@@ -806,6 +816,7 @@ def from_dataframe(cls, dataframe: pd.DataFrame):
806816 statistical_err ,
807817 systematic_norm_err ,
808818 systematic_offset_err ,
819+ other_fields ,
809820 )
810821 )
811822
0 commit comments