diff --git a/gemma-core/src/main/java/ubic/gemma/model/analysis/expression/diff/DifferentialExpressionAnalysisResultSetValueObject.java b/gemma-core/src/main/java/ubic/gemma/model/analysis/expression/diff/DifferentialExpressionAnalysisResultSetValueObject.java index 9865a3f7de..0f4d3cc9bd 100644 --- a/gemma-core/src/main/java/ubic/gemma/model/analysis/expression/diff/DifferentialExpressionAnalysisResultSetValueObject.java +++ b/gemma-core/src/main/java/ubic/gemma/model/analysis/expression/diff/DifferentialExpressionAnalysisResultSetValueObject.java @@ -46,6 +46,9 @@ public DifferentialExpressionAnalysisResultSetValueObject( ExpressionAnalysisRes if ( analysisResultSet.getBaselineGroup() != null ) { this.baselineGroup = new FactorValueBasicValueObject( analysisResultSet.getBaselineGroup() ); } + if ( analysisResultSet.getSecondBaselineGroup() != null ) { + this.secondBaselineGroup = new FactorValueBasicValueObject( analysisResultSet.getSecondBaselineGroup() ); + } } /** diff --git a/gemma-core/src/main/java/ubic/gemma/model/analysis/expression/diff/ExpressionAnalysisResultSet.java b/gemma-core/src/main/java/ubic/gemma/model/analysis/expression/diff/ExpressionAnalysisResultSet.java index 8f0227a35a..e41aea3acc 100644 --- a/gemma-core/src/main/java/ubic/gemma/model/analysis/expression/diff/ExpressionAnalysisResultSet.java +++ b/gemma-core/src/main/java/ubic/gemma/model/analysis/expression/diff/ExpressionAnalysisResultSet.java @@ -28,6 +28,7 @@ import ubic.gemma.model.expression.experiment.FactorValue; import ubic.gemma.model.genome.Gene; +import javax.annotation.Nullable; import javax.persistence.Transient; import java.util.HashSet; import java.util.Set; @@ -40,7 +41,10 @@ public class ExpressionAnalysisResultSet extends FactorAssociatedAnalysisResultS private static final long serialVersionUID = 7226901182513177574L; private Integer numberOfProbesTested; private Integer numberOfGenesTested; + @Nullable private FactorValue baselineGroup; + @Nullable + private FactorValue secondBaselineGroup; private Set results = new HashSet<>(); private DifferentialExpressionAnalysis analysis; private PvalueDistribution pvalueDistribution; @@ -91,18 +95,38 @@ public void setAnalysis( DifferentialExpressionAnalysis analysis ) { } /** - * @return The group considered baseline when computing scores and 'upRegulated'. This might be a control group if it could - * be recognized. For continuous factors, this would be null. For interaction terms we do not compute this so it - * will also be null. + * The group considered baseline when computing scores and 'upRegulated'. This might be a control group if it could + * be recognized. + *

+ * Corresponds to {@link ContrastResult#getFactorValue()}. + *

+ * For interactions, {@link #getSecondBaselineGroup()} will also be populated. + *

+ * For continuous factors, this would be {@code null}. */ + @Nullable public FactorValue getBaselineGroup() { return this.baselineGroup; } - public void setBaselineGroup( FactorValue baselineGroup ) { + public void setBaselineGroup( @Nullable FactorValue baselineGroup ) { this.baselineGroup = baselineGroup; } + /** + * If this result set is for an interaction of factors, this is the second baseline group. + *

+ * Corresponds to {@link ContrastResult#getSecondFactorValue()}. + */ + @Nullable + public FactorValue getSecondBaselineGroup() { + return this.secondBaselineGroup; + } + + public void setSecondBaselineGroup( @Nullable FactorValue secondBaselineGroup ) { + this.secondBaselineGroup = secondBaselineGroup; + } + public Set getHitListSizes() { return this.hitListSizes; } diff --git a/gemma-core/src/main/java/ubic/gemma/persistence/service/analysis/expression/diff/ExpressionAnalysisResultSetDaoImpl.java b/gemma-core/src/main/java/ubic/gemma/persistence/service/analysis/expression/diff/ExpressionAnalysisResultSetDaoImpl.java index 3112fe13a6..ec7e57d345 100644 --- a/gemma-core/src/main/java/ubic/gemma/persistence/service/analysis/expression/diff/ExpressionAnalysisResultSetDaoImpl.java +++ b/gemma-core/src/main/java/ubic/gemma/persistence/service/analysis/expression/diff/ExpressionAnalysisResultSetDaoImpl.java @@ -230,6 +230,15 @@ public void thaw( ExpressionAnalysisResultSet ears ) { Hibernate.initialize( ears.getAnalysis().getSubsetFactorValue() ); Hibernate.initialize( ears.getAnalysis().getSubsetFactorValue().getExperimentalFactor() ); } + + if ( ears.getBaselineGroup() != null ) { + Hibernate.initialize( ears.getBaselineGroup() ); + Hibernate.initialize( ears.getBaselineGroup().getExperimentalFactor() ); + } + if ( ears.getSecondBaselineGroup() != null ) { + Hibernate.initialize( ears.getSecondBaselineGroup() ); + Hibernate.initialize( ears.getSecondBaselineGroup().getExperimentalFactor() ); + } } @Override @@ -373,7 +382,7 @@ public Map> loadResultToGenesMap( ExpressionAnalysisResultSet r */ private void populateBaselines( List vos ) { Collection vosWithMissingBaselines = vos.stream() - .filter( vo -> vo.getBaselineGroup() == null ) + .filter( vo -> vo.getBaselineGroup() == null && vo.getSecondBaselineGroup() == null ) .collect( Collectors.toList() ); if ( vosWithMissingBaselines.isEmpty() ) { return; diff --git a/gemma-core/src/main/resources/sql/migrations/db.1.32.0.sql b/gemma-core/src/main/resources/sql/migrations/db.1.32.0.sql new file mode 100644 index 0000000000..f08a7b5abd --- /dev/null +++ b/gemma-core/src/main/resources/sql/migrations/db.1.32.0.sql @@ -0,0 +1,27 @@ +alter table ANALYSIS_RESULT_SET + add column SECOND_BASELINE_GROUP_FK BIGINT references FACTOR_VALUE (ID) after BASELINE_GROUP_FK; + +-- populate baselines for interaction terms +update ANALYSIS_RESULT_SET + join DIFFERENTIAL_EXPRESSION_ANALYSIS_RESULT + on ANALYSIS_RESULT_SET.ID = DIFFERENTIAL_EXPRESSION_ANALYSIS_RESULT.RESULT_SET_FK + join CONTRAST_RESULT + on DIFFERENTIAL_EXPRESSION_ANALYSIS_RESULT.ID = CONTRAST_RESULT.DIFFERENTIAL_EXPRESSION_ANALYSIS_RESULT_FK + + -- first baseline + join FACTOR_VALUE fv1 on CONTRAST_RESULT.FACTOR_VALUE_FK = fv1.ID + join ANALYSIS_RESULT_SET b1rs on b1rs.ANALYSIS_FK = ANALYSIS_RESULT_SET.ANALYSIS_FK + join FACTOR_VALUE b1g + on b1g.ID = b1rs.BASELINE_GROUP_FK and b1g.EXPERIMENTAL_FACTOR_FK = fv1.EXPERIMENTAL_FACTOR_FK + + -- second baseline + join FACTOR_VALUE fv2 on CONTRAST_RESULT.SECOND_FACTOR_VALUE_FK = fv2.ID + join ANALYSIS_RESULT_SET b2rs on b2rs.ANALYSIS_FK = ANALYSIS_RESULT_SET.ANALYSIS_FK + join FACTOR_VALUE b2g + on b2g.ID = b2rs.BASELINE_GROUP_FK and b2g.EXPERIMENTAL_FACTOR_FK = fv2.EXPERIMENTAL_FACTOR_FK + +set ANALYSIS_RESULT_SET.BASELINE_GROUP_FK = b1g.ID, + ANALYSIS_RESULT_SET.SECOND_BASELINE_GROUP_FK = b2g.ID + +where ANALYSIS_RESULT_SET.BASELINE_GROUP_FK is null + and ANALYSIS_RESULT_SET.SECOND_BASELINE_GROUP_FK is null; \ No newline at end of file diff --git a/gemma-core/src/main/resources/ubic/gemma/model/analysis/AnalysisResultSet.hbm.xml b/gemma-core/src/main/resources/ubic/gemma/model/analysis/AnalysisResultSet.hbm.xml index cdd9dd8494..14ad1bbe78 100644 --- a/gemma-core/src/main/resources/ubic/gemma/model/analysis/AnalysisResultSet.hbm.xml +++ b/gemma-core/src/main/resources/ubic/gemma/model/analysis/AnalysisResultSet.hbm.xml @@ -38,6 +38,10 @@ lazy="proxy" fetch="select"> + + +