extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/grid/MethylationBetaJobCreator.java

Code
Comments
Other
Rev Date Author Line
6870 16 Nov 22 nicklas 1 package net.sf.basedb.reggie.grid;
6870 16 Nov 22 nicklas 2
6870 16 Nov 22 nicklas 3 import java.util.ArrayList;
6870 16 Nov 22 nicklas 4 import java.util.List;
6870 16 Nov 22 nicklas 5
6870 16 Nov 22 nicklas 6 import net.sf.basedb.core.AnyToAny;
6870 16 Nov 22 nicklas 7 import net.sf.basedb.core.DataFileType;
6870 16 Nov 22 nicklas 8 import net.sf.basedb.core.DbControl;
6870 16 Nov 22 nicklas 9 import net.sf.basedb.core.DerivedBioAssay;
6870 16 Nov 22 nicklas 10 import net.sf.basedb.core.Directory;
6870 16 Nov 22 nicklas 11 import net.sf.basedb.core.File;
6870 16 Nov 22 nicklas 12 import net.sf.basedb.core.FileServer;
6870 16 Nov 22 nicklas 13 import net.sf.basedb.core.FileSetMember;
6870 16 Nov 22 nicklas 14 import net.sf.basedb.core.ItemList;
6870 16 Nov 22 nicklas 15 import net.sf.basedb.core.ItemNotFoundException;
6870 16 Nov 22 nicklas 16 import net.sf.basedb.core.ItemSubtype;
6870 16 Nov 22 nicklas 17 import net.sf.basedb.core.Job;
6870 16 Nov 22 nicklas 18 import net.sf.basedb.core.Path;
6870 16 Nov 22 nicklas 19 import net.sf.basedb.core.Sample;
6870 16 Nov 22 nicklas 20 import net.sf.basedb.core.SessionControl;
6870 16 Nov 22 nicklas 21 import net.sf.basedb.core.Software;
6981 17 Jan 23 nicklas 22 import net.sf.basedb.core.StringParameterType;
6870 16 Nov 22 nicklas 23 import net.sf.basedb.opengrid.JobDefinition;
6870 16 Nov 22 nicklas 24 import net.sf.basedb.opengrid.JobStatus;
6870 16 Nov 22 nicklas 25 import net.sf.basedb.opengrid.OpenGridCluster;
6870 16 Nov 22 nicklas 26 import net.sf.basedb.opengrid.OpenGridSession;
6870 16 Nov 22 nicklas 27 import net.sf.basedb.opengrid.ScriptBuilder;
6870 16 Nov 22 nicklas 28 import net.sf.basedb.opengrid.config.ClusterConfig;
6870 16 Nov 22 nicklas 29 import net.sf.basedb.opengrid.config.JobConfig;
6870 16 Nov 22 nicklas 30 import net.sf.basedb.opengrid.service.JobCompletionHandler;
6870 16 Nov 22 nicklas 31 import net.sf.basedb.reggie.Reggie;
6870 16 Nov 22 nicklas 32 import net.sf.basedb.reggie.XmlConfig;
6870 16 Nov 22 nicklas 33 import net.sf.basedb.reggie.dao.Annotationtype;
6870 16 Nov 22 nicklas 34 import net.sf.basedb.reggie.dao.BeadChip;
6870 16 Nov 22 nicklas 35 import net.sf.basedb.reggie.dao.BiomaterialList;
6870 16 Nov 22 nicklas 36 import net.sf.basedb.reggie.dao.Datafiletype;
6870 16 Nov 22 nicklas 37 import net.sf.basedb.reggie.dao.Dna;
6870 16 Nov 22 nicklas 38 import net.sf.basedb.reggie.dao.Fileserver;
6870 16 Nov 22 nicklas 39 import net.sf.basedb.reggie.dao.MergedSequences;
6870 16 Nov 22 nicklas 40 import net.sf.basedb.reggie.dao.Methylation;
6870 16 Nov 22 nicklas 41 import net.sf.basedb.reggie.dao.Scan;
6870 16 Nov 22 nicklas 42 import net.sf.basedb.reggie.dao.Subtype;
6870 16 Nov 22 nicklas 43 import net.sf.basedb.util.Values;
6870 16 Nov 22 nicklas 44
6870 16 Nov 22 nicklas 45 /**
6870 16 Nov 22 nicklas 46   Helper class for creating items needed for generating Mathylation beta analysis 
6870 16 Nov 22 nicklas 47   script and send it to the cluster for execution.
6870 16 Nov 22 nicklas 48   
6870 16 Nov 22 nicklas 49   @author nicklas
6870 16 Nov 22 nicklas 50   @since 4.41
6870 16 Nov 22 nicklas 51 */
6870 16 Nov 22 nicklas 52 public class MethylationBetaJobCreator 
6870 16 Nov 22 nicklas 53   extends AbstractJobCreator
6870 16 Nov 22 nicklas 54 {
6870 16 Nov 22 nicklas 55
6870 16 Nov 22 nicklas 56   private Software software;
6870 16 Nov 22 nicklas 57   
6870 16 Nov 22 nicklas 58   public MethylationBetaJobCreator()
6870 16 Nov 22 nicklas 59   {}
6870 16 Nov 22 nicklas 60
6870 16 Nov 22 nicklas 61   /**
6870 16 Nov 22 nicklas 62     Set the software item.
6870 16 Nov 22 nicklas 63   */
6870 16 Nov 22 nicklas 64   public void setSoftware(Software software)
6870 16 Nov 22 nicklas 65   {
6870 16 Nov 22 nicklas 66     this.software = software;
6870 16 Nov 22 nicklas 67   }
6870 16 Nov 22 nicklas 68
6870 16 Nov 22 nicklas 69   /**
6870 16 Nov 22 nicklas 70     Schedule jobs on the given cluster for running beta-analysis.
6870 16 Nov 22 nicklas 71     @return A list with the corresponding jobs in BASE
6870 16 Nov 22 nicklas 72   */
6870 16 Nov 22 nicklas 73   public List<JobDefinition> createBetaJobs(DbControl dc, OpenGridCluster cluster, List<Methylation> items)
6870 16 Nov 22 nicklas 74   {
6870 16 Nov 22 nicklas 75     SessionControl sc = dc.getSessionControl();
6870 16 Nov 22 nicklas 76     
6870 16 Nov 22 nicklas 77     ClusterConfig clusterCfg = cluster.getConfig();
6870 16 Nov 22 nicklas 78     XmlConfig cfg = Reggie.getConfig(cluster.getId());
6870 16 Nov 22 nicklas 79     if (cfg == null)
6870 16 Nov 22 nicklas 80     {
6870 16 Nov 22 nicklas 81       throw new ItemNotFoundException("No configuration in reggie-config.xml for cluster: " + cluster.getId());
6870 16 Nov 22 nicklas 82     }
6870 16 Nov 22 nicklas 83     String parameterSet = (String)Annotationtype.PARAMETER_SET.getAnnotationValue(dc, software);
6870 16 Nov 22 nicklas 84
6870 16 Nov 22 nicklas 85     // Get global options
6870 16 Nov 22 nicklas 86     String global_env = ScriptUtil.multilineIndent(cfg.getConfig("global-env"));
6870 16 Nov 22 nicklas 87     String projectArchive = cfg.getRequiredConfig("project-archive", null);
6870 16 Nov 22 nicklas 88     String externalArchive = cfg.getConfig("external-archive", null, projectArchive);
6870 16 Nov 22 nicklas 89
7372 06 Oct 23 nicklas 90     String beta_submit = cfg.getConfig("methylation-beta/submit", parameterSet, null);
7372 06 Oct 23 nicklas 91     String beta_submit_debug = cfg.getConfig("methylation-beta/submit-debug", parameterSet, null);
6870 16 Nov 22 nicklas 92     String beta_env = ScriptUtil.multilineIndent(cfg.getRequiredConfig("methylation-beta/env", parameterSet));
6870 16 Nov 22 nicklas 93     String beta_envdebug = ScriptUtil.multilineIndent(cfg.getConfig("methylation-beta/env-debug", parameterSet, null));
6870 16 Nov 22 nicklas 94     String beta_execute = ScriptUtil.multilineIndent(cfg.getConfig("methylation-beta/execute", parameterSet, "./methylation-beta.sh"));
6870 16 Nov 22 nicklas 95
6870 16 Nov 22 nicklas 96     // Selected items must be removed from this list
6870 16 Nov 22 nicklas 97     ItemList methylationPipeline = BiomaterialList.METHYLATION_PIPELINE.load(dc);
6870 16 Nov 22 nicklas 98
6870 16 Nov 22 nicklas 99     // Options common for all jobs
6870 16 Nov 22 nicklas 100     JobConfig jobConfig = new JobConfig();
6870 16 Nov 22 nicklas 101     if (priority != null) jobConfig.setPriority(priority);
7372 06 Oct 23 nicklas 102     if (partition != null) jobConfig.setSbatchOption("partition", ScriptUtil.checkValidScriptParameter(partition));
7372 06 Oct 23 nicklas 103     jobConfig.convertOptionsTo(clusterCfg.getType());
7372 06 Oct 23 nicklas 104     if (submitOptionsOverride != null)
7372 06 Oct 23 nicklas 105     {
7372 06 Oct 23 nicklas 106       ScriptUtil.addSubmitOptions(jobConfig, submitOptionsOverride, clusterCfg.getType());
7372 06 Oct 23 nicklas 107     }
7372 06 Oct 23 nicklas 108     else
7372 06 Oct 23 nicklas 109     {
7372 06 Oct 23 nicklas 110       ScriptUtil.addSubmitOptions(jobConfig, beta_submit, clusterCfg.getType());
7372 06 Oct 23 nicklas 111       if (debug) ScriptUtil.addSubmitOptions(jobConfig, beta_submit_debug, clusterCfg.getType());
7372 06 Oct 23 nicklas 112     }
6884 24 Nov 22 nicklas 113     jobConfig.getBatchConfig().setDelayInterval(5);
6870 16 Nov 22 nicklas 114     
6870 16 Nov 22 nicklas 115     // We submit one job for each raw bioassay to the cluster
6870 16 Nov 22 nicklas 116     List<JobDefinition> jobDefs = new ArrayList<JobDefinition>(items.size());
6870 16 Nov 22 nicklas 117
6870 16 Nov 22 nicklas 118     for (Methylation m : items)
6870 16 Nov 22 nicklas 119     {
6870 16 Nov 22 nicklas 120       m = Methylation.getById(dc, m.getId()); // Ensure item is loaded in this transaction
6870 16 Nov 22 nicklas 121
6870 16 Nov 22 nicklas 122       // Get some information about the aligned data that we need
6870 16 Nov 22 nicklas 123       DerivedBioAssay meth = m.getDerivedBioAssay();
6870 16 Nov 22 nicklas 124       methylationPipeline.removeItem(meth);
6870 16 Nov 22 nicklas 125       
6870 16 Nov 22 nicklas 126       Dna dna = m.getDnaAliquot(dc);
6870 16 Nov 22 nicklas 127       Scan scan = m.getScan(dc);
6870 16 Nov 22 nicklas 128       BeadChip chip = m.getBeadChip(dc);
6870 16 Nov 22 nicklas 129       Sample specimen =  (Sample)dna.findSingleParent(dc, Subtype.SPECIMEN);
6870 16 Nov 22 nicklas 130       
6871 16 Nov 22 nicklas 131       String methylationName = ScriptUtil.checkValidScriptParameter(meth.getName());
6871 16 Nov 22 nicklas 132       boolean isExternal = Reggie.isExternalItem(methylationName);
6870 16 Nov 22 nicklas 133       String archiveFolder = isExternal ? externalArchive : projectArchive;
6870 16 Nov 22 nicklas 134       String rootName = isExternal ? dna.getTopExtractOrSample(dc).getName() : null;
6870 16 Nov 22 nicklas 135
6871 16 Nov 22 nicklas 136       String idatFolder = ScriptUtil.checkValidPath(MergedSequences.generateDataFilesFolderForProjectArchive(methylationName, rootName, debug), true, true);
6870 16 Nov 22 nicklas 137       Annotationtype.DATA_FILES_FOLDER.setAnnotationValue(dc, meth, idatFolder);
6870 16 Nov 22 nicklas 138       
6870 16 Nov 22 nicklas 139       String scanFolder = (String)Annotationtype.DATA_FILES_FOLDER.getAnnotationValue(dc, scan.getItem());
6870 16 Nov 22 nicklas 140       String beadChipId = (String)Annotationtype.BEADCHIP_ID.getAnnotationValue(dc, chip.getItem());
6870 16 Nov 22 nicklas 141       String beadChipPosition = (String)Annotationtype.BEADCHIP_POSITION.getAnnotationValue(dc, dna.getItem());
6870 16 Nov 22 nicklas 142       ScriptUtil.checkValidPath(scanFolder, true, true);
6870 16 Nov 22 nicklas 143       ScriptUtil.checkValidScriptParameter(beadChipId);
6870 16 Nov 22 nicklas 144       ScriptUtil.checkValidScriptParameter(beadChipPosition);
6870 16 Nov 22 nicklas 145       
6871 16 Nov 22 nicklas 146       String externalMethylationName = methylationName;
6870 16 Nov 22 nicklas 147       if (specimen != null && specimen.getExternalId() != null)
6870 16 Nov 22 nicklas 148       {
6870 16 Nov 22 nicklas 149         // Replace SCANB-ID with Sample.externalId
6870 16 Nov 22 nicklas 150         externalMethylationName = externalMethylationName.replace(specimen.getName(), specimen.getExternalId());
6870 16 Nov 22 nicklas 151       }
6870 16 Nov 22 nicklas 152       
6870 16 Nov 22 nicklas 153       // Create job 
6870 16 Nov 22 nicklas 154       Job betaJob = Job.getNew(dc, null, null, null);
6870 16 Nov 22 nicklas 155       betaJob.setItemSubtype(Subtype.METHYLATION_BETA_JOB.get(dc));
6870 16 Nov 22 nicklas 156       betaJob.setPluginVersion("reggie-"+Reggie.VERSION);
6870 16 Nov 22 nicklas 157       betaJob.setSendMessage(Values.getBoolean(sc.getUserClientSetting("plugins.sendmessage"), false));
6871 16 Nov 22 nicklas 158       betaJob.setName("Calculate beta values for " + methylationName);
6870 16 Nov 22 nicklas 159
6870 16 Nov 22 nicklas 160       if (debug) betaJob.setName(betaJob.getName() + " (debug)");
6981 17 Jan 23 nicklas 161       if (partition != null) betaJob.setParameterValue("partition", new StringParameterType(), partition);
7372 06 Oct 23 nicklas 162       if (submitOptionsOverride != null) betaJob.setParameterValue("jobOptions", new StringParameterType(), submitOptionsOverride);
6870 16 Nov 22 nicklas 163       // Register a handler for auto-confirmation (BetaAutoConfirmer)
6881 22 Nov 22 nicklas 164       dc.saveItem(betaJob);
6881 22 Nov 22 nicklas 165       meth.setJob(betaJob);
6881 22 Nov 22 nicklas 166       meth.setSoftware(software);
6870 16 Nov 22 nicklas 167       if (autoConfirm)
6870 16 Nov 22 nicklas 168       {
6881 22 Nov 22 nicklas 169         Annotationtype.AUTO_PROCESSING.setAnnotationValue(dc, meth, "AutoConfirm");
6870 16 Nov 22 nicklas 170       }
6870 16 Nov 22 nicklas 171       
6870 16 Nov 22 nicklas 172       ScriptBuilder script = new ScriptBuilder();
6870 16 Nov 22 nicklas 173       script.cmd(debug ? "set -ex" : "set -e");
6870 16 Nov 22 nicklas 174       // Set file permissions based on consent or external group!
6871 16 Nov 22 nicklas 175       String externalGroup = isExternal ? Reggie.getExternalGroup(methylationName) : null;
6870 16 Nov 22 nicklas 176       ScriptUtil.setUmaskForItem(dc, dna, externalGroup, script);
6870 16 Nov 22 nicklas 177       script.newLine();
6870 16 Nov 22 nicklas 178       script.cmd(global_env);
6870 16 Nov 22 nicklas 179       script.export("ArchiveFolder", archiveFolder);
6870 16 Nov 22 nicklas 180       script.export("IdatFolder", "${ArchiveFolder}"+idatFolder);
6870 16 Nov 22 nicklas 181       script.export("BeadChipId", beadChipId);
6870 16 Nov 22 nicklas 182       script.export("BeadChipPosition", beadChipPosition);
6871 16 Nov 22 nicklas 183       script.export("MethylationName", methylationName);
6870 16 Nov 22 nicklas 184       script.export("ExternalMethylationName", externalMethylationName);
6870 16 Nov 22 nicklas 185       script.newLine();
6870 16 Nov 22 nicklas 186       script.cmd(beta_env);
6870 16 Nov 22 nicklas 187       if (debug) script.cmd(beta_envdebug);
6870 16 Nov 22 nicklas 188       script.export("ScanFolder", "${MethylationArchive}"+scanFolder);
6870 16 Nov 22 nicklas 189       script.newLine();
6870 16 Nov 22 nicklas 190       script.cmd(beta_execute);
6870 16 Nov 22 nicklas 191       if (externalGroup != null)
6870 16 Nov 22 nicklas 192       {
6871 16 Nov 22 nicklas 193         ScriptUtil.addChgrp(externalGroup, "${IdatFolder}", methylationName, null, script);
6870 16 Nov 22 nicklas 194       }
6870 16 Nov 22 nicklas 195
6871 16 Nov 22 nicklas 196       JobDefinition jobDef = new JobDefinition("BetaAnalysis", jobConfig, batchConfig, betaJob);
6871 16 Nov 22 nicklas 197       jobDef.addFile(ScriptUtil.upload("methylation-beta.sh"));
6873 17 Nov 22 nicklas 198       jobDef.addFile(ScriptUtil.upload("beta_values.R"));
6870 16 Nov 22 nicklas 199       jobDef.addFile(ScriptUtil.upload("reggie-utils.sh"));
6873 17 Nov 22 nicklas 200       jobDef.addFile(ScriptUtil.upload("stderrwrap.sh"));
6870 16 Nov 22 nicklas 201       jobDef.setDebug(debug);
6870 16 Nov 22 nicklas 202       jobDef.setCmd(script.toString());
6870 16 Nov 22 nicklas 203       jobDefs.add(jobDef);
6870 16 Nov 22 nicklas 204     }
6870 16 Nov 22 nicklas 205     
6870 16 Nov 22 nicklas 206     return jobDefs;
6870 16 Nov 22 nicklas 207   }
6870 16 Nov 22 nicklas 208
6870 16 Nov 22 nicklas 209   
6870 16 Nov 22 nicklas 210   /**
6870 16 Nov 22 nicklas 211     Job completion handler for beta-analysis jobs. The handler downloads the
6870 16 Nov 22 nicklas 212     'files.out' file, create links to the files and import some annotations.
6870 16 Nov 22 nicklas 213   */
6870 16 Nov 22 nicklas 214   public static class BetaJobCompletionHandler
6870 16 Nov 22 nicklas 215     implements JobCompletionHandler
6870 16 Nov 22 nicklas 216   {
6870 16 Nov 22 nicklas 217     
6870 16 Nov 22 nicklas 218     public BetaJobCompletionHandler()
6870 16 Nov 22 nicklas 219     {}
6870 16 Nov 22 nicklas 220   
6870 16 Nov 22 nicklas 221     @Override
6870 16 Nov 22 nicklas 222     public String jobCompleted(SessionControl sc, OpenGridSession session, Job job, JobStatus status)
6870 16 Nov 22 nicklas 223     {
6870 16 Nov 22 nicklas 224       String jobName = status.getName();
6870 16 Nov 22 nicklas 225       String files = session.getJobFileAsString(jobName, "files.out", "UTF-8");
6876 18 Nov 22 nicklas 226       String stats = session.getJobFileAsString(jobName, "stats.out", "UTF-8");
6876 18 Nov 22 nicklas 227       String msg = parseFiles(sc, job, files, stats);
6870 16 Nov 22 nicklas 228       return "Beta-analysis completed. " + msg;
6870 16 Nov 22 nicklas 229     }
6870 16 Nov 22 nicklas 230     
6876 18 Nov 22 nicklas 231     private String parseFiles(SessionControl sc, Job job, String filesOut, String statsOut)
6870 16 Nov 22 nicklas 232     {
6870 16 Nov 22 nicklas 233       
6870 16 Nov 22 nicklas 234       DbControl dc = null;
6870 16 Nov 22 nicklas 235       String msg = null;
6870 16 Nov 22 nicklas 236       try
6870 16 Nov 22 nicklas 237       {
6870 16 Nov 22 nicklas 238         dc = sc.newDbControl("Reggie: beta-analysis completed handler");
6870 16 Nov 22 nicklas 239         
6870 16 Nov 22 nicklas 240         Methylation m = Methylation.getByJob(dc, job);
6870 16 Nov 22 nicklas 241         DerivedBioAssay meth = m.getItem();
6870 16 Nov 22 nicklas 242   
6870 16 Nov 22 nicklas 243         // Create file links
6870 16 Nov 22 nicklas 244         boolean useExternalProjectArchive = Reggie.isExternalItem(m.getName());
6870 16 Nov 22 nicklas 245         FileServer fileArchive = useExternalProjectArchive ? Fileserver.EXTERNAL_ARCHIVE.load(dc) : Fileserver.PROJECT_ARCHIVE.load(dc);
6870 16 Nov 22 nicklas 246         String analysisDir = useExternalProjectArchive ? Reggie.EXTERNAL_ANALYSIS_DIR : Reggie.SECONDARY_ANALYSIS_DIR;
6870 16 Nov 22 nicklas 247   
6870 16 Nov 22 nicklas 248         String dataFilesFolder = (String)Annotationtype.DATA_FILES_FOLDER.getAnnotationValue(dc, meth);
6870 16 Nov 22 nicklas 249         String baseFolder = Reggie.convertDataFilesFolderToBaseFolder(dataFilesFolder);
6870 16 Nov 22 nicklas 250         Directory localDataDir = Directory.getNew(dc, new Path(analysisDir+baseFolder, Path.Type.DIRECTORY));
6870 16 Nov 22 nicklas 251         ItemSubtype idatType = Subtype.IDAT.load(dc);
6870 16 Nov 22 nicklas 252         DataFileType idatData = Datafiletype.IDAT.load(dc);
6870 16 Nov 22 nicklas 253         
6870 16 Nov 22 nicklas 254         int lineNo = 0;
6870 16 Nov 22 nicklas 255         for (String line : filesOut.split("\n"))
6870 16 Nov 22 nicklas 256         {
6870 16 Nov 22 nicklas 257           lineNo++;
6870 16 Nov 22 nicklas 258           
6870 16 Nov 22 nicklas 259           File f = File.getFile(dc, localDataDir, line.substring(line.lastIndexOf("/")+1), true);
6870 16 Nov 22 nicklas 260           f.setFileServer(fileArchive);
6876 18 Nov 22 nicklas 261           String fileName = f.getName();
6876 18 Nov 22 nicklas 262           String fileUrl = "sftp://" + fileArchive.getHost() + dataFilesFolder + "/" + fileName;
6870 16 Nov 22 nicklas 263           try
6870 16 Nov 22 nicklas 264           {
6870 16 Nov 22 nicklas 265             f.setUrl(fileUrl, true);
6870 16 Nov 22 nicklas 266           }
6870 16 Nov 22 nicklas 267           catch (RuntimeException ex)
6870 16 Nov 22 nicklas 268           {
6870 16 Nov 22 nicklas 269             f.setUrl(fileUrl, false);
6870 16 Nov 22 nicklas 270           }
6870 16 Nov 22 nicklas 271           
6876 18 Nov 22 nicklas 272           if (!f.isInDatabase()) dc.saveItem(f);
6876 18 Nov 22 nicklas 273           if (fileName.startsWith("beta_normalized")) f.setDescription("Beta-values after NOOB normalization");
6876 18 Nov 22 nicklas 274           if (fileName.startsWith("beta_adjusted")) f.setDescription("Beta-values after adjustment");
6876 18 Nov 22 nicklas 275           if (fileName.startsWith("adjustmentPlots")) f.setDescription("Density plots before/after adjustment");
6870 16 Nov 22 nicklas 276           
6876 18 Nov 22 nicklas 277           if (fileName.endsWith(".idat"))
6870 16 Nov 22 nicklas 278           {
6870 16 Nov 22 nicklas 279             //f.setDescription(...);
6870 16 Nov 22 nicklas 280             f.setItemSubtype(idatType);
6870 16 Nov 22 nicklas 281             FileSetMember member = meth.getFileSet().addMember(f, idatData);
6876 18 Nov 22 nicklas 282             member.setValid(true, null);
6870 16 Nov 22 nicklas 283           }
6870 16 Nov 22 nicklas 284           else
6870 16 Nov 22 nicklas 285           {
6876 18 Nov 22 nicklas 286             AnyToAny link = AnyToAny.getNewOrExisting(dc, meth, fileName, f, true);
6870 16 Nov 22 nicklas 287             if (!link.isInDatabase()) dc.saveItem(link);
6876 18 Nov 22 nicklas 288             link.setDescription(f.getDescription());
6870 16 Nov 22 nicklas 289           }
6876 18 Nov 22 nicklas 290           
6870 16 Nov 22 nicklas 291         }
6870 16 Nov 22 nicklas 292         
6876 18 Nov 22 nicklas 293         Stats stat = Stats.parse(statsOut);
6876 18 Nov 22 nicklas 294         Annotationtype.NUM_PROBES.setAnnotationValue(dc, meth, stat.probesRaw);
6876 18 Nov 22 nicklas 295         Annotationtype.NUM_PROBES_BAD_PVAL.setAnnotationValue(dc, meth, stat.probesBad);
6876 18 Nov 22 nicklas 296         if (stat.probesRaw != null && stat.probesBad != null && stat.probesRaw > 0)
6876 18 Nov 22 nicklas 297         {
6876 18 Nov 22 nicklas 298           Annotationtype.PROBES_RATE.setAnnotationValue(dc, meth, 1f-(float)stat.probesBad/(float)stat.probesRaw);
6876 18 Nov 22 nicklas 299         }
6876 18 Nov 22 nicklas 300         Annotationtype.NUM_PROBES_I.setAnnotationValue(dc, meth, stat.probesI);
6876 18 Nov 22 nicklas 301         Annotationtype.NUM_PROBES_II.setAnnotationValue(dc, meth, stat.probesII);
6876 18 Nov 22 nicklas 302         Annotationtype.MEDIAN_METH.setAnnotationValue(dc, meth, stat.medianMeth);
6876 18 Nov 22 nicklas 303         Annotationtype.MEDIAN_UNMETH.setAnnotationValue(dc, meth, stat.medianUnmeth);
6876 18 Nov 22 nicklas 304
6876 18 Nov 22 nicklas 305         Annotationtype.PEAK_METH_I.setAnnotationValue(dc, meth, stat.peakMethI);
6876 18 Nov 22 nicklas 306         Annotationtype.PEAK_UNMETH_I.setAnnotationValue(dc, meth, stat.peakUnmethI);
6876 18 Nov 22 nicklas 307         Annotationtype.PEAK_METH_II.setAnnotationValue(dc, meth, stat.peakMethII);
6876 18 Nov 22 nicklas 308         Annotationtype.PEAK_UNMETH_II.setAnnotationValue(dc, meth, stat.peakUnmethII);
6876 18 Nov 22 nicklas 309
6878 18 Nov 22 nicklas 310         Annotationtype.ANALYSIS_FLAG.setAnnotationValue(dc, meth, stat.flag);
6878 18 Nov 22 nicklas 311         
6878 18 Nov 22 nicklas 312         if (stat.flag != null)
6878 18 Nov 22 nicklas 313         {
6878 18 Nov 22 nicklas 314           msg = "Flagged: " + stat.flag;
6878 18 Nov 22 nicklas 315         }
6878 18 Nov 22 nicklas 316         
6870 16 Nov 22 nicklas 317         dc.commit();
6870 16 Nov 22 nicklas 318       }
6870 16 Nov 22 nicklas 319       finally
6870 16 Nov 22 nicklas 320       {
6870 16 Nov 22 nicklas 321         if (dc != null) dc.close();
6870 16 Nov 22 nicklas 322       }
6870 16 Nov 22 nicklas 323   
6870 16 Nov 22 nicklas 324       return msg == null ? "" : msg;
6870 16 Nov 22 nicklas 325     }
6870 16 Nov 22 nicklas 326     
6870 16 Nov 22 nicklas 327   }
6876 18 Nov 22 nicklas 328   
6876 18 Nov 22 nicklas 329   /**
6876 18 Nov 22 nicklas 330     Statistics from the beta analysis. Parsed from stats.out.
6876 18 Nov 22 nicklas 331   */
6876 18 Nov 22 nicklas 332   static class Stats
6876 18 Nov 22 nicklas 333   {
6876 18 Nov 22 nicklas 334     Integer probesRaw = null;
6876 18 Nov 22 nicklas 335     Integer probesBad = null;
6876 18 Nov 22 nicklas 336     Integer probesI = null;
6876 18 Nov 22 nicklas 337     Integer probesII = null;
6876 18 Nov 22 nicklas 338     Float medianMeth = null;
6876 18 Nov 22 nicklas 339     Float medianUnmeth = null;
6876 18 Nov 22 nicklas 340     Float peakMethI = null;
6876 18 Nov 22 nicklas 341     Float peakUnmethI = null;
6876 18 Nov 22 nicklas 342     Float peakMethII = null;
6876 18 Nov 22 nicklas 343     Float peakUnmethII = null;
6878 18 Nov 22 nicklas 344     String flag = null;
6876 18 Nov 22 nicklas 345     
6876 18 Nov 22 nicklas 346     static Stats parse(String statsOut)
6876 18 Nov 22 nicklas 347     {
6876 18 Nov 22 nicklas 348       Stats s = new Stats();
6876 18 Nov 22 nicklas 349       for (String line : statsOut.split("\n"))
6876 18 Nov 22 nicklas 350       {
6876 18 Nov 22 nicklas 351         String[] stat = line.split("\\s", 2);
6876 18 Nov 22 nicklas 352         String key = stat[0].strip();
6876 18 Nov 22 nicklas 353         String val = stat[1].strip();
6876 18 Nov 22 nicklas 354         if ("MedianMeth".equals(key))
6876 18 Nov 22 nicklas 355         {
6876 18 Nov 22 nicklas 356           s.medianMeth = Float.parseFloat(val);
6876 18 Nov 22 nicklas 357         }
6876 18 Nov 22 nicklas 358         else if ("MedianUnmeth".equals(key))
6876 18 Nov 22 nicklas 359         {
6876 18 Nov 22 nicklas 360           s.medianUnmeth = Float.parseFloat(val);
6876 18 Nov 22 nicklas 361         }
6876 18 Nov 22 nicklas 362         else if ("ProbesRaw".equals(key))
6876 18 Nov 22 nicklas 363         {
6876 18 Nov 22 nicklas 364           s.probesRaw = Integer.parseInt(val);
6876 18 Nov 22 nicklas 365         }
6876 18 Nov 22 nicklas 366         else if ("ProbesBad".equals(key))
6876 18 Nov 22 nicklas 367         {
6876 18 Nov 22 nicklas 368           s.probesBad = Integer.parseInt(val);
6876 18 Nov 22 nicklas 369         }
6876 18 Nov 22 nicklas 370         else if ("ProbesI".equals(key))
6876 18 Nov 22 nicklas 371         {
6876 18 Nov 22 nicklas 372           s.probesI = Integer.parseInt(val);
6876 18 Nov 22 nicklas 373         }
6876 18 Nov 22 nicklas 374         else if ("ProbesII".equals(key))
6876 18 Nov 22 nicklas 375         {
6876 18 Nov 22 nicklas 376           s.probesII = Integer.parseInt(val);
6876 18 Nov 22 nicklas 377         }
6876 18 Nov 22 nicklas 378         else if ("PeakUnmethI".equals(key))
6876 18 Nov 22 nicklas 379         {
6876 18 Nov 22 nicklas 380           s.peakUnmethI = Float.parseFloat(val);
6876 18 Nov 22 nicklas 381         }
6876 18 Nov 22 nicklas 382         else if ("PeakMethI".equals(key))
6876 18 Nov 22 nicklas 383         {
6876 18 Nov 22 nicklas 384           s.peakMethI = Float.parseFloat(val);
6876 18 Nov 22 nicklas 385         }
6876 18 Nov 22 nicklas 386         else if ("PeakUnmethII".equals(key))
6876 18 Nov 22 nicklas 387         {
6876 18 Nov 22 nicklas 388           s.peakUnmethII = Float.parseFloat(val);
6876 18 Nov 22 nicklas 389         }
6876 18 Nov 22 nicklas 390         else if ("PeakMethII".equals(key))
6876 18 Nov 22 nicklas 391         {
6876 18 Nov 22 nicklas 392           s.peakMethII = Float.parseFloat(val);
6876 18 Nov 22 nicklas 393         }
6878 18 Nov 22 nicklas 394         else if ("Flag".equals(key))
6878 18 Nov 22 nicklas 395         {
6878 18 Nov 22 nicklas 396           s.flag = val;
6878 18 Nov 22 nicklas 397         }
6876 18 Nov 22 nicklas 398       }
6876 18 Nov 22 nicklas 399       return s;
6876 18 Nov 22 nicklas 400     }
6876 18 Nov 22 nicklas 401   
6876 18 Nov 22 nicklas 402   }
6876 18 Nov 22 nicklas 403
6870 16 Nov 22 nicklas 404 }