extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/servlet/StringTie2023Servlet.java

Code
Comments
Other
Rev Date Author Line
6818 26 Aug 22 nicklas 1 package net.sf.basedb.reggie.servlet;
6818 26 Aug 22 nicklas 2
6818 26 Aug 22 nicklas 3 import java.io.IOException;
6818 26 Aug 22 nicklas 4 import java.util.ArrayList;
6818 26 Aug 22 nicklas 5 import java.util.List;
6818 26 Aug 22 nicklas 6
6818 26 Aug 22 nicklas 7 import javax.servlet.ServletException;
6818 26 Aug 22 nicklas 8 import javax.servlet.http.HttpServlet;
6818 26 Aug 22 nicklas 9 import javax.servlet.http.HttpServletRequest;
6818 26 Aug 22 nicklas 10 import javax.servlet.http.HttpServletResponse;
6818 26 Aug 22 nicklas 11
6818 26 Aug 22 nicklas 12 import org.json.simple.JSONArray;
6818 26 Aug 22 nicklas 13 import org.json.simple.JSONObject;
6818 26 Aug 22 nicklas 14
6819 26 Aug 22 nicklas 15 import net.sf.basedb.core.Annotatable;
6818 26 Aug 22 nicklas 16 import net.sf.basedb.core.ArrayDesign;
6822 29 Aug 22 nicklas 17 import net.sf.basedb.core.BasicItem;
6818 26 Aug 22 nicklas 18 import net.sf.basedb.core.ItemList;
6821 29 Aug 22 nicklas 19 import net.sf.basedb.core.ItemNotFoundException;
6818 26 Aug 22 nicklas 20 import net.sf.basedb.core.DbControl;
6818 26 Aug 22 nicklas 21 import net.sf.basedb.core.DerivedBioAssay;
6822 29 Aug 22 nicklas 22 import net.sf.basedb.core.Extract;
6822 29 Aug 22 nicklas 23 import net.sf.basedb.core.File;
6818 26 Aug 22 nicklas 24 import net.sf.basedb.core.ItemQuery;
6821 29 Aug 22 nicklas 25 import net.sf.basedb.core.Job;
6818 26 Aug 22 nicklas 26 import net.sf.basedb.core.Project;
6821 29 Aug 22 nicklas 27 import net.sf.basedb.core.Protocol;
6822 29 Aug 22 nicklas 28 import net.sf.basedb.core.RawBioAssay;
6818 26 Aug 22 nicklas 29 import net.sf.basedb.core.SessionControl;
6821 29 Aug 22 nicklas 30 import net.sf.basedb.core.Software;
6822 29 Aug 22 nicklas 31 import net.sf.basedb.core.Trashcan;
6822 29 Aug 22 nicklas 32 import net.sf.basedb.core.query.Annotations;
6822 29 Aug 22 nicklas 33 import net.sf.basedb.core.query.Expressions;
6818 26 Aug 22 nicklas 34 import net.sf.basedb.core.query.Hql;
6818 26 Aug 22 nicklas 35 import net.sf.basedb.core.query.Orders;
6822 29 Aug 22 nicklas 36 import net.sf.basedb.core.query.Restrictions;
6818 26 Aug 22 nicklas 37 import net.sf.basedb.core.snapshot.SnapshotManager;
6821 29 Aug 22 nicklas 38 import net.sf.basedb.opengrid.JobDefinition;
6821 29 Aug 22 nicklas 39 import net.sf.basedb.opengrid.OpenGridCluster;
6821 29 Aug 22 nicklas 40 import net.sf.basedb.opengrid.service.OpenGridService;
6818 26 Aug 22 nicklas 41 import net.sf.basedb.reggie.JsonUtil;
6818 26 Aug 22 nicklas 42 import net.sf.basedb.reggie.Reggie;
6822 29 Aug 22 nicklas 43 import net.sf.basedb.reggie.activity.ActivityDef;
6818 26 Aug 22 nicklas 44 import net.sf.basedb.reggie.counter.CounterService;
6818 26 Aug 22 nicklas 45 import net.sf.basedb.reggie.dao.AlignedSequences;
6818 26 Aug 22 nicklas 46 import net.sf.basedb.reggie.dao.Annotationtype;
6818 26 Aug 22 nicklas 47 import net.sf.basedb.reggie.dao.Arraydesign;
6818 26 Aug 22 nicklas 48 import net.sf.basedb.reggie.dao.BiomaterialList;
6822 29 Aug 22 nicklas 49 import net.sf.basedb.reggie.dao.Datafiletype;
6818 26 Aug 22 nicklas 50 import net.sf.basedb.reggie.dao.Library;
6819 26 Aug 22 nicklas 51 import net.sf.basedb.reggie.dao.Pipeline;
6822 29 Aug 22 nicklas 52 import net.sf.basedb.reggie.dao.Rawbioassay;
6818 26 Aug 22 nicklas 53 import net.sf.basedb.reggie.dao.Rawdatatype;
6821 29 Aug 22 nicklas 54 import net.sf.basedb.reggie.dao.ReggieRole;
6818 26 Aug 22 nicklas 55 import net.sf.basedb.reggie.dao.Rna;
6818 26 Aug 22 nicklas 56 import net.sf.basedb.reggie.dao.Subtype;
6821 29 Aug 22 nicklas 57 import net.sf.basedb.reggie.grid.ScriptUtil;
6821 29 Aug 22 nicklas 58 import net.sf.basedb.reggie.grid.StringTie2023JobCreator;
6818 26 Aug 22 nicklas 59 import net.sf.basedb.util.Values;
6818 26 Aug 22 nicklas 60 import net.sf.basedb.util.error.ThrowableUtil;
6819 26 Aug 22 nicklas 61 import net.sf.basedb.util.filter.Filter;
6818 26 Aug 22 nicklas 62
6818 26 Aug 22 nicklas 63
6818 26 Aug 22 nicklas 64 public class StringTie2023Servlet 
6818 26 Aug 22 nicklas 65   extends HttpServlet 
6818 26 Aug 22 nicklas 66 {
6818 26 Aug 22 nicklas 67
6818 26 Aug 22 nicklas 68   private static final long serialVersionUID = -3398530236563046936L;
6818 26 Aug 22 nicklas 69
6818 26 Aug 22 nicklas 70   public StringTie2023Servlet()
6818 26 Aug 22 nicklas 71   {}
6818 26 Aug 22 nicklas 72
6818 26 Aug 22 nicklas 73   @Override
6818 26 Aug 22 nicklas 74   protected void doGet(HttpServletRequest req, HttpServletResponse resp)
6818 26 Aug 22 nicklas 75     throws ServletException, IOException 
6818 26 Aug 22 nicklas 76   {
6818 26 Aug 22 nicklas 77     String cmd = req.getParameter("cmd");
6818 26 Aug 22 nicklas 78     JsonUtil.setJsonResponseHeaders(resp);
6818 26 Aug 22 nicklas 79     
6818 26 Aug 22 nicklas 80     JSONObject json = new JSONObject();
6818 26 Aug 22 nicklas 81     json.put("status", "ok");
6818 26 Aug 22 nicklas 82     
6818 26 Aug 22 nicklas 83     final SessionControl sc = Reggie.getSessionControl(req);
6818 26 Aug 22 nicklas 84     DbControl dc = null;
6818 26 Aug 22 nicklas 85     try
6818 26 Aug 22 nicklas 86     {
6818 26 Aug 22 nicklas 87       if ("GetAlignedSequencesForStringTie2023".equals(cmd))
6818 26 Aug 22 nicklas 88       {
6818 26 Aug 22 nicklas 89         dc = sc.newDbControl(":Start StringTie/2023");
6818 26 Aug 22 nicklas 90         
6818 26 Aug 22 nicklas 91         List<AlignedSequences> list = null;
6818 26 Aug 22 nicklas 92         String items = Values.getStringOrNull(req.getParameter("items"));
6818 26 Aug 22 nicklas 93         if (items == null)
6818 26 Aug 22 nicklas 94         {
6818 26 Aug 22 nicklas 95           ItemList stringtiePipeline = BiomaterialList.STRINGTIE_2023_PIPELINE.load(dc);
6818 26 Aug 22 nicklas 96           ItemQuery<DerivedBioAssay> query = stringtiePipeline.getMembers();
6818 26 Aug 22 nicklas 97           query.setIncludes(Reggie.INCLUDE_IN_CURRENT_PROJECT);
6818 26 Aug 22 nicklas 98           Subtype.ALIGNED_SEQUENCES.addFilter(dc, query);
6818 26 Aug 22 nicklas 99           // Join LibPlate for sorting
6818 26 Aug 22 nicklas 100           query.join(Hql.innerJoin(null, "extract", "lib", true));
6818 26 Aug 22 nicklas 101           query.join(Hql.innerJoin("lib", "bioWell", "bw", true));
6818 26 Aug 22 nicklas 102           query.join(Hql.innerJoin("bw", "bioPlate", "libPlate", true));
6818 26 Aug 22 nicklas 103           query.order(Orders.asc(Hql.property("libPlate", "id")));
6818 26 Aug 22 nicklas 104           query.order(Orders.asc(Hql.property("name")));
6818 26 Aug 22 nicklas 105           query.setMaxResults(250);
6818 26 Aug 22 nicklas 106           list = AlignedSequences.toList(query.list(dc));
6818 26 Aug 22 nicklas 107         }
6818 26 Aug 22 nicklas 108         else
6818 26 Aug 22 nicklas 109         {
6818 26 Aug 22 nicklas 110           Integer[] ids = Values.getInt(items.split(","));
6818 26 Aug 22 nicklas 111           list = new ArrayList<AlignedSequences>();
6818 26 Aug 22 nicklas 112           for (Integer id : ids)
6818 26 Aug 22 nicklas 113           {
6818 26 Aug 22 nicklas 114             list.add(AlignedSequences.getById(dc, id));
6818 26 Aug 22 nicklas 115           }
6818 26 Aug 22 nicklas 116         }
6818 26 Aug 22 nicklas 117         SnapshotManager manager = new SnapshotManager();
6818 26 Aug 22 nicklas 118         JSONArray jsonAlignedSequences = new JSONArray();
6818 26 Aug 22 nicklas 119         for (AlignedSequences as : list)
6818 26 Aug 22 nicklas 120         {
6818 26 Aug 22 nicklas 121           as.loadAnnotations(dc, "pipeline", Annotationtype.PIPELINE, null);
6818 26 Aug 22 nicklas 122           Library lib = as.getLibrary(dc);
6818 26 Aug 22 nicklas 123           lib.loadBioPlateLocation();
6818 26 Aug 22 nicklas 124           Rna r = lib.getRna(dc, true);
6818 26 Aug 22 nicklas 125           if (r != null) lib.setAnnotation("specimen", r.loadYellowLabelInfo(dc, manager));
6818 26 Aug 22 nicklas 126           as.setAnnotation("lib", lib.asJSONObject());
6818 26 Aug 22 nicklas 127           as.loadAnnotations(dc, manager, "AutoProcess", Annotationtype.AUTO_PROCESSING, null);
6818 26 Aug 22 nicklas 128           as.loadDoNotUseAnnotations(dc, manager);
6818 26 Aug 22 nicklas 129           jsonAlignedSequences.add(as.asJSONObject());
6818 26 Aug 22 nicklas 130         }
6818 26 Aug 22 nicklas 131         json.put("alignedSequences", jsonAlignedSequences);
6818 26 Aug 22 nicklas 132       }
6818 26 Aug 22 nicklas 133       else if ("GetArrayDesigns".equals(cmd))
6818 26 Aug 22 nicklas 134       {
6818 26 Aug 22 nicklas 135         /*
6818 26 Aug 22 nicklas 136           Get information array designs.
6818 26 Aug 22 nicklas 137         */
6818 26 Aug 22 nicklas 138         dc = sc.newDbControl(":Start StringTie/2023");
6818 26 Aug 22 nicklas 139         
6819 26 Aug 22 nicklas 140         Filter<Annotatable> pipelineFilter = Annotationtype.PIPELINE.createFilter(Pipeline.RNASEQ_STRINGTIE_2023.getName());
6819 26 Aug 22 nicklas 141         List<Arraydesign> designs = Arraydesign.findByPlatformVariant(dc, Rawdatatype.STRINGTIE.getVariantId(), pipelineFilter);
6818 26 Aug 22 nicklas 142         Project project = sc.getActiveProjectId() == 0 ? null : Project.getById(dc, sc.getActiveProjectId());
6818 26 Aug 22 nicklas 143         
6818 26 Aug 22 nicklas 144         int defaultDesignId = -1;
6818 26 Aug 22 nicklas 145         JSONObject jsonDefault = null;
6818 26 Aug 22 nicklas 146         JSONArray jsonDesigns = new JSONArray();
6818 26 Aug 22 nicklas 147         for (Arraydesign design : designs)
6818 26 Aug 22 nicklas 148         {
6818 26 Aug 22 nicklas 149           ArrayDesign ad = design.getItem();
6818 26 Aug 22 nicklas 150           if (ad.getNumFileFeatures() == 0) continue; // Skip array designs with no features
6818 26 Aug 22 nicklas 151           
6818 26 Aug 22 nicklas 152           JSONObject jsonDesign = design.asJSONObject();
6818 26 Aug 22 nicklas 153           jsonDesigns.add(jsonDesign);
6818 26 Aug 22 nicklas 154           
6818 26 Aug 22 nicklas 155           // Check if the current design is the latest default design
6818 26 Aug 22 nicklas 156           if (project != null && project.isDefaultItem(ad) && ad.getId() > defaultDesignId)
6818 26 Aug 22 nicklas 157           {
6818 26 Aug 22 nicklas 158             defaultDesignId = ad.getId();
6818 26 Aug 22 nicklas 159             jsonDefault = jsonDesign;
6818 26 Aug 22 nicklas 160           }
6818 26 Aug 22 nicklas 161         }
6818 26 Aug 22 nicklas 162
6818 26 Aug 22 nicklas 163         if (jsonDefault != null)
6818 26 Aug 22 nicklas 164         {
6818 26 Aug 22 nicklas 165           jsonDefault.put("isDefault", true);
6818 26 Aug 22 nicklas 166         }
6818 26 Aug 22 nicklas 167         json.put("arrayDesigns", jsonDesigns);
6818 26 Aug 22 nicklas 168       }
6822 29 Aug 22 nicklas 169       else if ("GetUnconfirmed".equals(cmd))
6822 29 Aug 22 nicklas 170       {
6822 29 Aug 22 nicklas 171         dc = sc.newDbControl(":Confirm StringTie/2023");
6822 29 Aug 22 nicklas 172         ItemQuery<RawBioAssay> query = RawBioAssay.getQuery();
6822 29 Aug 22 nicklas 173         query.setIncludes(Reggie.INCLUDE_IN_CURRENT_PROJECT);
6822 29 Aug 22 nicklas 174         Rawdatatype.STRINGTIE.addFilter(dc, query);
6822 29 Aug 22 nicklas 175         Pipeline.RNASEQ_STRINGTIE_2023.addFilter(dc, query);
6822 29 Aug 22 nicklas 176         
6822 29 Aug 22 nicklas 177         // The job must be ended
6822 29 Aug 22 nicklas 178         query.join(Hql.innerJoin("job", "jb"));
6822 29 Aug 22 nicklas 179         query.restrict(Restrictions.neq(Hql.property("jb", "ended"), null));
6822 29 Aug 22 nicklas 180         // Must NOT have a ANALYSIS_RESULT annotation
6822 29 Aug 22 nicklas 181         query.join(Annotations.leftJoin(null, Annotationtype.ANALYSIS_RESULT.load(dc), "ar"));
6822 29 Aug 22 nicklas 182         query.restrict(Restrictions.eq(Hql.alias("ar"), null));
6822 29 Aug 22 nicklas 183         // Ignore if AutoProcess==AutoConfirm
6822 29 Aug 22 nicklas 184         query.join(Annotations.leftJoin(null, Annotationtype.AUTO_PROCESSING.load(dc), "ap"));
6822 29 Aug 22 nicklas 185         query.restrict(
6822 29 Aug 22 nicklas 186             Restrictions.or(
6822 29 Aug 22 nicklas 187               Restrictions.neq(Hql.alias("ap"), Expressions.string("AutoConfirm")),
6822 29 Aug 22 nicklas 188               Restrictions.eq(Hql.alias("ap"), null)
6822 29 Aug 22 nicklas 189             ));
6822 29 Aug 22 nicklas 190         // Join LibPlate for sorting
6822 29 Aug 22 nicklas 191         query.join(Hql.innerJoin(null, "parentExtract", "lib", true));
6822 29 Aug 22 nicklas 192         query.join(Hql.innerJoin("lib", "bioWell", "bw", true));
6822 29 Aug 22 nicklas 193         query.join(Hql.innerJoin("bw", "bioPlate", "libPlate", true));
6822 29 Aug 22 nicklas 194         query.order(Orders.asc(Hql.property("libPlate", "id")));
6822 29 Aug 22 nicklas 195         query.order(Orders.asc(Hql.property("name")));
6822 29 Aug 22 nicklas 196         query.setMaxResults(250);
6822 29 Aug 22 nicklas 197         
6822 29 Aug 22 nicklas 198         SnapshotManager manager = new SnapshotManager();
6822 29 Aug 22 nicklas 199         List<Rawbioassay> list = Rawbioassay.toList(query.list(dc));
6822 29 Aug 22 nicklas 200         JSONArray jsonRawBioAssays = new JSONArray();
6822 29 Aug 22 nicklas 201         for (Rawbioassay raw : list)
6822 29 Aug 22 nicklas 202         {
6822 29 Aug 22 nicklas 203           RawBioAssay rba = raw.getItem();
6822 29 Aug 22 nicklas 204           raw.setAnnotation("spots", rba.getNumFileSpots());
6822 29 Aug 22 nicklas 205           raw.loadAnnotations(dc, manager, "DataFilesFolder", Annotationtype.DATA_FILES_FOLDER, null);
6822 29 Aug 22 nicklas 206           
6822 29 Aug 22 nicklas 207           File geneTsv = raw.getFile(dc, Datafiletype.GENERIC_RAWDATA);
6822 29 Aug 22 nicklas 208           if (geneTsv != null) raw.setAnnotation("geneTsvFile", geneTsv.getPath().toString());
6822 29 Aug 22 nicklas 209           
6822 29 Aug 22 nicklas 210           // Load job information
6822 29 Aug 22 nicklas 211           Job job = rba.getJob();
6822 29 Aug 22 nicklas 212           JSONObject jsonJob = JsonUtil.getJobAsJSON(job);
6822 29 Aug 22 nicklas 213           raw.setAnnotation("stringTieJob", jsonJob);
6822 29 Aug 22 nicklas 214
6822 29 Aug 22 nicklas 215           // Load library information
6822 29 Aug 22 nicklas 216           Library lib = raw.getLibrary(dc);
6822 29 Aug 22 nicklas 217           Rna r = lib.getRna(dc, true);
6822 29 Aug 22 nicklas 218           lib.loadBioPlateLocation();
6822 29 Aug 22 nicklas 219           lib.setAnnotation("specimen", r.loadYellowLabelInfo(dc, manager));
6822 29 Aug 22 nicklas 220           raw.setAnnotation("lib", lib.asJSONObject());
6822 29 Aug 22 nicklas 221           
6822 29 Aug 22 nicklas 222           jsonRawBioAssays.add(raw.asJSONObject());
6822 29 Aug 22 nicklas 223         }
6822 29 Aug 22 nicklas 224         
6822 29 Aug 22 nicklas 225         json.put("rawBioAssays", jsonRawBioAssays);
6822 29 Aug 22 nicklas 226       }
6818 26 Aug 22 nicklas 227     }
6818 26 Aug 22 nicklas 228     catch (Throwable t)
6818 26 Aug 22 nicklas 229     {
6818 26 Aug 22 nicklas 230       t.printStackTrace();
6818 26 Aug 22 nicklas 231       json.clear();
6818 26 Aug 22 nicklas 232       json.put("status", "error");
6818 26 Aug 22 nicklas 233       json.put("message", t.getMessage());
6818 26 Aug 22 nicklas 234       json.put("stacktrace", ThrowableUtil.stackTraceToString(t));
6818 26 Aug 22 nicklas 235     }
6818 26 Aug 22 nicklas 236     finally
6818 26 Aug 22 nicklas 237     {
6818 26 Aug 22 nicklas 238       if (dc != null) dc.close();
6818 26 Aug 22 nicklas 239       json.writeJSONString(resp.getWriter());
6818 26 Aug 22 nicklas 240     }
6818 26 Aug 22 nicklas 241     
6818 26 Aug 22 nicklas 242   }
6818 26 Aug 22 nicklas 243
6818 26 Aug 22 nicklas 244   @Override
6818 26 Aug 22 nicklas 245   protected void doPost(HttpServletRequest req, HttpServletResponse resp)
6818 26 Aug 22 nicklas 246     throws ServletException, IOException 
6818 26 Aug 22 nicklas 247   {
6818 26 Aug 22 nicklas 248     String cmd = req.getParameter("cmd");
6818 26 Aug 22 nicklas 249     JsonUtil.setJsonResponseHeaders(resp);
6818 26 Aug 22 nicklas 250     
6818 26 Aug 22 nicklas 251     JSONObject json = new JSONObject();
6818 26 Aug 22 nicklas 252     json.put("status", "ok");
6818 26 Aug 22 nicklas 253     JSONArray jsonMessages = new JSONArray();
6818 26 Aug 22 nicklas 254   
6818 26 Aug 22 nicklas 255     final SessionControl sc = Reggie.getSessionControl(req);
6818 26 Aug 22 nicklas 256     DbControl dc = null;
6818 26 Aug 22 nicklas 257     try
6818 26 Aug 22 nicklas 258     {
6821 29 Aug 22 nicklas 259       if ("StartStringTie2023".equals(cmd))
6821 29 Aug 22 nicklas 260       {
6821 29 Aug 22 nicklas 261         dc = sc.newDbControl(":Start StringTie/2023");
6818 26 Aug 22 nicklas 262
6821 29 Aug 22 nicklas 263         ReggieRole.checkPermission(dc, "'" + cmd + "' wizard", ReggieRole.SECONDARY_ANALYSIS, ReggieRole.ADMINISTRATOR);
6821 29 Aug 22 nicklas 264
6821 29 Aug 22 nicklas 265         JSONObject jsonReq = JsonUtil.parseRequest(req);
6821 29 Aug 22 nicklas 266         JSONArray jsonAligned = (JSONArray)jsonReq.get("alignedSequences");
6821 29 Aug 22 nicklas 267       
6821 29 Aug 22 nicklas 268         Number arrayDesignId = (Number)jsonReq.get("arrayDesign");
6821 29 Aug 22 nicklas 269         Number stringtieSoftwareId = (Number)jsonReq.get("stringtieSoftware");
6821 29 Aug 22 nicklas 270         Number stringtieProtocolId = (Number)jsonReq.get("stringtieProtocol");
6821 29 Aug 22 nicklas 271       
6821 29 Aug 22 nicklas 272         String clusterId = (String)jsonReq.get("cluster");
6821 29 Aug 22 nicklas 273         boolean debug = Boolean.TRUE.equals(jsonReq.get("debug"));
6821 29 Aug 22 nicklas 274         boolean autoConfirm = Boolean.TRUE.equals(jsonReq.get("autoConfirm"));
6821 29 Aug 22 nicklas 275         Number priority = (Number)jsonReq.get("priority");
6981 17 Jan 23 nicklas 276         String partition = Values.getStringOrNull((String)jsonReq.get("partition"));
7372 06 Oct 23 nicklas 277         String submitOptions = Values.getStringOrNull((String)jsonReq.get("submitOptionsOverride"));
6821 29 Aug 22 nicklas 278
6821 29 Aug 22 nicklas 279         OpenGridCluster cluster = OpenGridService.getInstance().getClusterById(dc, clusterId);
6821 29 Aug 22 nicklas 280         if (cluster == null)
6821 29 Aug 22 nicklas 281         {
6821 29 Aug 22 nicklas 282           throw new ItemNotFoundException("OpenGridCluster[" + clusterId + "]");
6821 29 Aug 22 nicklas 283         }
6821 29 Aug 22 nicklas 284
6821 29 Aug 22 nicklas 285         // Load common items
6821 29 Aug 22 nicklas 286         ArrayDesign design = ArrayDesign.getById(dc, arrayDesignId.intValue());
6821 29 Aug 22 nicklas 287         Software stringtieSoftware = stringtieSoftwareId != null ? Software.getById(dc, stringtieSoftwareId.intValue()) : null;
6821 29 Aug 22 nicklas 288         Protocol stringtieProtocol = stringtieProtocolId != null ? Protocol.getById(dc, stringtieProtocolId.intValue()) : null;
6821 29 Aug 22 nicklas 289
6821 29 Aug 22 nicklas 290         // StringTie job creator implementation
6821 29 Aug 22 nicklas 291         StringTie2023JobCreator jobCreator = new StringTie2023JobCreator();
6821 29 Aug 22 nicklas 292         jobCreator.setArrayDesign(design);
6821 29 Aug 22 nicklas 293         jobCreator.setAutoConfirm(autoConfirm);
6821 29 Aug 22 nicklas 294         jobCreator.setDebug(debug);
6821 29 Aug 22 nicklas 295         jobCreator.setPriority(priority == null ? null : priority.intValue());
6981 17 Jan 23 nicklas 296         jobCreator.setPartition(partition);
6821 29 Aug 22 nicklas 297         jobCreator.setProtocol(stringtieProtocol);
6821 29 Aug 22 nicklas 298         jobCreator.setSoftware(stringtieSoftware);
7372 06 Oct 23 nicklas 299         jobCreator.setSubmitOptionsOverride(submitOptions);
6821 29 Aug 22 nicklas 300         
6821 29 Aug 22 nicklas 301         List<AlignedSequences> alignedSequences = new ArrayList<AlignedSequences>();
6821 29 Aug 22 nicklas 302         for (int alNo = 0; alNo < jsonAligned.size(); alNo++)
6821 29 Aug 22 nicklas 303         {
6821 29 Aug 22 nicklas 304           JSONObject jsonAl = (JSONObject)jsonAligned.get(alNo);
6821 29 Aug 22 nicklas 305           Number alignedId = (Number)jsonAl.get("id");
6821 29 Aug 22 nicklas 306         
6821 29 Aug 22 nicklas 307           AlignedSequences as = AlignedSequences.getById(dc, alignedId.intValue());
6821 29 Aug 22 nicklas 308           alignedSequences.add(as);
6821 29 Aug 22 nicklas 309
6821 29 Aug 22 nicklas 310           // Reset AUTO_PROCESSING annotation
6821 29 Aug 22 nicklas 311           DerivedBioAssay aligned = as.getDerivedBioAssay();
6821 29 Aug 22 nicklas 312           Annotationtype.AUTO_PROCESSING.setAnnotationValue(dc, aligned, null);
6821 29 Aug 22 nicklas 313         }
6821 29 Aug 22 nicklas 314
6821 29 Aug 22 nicklas 315         List<JobDefinition> jobDefs = jobCreator.createStringTieJobs(dc, cluster, alignedSequences);
6821 29 Aug 22 nicklas 316         List<Job> jobs = ScriptUtil.submitJobs(dc, cluster, jobDefs);
6821 29 Aug 22 nicklas 317         
6821 29 Aug 22 nicklas 318         for (Job job : jobs)
6821 29 Aug 22 nicklas 319         {
6821 29 Aug 22 nicklas 320           if (job.getStatus() == Job.Status.ERROR)
6821 29 Aug 22 nicklas 321           {
6821 29 Aug 22 nicklas 322             jsonMessages.add("[Error]Job submission for '" + job.getName() + "' failed: " + job.getStatusMessage());
6821 29 Aug 22 nicklas 323           }
6821 29 Aug 22 nicklas 324           else
6821 29 Aug 22 nicklas 325           {
6821 29 Aug 22 nicklas 326             jsonMessages.add("Submitted StringTie/2023 job to " + cluster.getConnectionInfo().getName() + " with id " + job.getExternalId());
6821 29 Aug 22 nicklas 327           }
6821 29 Aug 22 nicklas 328         }
6821 29 Aug 22 nicklas 329         
6821 29 Aug 22 nicklas 330         dc.commit();
6821 29 Aug 22 nicklas 331       }
6822 29 Aug 22 nicklas 332       else if ("RegisterStringTie2023".equals(cmd))
6822 29 Aug 22 nicklas 333       {
6822 29 Aug 22 nicklas 334         dc = sc.newDbControl(":Confirm StringTie/2023");
6821 29 Aug 22 nicklas 335
6822 29 Aug 22 nicklas 336         ReggieRole.checkPermission(dc, "'" + cmd + "' wizard", ReggieRole.SECONDARY_ANALYSIS, ReggieRole.ADMINISTRATOR);
6822 29 Aug 22 nicklas 337
6822 29 Aug 22 nicklas 338         JSONObject jsonReq = JsonUtil.parseRequest(req);
6822 29 Aug 22 nicklas 339         JSONArray jsonRawBioAssays = (JSONArray)jsonReq.get("rawBioAssays");
6822 29 Aug 22 nicklas 340
6822 29 Aug 22 nicklas 341         int numConfirmed = 0;
6822 29 Aug 22 nicklas 342         int numUnconfirmed = 0;
6822 29 Aug 22 nicklas 343         int numReRun = 0;
6822 29 Aug 22 nicklas 344         int numFlaggedRna = 0;
6822 29 Aug 22 nicklas 345         int numDeleted = 0;
6822 29 Aug 22 nicklas 346         
6822 29 Aug 22 nicklas 347         ItemList flaggedRna = BiomaterialList.FLAGGED_RNA.load(dc);
6822 29 Aug 22 nicklas 348         ItemList stringTiePipeline = BiomaterialList.STRINGTIE_2023_PIPELINE.load(dc);
6822 29 Aug 22 nicklas 349       
6822 29 Aug 22 nicklas 350         boolean deleteItemsCreatedByFailedJobs = Boolean.TRUE.equals(jsonReq.get("deleteItemsCreatedByFailedJobs"));
6822 29 Aug 22 nicklas 351         List<BasicItem> toDelete = new ArrayList<BasicItem>();
6822 29 Aug 22 nicklas 352         
6822 29 Aug 22 nicklas 353         for (int rawNo = 0; rawNo < jsonRawBioAssays.size(); ++rawNo)
6822 29 Aug 22 nicklas 354         {
6822 29 Aug 22 nicklas 355           JSONObject jsonRaw = (JSONObject)jsonRawBioAssays.get(rawNo);
6822 29 Aug 22 nicklas 356           Number rawdId = (Number)jsonRaw.get("id");
6822 29 Aug 22 nicklas 357           
6822 29 Aug 22 nicklas 358           Rawbioassay raw = Rawbioassay.getById(dc, rawdId.intValue());
6822 29 Aug 22 nicklas 359           AlignedSequences aligned = raw.getAlignedSequences(dc);
6822 29 Aug 22 nicklas 360           
6822 29 Aug 22 nicklas 361           DerivedBioAssay alignedDBA = aligned.getDerivedBioAssay();
6822 29 Aug 22 nicklas 362           RawBioAssay rba = raw.getRawBioAssay();
6822 29 Aug 22 nicklas 363           Job job = rba.getJob();
6822 29 Aug 22 nicklas 364           Annotationtype.AUTO_PROCESSING.setAnnotationValue(dc, rba, null);
6822 29 Aug 22 nicklas 365           
6822 29 Aug 22 nicklas 366           boolean flag = Boolean.TRUE.equals(jsonRaw.get("flag"));
6822 29 Aug 22 nicklas 367           if (flag && !Reggie.isExternalItem(raw.getName()))
6822 29 Aug 22 nicklas 368           {
6822 29 Aug 22 nicklas 369             Library lib = Library.get(rba.getParentExtract());
6822 29 Aug 22 nicklas 370             Rna rna = lib.getRna(dc, false);
6822 29 Aug 22 nicklas 371             Extract r = rna.getItem();
6822 29 Aug 22 nicklas 372             Annotationtype.FLAG.setAnnotationValue(dc, r, Rna.FLAG_STRINGTIE_FAILED);
6822 29 Aug 22 nicklas 373             flaggedRna.add(r);
6822 29 Aug 22 nicklas 374             numFlaggedRna++;
6822 29 Aug 22 nicklas 375           }
6822 29 Aug 22 nicklas 376           
6822 29 Aug 22 nicklas 377           String comment = Values.getStringOrNull((String)jsonRaw.get("comment"));
6822 29 Aug 22 nicklas 378           rba.setDescription(comment);
6822 29 Aug 22 nicklas 379           
6822 29 Aug 22 nicklas 380           boolean reRun = Boolean.TRUE.equals(jsonRaw.get("rerun"));
6822 29 Aug 22 nicklas 381           boolean confirm = Boolean.TRUE.equals(jsonRaw.get("confirm"));
6822 29 Aug 22 nicklas 382           boolean deleted = false;
6822 29 Aug 22 nicklas 383
6822 29 Aug 22 nicklas 384           if (reRun)
6822 29 Aug 22 nicklas 385           {
6822 29 Aug 22 nicklas 386             // Set ReProcess annotation on aligned sequences item
6822 29 Aug 22 nicklas 387             Annotationtype.AUTO_PROCESSING.setAnnotationValue(dc, aligned.getItem(), "ReProcess");
6822 29 Aug 22 nicklas 388             stringTiePipeline.add(aligned.getItem());
6822 29 Aug 22 nicklas 389             numReRun++;
6822 29 Aug 22 nicklas 390             
6822 29 Aug 22 nicklas 391             if (deleteItemsCreatedByFailedJobs && !confirm)
6822 29 Aug 22 nicklas 392             {
6822 29 Aug 22 nicklas 393               // Delete rawbioassay and related items
6822 29 Aug 22 nicklas 394               rba.setRemoved(true);
6822 29 Aug 22 nicklas 395               toDelete.add(rba);
6822 29 Aug 22 nicklas 396               toDelete.addAll(Reggie.removeAttachedFiles(dc, rba));
6822 29 Aug 22 nicklas 397               deleted = true;
6822 29 Aug 22 nicklas 398               numDeleted++;
6822 29 Aug 22 nicklas 399               aligned.getItem().setDescription(comment);
6822 29 Aug 22 nicklas 400             }
6822 29 Aug 22 nicklas 401           }
6822 29 Aug 22 nicklas 402           
6822 29 Aug 22 nicklas 403           if (!deleted)
6822 29 Aug 22 nicklas 404           {
6822 29 Aug 22 nicklas 405             if (confirm)
6822 29 Aug 22 nicklas 406             {
6822 29 Aug 22 nicklas 407               Annotationtype.ANALYSIS_RESULT.setAnnotationValue(dc, rba, Rawbioassay.FEATURE_EXTRACTION_SUCCESSFUL);
6822 29 Aug 22 nicklas 408               numConfirmed++;
6822 29 Aug 22 nicklas 409             }
6822 29 Aug 22 nicklas 410             else if (reRun || flag)
6822 29 Aug 22 nicklas 411             {
6822 29 Aug 22 nicklas 412               Annotationtype.ANALYSIS_RESULT.setAnnotationValue(dc, rba, Rawbioassay.FEATURE_EXTRACTION_FAILED);
6822 29 Aug 22 nicklas 413             }
6822 29 Aug 22 nicklas 414             else
6822 29 Aug 22 nicklas 415             {
6822 29 Aug 22 nicklas 416               numUnconfirmed++;
6822 29 Aug 22 nicklas 417             }
6822 29 Aug 22 nicklas 418           }
6822 29 Aug 22 nicklas 419         }
6822 29 Aug 22 nicklas 420         
6822 29 Aug 22 nicklas 421         if (numConfirmed > 0)
6822 29 Aug 22 nicklas 422         {
6822 29 Aug 22 nicklas 423           jsonMessages.add(numConfirmed + " libraries confirmed");
6822 29 Aug 22 nicklas 424           ActivityDef.STRINGTIE_CONFIRMED.merge(dc, numConfirmed);
6822 29 Aug 22 nicklas 425         }
6822 29 Aug 22 nicklas 426         else
6822 29 Aug 22 nicklas 427         {
6822 29 Aug 22 nicklas 428           jsonMessages.add("No libraries confirmed");
6822 29 Aug 22 nicklas 429         }
6822 29 Aug 22 nicklas 430         
6822 29 Aug 22 nicklas 431         if (numReRun > 0)
6822 29 Aug 22 nicklas 432         {
6822 29 Aug 22 nicklas 433           jsonMessages.add(numReRun + " libraries flagged for re-running");
6822 29 Aug 22 nicklas 434         }
6822 29 Aug 22 nicklas 435         
6822 29 Aug 22 nicklas 436         if (numDeleted > 0)
6822 29 Aug 22 nicklas 437         {
6822 29 Aug 22 nicklas 438           jsonMessages.add(numDeleted + " libraries deleted due to failure");
6822 29 Aug 22 nicklas 439           if (toDelete.size() > numDeleted)
6822 29 Aug 22 nicklas 440           {
6822 29 Aug 22 nicklas 441             jsonMessages.add((toDelete.size() - numDeleted) + " linked items (eg. parent items and files) deleted");
6822 29 Aug 22 nicklas 442           }
6822 29 Aug 22 nicklas 443         }
6822 29 Aug 22 nicklas 444         
6822 29 Aug 22 nicklas 445         if (numFlaggedRna > 0)
6822 29 Aug 22 nicklas 446         {
6822 29 Aug 22 nicklas 447           jsonMessages.add("Added " + numFlaggedRna + " RNA items to the '" + flaggedRna.getName() + "' list");
6822 29 Aug 22 nicklas 448         }
6822 29 Aug 22 nicklas 449         
6822 29 Aug 22 nicklas 450         if (numUnconfirmed > 0)
6822 29 Aug 22 nicklas 451         {
6822 29 Aug 22 nicklas 452           jsonMessages.add(numUnconfirmed + " libraries remain unconfirmed");
6822 29 Aug 22 nicklas 453         }
6822 29 Aug 22 nicklas 454         dc.commit();
6822 29 Aug 22 nicklas 455         if (toDelete.size() > 0)
6822 29 Aug 22 nicklas 456         {
6822 29 Aug 22 nicklas 457           try
6822 29 Aug 22 nicklas 458           {
6822 29 Aug 22 nicklas 459             Trashcan.delete(sc, toDelete, false, null);
6822 29 Aug 22 nicklas 460           }
6822 29 Aug 22 nicklas 461           catch (RuntimeException ex)
6822 29 Aug 22 nicklas 462           {
6822 29 Aug 22 nicklas 463             ex.printStackTrace();
6822 29 Aug 22 nicklas 464             jsonMessages.add("[Error]Could not delete all items created by failed jobs: " + ex.getMessage());
6822 29 Aug 22 nicklas 465           }
6822 29 Aug 22 nicklas 466         }
6822 29 Aug 22 nicklas 467       }
6822 29 Aug 22 nicklas 468
6818 26 Aug 22 nicklas 469       json.put("messages", jsonMessages);
6818 26 Aug 22 nicklas 470       CounterService.getInstance().setForceCount();
6818 26 Aug 22 nicklas 471     }
6818 26 Aug 22 nicklas 472     catch (Throwable t)
6818 26 Aug 22 nicklas 473     {
6818 26 Aug 22 nicklas 474       t.printStackTrace();
6818 26 Aug 22 nicklas 475       json.clear();
6818 26 Aug 22 nicklas 476       json.put("status", "error");
6818 26 Aug 22 nicklas 477       json.put("message", t.getMessage());
6818 26 Aug 22 nicklas 478       json.put("stacktrace", ThrowableUtil.stackTraceToString(t));
6818 26 Aug 22 nicklas 479     }
6818 26 Aug 22 nicklas 480     finally
6818 26 Aug 22 nicklas 481     {
6818 26 Aug 22 nicklas 482       if (dc != null) dc.close();
6818 26 Aug 22 nicklas 483       json.writeJSONString(resp.getWriter());
6818 26 Aug 22 nicklas 484     }
6818 26 Aug 22 nicklas 485     
6818 26 Aug 22 nicklas 486   }
6818 26 Aug 22 nicklas 487   
6818 26 Aug 22 nicklas 488   
6818 26 Aug 22 nicklas 489
6818 26 Aug 22 nicklas 490 }