@@ -567,22 +567,37 @@ def translate_data(self, target_type: str) -> 'MSExpression':
567567 for feature in self .features :
568568 value = feature .get_value (condition )
569569 if value is not None :
570- if self .type == "AbsoluteAbundance" :
570+ if self .type == "AbsoluteAbundance" or self . type == "FPKM" or self . type == "TPM" :
571571 if target_type == "RelativeAbundance" :
572- value = value / condition .sum_value ()
572+ if condition .sum_value () > 0.01 :
573+ value = value / condition .sum_value ()
574+ else :
575+ value = 0
573576 elif target_type == "NormalizedRatios" :
574- value = value / condition .highest_value ()
577+ if condition .highest_value () > 0.01 :
578+ value = value / condition .highest_value ()
579+ else :
580+ value = 0
575581 else :
576582 raise ValueError (
577583 f"Translation from { self .type } to { target_type } not supported"
578584 )
585+ elif self .type == "Log2" :
586+ ave_val = condition .average_value ()
587+ col_sum = condition .sum_value ()
588+ n_features = len (self .features )
589+ denominator = (2 ** (col_sum - n_features * ave_val ))
590+ if denominator > 0.01 :
591+ transformed_value = (2 ** (value - ave_val )) / denominator
592+ else :
593+ transformed_value = 0
579594 else :
580595 raise ValueError (
581596 f"Translation from { self .type } to { target_type } not supported"
582597 )
583598 new_expression ._data .loc [feature .id , condition .id ] = value
584599 return new_expression
585-
600+
586601 def fit_model_flux_to_data (
587602 self ,
588603 model : 'MSModelUtil' ,
@@ -707,7 +722,9 @@ def fit_model_flux_to_data(
707722 )
708723
709724 rxn_expression = self
710-
725+
726+ model .util .save ("reaction_expression_data" , rxn_expression ._data .to_dict ())
727+
711728 # Task 2.5-2.13: Expression type transformation
712729 if rxn_expression .type != "RelativeAbundance" and rxn_expression .type != "NormalizedRatios" :
713730 # Task 2.10: Log transformation
@@ -738,17 +755,20 @@ def fit_model_flux_to_data(
738755 value = rxn_expression .get_value (feat .id , cond .id )
739756 if value is not None :
740757 # Task 2.6-2.9: Apply transformation formulas
741- if rxn_expression .type == "AbsoluteAbundance" :
742- transformed_value = value / cond .sum_value ()
743- elif rxn_expression .type == "FPKM" :
744- transformed_value = value / cond .sum_value ()
745- elif rxn_expression .type == "TPM" :
746- transformed_value = value / cond .sum_value ()
758+ if rxn_expression .type == "AbsoluteAbundance" or rxn_expression .type == "FPKM" or rxn_expression .type == "TPM" :
759+ if cond .sum_value () > 0.01 :
760+ transformed_value = value / cond .sum_value ()
761+ else :
762+ transformed_value = 0
747763 elif rxn_expression .type == "Log2" :
748764 ave_val = cond .average_value ()
749765 col_sum = cond .sum_value ()
750766 n_features = len (rxn_expression .features )
751- transformed_value = (2 ** (value - ave_val )) / (2 ** (col_sum - n_features * ave_val ))
767+ denominator = (2 ** (col_sum - n_features * ave_val ))
768+ if denominator > 0.01 :
769+ transformed_value = (2 ** (value - ave_val )) / denominator
770+ else :
771+ transformed_value = 0
752772 else :
753773 transformed_value = value
754774
0 commit comments