extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/script/ScanBReport.java

Code
Comments
Other
Rev Date Author Line
6037 02 Nov 20 nicklas 1 package net.sf.basedb.reggie.script;
6037 02 Nov 20 nicklas 2
6037 02 Nov 20 nicklas 3 import java.io.IOException;
6037 02 Nov 20 nicklas 4 import java.util.ArrayList;
6037 02 Nov 20 nicklas 5 import java.util.Arrays;
6037 02 Nov 20 nicklas 6 import java.util.Collections;
6037 02 Nov 20 nicklas 7 import java.util.List;
6037 02 Nov 20 nicklas 8 import java.util.Map;
6037 02 Nov 20 nicklas 9
6037 02 Nov 20 nicklas 10 import net.sf.basedb.core.DbControl;
6075 23 Nov 20 nicklas 11 import net.sf.basedb.core.Extract;
6075 23 Nov 20 nicklas 12 import net.sf.basedb.core.Protocol;
6037 02 Nov 20 nicklas 13 import net.sf.basedb.reggie.Reggie;
6037 02 Nov 20 nicklas 14 import net.sf.basedb.reggie.XmlConfig;
6075 23 Nov 20 nicklas 15 import net.sf.basedb.reggie.dao.Annotationtype;
6037 02 Nov 20 nicklas 16 import net.sf.basedb.reggie.dao.Rawbioassay;
6075 23 Nov 20 nicklas 17 import net.sf.basedb.reggie.dao.Subtype;
6075 23 Nov 20 nicklas 18 import net.sf.basedb.reggie.ssp.SspModel;
6037 02 Nov 20 nicklas 19 import net.sf.basedb.util.Values;
6037 02 Nov 20 nicklas 20
6037 02 Nov 20 nicklas 21
6037 02 Nov 20 nicklas 22 /**
6075 23 Nov 20 nicklas 23   Helper class for running the 'ShowcaseReport' R script.
6037 02 Nov 20 nicklas 24
6037 02 Nov 20 nicklas 25   @author nicklas
6037 02 Nov 20 nicklas 26   @since 4.28
6037 02 Nov 20 nicklas 27 */
6037 02 Nov 20 nicklas 28 public class ScanBReport 
6037 02 Nov 20 nicklas 29   extends RScriptDefinition
6037 02 Nov 20 nicklas 30 {
6037 02 Nov 20 nicklas 31
6037 02 Nov 20 nicklas 32   private final List<String> genes;
6037 02 Nov 20 nicklas 33
6037 02 Nov 20 nicklas 34   private RFunction scanB;
6037 02 Nov 20 nicklas 35   
6037 02 Nov 20 nicklas 36   /**
6037 02 Nov 20 nicklas 37     Create a new GeneReport instance. It will be initialized with default
6037 02 Nov 20 nicklas 38     parameters. Path to R script must be in configuration file at
6037 02 Nov 20 nicklas 39     <cfg>/path. Directory with reference data can optionally be
6037 02 Nov 20 nicklas 40     specified by <cfg>/ref-dir-scanb and <cfg>/ref-dir-validation
6037 02 Nov 20 nicklas 41     or it will be assumed that it is found in the same directory 
6037 02 Nov 20 nicklas 42     as the R script.
6037 02 Nov 20 nicklas 43   */
6075 23 Nov 20 nicklas 44   public ScanBReport(String cfg, String parameterSet, String... genes)
6037 02 Nov 20 nicklas 45     throws IOException
6037 02 Nov 20 nicklas 46   {
6037 02 Nov 20 nicklas 47     this.genes = Collections.unmodifiableList(Arrays.asList(genes));
6037 02 Nov 20 nicklas 48     
6037 02 Nov 20 nicklas 49     XmlConfig config = Reggie.getConfig();
6037 02 Nov 20 nicklas 50     // Get and check path to script file
6037 02 Nov 20 nicklas 51     String script_path = config.getRequiredConfig(cfg+"/path", parameterSet);
6037 02 Nov 20 nicklas 52     Reggie.checkFile(script_path, false);
6037 02 Nov 20 nicklas 53     setScript(script_path);
6075 23 Nov 20 nicklas 54     String ref_dir = config.getConfig(cfg+"/ref-dir", parameterSet, getScriptDir() + "/referenceData");
6075 23 Nov 20 nicklas 55     String source_dir = config.getConfig(cfg+"/source-dir", parameterSet, getScriptDir() + "/source");
6037 02 Nov 20 nicklas 56
6037 02 Nov 20 nicklas 57     // Check that files and directories exists
6075 23 Nov 20 nicklas 58     Reggie.checkFile(ref_dir, true);
6075 23 Nov 20 nicklas 59     Reggie.checkFile(source_dir, true);
6037 02 Nov 20 nicklas 60     
6075 23 Nov 20 nicklas 61     scanB = addFunction("showcaseReport");
6037 02 Nov 20 nicklas 62     setDefaultGeneReportParameters(scanB);
6075 23 Nov 20 nicklas 63     scanB.setParameter("datadir", "'" + ref_dir + "'");
6075 23 Nov 20 nicklas 64     scanB.setParameter("sourcedir", "'" + source_dir + "'");
6037 02 Nov 20 nicklas 65   }
6037 02 Nov 20 nicklas 66
6037 02 Nov 20 nicklas 67   private void setDefaultGeneReportParameters(RFunction f)
6075 23 Nov 20 nicklas 68   {}
6037 02 Nov 20 nicklas 69   
6037 02 Nov 20 nicklas 70   /**
6037 02 Nov 20 nicklas 71     Get the list of genes to get a report for.
6037 02 Nov 20 nicklas 72   */
6037 02 Nov 20 nicklas 73   public List<String> getGenes()
6037 02 Nov 20 nicklas 74   {
6037 02 Nov 20 nicklas 75     return genes;
6037 02 Nov 20 nicklas 76   }
6037 02 Nov 20 nicklas 77   
6037 02 Nov 20 nicklas 78   /**
6037 02 Nov 20 nicklas 79     Run the gene report script for the given raw bioassay. It will calculate
6037 02 Nov 20 nicklas 80     the sum of fpkm for the specified genes and then submit those values to 
6037 02 Nov 20 nicklas 81     the R script.
6037 02 Nov 20 nicklas 82     @see Rawbioassay#getFpkmSum(DbControl, java.util.Collection)
6037 02 Nov 20 nicklas 83   */
6037 02 Nov 20 nicklas 84   public Result run(DbControl dc, Rawbioassay raw)
6037 02 Nov 20 nicklas 85   {
6037 02 Nov 20 nicklas 86         
6037 02 Nov 20 nicklas 87     // Calculate sum(fpkm) for given genes
6037 02 Nov 20 nicklas 88     Map<String, Float> sums = raw.getFpkmSum(dc, genes);
6037 02 Nov 20 nicklas 89     List<Float> v = new ArrayList<Float>();
6037 02 Nov 20 nicklas 90     for (String gene : genes)
6037 02 Nov 20 nicklas 91     {
6037 02 Nov 20 nicklas 92       Float s = sums.get(gene);
6037 02 Nov 20 nicklas 93       v.add(s == null ? 0 : s);
6037 02 Nov 20 nicklas 94     }
6076 24 Nov 20 nicklas 95     String values = Values.getString(v, ",", true);
6076 24 Nov 20 nicklas 96     scanB.setParameter("value", "c(" + values + ")");
6037 02 Nov 20 nicklas 97
6075 23 Nov 20 nicklas 98     Annotationtype ror = Annotationtype.sspResultAnnotation(SspModel.getModelByName("ROR asT0"));
6075 23 Nov 20 nicklas 99     String rorAsTo = ScriptDefinition.checkValidScriptParameter((String)ror.getAnnotationValue(dc, raw.getItem()));
6076 24 Nov 20 nicklas 100     scanB.setParameter("ROR", "'" + (rorAsTo == null ? "c005" : rorAsTo) + "'");
6075 23 Nov 20 nicklas 101
6076 24 Nov 20 nicklas 102     String protocolName = "unknown";
6075 23 Nov 20 nicklas 103     Extract lib = (Extract)raw.findSingleParent(dc, Subtype.LIBRARY);
6075 23 Nov 20 nicklas 104     if (lib != null)
6075 23 Nov 20 nicklas 105     {
6075 23 Nov 20 nicklas 106       Protocol libProtocol = lib.getProtocol();
6075 23 Nov 20 nicklas 107       if (libProtocol != null)
6075 23 Nov 20 nicklas 108       {
6076 24 Nov 20 nicklas 109         protocolName = ScriptDefinition.checkValidScriptParameter(libProtocol.getName());
6075 23 Nov 20 nicklas 110       }
6075 23 Nov 20 nicklas 111     }
6076 24 Nov 20 nicklas 112     scanB.setParameter("protocol", "'" + protocolName + "'");
6075 23 Nov 20 nicklas 113     
6037 02 Nov 20 nicklas 114     Result result = run(new Result(raw, genes));
6037 02 Nov 20 nicklas 115     return result;
6037 02 Nov 20 nicklas 116   }
6037 02 Nov 20 nicklas 117   
6037 02 Nov 20 nicklas 118   /**
6037 02 Nov 20 nicklas 119     The results keep track of the raw bioassay and genes that
6037 02 Nov 20 nicklas 120     was used.
6037 02 Nov 20 nicklas 121   */
6037 02 Nov 20 nicklas 122   public class Result
6037 02 Nov 20 nicklas 123     extends ScriptResult
6037 02 Nov 20 nicklas 124   {
6037 02 Nov 20 nicklas 125     public final Rawbioassay raw;
6037 02 Nov 20 nicklas 126     public final List<String> genes;
6037 02 Nov 20 nicklas 127     
6037 02 Nov 20 nicklas 128     /**
6037 02 Nov 20 nicklas 129       Creates a new result object for the given raw bioassay.
6037 02 Nov 20 nicklas 130     */
6037 02 Nov 20 nicklas 131     public Result(Rawbioassay raw, List<String> genes) 
6037 02 Nov 20 nicklas 132     {
6037 02 Nov 20 nicklas 133       super();
6037 02 Nov 20 nicklas 134       this.raw = raw;
6037 02 Nov 20 nicklas 135       this.genes = genes;
6037 02 Nov 20 nicklas 136     }
6075 23 Nov 20 nicklas 137
6037 02 Nov 20 nicklas 138   }
6037 02 Nov 20 nicklas 139 }