Skip to content

Commit 7118d00

Browse files
committed
added support for row normalization for two distinct datasets. (originally it was normalizing based only on dataset 1) - related to issue #116
1 parent f784248 commit 7118d00

File tree

4 files changed

+244
-62
lines changed

4 files changed

+244
-62
lines changed

EnrichmentMapPlugin/src/main/java/org/baderlab/csplugins/enrichmentmap/actions/EnrichmentMapActionListener.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,12 @@ private boolean initialize(CyNetwork network){
142142
if(map.getParams().isData() && map.getParams().getHmParams() == null){
143143
//create a heatmap parameters instance for this action listener
144144
HeatMapParameters hmParams = new HeatMapParameters(edgeOverlapPanel, nodeOverlapPanel);
145-
hmParams.initColorGradients(this.map.getDataset(EnrichmentMap.DATASET1).getExpressionSets());
145+
//If there are two distinct datasets intialize the theme and range for the heatmap coloring separately.
146+
if(map.getParams().isData2() && map.getDataset(EnrichmentMap.DATASET2).getExpressionSets() != null
147+
&& !map.getDataset(EnrichmentMap.DATASET1).getExpressionSets().getFilename().equalsIgnoreCase(map.getDataset(EnrichmentMap.DATASET2).getExpressionSets().getFilename()))
148+
hmParams.initColorGradients(this.map.getDataset(EnrichmentMap.DATASET1).getExpressionSets(),this.map.getDataset(EnrichmentMap.DATASET2).getExpressionSets());
149+
else
150+
hmParams.initColorGradients(this.map.getDataset(EnrichmentMap.DATASET1).getExpressionSets());
146151
//associate the newly created heatmap parameters with the current enrichment map paramters
147152
this.map.getParams().setHmParams(hmParams);
148153
}

EnrichmentMapPlugin/src/main/java/org/baderlab/csplugins/enrichmentmap/heatmap/HeatMapActionListener.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,8 +256,14 @@ else if(hmParams.getSort() == HeatMapParameters.Sort.RANK)
256256
hmParams.flipAscending(hmParams.getSortIndex());
257257
}
258258
}
259-
260-
hmParams.ResetColorGradient();
259+
260+
261+
hmParams.ResetColorGradient_ds1();
262+
263+
if(params.isData2() && map.getDataset(EnrichmentMap.DATASET2).getExpressionSets() != null
264+
&& !map.getDataset(EnrichmentMap.DATASET1).getExpressionSets().getFilename().equalsIgnoreCase(map.getDataset(EnrichmentMap.DATASET2).getExpressionSets().getFilename()))
265+
hmParams.ResetColorGradient_ds2();
266+
261267
edgeOverlapPanel.updatePanel();
262268
nodeOverlapPanel.updatePanel();
263269

EnrichmentMapPlugin/src/main/java/org/baderlab/csplugins/enrichmentmap/heatmap/HeatMapParameters.java

