extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/plugins/CaliperRunParametersExporter.java

Code
Comments
Other
Rev Date Author Line
1562 15 Mar 12 nicklas 1 package net.sf.basedb.reggie.plugins;
1562 15 Mar 12 nicklas 2
1562 15 Mar 12 nicklas 3 import java.io.IOException;
1562 15 Mar 12 nicklas 4 import java.io.OutputStreamWriter;
1562 15 Mar 12 nicklas 5 import java.io.Writer;
1562 15 Mar 12 nicklas 6 import java.util.ArrayList;
1562 15 Mar 12 nicklas 7 import java.util.Arrays;
1562 15 Mar 12 nicklas 8 import java.util.Collections;
1562 15 Mar 12 nicklas 9 import java.util.Iterator;
1562 15 Mar 12 nicklas 10 import java.util.List;
1562 15 Mar 12 nicklas 11 import java.util.Set;
1562 15 Mar 12 nicklas 12
3009 04 Dec 14 nicklas 13 import org.jdom2.Document;
3009 04 Dec 14 nicklas 14 import org.jdom2.Element;
3009 04 Dec 14 nicklas 15 import org.jdom2.output.Format;
3009 04 Dec 14 nicklas 16 import org.jdom2.output.XMLOutputter;
1562 15 Mar 12 nicklas 17
1562 15 Mar 12 nicklas 18 import net.sf.basedb.core.BaseException;
1562 15 Mar 12 nicklas 19 import net.sf.basedb.core.BioMaterial;
1562 15 Mar 12 nicklas 20 import net.sf.basedb.core.BioPlate;
1562 15 Mar 12 nicklas 21 import net.sf.basedb.core.BioWell;
1562 15 Mar 12 nicklas 22 import net.sf.basedb.core.DbControl;
1562 15 Mar 12 nicklas 23 import net.sf.basedb.core.Item;
1562 15 Mar 12 nicklas 24 import net.sf.basedb.core.ItemParameterType;
1562 15 Mar 12 nicklas 25 import net.sf.basedb.core.ItemQuery;
1562 15 Mar 12 nicklas 26 import net.sf.basedb.core.Path;
1562 15 Mar 12 nicklas 27 import net.sf.basedb.core.PermissionDeniedException;
1562 15 Mar 12 nicklas 28 import net.sf.basedb.core.PluginDefinition;
1562 15 Mar 12 nicklas 29 import net.sf.basedb.core.PluginParameter;
1562 15 Mar 12 nicklas 30 import net.sf.basedb.core.ProgressReporter;
1562 15 Mar 12 nicklas 31 import net.sf.basedb.core.RequestInformation;
1562 15 Mar 12 nicklas 32 import net.sf.basedb.core.User;
1562 15 Mar 12 nicklas 33 import net.sf.basedb.core.Job.ExecutionTime;
1562 15 Mar 12 nicklas 34 import net.sf.basedb.core.StringParameterType;
1562 15 Mar 12 nicklas 35 import net.sf.basedb.core.plugin.AbstractExporterPlugin;
1562 15 Mar 12 nicklas 36 import net.sf.basedb.core.plugin.ExportOutputStream;
1562 15 Mar 12 nicklas 37 import net.sf.basedb.core.plugin.GuiContext;
1562 15 Mar 12 nicklas 38 import net.sf.basedb.core.plugin.InteractivePlugin;
1562 15 Mar 12 nicklas 39 import net.sf.basedb.core.plugin.ParameterValues;
1562 15 Mar 12 nicklas 40 import net.sf.basedb.core.plugin.ParameterValuesWrapper;
1562 15 Mar 12 nicklas 41 import net.sf.basedb.core.plugin.Request;
1562 15 Mar 12 nicklas 42 import net.sf.basedb.core.plugin.Response;
1562 15 Mar 12 nicklas 43 import net.sf.basedb.core.query.Hql;
1562 15 Mar 12 nicklas 44 import net.sf.basedb.core.query.Orders;
1610 23 Apr 12 nicklas 45 import net.sf.basedb.reggie.dao.Annotationtype;
1562 15 Mar 12 nicklas 46 import net.sf.basedb.util.Values;
1562 15 Mar 12 nicklas 47
1562 15 Mar 12 nicklas 48 /**
1562 15 Mar 12 nicklas 49   Plug-in for exporting run parameters that can be imported when starting
1562 15 Mar 12 nicklas 50   a Caliper run. The run file contains information about bioassay type (standard
1562 15 Mar 12 nicklas 51   or high sense) and which wells that should be included in the run.
1562 15 Mar 12 nicklas 52
1562 15 Mar 12 nicklas 53   This class can be used as a BASE plug-in or as a standalone exporter.
1562 15 Mar 12 nicklas 54   In the latter case, simply use the {@link #exportRunParameters(DbControl, BioPlate, boolean, ParameterValues, Writer)}
1562 15 Mar 12 nicklas 55   method.
1562 15 Mar 12 nicklas 56   <p>
1562 15 Mar 12 nicklas 57   
1562 15 Mar 12 nicklas 58   Since the exporter should be really quick it doesn't implement support for aborting
1562 15 Mar 12 nicklas 59   or progress reporting.
1562 15 Mar 12 nicklas 60   
1562 15 Mar 12 nicklas 61   @author nicklas
1562 15 Mar 12 nicklas 62   @since 2.4
1562 15 Mar 12 nicklas 63 */
1562 15 Mar 12 nicklas 64 public class CaliperRunParametersExporter 
1562 15 Mar 12 nicklas 65   extends AbstractExporterPlugin 
1562 15 Mar 12 nicklas 66   implements InteractivePlugin
1562 15 Mar 12 nicklas 67 {
1562 15 Mar 12 nicklas 68
1562 15 Mar 12 nicklas 69   private RequestInformation configureJob;
1562 15 Mar 12 nicklas 70   
1562 15 Mar 12 nicklas 71   public CaliperRunParametersExporter()
1562 15 Mar 12 nicklas 72   {}
1562 15 Mar 12 nicklas 73   
1562 15 Mar 12 nicklas 74   /*
1562 15 Mar 12 nicklas 75      From the Plugin interface
1562 15 Mar 12 nicklas 76      --------------------------------
1562 15 Mar 12 nicklas 77   */
1562 15 Mar 12 nicklas 78   @Override
1562 15 Mar 12 nicklas 79   public boolean supportsConfigurations()
1562 15 Mar 12 nicklas 80   {
1562 15 Mar 12 nicklas 81     return true;
1562 15 Mar 12 nicklas 82   }
1562 15 Mar 12 nicklas 83   @Override
1562 15 Mar 12 nicklas 84   public boolean requiresConfiguration()
1562 15 Mar 12 nicklas 85   {
1562 15 Mar 12 nicklas 86     return true;
1562 15 Mar 12 nicklas 87   }
1562 15 Mar 12 nicklas 88   // -------------------------------------
1562 15 Mar 12 nicklas 89   
1562 15 Mar 12 nicklas 90   /*
1562 15 Mar 12 nicklas 91      From the InteractivePlugin interface
1562 15 Mar 12 nicklas 92      -------------------------------------------
1562 15 Mar 12 nicklas 93   */
1562 15 Mar 12 nicklas 94   /**
1562 15 Mar 12 nicklas 95     The plug-in will appear on the 
1562 15 Mar 12 nicklas 96    */
1562 15 Mar 12 nicklas 97   @Override
1562 15 Mar 12 nicklas 98   public Set<GuiContext> getGuiContexts()
1562 15 Mar 12 nicklas 99   {
1562 15 Mar 12 nicklas 100     return Collections.singleton(GuiContext.item(Item.BIOPLATE));
1562 15 Mar 12 nicklas 101   }
1562 15 Mar 12 nicklas 102   /**
1562 15 Mar 12 nicklas 103     We accept all bioplates.
1562 15 Mar 12 nicklas 104   */
1562 15 Mar 12 nicklas 105   @Override
1562 15 Mar 12 nicklas 106   public String isInContext(GuiContext context, Object item)
1562 15 Mar 12 nicklas 107   {
1562 15 Mar 12 nicklas 108     String message = null;
1562 15 Mar 12 nicklas 109     if (item == null)
1562 15 Mar 12 nicklas 110     {
1562 15 Mar 12 nicklas 111       message = "The object is null";
1562 15 Mar 12 nicklas 112     }
1562 15 Mar 12 nicklas 113     else if (!(item instanceof BioPlate))
1562 15 Mar 12 nicklas 114     {
1562 15 Mar 12 nicklas 115       message = "The object is not a BioPlate: " + item;
1562 15 Mar 12 nicklas 116     }
1562 15 Mar 12 nicklas 117     return message;
1562 15 Mar 12 nicklas 118   }
1562 15 Mar 12 nicklas 119   @Override
1562 15 Mar 12 nicklas 120   public RequestInformation getRequestInformation(GuiContext context, String command) 
1562 15 Mar 12 nicklas 121     throws BaseException
1562 15 Mar 12 nicklas 122   {
1562 15 Mar 12 nicklas 123     RequestInformation requestInformation = null;
1562 15 Mar 12 nicklas 124     if (Request.COMMAND_CONFIGURE_PLUGIN.equals(command))
1562 15 Mar 12 nicklas 125     {
1562 15 Mar 12 nicklas 126       requestInformation = getConfigurePluginParameters();
1562 15 Mar 12 nicklas 127     }
1562 15 Mar 12 nicklas 128     else if (Request.COMMAND_CONFIGURE_JOB.equals(command))
1562 15 Mar 12 nicklas 129     {
1562 15 Mar 12 nicklas 130       requestInformation = getConfigureJobParameters(null);
1562 15 Mar 12 nicklas 131     }
1562 15 Mar 12 nicklas 132     return requestInformation;
1562 15 Mar 12 nicklas 133   }
1562 15 Mar 12 nicklas 134   @Override
1562 15 Mar 12 nicklas 135   public void configure(GuiContext context, Request request, Response response)
1562 15 Mar 12 nicklas 136   {
1562 15 Mar 12 nicklas 137     String command = request.getCommand();    
1562 15 Mar 12 nicklas 138     try
1562 15 Mar 12 nicklas 139     {
1562 15 Mar 12 nicklas 140       if (command.equals(Request.COMMAND_CONFIGURE_PLUGIN))
1562 15 Mar 12 nicklas 141       {
1562 15 Mar 12 nicklas 142         RequestInformation ri = getConfigurePluginParameters();
1562 15 Mar 12 nicklas 143         List<Throwable> errors = validateRequestParameters(ri.getParameters(), request);
1562 15 Mar 12 nicklas 144         if (errors != null)
1562 15 Mar 12 nicklas 145         {
1562 15 Mar 12 nicklas 146           response.setError(errors.size() + " invalid parameters were found in the request",errors);
1562 15 Mar 12 nicklas 147           return;
1562 15 Mar 12 nicklas 148         }        
1562 15 Mar 12 nicklas 149
1562 15 Mar 12 nicklas 150         storeValue(configuration, request, ri.getParameter("sensitivity"));
1562 15 Mar 12 nicklas 151         storeValue(configuration, request, ri.getParameter("AssayType"));
1562 15 Mar 12 nicklas 152         storeValue(configuration, request, ri.getParameter("PlateName"));
1562 15 Mar 12 nicklas 153         storeValue(configuration, request, ri.getParameter("DataPath"));
1562 15 Mar 12 nicklas 154         response.setDone("Plugin configuration complete");
1562 15 Mar 12 nicklas 155       }
1562 15 Mar 12 nicklas 156       else if (command.equals(Request.COMMAND_CONFIGURE_JOB))
1562 15 Mar 12 nicklas 157       {
1562 15 Mar 12 nicklas 158         RequestInformation ri = getConfigureJobParameters(!request.isAllowedImmediateExecution());
1562 15 Mar 12 nicklas 159         List<Throwable> errors = validateRequestParameters(ri.getParameters(), request);
1562 15 Mar 12 nicklas 160         if (errors != null)
1562 15 Mar 12 nicklas 161         {
1562 15 Mar 12 nicklas 162           response.setError(errors.size() + " invalid parameters were found in the request",errors);
1562 15 Mar 12 nicklas 163           return;
1562 15 Mar 12 nicklas 164         }        
1562 15 Mar 12 nicklas 165         
1562 15 Mar 12 nicklas 166         storeValue(job, request, ri.getParameter("bioplate"));
1562 15 Mar 12 nicklas 167         if (request.getParameterValue(SAVE_AS) == null)
1562 15 Mar 12 nicklas 168         {
1562 15 Mar 12 nicklas 169           if (!request.isAllowedImmediateExecution())
1562 15 Mar 12 nicklas 170           {
1562 15 Mar 12 nicklas 171             response.setError("Immediate download is not allowed. Please specify a filename.", null);
1562 15 Mar 12 nicklas 172             return;
1562 15 Mar 12 nicklas 173           }
1562 15 Mar 12 nicklas 174           BioPlate plate = (BioPlate)request.getParameterValue("bioplate");
1562 15 Mar 12 nicklas 175           response.setDownloadImmediately("Export Caliper sample names for bioplate " + 
1562 15 Mar 12 nicklas 176               plate.getName(), ExecutionTime.SHORTEST, true);
1562 15 Mar 12 nicklas 177         }
1562 15 Mar 12 nicklas 178         else
1562 15 Mar 12 nicklas 179         {
1562 15 Mar 12 nicklas 180           Object parameterValue = request.getParameterValue(OVERWRITE); 
1562 15 Mar 12 nicklas 181           boolean overwrite = parameterValue != null ? (Boolean)parameterValue : false;
1562 15 Mar 12 nicklas 182           if (!pathCanBeUsed((String)request.getParameterValue(ri.getParameter(SAVE_AS).getName()), overwrite))
1562 15 Mar 12 nicklas 183           {
1562 15 Mar 12 nicklas 184             response.setError("File exists: " + (String)request.getParameterValue(ri.getParameter(SAVE_AS).getName()), null);
1562 15 Mar 12 nicklas 185             return;
1562 15 Mar 12 nicklas 186           }
1562 15 Mar 12 nicklas 187           storeValue(job, request, ri.getParameter(SAVE_AS));
1562 15 Mar 12 nicklas 188           storeValue(job, request, ri.getParameter(OVERWRITE));
1562 15 Mar 12 nicklas 189           BioPlate plate = (BioPlate)job.getValue("bioplate");
1562 15 Mar 12 nicklas 190           response.setSuggestedJobName("Export Caliper sample names for bioplate '" + plate.getName() + "'");
1562 15 Mar 12 nicklas 191           response.setDone("The job configuration is complete", ExecutionTime.SHORTEST);
1562 15 Mar 12 nicklas 192         }
1562 15 Mar 12 nicklas 193       }
1562 15 Mar 12 nicklas 194     }
1562 15 Mar 12 nicklas 195     catch(Throwable ex)
1562 15 Mar 12 nicklas 196     {
1562 15 Mar 12 nicklas 197       response.setError(ex.getMessage(), Arrays.asList(ex));
1562 15 Mar 12 nicklas 198     }    
1562 15 Mar 12 nicklas 199   }
1562 15 Mar 12 nicklas 200   // ------------------------------------------------
1562 15 Mar 12 nicklas 201   
1562 15 Mar 12 nicklas 202   
1562 15 Mar 12 nicklas 203   /*
1562 15 Mar 12 nicklas 204     From the AbstractExporterPlugin interface
1562 15 Mar 12 nicklas 205     -----------------------------------------
1562 15 Mar 12 nicklas 206   */
1562 15 Mar 12 nicklas 207   private DbControl dc;
1562 15 Mar 12 nicklas 208   private int numExported;
1562 15 Mar 12 nicklas 209   @Override
1562 15 Mar 12 nicklas 210   protected void begin(DbControl dc)
1562 15 Mar 12 nicklas 211   {
1562 15 Mar 12 nicklas 212     this.dc = dc;
1562 15 Mar 12 nicklas 213   }
1562 15 Mar 12 nicklas 214
1562 15 Mar 12 nicklas 215   @Override
1562 15 Mar 12 nicklas 216   protected void performExport(ExportOutputStream out, ProgressReporter progress) 
1562 15 Mar 12 nicklas 217     throws IOException 
1562 15 Mar 12 nicklas 218   {
1562 15 Mar 12 nicklas 219     BioPlate plate = (BioPlate)job.getValue("bioplate");
1562 15 Mar 12 nicklas 220     plate = BioPlate.getById(dc, plate.getId());
1562 15 Mar 12 nicklas 221     out.setMimeType("application/xml");
1562 15 Mar 12 nicklas 222     String filename = Path.makeSafeFilename(plate.getName(), "")+".xml";
1562 15 Mar 12 nicklas 223     out.setFilename(filename);
1562 15 Mar 12 nicklas 224     out.setCharacterSet("UTF-8");
1562 15 Mar 12 nicklas 225     boolean hiSense = "High".equals(configuration.getValue("sensitivity"));
1562 15 Mar 12 nicklas 226     
1562 15 Mar 12 nicklas 227     Writer writer = new OutputStreamWriter(out, "UTF-8");
1562 15 Mar 12 nicklas 228     
1562 15 Mar 12 nicklas 229     ParameterValues parameters = new ParameterValuesWrapper(null, job, configuration, true);
1562 15 Mar 12 nicklas 230     
1562 15 Mar 12 nicklas 231     numExported = exportRunParameters(dc, plate, hiSense, parameters, writer);
1562 15 Mar 12 nicklas 232     writer.flush();
1562 15 Mar 12 nicklas 233     
1562 15 Mar 12 nicklas 234   }
1751 28 Nov 12 nicklas 235   @Override
1562 15 Mar 12 nicklas 236   protected void end(boolean success)
1562 15 Mar 12 nicklas 237   {
1562 15 Mar 12 nicklas 238     this.dc = null;
1562 15 Mar 12 nicklas 239   }
1751 28 Nov 12 nicklas 240   @Override
1562 15 Mar 12 nicklas 241   protected String getSuccessMessage()
1562 15 Mar 12 nicklas 242   {
1562 15 Mar 12 nicklas 243     return numExported + " samples selected in run file";
1562 15 Mar 12 nicklas 244   }
1562 15 Mar 12 nicklas 245   // -------------------------------------------
1562 15 Mar 12 nicklas 246   
1562 15 Mar 12 nicklas 247   private RequestInformation getConfigurePluginParameters()
1562 15 Mar 12 nicklas 248   {
1562 15 Mar 12 nicklas 249     List<PluginParameter<?>> parameters = new ArrayList<PluginParameter<?>>();
1562 15 Mar 12 nicklas 250     
1562 15 Mar 12 nicklas 251     parameters.add(new PluginParameter<String>("sensitivity", "Sensitivity", 
1562 15 Mar 12 nicklas 252       "This parameter decide which RNA QC aliquots from the plate are selected for " +
1562 15 Mar 12 nicklas 253       "a specific run:\n" +
1562 15 Mar 12 nicklas 254       "Standard = extracts QCHiSense=FALSE or missing are selected\n" +
1562 15 Mar 12 nicklas 255       "High = extracts with QCHiSense=TRUE are selected",
1562 15 Mar 12 nicklas 256       new StringParameterType(255, "Standard", true, 1, 0, 0, Arrays.asList("Standard", "High"))
1562 15 Mar 12 nicklas 257     ));
1562 15 Mar 12 nicklas 258     
1562 15 Mar 12 nicklas 259     parameters.add(new PluginParameter<String>("AssayType", "Assay Type", 
1562 15 Mar 12 nicklas 260       "Enter the name of the Assay Type parameter as it appears in the Run dialog in the Caliper software. " +
1562 15 Mar 12 nicklas 261       "If an incorrect name is used the exported file can't be used by Caliper.", 
1562 15 Mar 12 nicklas 262       new StringParameterType(255, null, true)
1562 15 Mar 12 nicklas 263     ));
1562 15 Mar 12 nicklas 264     
1562 15 Mar 12 nicklas 265     parameters.add(new PluginParameter<String>("PlateName", "Plate Name", 
1562 15 Mar 12 nicklas 266       "Enter the name of the plate as it appears in the Run dialog in the Caliper software. " +
1562 15 Mar 12 nicklas 267       "If an incorrect name is used the exported file can't be used by Caliper.", 
1562 15 Mar 12 nicklas 268       new StringParameterType(255, null, true)
1562 15 Mar 12 nicklas 269     ));
1562 15 Mar 12 nicklas 270     
1562 15 Mar 12 nicklas 271     parameters.add(new PluginParameter<String>("DataPath", "Data Path", 
1562 15 Mar 12 nicklas 272       "Enter the path on the Caliper computer where data files should be saved." +
1562 15 Mar 12 nicklas 273       "If not specified, the descision is left to the Caliper software.",
1562 15 Mar 12 nicklas 274       new StringParameterType()
1562 15 Mar 12 nicklas 275     ));
1562 15 Mar 12 nicklas 276     
1562 15 Mar 12 nicklas 277     return new RequestInformation(Request.COMMAND_CONFIGURE_PLUGIN, 
1562 15 Mar 12 nicklas 278       "Caliper runtime options",
1562 15 Mar 12 nicklas 279       "Select various runtime options for the Caliper software", 
1562 15 Mar 12 nicklas 280       parameters);
1562 15 Mar 12 nicklas 281   }
1562 15 Mar 12 nicklas 282   
1562 15 Mar 12 nicklas 283   private RequestInformation getConfigureJobParameters(Boolean requireFile)
1562 15 Mar 12 nicklas 284   {
1562 15 Mar 12 nicklas 285     if (configureJob == null)
1562 15 Mar 12 nicklas 286     {
1562 15 Mar 12 nicklas 287       // Load the current bioplate
1562 15 Mar 12 nicklas 288       BioPlate currentPlate = null;
1562 15 Mar 12 nicklas 289       int currentPlateId = sc.getCurrentContext(Item.BIOPLATE).getId();
1562 15 Mar 12 nicklas 290       if (currentPlateId != 0)
1562 15 Mar 12 nicklas 291       {
1562 15 Mar 12 nicklas 292         DbControl dc = sc.newDbControl();
1562 15 Mar 12 nicklas 293         try
1562 15 Mar 12 nicklas 294         {
1562 15 Mar 12 nicklas 295           currentPlate = BioPlate.getById(dc, currentPlateId);
1562 15 Mar 12 nicklas 296         }
1562 15 Mar 12 nicklas 297         finally
1562 15 Mar 12 nicklas 298         {
1562 15 Mar 12 nicklas 299           if (dc != null) dc.close();
1562 15 Mar 12 nicklas 300         }
1562 15 Mar 12 nicklas 301       }
1562 15 Mar 12 nicklas 302       
1562 15 Mar 12 nicklas 303       List<PluginParameter<?>> parameters = new ArrayList<PluginParameter<?>>();
1562 15 Mar 12 nicklas 304
1562 15 Mar 12 nicklas 305       parameters.add(new PluginParameter<BioPlate>(
1562 15 Mar 12 nicklas 306         "bioplate", "Bioplate", "Select the bioplate to export", 
1562 15 Mar 12 nicklas 307         new ItemParameterType<BioPlate>(BioPlate.class, currentPlate, true, 1, null)
1562 15 Mar 12 nicklas 308       ));
1562 15 Mar 12 nicklas 309       
1562 15 Mar 12 nicklas 310       if (requireFile == null)
1562 15 Mar 12 nicklas 311       {
1562 15 Mar 12 nicklas 312         PluginDefinition pd = job.getPluginDefinition();
1562 15 Mar 12 nicklas 313         requireFile = pd == null ? false : !pd.getAllowImmediateExecution();
1562 15 Mar 12 nicklas 314       }
1562 15 Mar 12 nicklas 315       String defaultPath = null;
1562 15 Mar 12 nicklas 316       if (requireFile && currentPlate != null)
1562 15 Mar 12 nicklas 317       {
1562 15 Mar 12 nicklas 318         defaultPath = "~/" + Path.makeSafeFilename(currentPlate.getName(), "") + ".csv";
1562 15 Mar 12 nicklas 319       }
1562 15 Mar 12 nicklas 320       parameters.add(getSaveAsParameter(null, null, defaultPath, requireFile));
1562 15 Mar 12 nicklas 321       parameters.add(getOverwriteParameter(null, null));
1562 15 Mar 12 nicklas 322       
1562 15 Mar 12 nicklas 323       configureJob = new RequestInformation
1562 15 Mar 12 nicklas 324       (
1562 15 Mar 12 nicklas 325         Request.COMMAND_CONFIGURE_JOB,
1562 15 Mar 12 nicklas 326         "Caliper export options",
1562 15 Mar 12 nicklas 327         "Select bioplate and the file path where the export file should be saved",
1562 15 Mar 12 nicklas 328         parameters
1562 15 Mar 12 nicklas 329       );
1562 15 Mar 12 nicklas 330     }
1562 15 Mar 12 nicklas 331     return configureJob;
1562 15 Mar 12 nicklas 332   }
1562 15 Mar 12 nicklas 333
1562 15 Mar 12 nicklas 334   /**
1562 15 Mar 12 nicklas 335     Export Caliper run parameters for the given bioplate. The data is written
1562 15 Mar 12 nicklas 336     to the given writer formatted according to the Caliper specifications.
1562 15 Mar 12 nicklas 337     <p>
1562 15 Mar 12 nicklas 338     The parameters parameter may include the following string values. We list
1562 15 Mar 12 nicklas 339     the parameter name and default value.
1562 15 Mar 12 nicklas 340     
1562 15 Mar 12 nicklas 341     <ul>
1562 15 Mar 12 nicklas 342     <li>AssayType: 'HT RNA High Sens' or 'HT RNA Std Sens'
1562 15 Mar 12 nicklas 343     <li>Operator: The name of the logged in user
1562 15 Mar 12 nicklas 344     <li>PlateName: FrameStar Skirted 96 [sip 2mm]
1562 15 Mar 12 nicklas 345     <li>DataPath: C:\\CaliperFiles
1562 15 Mar 12 nicklas 346     <li>ComputerName: False
1562 15 Mar 12 nicklas 347     <li>ProjectName: 'std' or 'hi'
1562 15 Mar 12 nicklas 348     <li>DailySubDir: True
1562 15 Mar 12 nicklas 349     <li>UseBarcodeEnabled: False
1562 15 Mar 12 nicklas 350     <li>IncludeBarcodeInDataFile: False
1562 15 Mar 12 nicklas 351     <li>IncludeDateInDataFile: True
1569 16 Mar 12 nicklas 352     <li>IncludeTimeInDataFile: False
1562 15 Mar 12 nicklas 353     <li>PlateCycles: 1
1562 15 Mar 12 nicklas 354     <li>SampleSaver: False
1562 15 Mar 12 nicklas 355     <li>SampleSaverRepeats: 1
1562 15 Mar 12 nicklas 356     </ul>
1562 15 Mar 12 nicklas 357       
1562 15 Mar 12 nicklas 358     
1562 15 Mar 12 nicklas 359     @param plate The bioplate to export
1562 15 Mar 12 nicklas 360     @param hiSense If extracts flagged with QCHiSense should be exporter or not
1562 15 Mar 12 nicklas 361     @param parameters More parameters for the export
1562 15 Mar 12 nicklas 362     @return The number of wells included in the selection
1562 15 Mar 12 nicklas 363   */
1562 15 Mar 12 nicklas 364   public int exportRunParameters(DbControl dc, BioPlate plate, boolean hiSense, ParameterValues parameters, Writer out)
1562 15 Mar 12 nicklas 365     throws IOException
1562 15 Mar 12 nicklas 366   {
1562 15 Mar 12 nicklas 367     // RunParameters is the root element
1562 15 Mar 12 nicklas 368     Element root = new Element("RunParameters");
1562 15 Mar 12 nicklas 369     Document doc = new Document(root);
1562 15 Mar 12 nicklas 370
1562 15 Mar 12 nicklas 371     // Assay type
1562 15 Mar 12 nicklas 372     addChildElement(root, "AssayType", getParameter(parameters, "AssayType", hiSense ? "HT RNA High Sens" : "HT RNA Std Sens"));
1562 15 Mar 12 nicklas 373
1562 15 Mar 12 nicklas 374     User user = User.getById(dc, dc.getSessionControl().getLoggedInUserId());
1562 15 Mar 12 nicklas 375     
1562 15 Mar 12 nicklas 376     // Operator
1562 15 Mar 12 nicklas 377     addChildElement(root, "Operator", getParameter(parameters, "Operator", user.getName()));
1562 15 Mar 12 nicklas 378     
1562 15 Mar 12 nicklas 379     // PlateName
1562 15 Mar 12 nicklas 380     addChildElement(root, "PlateName", getParameter(parameters, "PlateName", "FrameStar Skirted 96 [sip 2mm]"));
1562 15 Mar 12 nicklas 381     
1562 15 Mar 12 nicklas 382     // SelectedSamples
1562 15 Mar 12 nicklas 383     List<String> selectedWells = new ArrayList<String>(plate.getUsedWells());
1562 15 Mar 12 nicklas 384     
1562 15 Mar 12 nicklas 385     //Query to get all non-empty wells on the plate
1562 15 Mar 12 nicklas 386     ItemQuery<BioWell> query = plate.getBioWells();
1562 15 Mar 12 nicklas 387     
1562 15 Mar 12 nicklas 388     // Load only non-empty wells
1562 15 Mar 12 nicklas 389     query.join(Hql.innerJoin(null, "bioMaterial", "bm", true));
1562 15 Mar 12 nicklas 390     query.order(Orders.asc(Hql.property("row")));
1562 15 Mar 12 nicklas 391     query.order(Orders.asc(Hql.property("column")));
1562 15 Mar 12 nicklas 392
1562 15 Mar 12 nicklas 393     Iterator<BioWell> it = query.iterate(dc);
1562 15 Mar 12 nicklas 394     while (it.hasNext())
1562 15 Mar 12 nicklas 395     {
1562 15 Mar 12 nicklas 396       BioWell well = it.next();
1562 15 Mar 12 nicklas 397       boolean isHiSense = false;
1562 15 Mar 12 nicklas 398       try
1562 15 Mar 12 nicklas 399       {
1562 15 Mar 12 nicklas 400         BioMaterial bm = well.getBioMaterial();
1610 23 Apr 12 nicklas 401         isHiSense = Boolean.TRUE.equals(Annotationtype.QC_HISENSE.getAnnotationValue(dc, bm));
1562 15 Mar 12 nicklas 402       }
1562 15 Mar 12 nicklas 403       catch (PermissionDeniedException ex)
1562 15 Mar 12 nicklas 404       {}
1562 15 Mar 12 nicklas 405       if (hiSense == isHiSense) selectedWells.add(well.getCoordinate());
1562 15 Mar 12 nicklas 406     }
1562 15 Mar 12 nicklas 407     
1562 15 Mar 12 nicklas 408     addChildElement(root, "SelectedSamples", Values.getString(selectedWells, ",", true));
1562 15 Mar 12 nicklas 409     
1562 15 Mar 12 nicklas 410     String fileName = Path.makeSafeFilename(plate.getName(), "");
1562 15 Mar 12 nicklas 411     
1562 15 Mar 12 nicklas 412     // Data path
1562 15 Mar 12 nicklas 413     addChildElement(root, "DataPath", getParameter(parameters, "DataPath", "C:\\CaliperFiles"));
1562 15 Mar 12 nicklas 414
1562 15 Mar 12 nicklas 415     // File name generation
1562 15 Mar 12 nicklas 416     addChildElement(root, "DataFilePrefix", fileName);
1562 15 Mar 12 nicklas 417     addChildElement(root, "ComputerName", getParameter(parameters, "ComputerName", "False"));
1562 15 Mar 12 nicklas 418     addChildElement(root, "ProjectName", getParameter(parameters, "ProjectName", hiSense ? "hi" : "std"));
1562 15 Mar 12 nicklas 419     addChildElement(root, "DailySubDir", getParameter(parameters, "DailySubDir", "True"));
1562 15 Mar 12 nicklas 420     addChildElement(root, "UseBarcodeEnabled", getParameter(parameters, "UseBarcodeEnabled", "False"));
1562 15 Mar 12 nicklas 421     addChildElement(root, "IncludeBarcodeInDataFile", getParameter(parameters, "IncludeBarcodeInDataFile", "False"));
1562 15 Mar 12 nicklas 422     addChildElement(root, "IncludeDateInDataFile", getParameter(parameters, "IncludeDateInDataFile", "True"));
1569 16 Mar 12 nicklas 423     addChildElement(root, "IncludeTimeInDataFile", getParameter(parameters, "IncludeTimeInDataFile", "False"));
1562 15 Mar 12 nicklas 424     
1562 15 Mar 12 nicklas 425     // Repeats
1562 15 Mar 12 nicklas 426     addChildElement(root, "PlateCycles", getParameter(parameters, "PlateCycles", "1"));
1562 15 Mar 12 nicklas 427     addChildElement(root, "SampleSaver", getParameter(parameters, "SampleSaver", "False"));
1562 15 Mar 12 nicklas 428     addChildElement(root, "SampleSaverRepeats", getParameter(parameters, "SampleSaverRepeats", "1"));
1562 15 Mar 12 nicklas 429     
1562 15 Mar 12 nicklas 430     // SampleNamesFilePath
1562 15 Mar 12 nicklas 431     addChildElement(root, "SampleNamesFilePath", fileName + ".csv");
1562 15 Mar 12 nicklas 432     
1562 15 Mar 12 nicklas 433     // Write document
1562 15 Mar 12 nicklas 434     out.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
1562 15 Mar 12 nicklas 435     XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat().setEncoding("UTF-8"));
1562 15 Mar 12 nicklas 436     xmlOut.output(root, out);
1562 15 Mar 12 nicklas 437     out.flush();
1562 15 Mar 12 nicklas 438     return selectedWells.size();
1562 15 Mar 12 nicklas 439   }
1562 15 Mar 12 nicklas 440   
1562 15 Mar 12 nicklas 441   
1562 15 Mar 12 nicklas 442   private Element addChildElement(Element parent, String childName, String childText)
1562 15 Mar 12 nicklas 443   {
1562 15 Mar 12 nicklas 444     Element child = new Element(childName);
1562 15 Mar 12 nicklas 445     child.setText(childText);
1562 15 Mar 12 nicklas 446     parent.addContent(child);
1562 15 Mar 12 nicklas 447     return child;
1562 15 Mar 12 nicklas 448   }
1562 15 Mar 12 nicklas 449   
1562 15 Mar 12 nicklas 450   private String getParameter(ParameterValues parameters, String key, String defaultValue)
1562 15 Mar 12 nicklas 451   {
1562 15 Mar 12 nicklas 452     String value = (String)parameters.getValue(key);
1562 15 Mar 12 nicklas 453     return value == null ? defaultValue : value;
1562 15 Mar 12 nicklas 454   }
1562 15 Mar 12 nicklas 455 }