extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/ssp/SspPlugin.java

Code
Comments
Other
Rev Date Author Line
5628 24 Sep 19 nicklas 1 package net.sf.basedb.reggie.ssp;
5628 24 Sep 19 nicklas 2
5628 24 Sep 19 nicklas 3 import java.util.ArrayList;
5628 24 Sep 19 nicklas 4 import java.util.Arrays;
5962 03 Jun 20 nicklas 5 import java.util.Collection;
5628 24 Sep 19 nicklas 6 import java.util.Collections;
5929 05 May 20 nicklas 7 import java.util.HashMap;
5628 24 Sep 19 nicklas 8 import java.util.HashSet;
5628 24 Sep 19 nicklas 9 import java.util.List;
5929 05 May 20 nicklas 10 import java.util.Map;
5628 24 Sep 19 nicklas 11 import java.util.Set;
5937 15 May 20 nicklas 12 import java.util.regex.Matcher;
5937 15 May 20 nicklas 13 import java.util.regex.Pattern;
5628 24 Sep 19 nicklas 14
5628 24 Sep 19 nicklas 15 import net.sf.basedb.core.AnnotationBatcher;
5628 24 Sep 19 nicklas 16 import net.sf.basedb.core.AnnotationBatcher.Change;
5628 24 Sep 19 nicklas 17 import net.sf.basedb.core.AnnotationType;
5922 27 Apr 20 nicklas 18 import net.sf.basedb.core.AnyToAny;
5628 24 Sep 19 nicklas 19 import net.sf.basedb.core.BaseException;
5628 24 Sep 19 nicklas 20 import net.sf.basedb.core.BooleanParameterType;
5628 24 Sep 19 nicklas 21 import net.sf.basedb.core.DbControl;
5628 24 Sep 19 nicklas 22 import net.sf.basedb.core.Item;
5628 24 Sep 19 nicklas 23 import net.sf.basedb.core.ItemContext;
5922 27 Apr 20 nicklas 24 import net.sf.basedb.core.ItemList;
5628 24 Sep 19 nicklas 25 import net.sf.basedb.core.ItemParameterType;
5628 24 Sep 19 nicklas 26 import net.sf.basedb.core.ItemQuery;
5922 27 Apr 20 nicklas 27 import net.sf.basedb.core.Job;
5922 27 Apr 20 nicklas 28 import net.sf.basedb.core.PluginDefinition;
5628 24 Sep 19 nicklas 29 import net.sf.basedb.core.PluginParameter;
5628 24 Sep 19 nicklas 30 import net.sf.basedb.core.ProgressReporter;
5628 24 Sep 19 nicklas 31 import net.sf.basedb.core.RawBioAssay;
5628 24 Sep 19 nicklas 32 import net.sf.basedb.core.RequestInformation;
5922 27 Apr 20 nicklas 33 import net.sf.basedb.core.SessionControl;
5628 24 Sep 19 nicklas 34 import net.sf.basedb.core.Type;
5628 24 Sep 19 nicklas 35 import net.sf.basedb.core.Job.ExecutionTime;
5628 24 Sep 19 nicklas 36 import net.sf.basedb.core.StringParameterType;
5628 24 Sep 19 nicklas 37 import net.sf.basedb.core.plugin.AbstractPlugin;
5628 24 Sep 19 nicklas 38 import net.sf.basedb.core.plugin.GuiContext;
5628 24 Sep 19 nicklas 39 import net.sf.basedb.core.plugin.InteractivePlugin;
5628 24 Sep 19 nicklas 40 import net.sf.basedb.core.plugin.Request;
5628 24 Sep 19 nicklas 41 import net.sf.basedb.core.plugin.Response;
5962 03 Jun 20 nicklas 42 import net.sf.basedb.core.query.Annotations;
5628 24 Sep 19 nicklas 43 import net.sf.basedb.core.query.Expressions;
5628 24 Sep 19 nicklas 44 import net.sf.basedb.core.query.Hql;
5628 24 Sep 19 nicklas 45 import net.sf.basedb.core.query.Restrictions;
5628 24 Sep 19 nicklas 46 import net.sf.basedb.core.signal.SignalHandler;
5628 24 Sep 19 nicklas 47 import net.sf.basedb.core.signal.SignalTarget;
5628 24 Sep 19 nicklas 48 import net.sf.basedb.core.signal.ThreadSignalHandler;
5628 24 Sep 19 nicklas 49 import net.sf.basedb.plugins.util.Parameters;
5628 24 Sep 19 nicklas 50 import net.sf.basedb.reggie.Reggie;
6186 26 Mar 21 nicklas 51 import net.sf.basedb.reggie.autoconfirm.AutoConfirmService;
6186 26 Mar 21 nicklas 52 import net.sf.basedb.reggie.counter.CounterService;
5922 27 Apr 20 nicklas 53 import net.sf.basedb.reggie.dao.Annotationtype;
5922 27 Apr 20 nicklas 54 import net.sf.basedb.reggie.dao.BiomaterialList;
5628 24 Sep 19 nicklas 55 import net.sf.basedb.reggie.dao.Rawbioassay;
5628 24 Sep 19 nicklas 56 import net.sf.basedb.reggie.dao.Rawdatatype;
5922 27 Apr 20 nicklas 57 import net.sf.basedb.reggie.dao.Subtype;
5628 24 Sep 19 nicklas 58 import net.sf.basedb.util.Enumeration;
5628 24 Sep 19 nicklas 59 import net.sf.basedb.util.Values;
5628 24 Sep 19 nicklas 60
5628 24 Sep 19 nicklas 61 public class SspPlugin 
5628 24 Sep 19 nicklas 62   extends AbstractPlugin 
5628 24 Sep 19 nicklas 63   implements InteractivePlugin, SignalTarget  
5628 24 Sep 19 nicklas 64 {
5628 24 Sep 19 nicklas 65
5922 27 Apr 20 nicklas 66   /**
5922 27 Apr 20 nicklas 67     Utility function for creating a BASE job that runs this plugin.
5922 27 Apr 20 nicklas 68     for a given list of raw bioassays and models.
5922 27 Apr 20 nicklas 69     
5922 27 Apr 20 nicklas 70     Other pararameter are using default values from configuration file.
5922 27 Apr 20 nicklas 71     @since 4.27
5922 27 Apr 20 nicklas 72   */
6025 26 Oct 20 nicklas 73   public static Job createAnalysisJob(DbControl dc, List<RawBioAssay> rawBioAssays, List<String> models, boolean autoConfirm)
5922 27 Apr 20 nicklas 74   {
5922 27 Apr 20 nicklas 75     SessionControl sc = dc.getSessionControl();
5922 27 Apr 20 nicklas 76     
5922 27 Apr 20 nicklas 77     // Create the job
5922 27 Apr 20 nicklas 78     PluginDefinition sspPlugin = PluginDefinition.getByClassName(dc, SspPlugin.class.getName());
5922 27 Apr 20 nicklas 79     Job sspJob = Job.getNew(dc, sspPlugin, null, null);
5922 27 Apr 20 nicklas 80     dc.saveItem(sspJob);
5922 27 Apr 20 nicklas 81     
5922 27 Apr 20 nicklas 82     sspJob.setItemSubtype(Subtype.SSP_JOB.get(dc));
5922 27 Apr 20 nicklas 83     sspJob.setSendMessage(Values.getBoolean(sc.getUserClientSetting("plugins.sendmessage"), false));
5962 03 Jun 20 nicklas 84     if (rawBioAssays.size() == 0)
5922 27 Apr 20 nicklas 85     {
5962 03 Jun 20 nicklas 86       // Find rawbioassays with missing SSP annotation
5962 03 Jun 20 nicklas 87       Set<RawBioAssay> toUpdate = new HashSet<>();
5962 03 Jun 20 nicklas 88       for (String m : models)
5962 03 Jun 20 nicklas 89       {
5962 03 Jun 20 nicklas 90         SspModel model = SspModel.getModelByName(m);
5962 03 Jun 20 nicklas 91         ItemQuery<RawBioAssay> query = RawBioAssay.getQuery();
5962 03 Jun 20 nicklas 92         query.setIncludes(Reggie.INCLUDE_IN_CURRENT_PROJECT);
5962 03 Jun 20 nicklas 93         Rawdatatype.STRINGTIE.addFilter(dc, query);
5962 03 Jun 20 nicklas 94         // Only load rawbioassays with missing value
5962 03 Jun 20 nicklas 95         query.join(Annotations.leftJoin(model.getAnnotationType(dc), "ssp"));
5962 03 Jun 20 nicklas 96         query.restrict(Restrictions.eq(Hql.alias("ssp"), null));
5962 03 Jun 20 nicklas 97         toUpdate.addAll(query.list(dc));
5962 03 Jun 20 nicklas 98       }
5962 03 Jun 20 nicklas 99       rawBioAssays.addAll(toUpdate);
5962 03 Jun 20 nicklas 100       sspJob.setName("Single Sample Predictor for " + models.size() + " models (" + rawBioAssays.size() + " raw bioassys with missing value)");
5922 27 Apr 20 nicklas 101     }
5962 03 Jun 20 nicklas 102     else 
5922 27 Apr 20 nicklas 103     {
5962 03 Jun 20 nicklas 104       if (rawBioAssays.size() == 1)
5962 03 Jun 20 nicklas 105       {
5962 03 Jun 20 nicklas 106         sspJob.setName("Single Sample Predictor for " + rawBioAssays.get(0).getName() + " (" + models.size() + " models)");
5962 03 Jun 20 nicklas 107       }
5962 03 Jun 20 nicklas 108       else
5962 03 Jun 20 nicklas 109       {
5962 03 Jun 20 nicklas 110         sspJob.setName("Single Sample Predictor for " + rawBioAssays.size() + " raw bioassays (" + models.size() + " models)");
5962 03 Jun 20 nicklas 111       }
5922 27 Apr 20 nicklas 112     }
6025 26 Oct 20 nicklas 113     sspJob.setParameterValues("rawBioAssays", 
6025 26 Oct 20 nicklas 114         new ItemParameterType<RawBioAssay>(RawBioAssay.class, null, true, 0, null), rawBioAssays);
5922 27 Apr 20 nicklas 115     sspJob.setParameterValues("models", new StringParameterType(255, null, true, 0, 0, 0), models);
6025 26 Oct 20 nicklas 116     if (autoConfirm)
6025 26 Oct 20 nicklas 117     {
6025 26 Oct 20 nicklas 118       sspJob.setParameterValue("AutoConfirmHandler", new StringParameterType(), "SspAutoConfirmer");
6025 26 Oct 20 nicklas 119     }
5922 27 Apr 20 nicklas 120     sspJob.setScheduled(null, null);
5628 24 Sep 19 nicklas 121
5922 27 Apr 20 nicklas 122     ItemList sspPipeline = BiomaterialList.SSP_PIPELINE.get(dc);
5922 27 Apr 20 nicklas 123     for (RawBioAssay raw : rawBioAssays)
5922 27 Apr 20 nicklas 124     {
5922 27 Apr 20 nicklas 125       // Reset AutoProcessing annotation and remove from item list
5922 27 Apr 20 nicklas 126       Annotationtype.AUTO_PROCESSING.setAnnotationValue(dc, raw, null);
5922 27 Apr 20 nicklas 127       sspPipeline.removeItem(raw);
5922 27 Apr 20 nicklas 128       
5922 27 Apr 20 nicklas 129       // Link to the job for bookkeeping 
5922 27 Apr 20 nicklas 130       AnyToAny link = AnyToAny.getNewOrExisting(dc, raw, "SSPJob", sspJob, false);
5922 27 Apr 20 nicklas 131       if (!link.isInDatabase()) dc.saveItem(link);
5922 27 Apr 20 nicklas 132     }
5922 27 Apr 20 nicklas 133     
5922 27 Apr 20 nicklas 134     return sspJob;
5922 27 Apr 20 nicklas 135   }
5922 27 Apr 20 nicklas 136   
5628 24 Sep 19 nicklas 137   private ThreadSignalHandler signalHandler;
5628 24 Sep 19 nicklas 138   
5628 24 Sep 19 nicklas 139   public SspPlugin()
5920 27 Apr 20 nicklas 140   {}
5628 24 Sep 19 nicklas 141   
5628 24 Sep 19 nicklas 142   /*
5628 24 Sep 19 nicklas 143      From the Plugin interface
5628 24 Sep 19 nicklas 144      --------------------------------
5628 24 Sep 19 nicklas 145   */
5628 24 Sep 19 nicklas 146   @Override
5628 24 Sep 19 nicklas 147   public MainType getMainType() 
5628 24 Sep 19 nicklas 148   {
5628 24 Sep 19 nicklas 149     return MainType.OTHER;
5628 24 Sep 19 nicklas 150   }
5628 24 Sep 19 nicklas 151   
5628 24 Sep 19 nicklas 152   @Override
5628 24 Sep 19 nicklas 153   public boolean supportsConfigurations()
5628 24 Sep 19 nicklas 154   {
5628 24 Sep 19 nicklas 155     return true;
5628 24 Sep 19 nicklas 156   }
5628 24 Sep 19 nicklas 157
5628 24 Sep 19 nicklas 158   @Override
5628 24 Sep 19 nicklas 159   public boolean requiresConfiguration()
5628 24 Sep 19 nicklas 160   {
5628 24 Sep 19 nicklas 161     return false;
5628 24 Sep 19 nicklas 162   }
5628 24 Sep 19 nicklas 163   
5628 24 Sep 19 nicklas 164   @Override
5628 24 Sep 19 nicklas 165   public void run(Request request, Response response, ProgressReporter progress)
5628 24 Sep 19 nicklas 166   {
5628 24 Sep 19 nicklas 167     if (signalHandler != null) signalHandler.setWorkerThread(null);
5628 24 Sep 19 nicklas 168     
5628 24 Sep 19 nicklas 169     DbControl dc = null;
5628 24 Sep 19 nicklas 170     SspAnalysis ssp = null;
5925 29 Apr 20 nicklas 171     Throwable lastException = null;
5628 24 Sep 19 nicklas 172     try
5628 24 Sep 19 nicklas 173     {
5628 24 Sep 19 nicklas 174       String logFile = (String)job.getValue(Parameters.LOGFILE_PARAMETER);
5628 24 Sep 19 nicklas 175       createLogFile(logFile);
5628 24 Sep 19 nicklas 176       
5628 24 Sep 19 nicklas 177       dc = sc.newDbControl();
5628 24 Sep 19 nicklas 178       boolean debugMode = Boolean.TRUE.equals(job.getValue("debugMode"));
6186 26 Mar 21 nicklas 179       boolean autoConfirm = job.getValue("AutoConfirmHandler") != null;
5628 24 Sep 19 nicklas 180       List<RawBioAssay> rawBioAssays = job.getValues("rawBioAssays");
5628 24 Sep 19 nicklas 181       List<String> modelNames = job.getValues("models");
5922 27 Apr 20 nicklas 182       if (modelNames == null || modelNames.isEmpty())
5922 27 Apr 20 nicklas 183       {
5922 27 Apr 20 nicklas 184         modelNames = SspModel.getModelNames();
5922 27 Apr 20 nicklas 185       }
5962 03 Jun 20 nicklas 186       
5628 24 Sep 19 nicklas 187       AnnotationBatcher batcher = new AnnotationBatcher(dc, Item.RAWBIOASSAY);
5628 24 Sep 19 nicklas 188       List<SspModel> models = new ArrayList<>();
5628 24 Sep 19 nicklas 189       StringBuilder logMsg = new StringBuilder();
5628 24 Sep 19 nicklas 190       logMsg.append("RawBioAssay");
5628 24 Sep 19 nicklas 191       for (String name : modelNames)
5628 24 Sep 19 nicklas 192       {
5628 24 Sep 19 nicklas 193         SspModel model = SspModel.getModelByName(name);
5628 24 Sep 19 nicklas 194         AnnotationType at = model.getAnnotationType(dc);
5628 24 Sep 19 nicklas 195         if (at != null)
5628 24 Sep 19 nicklas 196         {
5628 24 Sep 19 nicklas 197           models.add(model);
5628 24 Sep 19 nicklas 198           batcher.addAnnotationTypes(Collections.singleton(at));
5628 24 Sep 19 nicklas 199           logMsg.append("\t").append(name);
5937 15 May 20 nicklas 200           
5937 15 May 20 nicklas 201           AnnotationType scores = model.getAnnotationTypeScores(dc);
5937 15 May 20 nicklas 202           if (scores != null)
5937 15 May 20 nicklas 203           {
5937 15 May 20 nicklas 204             batcher.addAnnotationTypes(Collections.singleton(scores));
5937 15 May 20 nicklas 205             logMsg.append("\t").append(name).append("_Scores");
5937 15 May 20 nicklas 206           }
5628 24 Sep 19 nicklas 207         }
5628 24 Sep 19 nicklas 208       }
5628 24 Sep 19 nicklas 209       log(logMsg.toString());
5628 24 Sep 19 nicklas 210       
5962 03 Jun 20 nicklas 211       Collection<Integer> idList = null;  // ID of all RBA we need to run
5962 03 Jun 20 nicklas 212       
5962 03 Jun 20 nicklas 213       // Maps SSPModel -> List of RBA id that is missing a value for the model
5962 03 Jun 20 nicklas 214       Map<SspModel, Set<Integer>> modelsToUpdate = null;
5962 03 Jun 20 nicklas 215       
5962 03 Jun 20 nicklas 216       if (rawBioAssays == null || rawBioAssays.isEmpty())
5962 03 Jun 20 nicklas 217       {
5962 03 Jun 20 nicklas 218         // Find raw bioassays that is missing SSP annotations for each model
5962 03 Jun 20 nicklas 219         idList = new HashSet<>();
5962 03 Jun 20 nicklas 220         modelsToUpdate = new HashMap<>();
5962 03 Jun 20 nicklas 221         for (SspModel m : models)
5962 03 Jun 20 nicklas 222         {
5962 03 Jun 20 nicklas 223           ItemQuery<RawBioAssay> query = RawBioAssay.getQuery();
5962 03 Jun 20 nicklas 224           query.setIncludes(Reggie.INCLUDE_IN_CURRENT_PROJECT);
5962 03 Jun 20 nicklas 225           Rawdatatype.STRINGTIE.addFilter(dc, query);
5962 03 Jun 20 nicklas 226           // Only load rawbioassays with missing value
5962 03 Jun 20 nicklas 227           query.join(Annotations.leftJoin(m.getAnnotationType(dc), "ssp"));
5962 03 Jun 20 nicklas 228           query.restrict(Restrictions.eq(Hql.alias("ssp"), null));
5962 03 Jun 20 nicklas 229           
5962 03 Jun 20 nicklas 230           Set<Integer> tmp = new HashSet<>(query.idList(dc));
5962 03 Jun 20 nicklas 231           modelsToUpdate.put(m, tmp);
5962 03 Jun 20 nicklas 232           idList.addAll(tmp);
5962 03 Jun 20 nicklas 233         }
5962 03 Jun 20 nicklas 234       }
5962 03 Jun 20 nicklas 235       else
5962 03 Jun 20 nicklas 236       {
5962 03 Jun 20 nicklas 237         idList = new ArrayList<>();
5962 03 Jun 20 nicklas 238         for (RawBioAssay rba : rawBioAssays)
5962 03 Jun 20 nicklas 239         {
5962 03 Jun 20 nicklas 240           idList.add(rba.getId());
5962 03 Jun 20 nicklas 241         }
5962 03 Jun 20 nicklas 242       }
5962 03 Jun 20 nicklas 243
5962 03 Jun 20 nicklas 244       int totalCount = idList.size();
5628 24 Sep 19 nicklas 245       int count = 0;
5628 24 Sep 19 nicklas 246       int numCompleted = 0;
5628 24 Sep 19 nicklas 247       int numFailures = 0;
5628 24 Sep 19 nicklas 248       int numAnnotations = 0;
5628 24 Sep 19 nicklas 249       Set<String> failedModels = new HashSet<>();
5628 24 Sep 19 nicklas 250       
5628 24 Sep 19 nicklas 251       ssp = new SspAnalysis();
5962 03 Jun 20 nicklas 252       for (int rbaId : idList)
5628 24 Sep 19 nicklas 253       {
5628 24 Sep 19 nicklas 254         ThreadSignalHandler.checkInterrupted();
5628 24 Sep 19 nicklas 255         count++;
5962 03 Jun 20 nicklas 256         logMsg = new StringBuilder();
5962 03 Jun 20 nicklas 257         Rawbioassay rba = Rawbioassay.getById(dc, rbaId);
5628 24 Sep 19 nicklas 258         if (progress != null)
5628 24 Sep 19 nicklas 259         {
5962 03 Jun 20 nicklas 260           progress.display((90*count)/totalCount, rba.getName() + " (" + count + " of " + totalCount + (numFailures > 0 ? "; " + numFailures + " failed" : "") + ")");
5628 24 Sep 19 nicklas 261         }
5628 24 Sep 19 nicklas 262         batcher.setCurrentItem(rba.getItem());
5628 24 Sep 19 nicklas 263         logMsg.append(rba.getName());
5628 24 Sep 19 nicklas 264         boolean hasFailure = false;
5628 24 Sep 19 nicklas 265         
5628 24 Sep 19 nicklas 266         SspAnalysis.Result result = ssp.run(dc, rba, models);
5628 24 Sep 19 nicklas 267         if (result.getExitStatus() == 0)
5628 24 Sep 19 nicklas 268         {
5668 15 Oct 19 nicklas 269           for (SspModelResult modelResult : result.getModelResults())
5628 24 Sep 19 nicklas 270           {
5668 15 Oct 19 nicklas 271             SspModel model = modelResult.getModel();
5962 03 Jun 20 nicklas 272             boolean update = modelsToUpdate == null || modelsToUpdate.get(model).contains(rbaId);
5937 15 May 20 nicklas 273             AnnotationType at = model.getAnnotationType(dc);
5937 15 May 20 nicklas 274             AnnotationType scores = model.getAnnotationTypeScores(dc);
5962 03 Jun 20 nicklas 275             if (update)
5628 24 Sep 19 nicklas 276             {
5962 03 Jun 20 nicklas 277               try
5937 15 May 20 nicklas 278               {
5962 03 Jun 20 nicklas 279                 String resultClass = translate(modelResult.getResultClass());
5962 03 Jun 20 nicklas 280                 Object value = at.getValueType().parseString(resultClass);
5962 03 Jun 20 nicklas 281                 Change change = batcher.setValue(at, value, null, false);
5937 15 May 20 nicklas 282                 if (change != Change.NO_CHANGE) numAnnotations++;
5962 03 Jun 20 nicklas 283                 logMsg.append("\t").append(value);
5962 03 Jun 20 nicklas 284                 
5962 03 Jun 20 nicklas 285                 if (scores != null)
5962 03 Jun 20 nicklas 286                 {
5962 03 Jun 20 nicklas 287                   String resultScores = translateScores(modelResult.getAllScores());
5962 03 Jun 20 nicklas 288                   change = batcher.setValue(scores, resultScores, null, false);
5962 03 Jun 20 nicklas 289                   if (change != Change.NO_CHANGE) numAnnotations++;
5962 03 Jun 20 nicklas 290                   logMsg.append("\t").append(resultScores);
5962 03 Jun 20 nicklas 291                 }
5937 15 May 20 nicklas 292               }
5962 03 Jun 20 nicklas 293               catch (RuntimeException ex)
5962 03 Jun 20 nicklas 294               {
5962 03 Jun 20 nicklas 295                 lastException = ex;
5962 03 Jun 20 nicklas 296                 logMsg.append("\t").append(ex.getMessage());
5962 03 Jun 20 nicklas 297                 hasFailure = true;
5962 03 Jun 20 nicklas 298                 failedModels.add(model.getName());
5962 03 Jun 20 nicklas 299               }
5628 24 Sep 19 nicklas 300             }
5962 03 Jun 20 nicklas 301             else
5628 24 Sep 19 nicklas 302             {
5962 03 Jun 20 nicklas 303               logMsg.append("\t");
5962 03 Jun 20 nicklas 304               if (scores != null) logMsg.append("\t");
5628 24 Sep 19 nicklas 305             }
5628 24 Sep 19 nicklas 306           }
5628 24 Sep 19 nicklas 307           if (hasFailure)
5628 24 Sep 19 nicklas 308           {
5628 24 Sep 19 nicklas 309             numFailures++;
5628 24 Sep 19 nicklas 310           }
5628 24 Sep 19 nicklas 311           else
5628 24 Sep 19 nicklas 312           {
5628 24 Sep 19 nicklas 313             numCompleted++;
5628 24 Sep 19 nicklas 314           }
5628 24 Sep 19 nicklas 315         }
5628 24 Sep 19 nicklas 316         else
5628 24 Sep 19 nicklas 317         {
5925 29 Apr 20 nicklas 318           lastException = result.getException();
5628 24 Sep 19 nicklas 319           logMsg.append(result.getStderr());
5628 24 Sep 19 nicklas 320           numFailures++;
5628 24 Sep 19 nicklas 321         }
5628 24 Sep 19 nicklas 322         log(logMsg.toString());
5962 03 Jun 20 nicklas 323         if (numFailures > 10) break; // Break if we get too many errors
5628 24 Sep 19 nicklas 324       }
5628 24 Sep 19 nicklas 325       batcher.flush();
5628 24 Sep 19 nicklas 326       
5628 24 Sep 19 nicklas 327       StringBuilder msg = new StringBuilder();
5628 24 Sep 19 nicklas 328       if (numFailures == 0)
5628 24 Sep 19 nicklas 329       {
5628 24 Sep 19 nicklas 330         if (!job.getJob().isDryRun()) 
5628 24 Sep 19 nicklas 331         {
5628 24 Sep 19 nicklas 332           if (progress != null)
5628 24 Sep 19 nicklas 333           {
5628 24 Sep 19 nicklas 334             progress.display(95, "Saving " + numAnnotations + " annotations to database.");
5628 24 Sep 19 nicklas 335           }
5628 24 Sep 19 nicklas 336           dc.commit();
5628 24 Sep 19 nicklas 337         }
5628 24 Sep 19 nicklas 338         msg.append("Completed for " + numCompleted + " raw bioassays. " + numAnnotations + " annotations updated or created. ");
5628 24 Sep 19 nicklas 339       }
5628 24 Sep 19 nicklas 340       else
5628 24 Sep 19 nicklas 341       {
5925 29 Apr 20 nicklas 342         if (lastException != null && lastException.getMessage() != null)
5925 29 Apr 20 nicklas 343         {
5925 29 Apr 20 nicklas 344           msg.append(lastException.getMessage() + ". ");
5925 29 Apr 20 nicklas 345         }
5925 29 Apr 20 nicklas 346         if (numCompleted > 0) msg.append("Completed for " + numCompleted + " raw bioassays. ");
5628 24 Sep 19 nicklas 347         msg.append("Failed for " + numFailures + " raw bioassays. ");
5628 24 Sep 19 nicklas 348         if (failedModels.size() > 0)
5628 24 Sep 19 nicklas 349         {
5628 24 Sep 19 nicklas 350           msg.append("Failed models: ");
5628 24 Sep 19 nicklas 351           msg.append(Values.getString(failedModels, ", ", true));
5628 24 Sep 19 nicklas 352           msg.append(". ");
5628 24 Sep 19 nicklas 353         }
5628 24 Sep 19 nicklas 354         if (logFile != null)
5628 24 Sep 19 nicklas 355         {
5628 24 Sep 19 nicklas 356           msg.append("Check the log file for more information.");
5628 24 Sep 19 nicklas 357         }
5628 24 Sep 19 nicklas 358         else
5628 24 Sep 19 nicklas 359         {
5628 24 Sep 19 nicklas 360           msg.append("Use a log file to get more information.");
5628 24 Sep 19 nicklas 361         }
5925 29 Apr 20 nicklas 362         throw new RuntimeException(msg.toString(), lastException);
5628 24 Sep 19 nicklas 363       }
5628 24 Sep 19 nicklas 364       
5628 24 Sep 19 nicklas 365       if (debugMode)
5628 24 Sep 19 nicklas 366       {
5628 24 Sep 19 nicklas 367         // DEBUG!! will make it easier to re-run a job with same settings
5628 24 Sep 19 nicklas 368         response.setError("[DEBUG] "+msg, null);
5628 24 Sep 19 nicklas 369       }
5628 24 Sep 19 nicklas 370       else
5628 24 Sep 19 nicklas 371       {
5628 24 Sep 19 nicklas 372         response.setDone(msg.toString());
5628 24 Sep 19 nicklas 373       }
6186 26 Mar 21 nicklas 374       CounterService.getInstance().setForceCount();
6186 26 Mar 21 nicklas 375       if (autoConfirm) AutoConfirmService.getInstance().setForceCheck(15);
6186 26 Mar 21 nicklas 376
5628 24 Sep 19 nicklas 377     }
5628 24 Sep 19 nicklas 378     catch (Throwable t)
5628 24 Sep 19 nicklas 379     {
5628 24 Sep 19 nicklas 380       response.setError(t.getMessage(), Arrays.asList(new Throwable[] { t }));
5628 24 Sep 19 nicklas 381     }
5628 24 Sep 19 nicklas 382     finally
5628 24 Sep 19 nicklas 383     {
5628 24 Sep 19 nicklas 384       if (dc != null) dc.close();
5628 24 Sep 19 nicklas 385       if (ssp != null) ssp.removeWorkDir();
5628 24 Sep 19 nicklas 386       closeLogFile();
5628 24 Sep 19 nicklas 387     }
5628 24 Sep 19 nicklas 388     
5628 24 Sep 19 nicklas 389   }
5929 05 May 20 nicklas 390   
5929 05 May 20 nicklas 391   private Map<String, String> translations;
5937 15 May 20 nicklas 392   // Translate some swedish to english
5929 05 May 20 nicklas 393   private String translate(String word)
5929 05 May 20 nicklas 394   {
5929 05 May 20 nicklas 395     if (word == null) return null;
5962 03 Jun 20 nicklas 396     if (translations == null) translations =  SspModel.getTranslations();
5929 05 May 20 nicklas 397     String translatedWord = translations.get(word.toLowerCase());
5929 05 May 20 nicklas 398     return translatedWord == null ? word : translatedWord;
5929 05 May 20 nicklas 399   }
5628 24 Sep 19 nicklas 400
5937 15 May 20 nicklas 401   private Pattern translatePattern;
5937 15 May 20 nicklas 402   // Translate each class in the scores list
5937 15 May 20 nicklas 403   private String translateScores(String scores)
5937 15 May 20 nicklas 404   {
5937 15 May 20 nicklas 405     if (translatePattern == null)
5937 15 May 20 nicklas 406     {
5937 15 May 20 nicklas 407       // Pattern to match ClassA=ScoreA; ClassB=ScoreB; ...ClassN=ScoreN
5937 15 May 20 nicklas 408       // We catch 'Class' in $1 and rest in $2
5962 03 Jun 20 nicklas 409       // Note: there can be spaces classes, for example: 'Class A'
5962 03 Jun 20 nicklas 410       translatePattern = Pattern.compile("(\\w+[\\s\\w]*)(=.+?(;|$))");
5937 15 May 20 nicklas 411     }
5937 15 May 20 nicklas 412     Matcher m = translatePattern.matcher(scores);
5937 15 May 20 nicklas 413     return m.replaceAll(mr -> translate(mr.group(1))+mr.group(2));
5937 15 May 20 nicklas 414   }
5937 15 May 20 nicklas 415   
5628 24 Sep 19 nicklas 416   // -------------------------------------
5628 24 Sep 19 nicklas 417   /*
5628 24 Sep 19 nicklas 418      From the InteractivePlugin interface
5628 24 Sep 19 nicklas 419      -------------------------------------------
5628 24 Sep 19 nicklas 420   */
5628 24 Sep 19 nicklas 421   /**
5628 24 Sep 19 nicklas 422     The plug-in will appear on the single-item and list page for raw bioassays.
5628 24 Sep 19 nicklas 423   */
5628 24 Sep 19 nicklas 424   @Override
5628 24 Sep 19 nicklas 425   public Set<GuiContext> getGuiContexts()
5628 24 Sep 19 nicklas 426   {
5628 24 Sep 19 nicklas 427     Set<GuiContext> ctx = new HashSet<GuiContext>();
5628 24 Sep 19 nicklas 428     ctx.add(GuiContext.item(Item.RAWBIOASSAY));
5628 24 Sep 19 nicklas 429     ctx.add(GuiContext.list(Item.RAWBIOASSAY));
5628 24 Sep 19 nicklas 430     return Collections.unmodifiableSet(ctx);
5628 24 Sep 19 nicklas 431   }
5628 24 Sep 19 nicklas 432   /**
5628 24 Sep 19 nicklas 433     We accept all StringTie raw bioassays.
5628 24 Sep 19 nicklas 434   */
5628 24 Sep 19 nicklas 435   @Override
5628 24 Sep 19 nicklas 436   public String isInContext(GuiContext context, Object item)
5628 24 Sep 19 nicklas 437   {
5628 24 Sep 19 nicklas 438     String message = null;
5628 24 Sep 19 nicklas 439     if (context.getType() == GuiContext.Type.ITEM)
5628 24 Sep 19 nicklas 440     {
5628 24 Sep 19 nicklas 441       if (item == null)
5628 24 Sep 19 nicklas 442       {
5628 24 Sep 19 nicklas 443         message = "The object is null";
5628 24 Sep 19 nicklas 444       }
5628 24 Sep 19 nicklas 445       else if (!(item instanceof RawBioAssay))
5628 24 Sep 19 nicklas 446       {
5628 24 Sep 19 nicklas 447         message = "The object is not a raw bioassay: " + item;
5628 24 Sep 19 nicklas 448       }
5628 24 Sep 19 nicklas 449       else
5628 24 Sep 19 nicklas 450       {
5628 24 Sep 19 nicklas 451         RawBioAssay pba = (RawBioAssay)item;
5628 24 Sep 19 nicklas 452         if (!pba.getRawDataType().equals(Rawdatatype.STRINGTIE.getRawDataType()))
5628 24 Sep 19 nicklas 453         {
5628 24 Sep 19 nicklas 454           message = "The rawbioassay doesn't contain StringTie data.";
5628 24 Sep 19 nicklas 455         }
5628 24 Sep 19 nicklas 456       }
5628 24 Sep 19 nicklas 457     }
5628 24 Sep 19 nicklas 458     return message;
5628 24 Sep 19 nicklas 459   }
5628 24 Sep 19 nicklas 460   
5628 24 Sep 19 nicklas 461   @Override
5628 24 Sep 19 nicklas 462   public RequestInformation getRequestInformation(GuiContext context, String command) 
5628 24 Sep 19 nicklas 463     throws BaseException
5628 24 Sep 19 nicklas 464   {
5628 24 Sep 19 nicklas 465     RequestInformation requestInformation = null;
5628 24 Sep 19 nicklas 466     if (Request.COMMAND_CONFIGURE_PLUGIN.equals(command))
5628 24 Sep 19 nicklas 467     {
5628 24 Sep 19 nicklas 468       requestInformation = getConfigurePluginParameters();
5628 24 Sep 19 nicklas 469     }
5628 24 Sep 19 nicklas 470     else if (Request.COMMAND_CONFIGURE_JOB.equals(command))
5628 24 Sep 19 nicklas 471     {
5628 24 Sep 19 nicklas 472       requestInformation = getConfigureJobParameters(context, null);
5628 24 Sep 19 nicklas 473     }
5628 24 Sep 19 nicklas 474     return requestInformation;
5628 24 Sep 19 nicklas 475   }
5628 24 Sep 19 nicklas 476   
5628 24 Sep 19 nicklas 477   @SuppressWarnings("unchecked")
5628 24 Sep 19 nicklas 478   @Override
5628 24 Sep 19 nicklas 479   public void configure(GuiContext context, Request request, Response response)
5628 24 Sep 19 nicklas 480   {
5628 24 Sep 19 nicklas 481     String command = request.getCommand();
5628 24 Sep 19 nicklas 482     DbControl dc = null;
5628 24 Sep 19 nicklas 483     try
5628 24 Sep 19 nicklas 484     {
5628 24 Sep 19 nicklas 485       if (command.equals(Request.COMMAND_CONFIGURE_PLUGIN))
5628 24 Sep 19 nicklas 486       {
5628 24 Sep 19 nicklas 487         RequestInformation ri = getConfigurePluginParameters();
5628 24 Sep 19 nicklas 488         List<Throwable> errors = validateRequestParameters(ri.getParameters(), request);
5628 24 Sep 19 nicklas 489         if (errors != null)
5628 24 Sep 19 nicklas 490         {
5628 24 Sep 19 nicklas 491           response.setError(errors.size() + " invalid parameters were found in the request",errors);
5628 24 Sep 19 nicklas 492           return;
5628 24 Sep 19 nicklas 493         }
5628 24 Sep 19 nicklas 494         storeValues(configuration, request, ri.getParameter("models"));
5628 24 Sep 19 nicklas 495         response.setDone("Configuration complete");
5628 24 Sep 19 nicklas 496       }
5628 24 Sep 19 nicklas 497       else if (command.equals(Request.COMMAND_CONFIGURE_JOB))
5628 24 Sep 19 nicklas 498       {
5628 24 Sep 19 nicklas 499         RequestInformation ri = getConfigureJobParameters(context, !request.isAllowedImmediateExecution());
5628 24 Sep 19 nicklas 500         List<Throwable> errors = validateRequestParameters(ri.getParameters(), request);
5628 24 Sep 19 nicklas 501         if (errors != null)
5628 24 Sep 19 nicklas 502         {
5628 24 Sep 19 nicklas 503           response.setError(errors.size() + " invalid parameters were found in the request",errors);
5628 24 Sep 19 nicklas 504           return;
5628 24 Sep 19 nicklas 505         }
5628 24 Sep 19 nicklas 506         
5628 24 Sep 19 nicklas 507         storeValues(job, request, ri.getParameter("models"));
5628 24 Sep 19 nicklas 508         
5628 24 Sep 19 nicklas 509         // Error handling and debugging parameters
5628 24 Sep 19 nicklas 510         storeValue(job, request, ri.getParameter(Parameters.LOGFILE_PARAMETER));
5628 24 Sep 19 nicklas 511         storeValue(job, request, ri.getParameter(Parameters.DRY_RUN_PARAMETER));
5628 24 Sep 19 nicklas 512         storeValue(job, request, ri.getParameter("debugMode"));
5628 24 Sep 19 nicklas 513         response.setDryRun(Boolean.TRUE.equals(request.getParameterValue(Parameters.DRY_RUN_PARAMETER)));
5628 24 Sep 19 nicklas 514         
5628 24 Sep 19 nicklas 515         if (context.getType() == GuiContext.Type.ITEM)
5628 24 Sep 19 nicklas 516         {
5628 24 Sep 19 nicklas 517           storeValue(job, request, ri.getParameter("rawBioAssays"));
5628 24 Sep 19 nicklas 518           RawBioAssay rba = (RawBioAssay)job.getValue("rawBioAssays");
5628 24 Sep 19 nicklas 519           response.setSuggestedJobName("Run single-sample predictor: " + rba.getName());
5628 24 Sep 19 nicklas 520           response.setDone("The job configuration is complete", ExecutionTime.SHORTEST);
5628 24 Sep 19 nicklas 521         }
5628 24 Sep 19 nicklas 522         else
5628 24 Sep 19 nicklas 523         {
5628 24 Sep 19 nicklas 524           List<RawBioAssay> rawBioAssays = job.getValues("rawBioAssays");
5628 24 Sep 19 nicklas 525           if (rawBioAssays == null)
5628 24 Sep 19 nicklas 526           {
5628 24 Sep 19 nicklas 527             String whichItems = (String)request.getParameterValue("whichItems");
5628 24 Sep 19 nicklas 528             
5628 24 Sep 19 nicklas 529             ItemContext cc = sc.getCurrentContext(context.getItem(), context.getSubContext());
5628 24 Sep 19 nicklas 530             ItemQuery<RawBioAssay> query = (ItemQuery<RawBioAssay>)cc.getQuery();
5628 24 Sep 19 nicklas 531             Rawdatatype.STRINGTIE.addFilter(dc, query);
5628 24 Sep 19 nicklas 532             if ("all".equals(whichItems))
5628 24 Sep 19 nicklas 533             {  
5628 24 Sep 19 nicklas 534               query.setFirstResult(0);
5628 24 Sep 19 nicklas 535               query.setMaxResults(0);
5628 24 Sep 19 nicklas 536             }
5628 24 Sep 19 nicklas 537             else if ("selected".equals(whichItems))
5628 24 Sep 19 nicklas 538             {
5628 24 Sep 19 nicklas 539               query.setFirstResult(0);
5628 24 Sep 19 nicklas 540               query.setMaxResults(0);
5628 24 Sep 19 nicklas 541               query.restrict(
5628 24 Sep 19 nicklas 542                 Restrictions.in(
5628 24 Sep 19 nicklas 543                   Hql.property("id"),
5628 24 Sep 19 nicklas 544                   Expressions.parameter("_selected_", cc.getSelected(), Type.INT)
5628 24 Sep 19 nicklas 545                 )
5628 24 Sep 19 nicklas 546               );
5628 24 Sep 19 nicklas 547             }
5628 24 Sep 19 nicklas 548           
5628 24 Sep 19 nicklas 549             dc = sc.newDbControl();
5628 24 Sep 19 nicklas 550             rawBioAssays = query.list(dc);
5921 27 Apr 20 nicklas 551             if (rawBioAssays.size() > 0)
5921 27 Apr 20 nicklas 552             {
5921 27 Apr 20 nicklas 553               job.setValues("rawBioAssays", new ItemParameterType<RawBioAssay>(RawBioAssay.class, null, true, 0, null), rawBioAssays);
5921 27 Apr 20 nicklas 554             }
5628 24 Sep 19 nicklas 555           }
5628 24 Sep 19 nicklas 556           if (rawBioAssays.size() == 0)
5628 24 Sep 19 nicklas 557           {
5921 27 Apr 20 nicklas 558             response.setError("None of the selected raw bioassays have StringTie data.", null);
5628 24 Sep 19 nicklas 559             return;
5628 24 Sep 19 nicklas 560           }
5628 24 Sep 19 nicklas 561           else
5628 24 Sep 19 nicklas 562           {
5628 24 Sep 19 nicklas 563             List<String> models = job.getValues("models");
5628 24 Sep 19 nicklas 564             response.setSuggestedJobName("Run single-sample predictor for " + rawBioAssays.size() + 
5628 24 Sep 19 nicklas 565               " raw bioassays. Models: " + Values.getString(models, ", ", true));
5628 24 Sep 19 nicklas 566           }
5628 24 Sep 19 nicklas 567           response.setDone("The job configuration is complete", ExecutionTime.SHORTEST);
5628 24 Sep 19 nicklas 568         }
5628 24 Sep 19 nicklas 569       }
5628 24 Sep 19 nicklas 570     }
5628 24 Sep 19 nicklas 571     catch(Throwable ex)
5628 24 Sep 19 nicklas 572     {
5628 24 Sep 19 nicklas 573       response.setError(ex.getMessage(), Arrays.asList(ex));
5628 24 Sep 19 nicklas 574     }
5628 24 Sep 19 nicklas 575     finally
5628 24 Sep 19 nicklas 576     {
5628 24 Sep 19 nicklas 577       if (dc != null) dc.close();
5628 24 Sep 19 nicklas 578     }
5628 24 Sep 19 nicklas 579   }
5628 24 Sep 19 nicklas 580   // ------------------------------------------------
5628 24 Sep 19 nicklas 581
5941 18 May 20 nicklas 582   private PluginParameter<String> getSspModelsParameter(DbControl dc)
5628 24 Sep 19 nicklas 583   {
5628 24 Sep 19 nicklas 584     Enumeration<String, String> reportOptions = new Enumeration<String, String>();
5942 18 May 20 nicklas 585     List<SspModel> models = SspModel.getValidModels(dc);
5941 18 May 20 nicklas 586     //Collections.sort(models);
5628 24 Sep 19 nicklas 587     for (SspModel model : models)
5628 24 Sep 19 nicklas 588     {
5942 18 May 20 nicklas 589       String name = model.getName();
5942 18 May 20 nicklas 590       reportOptions.add(name, name);
5628 24 Sep 19 nicklas 591     }
5628 24 Sep 19 nicklas 592
5628 24 Sep 19 nicklas 593     return new PluginParameter<String>(
5628 24 Sep 19 nicklas 594       "models", "Models", "Select the models to use with this configuration.", null,
5926 29 Apr 20 nicklas 595       new StringParameterType(255, null, true, 0, 0, 0, reportOptions)
5628 24 Sep 19 nicklas 596       );
5628 24 Sep 19 nicklas 597   }
5628 24 Sep 19 nicklas 598   
5628 24 Sep 19 nicklas 599   private RequestInformation getConfigurePluginParameters()
5941 18 May 20 nicklas 600   {
5628 24 Sep 19 nicklas 601     List<PluginParameter<?>> parameters = new ArrayList<PluginParameter<?>>();
5941 18 May 20 nicklas 602     DbControl dc = null;
5941 18 May 20 nicklas 603     try
5941 18 May 20 nicklas 604     {
5941 18 May 20 nicklas 605       dc = sc.newDbControl();
5941 18 May 20 nicklas 606       parameters.add(getSspModelsParameter(dc));
5941 18 May 20 nicklas 607     }
5941 18 May 20 nicklas 608     finally
5941 18 May 20 nicklas 609     {
5941 18 May 20 nicklas 610       if (dc != null) dc.close();
5941 18 May 20 nicklas 611     }
5628 24 Sep 19 nicklas 612     
5628 24 Sep 19 nicklas 613     RequestInformation configurePlugin = new RequestInformation
5628 24 Sep 19 nicklas 614     (
5628 24 Sep 19 nicklas 615       Request.COMMAND_CONFIGURE_PLUGIN, 
5628 24 Sep 19 nicklas 616       "Model options", 
5628 24 Sep 19 nicklas 617       "Select models to use with this configuration.", 
5628 24 Sep 19 nicklas 618       parameters
5628 24 Sep 19 nicklas 619     );
5628 24 Sep 19 nicklas 620     return configurePlugin;
5628 24 Sep 19 nicklas 621   }
5628 24 Sep 19 nicklas 622
5628 24 Sep 19 nicklas 623   private RequestInformation getConfigureJobParameters(GuiContext context, Boolean requireFile)
5628 24 Sep 19 nicklas 624   {
5628 24 Sep 19 nicklas 625     RequestInformation configureJob = null;
5628 24 Sep 19 nicklas 626     
5628 24 Sep 19 nicklas 627     List<PluginParameter<?>> parameters = new ArrayList<PluginParameter<?>>();
5628 24 Sep 19 nicklas 628     DbControl dc = null;
5628 24 Sep 19 nicklas 629     try
5628 24 Sep 19 nicklas 630     {
5628 24 Sep 19 nicklas 631       ItemContext cc = sc.getCurrentContext(context.getItem(), context.getSubContext());
5628 24 Sep 19 nicklas 632       dc = sc.newDbControl();
5628 24 Sep 19 nicklas 633       if (context.getType() == GuiContext.Type.ITEM)
5628 24 Sep 19 nicklas 634       {
5628 24 Sep 19 nicklas 635         parameters.add(new PluginParameter<RawBioAssay>(
5628 24 Sep 19 nicklas 636             "rawBioAssays", "Raw bioassay", "Select the rawbioassay", 
5628 24 Sep 19 nicklas 637             new ItemParameterType<RawBioAssay>(RawBioAssay.class, null, true, 1, null)
5628 24 Sep 19 nicklas 638           ));
5628 24 Sep 19 nicklas 639       }
5628 24 Sep 19 nicklas 640       else
5628 24 Sep 19 nicklas 641       {
5628 24 Sep 19 nicklas 642         if (job.getValues("rawBioAssays") == null)
5628 24 Sep 19 nicklas 643         {
5628 24 Sep 19 nicklas 644           String defaultWhich = "all";
5628 24 Sep 19 nicklas 645           Enumeration<String, String> options = new Enumeration<String, String>();
5628 24 Sep 19 nicklas 646           if (cc.getSelected().size() > 0)
5628 24 Sep 19 nicklas 647           {
5628 24 Sep 19 nicklas 648             options.add("selected", "Selected items");
5628 24 Sep 19 nicklas 649             defaultWhich = "selected";
5628 24 Sep 19 nicklas 650           }
5628 24 Sep 19 nicklas 651           options.add("all", "All items");
5628 24 Sep 19 nicklas 652           parameters.add(new PluginParameter<String>
5628 24 Sep 19 nicklas 653             (
5921 27 Apr 20 nicklas 654               "whichItems", "Which raw bioassays", 
5921 27 Apr 20 nicklas 655               "Select the <b>StringTie</b> raw bioassays to analyze with the Single Sample Predictor. ",
5921 27 Apr 20 nicklas 656               defaultWhich, new StringParameterType(255, defaultWhich, true, 1, 0, 0, options)
5628 24 Sep 19 nicklas 657             ));
5628 24 Sep 19 nicklas 658         }
5628 24 Sep 19 nicklas 659       }  
5941 18 May 20 nicklas 660       parameters.add(getSspModelsParameter(dc));
5628 24 Sep 19 nicklas 661       
5628 24 Sep 19 nicklas 662       parameters.add(Parameters.errorSection(null, null));
5628 24 Sep 19 nicklas 663       parameters.add(Parameters.logFileParameter(null, null, null));
5628 24 Sep 19 nicklas 664       parameters.add(Parameters.dryRunParameter(null, null, null));
5628 24 Sep 19 nicklas 665       
5628 24 Sep 19 nicklas 666       // If <developer-mode>1</developer-mode> is in reggie-config.xml we allow debug via parameter
5628 24 Sep 19 nicklas 667       if (Values.getBoolean(Reggie.getConfig().getConfig("developer-mode")))
5628 24 Sep 19 nicklas 668       {
5628 24 Sep 19 nicklas 669         parameters.add(new PluginParameter<Boolean>(
5628 24 Sep 19 nicklas 670           "debugMode", "Debug mode", "Runs the plug-in in debug mode. Major difference is "
5628 24 Sep 19 nicklas 671               + "that it will always report an error making it easier to re-start the "
5628 24 Sep 19 nicklas 672               + "plug-in with the same parameters.",
5628 24 Sep 19 nicklas 673           new BooleanParameterType(null, false)
5628 24 Sep 19 nicklas 674           ));
5628 24 Sep 19 nicklas 675       }
5628 24 Sep 19 nicklas 676
5628 24 Sep 19 nicklas 677       configureJob = new RequestInformation
5628 24 Sep 19 nicklas 678       (
5628 24 Sep 19 nicklas 679         Request.COMMAND_CONFIGURE_JOB, 
5921 27 Apr 20 nicklas 680         "Singe Sample Predictor options", 
5921 27 Apr 20 nicklas 681         "Select which models to use and which raw bioassays to analyze.", 
5628 24 Sep 19 nicklas 682         parameters
5628 24 Sep 19 nicklas 683       );
5628 24 Sep 19 nicklas 684       dc.close();
5628 24 Sep 19 nicklas 685     }
5628 24 Sep 19 nicklas 686     finally
5628 24 Sep 19 nicklas 687     {
5628 24 Sep 19 nicklas 688       if (dc != null) dc.close();
5628 24 Sep 19 nicklas 689     }
5628 24 Sep 19 nicklas 690       
5628 24 Sep 19 nicklas 691     return configureJob;
5628 24 Sep 19 nicklas 692   }
5628 24 Sep 19 nicklas 693   /*
5628 24 Sep 19 nicklas 694     From the SignalTarget interface
5628 24 Sep 19 nicklas 695     -------------------------------------------
5628 24 Sep 19 nicklas 696   */
5628 24 Sep 19 nicklas 697   @Override
5628 24 Sep 19 nicklas 698   public SignalHandler getSignalHandler()
5628 24 Sep 19 nicklas 699   {
5628 24 Sep 19 nicklas 700     signalHandler = new ThreadSignalHandler();
5628 24 Sep 19 nicklas 701     return signalHandler;
5628 24 Sep 19 nicklas 702   }
5628 24 Sep 19 nicklas 703   // -------------------------------------------
5628 24 Sep 19 nicklas 704
5628 24 Sep 19 nicklas 705
5628 24 Sep 19 nicklas 706
5628 24 Sep 19 nicklas 707 }