Lines changed: 194 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@
5959
*/
6060
public class HeatMapParameters {
6161

62-
private org.mskcc.colorgradient.ColorGradientRange range;
63-
private org.mskcc.colorgradient.ColorGradientTheme theme;
62+
private org.mskcc.colorgradient.ColorGradientRange range_ds1;
63+
private org.mskcc.colorgradient.ColorGradientTheme theme_ds1;
6464

6565

6666
//data transformation options (row normalized, as if or log transformed)
@@ -94,12 +94,23 @@ public static enum Sort{
9494
//switch to turn off the coloring of the heatmap
9595
private boolean showValues = false;
9696

97-
//minimum and maximum expression values used to create colour mapper
98-
private double minExpression;
99-
private double maxExpression;
100-
private double closestToZeroExpression;
101-
private double minExpression_rownorm;
102-
private double maxExpression_rownorm;
97+
//minimum and maximum expression values used to create colour mapper - dataset 1
98+
//defaults to dataset1 if there is only one dataset
99+
private double minExpression_ds1;
100+
private double maxExpression_ds1;
101+
private double closestToZeroExpression_ds1;
102+
private double minExpression_rownorm_ds1;
103+
private double maxExpression_rownorm_ds1;
104+
105+
//minimum and maximum expression values used to create colour mapper - dataset 2
106+
private org.mskcc.colorgradient.ColorGradientRange range_ds2;
107+
private org.mskcc.colorgradient.ColorGradientTheme theme_ds2;
108+
private double minExpression_ds2;
109+
private double maxExpression_ds2;
110+
private double closestToZeroExpression_ds2;
111+
private double minExpression_rownorm_ds2;
112+
private double maxExpression_rownorm_ds2;
113+
103114

104115
//pointer to panels containing the heatmaps.
105116
private HeatMapPanel edgeOverlapPanel;
@@ -139,40 +150,91 @@ public HeatMapParameters(HeatMapPanel edgeOverlapPanel, HeatMapPanel nodeOverlap
139150
*/
140151
public void initColorGradients(GeneExpressionMatrix expression){
141152

142-
minExpression = expression.getMinExpression();
143-
maxExpression = expression.getMaxExpression();
144-
closestToZeroExpression = expression.getClosesttoZero();
145-
minExpression_rownorm = expression.getMinExpression(expression.getExpressionMatrix_rowNormalized());
146-
maxExpression_rownorm = expression.getMaxExpression(expression.getExpressionMatrix_rowNormalized());
153+
minExpression_ds1 = expression.getMinExpression();
154+
maxExpression_ds1 = expression.getMaxExpression();
155+
closestToZeroExpression_ds1 = expression.getClosesttoZero();
156+
minExpression_rownorm_ds1 = expression.getMinExpression(expression.getExpressionMatrix_rowNormalized());
157+
maxExpression_rownorm_ds1 = expression.getMaxExpression(expression.getExpressionMatrix_rowNormalized());
147158

148-
double max = Math.max(Math.abs(minExpression), maxExpression);
159+
double max = Math.max(Math.abs(minExpression_ds1), maxExpression_ds1);
149160

150161
double median = 0;
151162

152163
//if the minimum expression is above zero make it a one colour heatmap
153-
if(minExpression >= 0){
154-
range = ColorGradientRange.getInstance(0,max/2, max/2,max, 0,max/2,max/2,max);
155-
theme = ColorGradientTheme.GREEN_ONECOLOR_GRADIENT_THEME;
164+
if(minExpression_ds1 >= 0){
165+
range_ds1 = ColorGradientRange.getInstance(0,max/2, max/2,max, 0,max/2,max/2,max);
166+
theme_ds1 = ColorGradientTheme.GREEN_ONECOLOR_GRADIENT_THEME;
156167
}
157168
else{
158-
range = ColorGradientRange.getInstance(-max,median, median,max, -max,median,median,max);
159-
theme = ColorGradientTheme.GREEN_MAGENTA_GRADIENT_THEME;
169+
range_ds1 = ColorGradientRange.getInstance(-max,median, median,max, -max,median,median,max);
170+
theme_ds1 = ColorGradientTheme.GREEN_MAGENTA_GRADIENT_THEME;
171+
}
172+
173+
}
174+
/**
175+
* Initialize the the color gradients based on the expression matrix for both datasets
176+
* associated with this set of heatmap panels (ie. both node and edge heatmap panels)
177+
*
178+
* @param expression - expression matrix used for this heatmap set
179+
*/
180+
public void initColorGradients(GeneExpressionMatrix expression_ds1,GeneExpressionMatrix expression_ds2){
181+
182+
minExpression_ds1 = expression_ds1.getMinExpression();
183+
maxExpression_ds1 = expression_ds1.getMaxExpression();
184+
closestToZeroExpression_ds1 = expression_ds1.getClosesttoZero();
185+
minExpression_rownorm_ds1 = expression_ds1.getMinExpression(expression_ds1.getExpressionMatrix_rowNormalized());
186+
maxExpression_rownorm_ds1 = expression_ds1.getMaxExpression(expression_ds1.getExpressionMatrix_rowNormalized());
187+
188+
double max = Math.max(Math.abs(minExpression_ds1), maxExpression_ds1);
189+
190+
double median = 0;
191+
192+
//if the minimum expression is above zero make it a one colour heatmap
193+
if(minExpression_ds1 >= 0){
194+
range_ds1 = ColorGradientRange.getInstance(0,max/2, max/2,max, 0,max/2,max/2,max);
195+
theme_ds1 = ColorGradientTheme.GREEN_ONECOLOR_GRADIENT_THEME;
196+
}
197+
else{
198+
range_ds1 = ColorGradientRange.getInstance(-max,median, median,max, -max,median,median,max);
199+
theme_ds1 = ColorGradientTheme.GREEN_MAGENTA_GRADIENT_THEME;
200+
}
201+
202+
203+
//Do the same for dataset 2
204+
minExpression_ds2 = expression_ds2.getMinExpression();
205+
maxExpression_ds2 = expression_ds2.getMaxExpression();
206+
closestToZeroExpression_ds2 = expression_ds2.getClosesttoZero();
207+
minExpression_rownorm_ds2 = expression_ds2.getMinExpression(expression_ds2.getExpressionMatrix_rowNormalized());
208+
maxExpression_rownorm_ds2 = expression_ds2.getMaxExpression(expression_ds2.getExpressionMatrix_rowNormalized());
209+
210+
max = Math.max(Math.abs(minExpression_ds2), maxExpression_ds2);
211+
212+
median = 0;
213+
214+
//if the minimum expression is above zero make it a one colour heatmap
215+
if(minExpression_ds2 >= 0){
216+
range_ds2 = ColorGradientRange.getInstance(0,max/2, max/2,max, 0,max/2,max/2,max);
217+
theme_ds2 = ColorGradientTheme.GREEN_ONECOLOR_GRADIENT_THEME;
218+
}
219+
else{
220+
range_ds2 = ColorGradientRange.getInstance(-max,median, median,max, -max,median,median,max);
221+
theme_ds2 = ColorGradientTheme.GREEN_MAGENTA_GRADIENT_THEME;
160222
}
161223

162224
}
163225

164226
/**
165227
* Reset color gradients based on a change in the data transformation.
166228
*/
167-
public void ResetColorGradient(){
229+
public void ResetColorGradient_ds1(){
168230
double min;
169231
double max;
170232
double median;
171233

172234
switch(transformation){
173235
case ROWNORM:
174-
min = minExpression_rownorm;
175-
max = maxExpression_rownorm;
236+
min = minExpression_rownorm_ds1;
237+
max = maxExpression_rownorm_ds1;
176238

177239
//if both row normalization values are zero, can't perform row normalization
178240
//issue warning
@@ -188,52 +250,122 @@ public void ResetColorGradient(){
188250
//can't take a log of a negative number
189251
//if both the max and min are negative then log tranform won't work.
190252
//issue a warning.
191-
if((minExpression <= 0) && (maxExpression <= 0) ){
253+
if((minExpression_ds1 <= 0) && (maxExpression_ds1 <= 0) ){
192254
//both the max and min are probably negative values
193255
//JOptionPane.showMessageDialog(Cytoscape.getDesktop(),"Both the max and min expression are negative, log of negative numbers is not valid", "log normalization error", JOptionPane.WARNING_MESSAGE);
194256
min = 0;
195257
max = 0;
196258
}
197259
//if min expression is negative then use the max expression as the max
198-
else if(minExpression <= 0){
199-
min = Math.min(Math.log(closestToZeroExpression), Math.log1p(maxExpression));
200-
max = Math.max(Math.log(closestToZeroExpression), Math.log1p(maxExpression));
260+
else if(minExpression_ds1 <= 0){
261+
min = Math.min(Math.log(closestToZeroExpression_ds1), Math.log1p(maxExpression_ds1));
262+
max = Math.max(Math.log(closestToZeroExpression_ds1), Math.log1p(maxExpression_ds1));
201263
}
202264
//if the max expression is negative then use the min expression as the max (should never happen!)
203-
else if(maxExpression <= 0){
265+
else if(maxExpression_ds1 <= 0){
204266
min = 0;
205-
max = Math.log1p(minExpression);
267+
max = Math.log1p(minExpression_ds1);
206268
}
207269
else{
208-
min = Math.log1p(minExpression);
209-
max = Math.log1p(maxExpression) ;
270+
min = Math.log1p(minExpression_ds1);
271+
max = Math.log1p(maxExpression_ds1) ;
210272
max = Math.max(Math.abs(min),max);
211273
}
212274

213275
break;
214276

215277
case ASIS:
216278
default:
217-
min = minExpression;
218-
max = Math.max(Math.abs(minExpression), maxExpression);
279+
min = minExpression_ds1;
280+
max = Math.max(Math.abs(minExpression_ds1), maxExpression_ds1);
219281
break;
220282
}
221283

222284
median = max/2;
223285
if(min >= 0){
224286
median = max/2;
225-
range = ColorGradientRange.getInstance(0,median, median,max, 0,median,median,max);
226-
theme = ColorGradientTheme.GREEN_ONECOLOR_GRADIENT_THEME;
287+
range_ds1 = ColorGradientRange.getInstance(0,median, median,max, 0,median,median,max);
288+
theme_ds1 = ColorGradientTheme.GREEN_ONECOLOR_GRADIENT_THEME;
227289
}
228290
else{
229291
median = 0;
230-
range = ColorGradientRange.getInstance(-max,0, 0,max, -max,0,0,max);
231-
theme = ColorGradientTheme.GREEN_MAGENTA_GRADIENT_THEME;
292+
range_ds1 = ColorGradientRange.getInstance(-max,0, 0,max, -max,0,0,max);
293+
theme_ds1 = ColorGradientTheme.GREEN_MAGENTA_GRADIENT_THEME;
232294
}
233295

234296
}
235297

236-
298+
/**
299+
* Reset color gradients based on a change in the data transformation.
300+
*/
301+
public void ResetColorGradient_ds2(){
302+
double min;
303+
double max;
304+
double median;
305+
306+
switch(transformation){
307+
case ROWNORM:
308+
min = minExpression_rownorm_ds2;
309+
max = maxExpression_rownorm_ds2;
310+
311+
//if both row normalization values are zero, can't perform row normalization
312+
//issue warning
313+
//This happens when there is only one data column in the dataset (or if it is rank file)
314+
if((min == 0) && (max == 0)){
315+
//JOptionPane.showMessageDialog(Cytoscape.getDesktop(),"Row normalization does not work with only one data column per dataset.","Row normalization error",JOptionPane.WARNING_MESSAGE);
316+
}
317+
max = Math.max(Math.abs(min),max);
318+
break;
319+
320+
case LOGTRANSFORM:
321+
322+
//can't take a log of a negative number
323+
//if both the max and min are negative then log tranform won't work.
324+
//issue a warning.
325+
if((minExpression_ds2 <= 0) && (maxExpression_ds2 <= 0) ){
326+
//both the max and min are probably negative values
327+
//JOptionPane.showMessageDialog(Cytoscape.getDesktop(),"Both the max and min expression are negative, log of negative numbers is not valid", "log normalization error", JOptionPane.WARNING_MESSAGE);
328+
min = 0;
329+
max = 0;
330+
}
331+
//if min expression is negative then use the max expression as the max
332+
else if(minExpression_ds2 <= 0){
333+
min = Math.min(Math.log(closestToZeroExpression_ds2), Math.log1p(maxExpression_ds2));
334+
max = Math.max(Math.log(closestToZeroExpression_ds2), Math.log1p(maxExpression_ds2));
335+
}
336+
//if the max expression is negative then use the min expression as the max (should never happen!)
337+
else if(maxExpression_ds2 <= 0){
338+
min = 0;
339+
max = Math.log1p(minExpression_ds2);
340+
}
341+
else{
342+
min = Math.log1p(minExpression_ds2);
343+
max = Math.log1p(maxExpression_ds2) ;
344+
max = Math.max(Math.abs(min),max);
345+
}
346+
347+
break;
348+
349+
case ASIS:
350+
default:
351+
min = minExpression_ds2;
352+
max = Math.max(Math.abs(minExpression_ds2), maxExpression_ds2);
353+
break;
354+
}
355+
356+
median = max/2;
357+
if(min >= 0){
358+
median = max/2;
359+
range_ds2 = ColorGradientRange.getInstance(0,median, median,max, 0,median,median,max);
360+
theme_ds2 = ColorGradientTheme.GREEN_ONECOLOR_GRADIENT_THEME;
361+
}
362+
else{
363+
median = 0;
364+
range_ds2 = ColorGradientRange.getInstance(-max,0, 0,max, -max,0,0,max);
365+
theme_ds2 = ColorGradientTheme.GREEN_MAGENTA_GRADIENT_THEME;
366+
}
367+
368+
}
237369

238370

239371

@@ -257,22 +389,39 @@ public HeatMapPanel getNodeOverlapPanel(){
257389
return nodeOverlapPanel;
258390
}
259391

260-
public ColorGradientRange getRange() {
261-
return range;
392+
public ColorGradientRange getRange_ds1() {
393+
return range_ds1;
394+
}
395+
396+
public void setRange_ds1(ColorGradientRange range) {
397+
this.range_ds1 = range;
398+
}
399+
400+
public ColorGradientTheme getTheme_ds1() {
401+
return theme_ds1;
262402
}
263403

264-
public void setRange(ColorGradientRange range) {
265-
this.range = range;
404+
public void setTheme_ds1(ColorGradientTheme theme) {
405+
this.theme_ds1 = theme;
266406
}
267407

268-
public ColorGradientTheme getTheme() {
269-
return theme;
408+
public ColorGradientRange getRange_ds2() {
409+
return range_ds2;
270410
}
271411

272-
public void setTheme(ColorGradientTheme theme) {
273-
this.theme = theme;
412+
public void setRange_ds2(ColorGradientRange range) {
413+
this.range_ds2 = range;
274414
}
275415

416+
public ColorGradientTheme getTheme_ds2() {
417+
return theme_ds2;
418+
}
419+
420+
public void setTheme_ds2(ColorGradientTheme theme) {
421+
this.theme_ds2 = theme;
422+
}
423+
424+
276425
public Transformation getTransformation() {
277426
return transformation;
278427
}

0 commit comments

Comments
 (0)