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

Code
Comments
Other
Rev Date Author Line
6180 24 Mar 21 nicklas 1 package net.sf.basedb.reggie.servlet;
6180 24 Mar 21 nicklas 2
6180 24 Mar 21 nicklas 3 import java.io.IOException;
6180 24 Mar 21 nicklas 4 import java.util.ArrayList;
6180 24 Mar 21 nicklas 5 import java.util.List;
6180 24 Mar 21 nicklas 6
6180 24 Mar 21 nicklas 7 import javax.servlet.ServletException;
6180 24 Mar 21 nicklas 8 import javax.servlet.http.HttpServlet;
6180 24 Mar 21 nicklas 9 import javax.servlet.http.HttpServletRequest;
6180 24 Mar 21 nicklas 10 import javax.servlet.http.HttpServletResponse;
6180 24 Mar 21 nicklas 11
6180 24 Mar 21 nicklas 12 import org.json.simple.JSONArray;
6180 24 Mar 21 nicklas 13 import org.json.simple.JSONObject;
6180 24 Mar 21 nicklas 14
6180 24 Mar 21 nicklas 15 import net.sf.basedb.core.ItemList;
6215 16 Apr 21 nicklas 16 import net.sf.basedb.core.BasicItem;
6180 24 Mar 21 nicklas 17 import net.sf.basedb.core.DbControl;
6180 24 Mar 21 nicklas 18 import net.sf.basedb.core.DerivedBioAssay;
6187 26 Mar 21 nicklas 19 import net.sf.basedb.core.Extract;
6180 24 Mar 21 nicklas 20 import net.sf.basedb.core.ItemNotFoundException;
6180 24 Mar 21 nicklas 21 import net.sf.basedb.core.ItemQuery;
6181 25 Mar 21 nicklas 22 import net.sf.basedb.core.Job;
6180 24 Mar 21 nicklas 23 import net.sf.basedb.core.Protocol;
6180 24 Mar 21 nicklas 24 import net.sf.basedb.core.SessionControl;
6180 24 Mar 21 nicklas 25 import net.sf.basedb.core.Software;
6215 16 Apr 21 nicklas 26 import net.sf.basedb.core.Trashcan;
6187 26 Mar 21 nicklas 27 import net.sf.basedb.core.query.Annotations;
6187 26 Mar 21 nicklas 28 import net.sf.basedb.core.query.Expressions;
6180 24 Mar 21 nicklas 29 import net.sf.basedb.core.query.Hql;
6180 24 Mar 21 nicklas 30 import net.sf.basedb.core.query.Orders;
6187 26 Mar 21 nicklas 31 import net.sf.basedb.core.query.Restrictions;
6180 24 Mar 21 nicklas 32 import net.sf.basedb.core.snapshot.SnapshotManager;
6181 25 Mar 21 nicklas 33 import net.sf.basedb.opengrid.JobDefinition;
6180 24 Mar 21 nicklas 34 import net.sf.basedb.opengrid.OpenGridCluster;
6180 24 Mar 21 nicklas 35 import net.sf.basedb.opengrid.service.OpenGridService;
6180 24 Mar 21 nicklas 36 import net.sf.basedb.reggie.JsonUtil;
6180 24 Mar 21 nicklas 37 import net.sf.basedb.reggie.Reggie;
6187 26 Mar 21 nicklas 38 import net.sf.basedb.reggie.activity.ActivityDef;
6187 26 Mar 21 nicklas 39 import net.sf.basedb.reggie.autoconfirm.DemuxAutoConfirmer;
6180 24 Mar 21 nicklas 40 import net.sf.basedb.reggie.counter.CounterService;
6180 24 Mar 21 nicklas 41 import net.sf.basedb.reggie.dao.Annotationtype;
6180 24 Mar 21 nicklas 42 import net.sf.basedb.reggie.dao.BiomaterialList;
6214 15 Apr 21 nicklas 43 import net.sf.basedb.reggie.dao.DemuxedSequences;
6180 24 Mar 21 nicklas 44 import net.sf.basedb.reggie.dao.Library;
6180 24 Mar 21 nicklas 45 import net.sf.basedb.reggie.dao.MergedSequences;
6187 26 Mar 21 nicklas 46 import net.sf.basedb.reggie.dao.Pipeline;
6180 24 Mar 21 nicklas 47 import net.sf.basedb.reggie.dao.ReggieRole;
6180 24 Mar 21 nicklas 48 import net.sf.basedb.reggie.dao.Rna;
6180 24 Mar 21 nicklas 49 import net.sf.basedb.reggie.dao.Subtype;
6181 25 Mar 21 nicklas 50 import net.sf.basedb.reggie.grid.ImportFastqJobCreator;
6181 25 Mar 21 nicklas 51 import net.sf.basedb.reggie.grid.ScriptUtil;
6215 16 Apr 21 nicklas 52 import net.sf.basedb.util.Values;
6180 24 Mar 21 nicklas 53 import net.sf.basedb.util.error.ThrowableUtil;
6180 24 Mar 21 nicklas 54
6180 24 Mar 21 nicklas 55
6180 24 Mar 21 nicklas 56 public class FastqServlet 
6180 24 Mar 21 nicklas 57   extends HttpServlet 
6180 24 Mar 21 nicklas 58 {
6180 24 Mar 21 nicklas 59
6181 25 Mar 21 nicklas 60   private static final long serialVersionUID = -3707987222605090174L;
6181 25 Mar 21 nicklas 61
6180 24 Mar 21 nicklas 62   public FastqServlet()
6180 24 Mar 21 nicklas 63   {}
6180 24 Mar 21 nicklas 64
6180 24 Mar 21 nicklas 65   @Override
6180 24 Mar 21 nicklas 66   protected void doGet(HttpServletRequest req, HttpServletResponse resp)
6180 24 Mar 21 nicklas 67     throws ServletException, IOException 
6180 24 Mar 21 nicklas 68   {
6180 24 Mar 21 nicklas 69     String cmd = req.getParameter("cmd");
6180 24 Mar 21 nicklas 70     JsonUtil.setJsonResponseHeaders(resp);
6180 24 Mar 21 nicklas 71     
6180 24 Mar 21 nicklas 72     JSONObject json = new JSONObject();
6180 24 Mar 21 nicklas 73     json.put("status", "ok");
6180 24 Mar 21 nicklas 74     
6180 24 Mar 21 nicklas 75     final SessionControl sc = Reggie.getSessionControl(req);
6180 24 Mar 21 nicklas 76     DbControl dc = null;
6180 24 Mar 21 nicklas 77     try
6180 24 Mar 21 nicklas 78     {
6215 16 Apr 21 nicklas 79       if ("GetDemuxedSequencesForImport".equals(cmd))
6180 24 Mar 21 nicklas 80       {
6337 16 Jun 21 nicklas 81         dc = sc.newDbControl(":Import FASTQ files");
6180 24 Mar 21 nicklas 82         
6215 16 Apr 21 nicklas 83         List<DemuxedSequences> list = null;
6180 24 Mar 21 nicklas 84         // Load items from the pipeline list
6180 24 Mar 21 nicklas 85         ItemList fastqImportPipeline = BiomaterialList.FASTQ_IMPORT_PIPELINE.load(dc);
6183 26 Mar 21 nicklas 86         ItemQuery<DerivedBioAssay> query = fastqImportPipeline.getMembers();
6180 24 Mar 21 nicklas 87         query.setIncludes(Reggie.INCLUDE_IN_CURRENT_PROJECT);
6215 16 Apr 21 nicklas 88         Subtype.DEMUXED_SEQUENCES.addFilter(dc, query);
6180 24 Mar 21 nicklas 89         // Join LibPlate for sorting
6180 24 Mar 21 nicklas 90         query.join(Hql.innerJoin(null, "extract", "lib", true));
6180 24 Mar 21 nicklas 91         query.join(Hql.innerJoin("lib", "bioWell", "bw", true));
6180 24 Mar 21 nicklas 92         query.join(Hql.innerJoin("bw", "bioPlate", "libPlate", true));
6180 24 Mar 21 nicklas 93         query.order(Orders.asc(Hql.property("libPlate", "id")));
6180 24 Mar 21 nicklas 94         query.order(Orders.asc(Hql.property("name")));
6180 24 Mar 21 nicklas 95         query.setMaxResults(250);
6215 16 Apr 21 nicklas 96         list = DemuxedSequences.toList(query.list(dc));
6180 24 Mar 21 nicklas 97
6180 24 Mar 21 nicklas 98         SnapshotManager manager = new SnapshotManager();
6215 16 Apr 21 nicklas 99         JSONArray jsonDemuxedSequences = new JSONArray();
6215 16 Apr 21 nicklas 100         for (DemuxedSequences ds : list)
6180 24 Mar 21 nicklas 101         {
6215 16 Apr 21 nicklas 102           ds.loadAnnotations(dc, "pipeline", Annotationtype.PIPELINE, null);
6215 16 Apr 21 nicklas 103           ds.loadAnnotations(dc, "rawFastq", Annotationtype.RAW_FASTQ, null);
6215 16 Apr 21 nicklas 104           ds.loadAnnotations(dc, "DataFilesFolder", Annotationtype.DATA_FILES_FOLDER, null);
6215 16 Apr 21 nicklas 105           Library lib = ds.getLibrary(dc);
6180 24 Mar 21 nicklas 106           lib.loadBioPlateLocation();
6180 24 Mar 21 nicklas 107           Rna r = lib.getRna(dc, true);
6180 24 Mar 21 nicklas 108           if (r != null) lib.setAnnotation("specimen", r.loadYellowLabelInfo(dc, manager));
6215 16 Apr 21 nicklas 109           ds.setAnnotation("lib", lib.asJSONObject());
6215 16 Apr 21 nicklas 110           ds.loadAnnotations(dc, manager, "AutoProcess", Annotationtype.AUTO_PROCESSING, null);
6215 16 Apr 21 nicklas 111           ds.loadDoNotUseAnnotations(dc, manager);
6215 16 Apr 21 nicklas 112           jsonDemuxedSequences.add(ds.asJSONObject());
6180 24 Mar 21 nicklas 113         }
6215 16 Apr 21 nicklas 114         json.put("demuxedSequences", jsonDemuxedSequences);        
6180 24 Mar 21 nicklas 115       }
6187 26 Mar 21 nicklas 116       else if ("GetUnconfirmedImportedSequences".equals(cmd))
6187 26 Mar 21 nicklas 117       {
6337 16 Jun 21 nicklas 118         dc = sc.newDbControl(":Confirm FASTQ import");
6187 26 Mar 21 nicklas 119         ItemQuery<DerivedBioAssay> query = DerivedBioAssay.getQuery();
6187 26 Mar 21 nicklas 120         query.setIncludes(Reggie.INCLUDE_IN_CURRENT_PROJECT);
6187 26 Mar 21 nicklas 121         Subtype.MERGED_SEQUENCES.addFilter(dc, query);
6187 26 Mar 21 nicklas 122         Pipeline.RNA_SEQ.addFilter(dc, query);
6187 26 Mar 21 nicklas 123         // The job must be a FASTQImport job and it must be ended
6187 26 Mar 21 nicklas 124         query.join(Hql.innerJoin("job", "jb"));
6187 26 Mar 21 nicklas 125         Subtype.FASTQ_IMPORT_JOB.addFilter(dc, query, "jb");
6187 26 Mar 21 nicklas 126         query.restrict(Restrictions.neq(Hql.property("jb", "ended"), null));
6187 26 Mar 21 nicklas 127         // Must NOT have a ANALYSIS_RESULT annotation
6187 26 Mar 21 nicklas 128         query.join(Annotations.leftJoin(null, Annotationtype.ANALYSIS_RESULT.load(dc), "ar"));
6187 26 Mar 21 nicklas 129         query.restrict(Restrictions.eq(Hql.alias("ar"), null));
6187 26 Mar 21 nicklas 130         // Ignore if AutoProcess==AutoConfirm
6187 26 Mar 21 nicklas 131         query.join(Annotations.leftJoin(null, Annotationtype.AUTO_PROCESSING.load(dc), "ap"));
6187 26 Mar 21 nicklas 132         query.restrict(
6187 26 Mar 21 nicklas 133             Restrictions.or(
6187 26 Mar 21 nicklas 134               Restrictions.neq(Hql.alias("ap"), Expressions.string("AutoConfirm")),
6187 26 Mar 21 nicklas 135               Restrictions.eq(Hql.alias("ap"), null)
6187 26 Mar 21 nicklas 136             ));
6187 26 Mar 21 nicklas 137         // Join LibPlate for sorting
6187 26 Mar 21 nicklas 138         query.join(Hql.innerJoin(null, "extract", "lib", true));
6187 26 Mar 21 nicklas 139         query.join(Hql.innerJoin("lib", "bioWell", "bw", true));
6187 26 Mar 21 nicklas 140         query.join(Hql.innerJoin("bw", "bioPlate", "libPlate", true));
6187 26 Mar 21 nicklas 141         query.order(Orders.asc(Hql.property("libPlate", "id")));
6187 26 Mar 21 nicklas 142         query.order(Orders.asc(Hql.property("name")));
6187 26 Mar 21 nicklas 143         query.setMaxResults(250);
6187 26 Mar 21 nicklas 144         
6187 26 Mar 21 nicklas 145         SnapshotManager manager = new SnapshotManager();
6187 26 Mar 21 nicklas 146         JSONArray jsonMerged = new JSONArray();
6187 26 Mar 21 nicklas 147         List<MergedSequences> list = MergedSequences.toList(query.list(dc));
6187 26 Mar 21 nicklas 148         for (MergedSequences mg : list)
6187 26 Mar 21 nicklas 149         {
6187 26 Mar 21 nicklas 150           Library lib = mg.getLibrary(dc);
6187 26 Mar 21 nicklas 151           lib.loadBioPlateLocation();
6187 26 Mar 21 nicklas 152
6187 26 Mar 21 nicklas 153           Job job = mg.getItem().getJob();
6187 26 Mar 21 nicklas 154           JSONObject jsonJob = JsonUtil.getJobAsJSON(job);
6187 26 Mar 21 nicklas 155           boolean debug = Boolean.TRUE.equals(job.getParameterValue("debug"));
6187 26 Mar 21 nicklas 156           jsonJob.put("debug", debug);
6187 26 Mar 21 nicklas 157           
6187 26 Mar 21 nicklas 158           JSONObject jsonLimits = new JSONObject();
6187 26 Mar 21 nicklas 159           jsonLimits.put("minPtReads", debug ? DemuxAutoConfirmer.MIN_PT_READS_DEBUG : DemuxAutoConfirmer.MIN_PT_READS);
6187 26 Mar 21 nicklas 160           jsonJob.put("limits", jsonLimits);
6187 26 Mar 21 nicklas 161           mg.setAnnotation("job", jsonJob);
6187 26 Mar 21 nicklas 162           
6187 26 Mar 21 nicklas 163           Rna r = lib.getRna(dc, true);
6187 26 Mar 21 nicklas 164           if (r != null) lib.setAnnotation("specimen", r.loadYellowLabelInfo(dc, manager));
6187 26 Mar 21 nicklas 165           lib.loadAnnotations(dc, manager, "CA_Size", Annotationtype.CA_SIZE, null);
6187 26 Mar 21 nicklas 166           lib.loadAnnotations(dc, manager, "library_size_est", Annotationtype.LIBRARY_SIZE_EST, null);
6187 26 Mar 21 nicklas 167           mg.setAnnotation("lib", lib.asJSONObject());
6187 26 Mar 21 nicklas 168           mg.loadAnnotations(dc, manager, "READS", Annotationtype.READS, null);
6187 26 Mar 21 nicklas 169           mg.loadAnnotations(dc, manager, "PF_READS", Annotationtype.PF_READS, null);
6187 26 Mar 21 nicklas 170           mg.loadAnnotations(dc, manager, "ADAPTER_READS", Annotationtype.ADAPTER_READS, null);
6187 26 Mar 21 nicklas 171           mg.loadAnnotations(dc, manager, "PT_READS", Annotationtype.PT_READS, null);
6187 26 Mar 21 nicklas 172           mg.loadAnnotations(dc, manager, "FragmentSizeAvg", Annotationtype.FRAGMENT_SIZE_AVG, null);
6187 26 Mar 21 nicklas 173           mg.loadAnnotations(dc, manager, "FragmentSizeStdev", Annotationtype.FRAGMENT_SIZE_STDEV, null);
6187 26 Mar 21 nicklas 174           mg.loadAnnotations(dc, manager, "DataFilesFolder", Annotationtype.DATA_FILES_FOLDER, null);
6187 26 Mar 21 nicklas 175           
6187 26 Mar 21 nicklas 176           jsonMerged.add(mg.asJSONObject());
6187 26 Mar 21 nicklas 177         }
6187 26 Mar 21 nicklas 178         
6187 26 Mar 21 nicklas 179         json.put("mergedSequences", jsonMerged);
6187 26 Mar 21 nicklas 180         
6187 26 Mar 21 nicklas 181       }
6180 24 Mar 21 nicklas 182     }
6180 24 Mar 21 nicklas 183     catch (Throwable t)
6180 24 Mar 21 nicklas 184     {
6180 24 Mar 21 nicklas 185       t.printStackTrace();
6180 24 Mar 21 nicklas 186       json.clear();
6180 24 Mar 21 nicklas 187       json.put("status", "error");
6180 24 Mar 21 nicklas 188       json.put("message", t.getMessage());
6180 24 Mar 21 nicklas 189       json.put("stacktrace", ThrowableUtil.stackTraceToString(t));
6180 24 Mar 21 nicklas 190     }
6180 24 Mar 21 nicklas 191     finally
6180 24 Mar 21 nicklas 192     {
6180 24 Mar 21 nicklas 193       if (dc != null) dc.close();
6180 24 Mar 21 nicklas 194       json.writeJSONString(resp.getWriter());
6180 24 Mar 21 nicklas 195     }
6180 24 Mar 21 nicklas 196     
6180 24 Mar 21 nicklas 197   }
6180 24 Mar 21 nicklas 198
6180 24 Mar 21 nicklas 199   @Override
6180 24 Mar 21 nicklas 200   protected void doPost(HttpServletRequest req, HttpServletResponse resp)
6180 24 Mar 21 nicklas 201     throws ServletException, IOException 
6180 24 Mar 21 nicklas 202   {
6180 24 Mar 21 nicklas 203     String cmd = req.getParameter("cmd");
6180 24 Mar 21 nicklas 204     JsonUtil.setJsonResponseHeaders(resp);
6180 24 Mar 21 nicklas 205     
6180 24 Mar 21 nicklas 206     JSONObject json = new JSONObject();
6180 24 Mar 21 nicklas 207     json.put("status", "ok");
6180 24 Mar 21 nicklas 208     JSONArray jsonMessages = new JSONArray();
6180 24 Mar 21 nicklas 209   
6180 24 Mar 21 nicklas 210     final SessionControl sc = Reggie.getSessionControl(req);
6180 24 Mar 21 nicklas 211     DbControl dc = null;
6180 24 Mar 21 nicklas 212     try
6180 24 Mar 21 nicklas 213     {
6180 24 Mar 21 nicklas 214
6180 24 Mar 21 nicklas 215       if ("ImportFastq".equals(cmd))
6180 24 Mar 21 nicklas 216       {
6337 16 Jun 21 nicklas 217         dc = sc.newDbControl(":Import FASTQ files");
6180 24 Mar 21 nicklas 218
6180 24 Mar 21 nicklas 219         ReggieRole.checkPermission(dc, "'" + cmd + "' wizard", ReggieRole.SECONDARY_ANALYSIS, ReggieRole.ADMINISTRATOR);
6180 24 Mar 21 nicklas 220
6180 24 Mar 21 nicklas 221         JSONObject jsonReq = JsonUtil.parseRequest(req);
6215 16 Apr 21 nicklas 222         JSONArray jsonDemuxed = (JSONArray)jsonReq.get("demuxedSequences");
6180 24 Mar 21 nicklas 223         
6180 24 Mar 21 nicklas 224         Number mergeSoftwareId = (Number)jsonReq.get("mergeSoftware");
6180 24 Mar 21 nicklas 225         Number mergeProtocolId = (Number)jsonReq.get("mergeProtocol");
6180 24 Mar 21 nicklas 226         
6180 24 Mar 21 nicklas 227         String clusterId = (String)jsonReq.get("cluster");
6180 24 Mar 21 nicklas 228         boolean debug = Boolean.TRUE.equals(jsonReq.get("debug"));
6180 24 Mar 21 nicklas 229         boolean autoConfirm = Boolean.TRUE.equals(jsonReq.get("autoConfirm"));
6180 24 Mar 21 nicklas 230         Number priority = (Number)jsonReq.get("priority");
6981 17 Jan 23 nicklas 231         String partition = Values.getStringOrNull((String)jsonReq.get("partition"));
7372 06 Oct 23 nicklas 232         String submitOptions = Values.getStringOrNull((String)jsonReq.get("submitOptionsOverride"));
6180 24 Mar 21 nicklas 233
6180 24 Mar 21 nicklas 234         OpenGridCluster cluster = OpenGridService.getInstance().getClusterById(dc, clusterId);
6180 24 Mar 21 nicklas 235         if (cluster == null)
6180 24 Mar 21 nicklas 236         {
6180 24 Mar 21 nicklas 237           throw new ItemNotFoundException("OpenGridCluster[" + clusterId + "]");
6180 24 Mar 21 nicklas 238         }
6180 24 Mar 21 nicklas 239         
6180 24 Mar 21 nicklas 240         // Load common items
6180 24 Mar 21 nicklas 241         Software mergeSoftware = mergeSoftwareId != null ? Software.getById(dc, mergeSoftwareId.intValue()) : null;
6180 24 Mar 21 nicklas 242         Protocol mergeProtocol = mergeProtocolId != null ? Protocol.getById(dc, mergeProtocolId.intValue()) : null;
6180 24 Mar 21 nicklas 243
6180 24 Mar 21 nicklas 244         // Load MergedSequences that should be imported
6215 16 Apr 21 nicklas 245         List<DemuxedSequences> demuxedSequences = new ArrayList<DemuxedSequences>();
6215 16 Apr 21 nicklas 246         for (int mgNo = 0; mgNo < jsonDemuxed.size(); mgNo++)
6180 24 Mar 21 nicklas 247         {
6215 16 Apr 21 nicklas 248           JSONObject jsonDx = (JSONObject)jsonDemuxed.get(mgNo);
6215 16 Apr 21 nicklas 249           Number demuxedId = (Number)jsonDx.get("id");
6180 24 Mar 21 nicklas 250         
6215 16 Apr 21 nicklas 251           DemuxedSequences ds = DemuxedSequences.getById(dc, demuxedId.intValue());
6215 16 Apr 21 nicklas 252           demuxedSequences.add(ds);
6180 24 Mar 21 nicklas 253
6180 24 Mar 21 nicklas 254           // Reset AUTO_PROCESSING annotation
6215 16 Apr 21 nicklas 255           DerivedBioAssay demuxed = ds.getDerivedBioAssay();
6215 16 Apr 21 nicklas 256           Annotationtype.AUTO_PROCESSING.setAnnotationValue(dc, demuxed, null);
6180 24 Mar 21 nicklas 257         }
6180 24 Mar 21 nicklas 258
6181 25 Mar 21 nicklas 259         // FASTQ import job creator implementation        
6180 24 Mar 21 nicklas 260         ImportFastqJobCreator jobCreator = new ImportFastqJobCreator();
6180 24 Mar 21 nicklas 261         jobCreator.setAutoConfirm(autoConfirm);
6180 24 Mar 21 nicklas 262         jobCreator.setDebug(debug);
6180 24 Mar 21 nicklas 263         jobCreator.setPriority(priority == null ? null : priority.intValue());
6981 17 Jan 23 nicklas 264         jobCreator.setPartition(partition);
6180 24 Mar 21 nicklas 265         jobCreator.setMergeProtocol(mergeProtocol);
6180 24 Mar 21 nicklas 266         jobCreator.setMergeSoftware(mergeSoftware);
7372 06 Oct 23 nicklas 267         jobCreator.setSubmitOptionsOverride(submitOptions);
6180 24 Mar 21 nicklas 268         
6215 16 Apr 21 nicklas 269         List<JobDefinition> jobDefs = jobCreator.createFastqImportJobs(dc, cluster, demuxedSequences);
6180 24 Mar 21 nicklas 270         List<Job> jobs = ScriptUtil.submitJobs(dc, cluster, jobDefs);
6180 24 Mar 21 nicklas 271         for (Job job : jobs)
6180 24 Mar 21 nicklas 272         {
6180 24 Mar 21 nicklas 273           if (job.getStatus() == Job.Status.ERROR)
6180 24 Mar 21 nicklas 274           {
6180 24 Mar 21 nicklas 275             jsonMessages.add("[Error]Job submission for '" + job.getName() + "' failed: " + job.getStatusMessage());
6180 24 Mar 21 nicklas 276           }
6180 24 Mar 21 nicklas 277           else
6180 24 Mar 21 nicklas 278           {
6215 16 Apr 21 nicklas 279             jsonMessages.add("Submitted " + job.getName() + " to " + cluster.getConnectionInfo().getName() + " with id " + job.getExternalId());
6180 24 Mar 21 nicklas 280           }
6180 24 Mar 21 nicklas 281         }
6180 24 Mar 21 nicklas 282         
6180 24 Mar 21 nicklas 283         dc.commit();
6180 24 Mar 21 nicklas 284       }
6187 26 Mar 21 nicklas 285       else if ("RegisterFastqImport".equals(cmd))
6187 26 Mar 21 nicklas 286       {
6337 16 Jun 21 nicklas 287         dc = sc.newDbControl(":Confirm FASTQ import");
6180 24 Mar 21 nicklas 288
6187 26 Mar 21 nicklas 289         ReggieRole.checkPermission(dc, "'" + cmd + "' wizard", ReggieRole.SECONDARY_ANALYSIS, ReggieRole.ADMINISTRATOR);
6187 26 Mar 21 nicklas 290         JSONObject jsonReq = JsonUtil.parseRequest(req);
6187 26 Mar 21 nicklas 291
6187 26 Mar 21 nicklas 292         JSONArray jsonMergedSequences = (JSONArray)jsonReq.get("mergedSequences");
6187 26 Mar 21 nicklas 293         
6187 26 Mar 21 nicklas 294         int numHisatAlign = 0;
6809 24 Aug 22 nicklas 295         int numHisat2023Align = 0;
6187 26 Mar 21 nicklas 296         int numLegacyAlign = 0;
6187 26 Mar 21 nicklas 297         int numConfirmed = 0;
6215 16 Apr 21 nicklas 298         int numUnconfirmed = 0;
6187 26 Mar 21 nicklas 299         int numFlaggedRna = 0;
6187 26 Mar 21 nicklas 300         int numReImport = 0;
6215 16 Apr 21 nicklas 301         int numDeleted = 0;
6215 16 Apr 21 nicklas 302         
6187 26 Mar 21 nicklas 303         ItemList flaggedRna = BiomaterialList.FLAGGED_RNA.load(dc);
6187 26 Mar 21 nicklas 304         ItemList hisatPipeline = BiomaterialList.HISAT_PIPELINE.load(dc);
6811 25 Aug 22 nicklas 305         ItemList hisat2023Pipeline = BiomaterialList.HISAT_2023_PIPELINE.load(dc);
6187 26 Mar 21 nicklas 306         ItemList legacyPipeline = BiomaterialList.LEGACY_PIPELINE.load(dc);
6187 26 Mar 21 nicklas 307         ItemList fastqImportPipeline = BiomaterialList.FASTQ_IMPORT_PIPELINE.load(dc);
6215 16 Apr 21 nicklas 308         
6215 16 Apr 21 nicklas 309         boolean deleteItemsCreatedByFailedJobs = Boolean.TRUE.equals(jsonReq.get("deleteItemsCreatedByFailedJobs"));
6215 16 Apr 21 nicklas 310         List<BasicItem> toDelete = new ArrayList<BasicItem>();
6215 16 Apr 21 nicklas 311         
6187 26 Mar 21 nicklas 312         for (int mergeNo = 0; mergeNo < jsonMergedSequences.size(); ++mergeNo)
6187 26 Mar 21 nicklas 313         {
6187 26 Mar 21 nicklas 314           JSONObject jsonMerge = (JSONObject)jsonMergedSequences.get(mergeNo);
6187 26 Mar 21 nicklas 315           Number mergeId = (Number)jsonMerge.get("id");
6187 26 Mar 21 nicklas 316           boolean legacyAlign = Boolean.TRUE.equals(jsonMerge.get("legacyAlign"));
6187 26 Mar 21 nicklas 317           boolean hisatAlign = Boolean.TRUE.equals(jsonMerge.get("hisatAlign"));
6809 24 Aug 22 nicklas 318           boolean hisat2023Align = Boolean.TRUE.equals(jsonMerge.get("hisat2023Align"));
6187 26 Mar 21 nicklas 319           boolean reImport = Boolean.TRUE.equals(jsonMerge.get("reimport"));
6187 26 Mar 21 nicklas 320           boolean flag = Boolean.TRUE.equals(jsonMerge.get("flag"));
6187 26 Mar 21 nicklas 321           boolean align = legacyAlign || hisatAlign;
6215 16 Apr 21 nicklas 322           boolean deleted = false;
6215 16 Apr 21 nicklas 323
6215 16 Apr 21 nicklas 324           MergedSequences mg = MergedSequences.getById(dc, mergeId.intValue());
6215 16 Apr 21 nicklas 325           DemuxedSequences dx = mg.getSingleDemuxedSequences(dc);
6187 26 Mar 21 nicklas 326           
6215 16 Apr 21 nicklas 327           DerivedBioAssay merge = mg.getDerivedBioAssay();
6215 16 Apr 21 nicklas 328           DerivedBioAssay demux = dx.getDerivedBioAssay();
6187 26 Mar 21 nicklas 329           
6215 16 Apr 21 nicklas 330           if (flag && !Reggie.isExternalItem(merge.getName()))
6187 26 Mar 21 nicklas 331           {
6215 16 Apr 21 nicklas 332             Library lib = Library.get(merge.getExtract());
6215 16 Apr 21 nicklas 333             Rna rna = lib.getRna(dc, false);
6215 16 Apr 21 nicklas 334             if (rna != null)
6187 26 Mar 21 nicklas 335             {
6215 16 Apr 21 nicklas 336               Extract r = rna.getItem();
6215 16 Apr 21 nicklas 337               Annotationtype.FLAG.setAnnotationValue(dc, r, Rna.FLAG_FASTQ_IMPORT_FAILED);
6215 16 Apr 21 nicklas 338               flaggedRna.add(r);
6215 16 Apr 21 nicklas 339               numFlaggedRna++;
6187 26 Mar 21 nicklas 340             }
6187 26 Mar 21 nicklas 341           }
6215 16 Apr 21 nicklas 342
6215 16 Apr 21 nicklas 343           String comment = Values.getStringOrNull((String)jsonMerge.get("comment"));
6215 16 Apr 21 nicklas 344           merge.setDescription(comment);
6187 26 Mar 21 nicklas 345           
6215 16 Apr 21 nicklas 346           if (reImport)
6187 26 Mar 21 nicklas 347           {
6215 16 Apr 21 nicklas 348             // Set ReProcess annotation on demuxed sequences item
6215 16 Apr 21 nicklas 349             Annotationtype.AUTO_PROCESSING.setAnnotationValue(dc, demux, "ReProcess");
6215 16 Apr 21 nicklas 350             fastqImportPipeline.add(demux);
6215 16 Apr 21 nicklas 351             numReImport++;
6215 16 Apr 21 nicklas 352             
6215 16 Apr 21 nicklas 353             if (deleteItemsCreatedByFailedJobs && !align)
6187 26 Mar 21 nicklas 354             {
6215 16 Apr 21 nicklas 355               // Delete rawbioassay and related items
6215 16 Apr 21 nicklas 356               merge.setRemoved(true);
6215 16 Apr 21 nicklas 357               toDelete.add(merge);
6215 16 Apr 21 nicklas 358               toDelete.addAll(Reggie.removeAttachedFiles(dc, merge));
6215 16 Apr 21 nicklas 359               deleted = true;
6215 16 Apr 21 nicklas 360               numDeleted++;
6215 16 Apr 21 nicklas 361               demux.setDescription(comment);
6187 26 Mar 21 nicklas 362             }
6215 16 Apr 21 nicklas 363           }
6215 16 Apr 21 nicklas 364           if (!deleted)
6215 16 Apr 21 nicklas 365           {
6215 16 Apr 21 nicklas 366             if (align)
6187 26 Mar 21 nicklas 367             {
6215 16 Apr 21 nicklas 368               Annotationtype.ANALYSIS_RESULT.setAnnotationValue(dc, merge, MergedSequences.MERGE_SUCCESSFUL);
6215 16 Apr 21 nicklas 369               numConfirmed++;
6215 16 Apr 21 nicklas 370               if (hisatAlign)
6187 26 Mar 21 nicklas 371               {
6215 16 Apr 21 nicklas 372                 hisatPipeline.add(merge);
6215 16 Apr 21 nicklas 373                 numHisatAlign++;
6187 26 Mar 21 nicklas 374               }
6809 24 Aug 22 nicklas 375               if (hisat2023Align)
6809 24 Aug 22 nicklas 376               {
6809 24 Aug 22 nicklas 377                 hisat2023Pipeline.add(merge);
6809 24 Aug 22 nicklas 378                 numHisat2023Align++;
6809 24 Aug 22 nicklas 379               }
6215 16 Apr 21 nicklas 380     
6215 16 Apr 21 nicklas 381               if (legacyAlign)
6215 16 Apr 21 nicklas 382               {
6215 16 Apr 21 nicklas 383                 legacyPipeline.add(merge);
6215 16 Apr 21 nicklas 384                 numLegacyAlign++;
6215 16 Apr 21 nicklas 385               }
6187 26 Mar 21 nicklas 386             }
6215 16 Apr 21 nicklas 387             else if (reImport || flag)
6215 16 Apr 21 nicklas 388             {
6215 16 Apr 21 nicklas 389               Annotationtype.ANALYSIS_RESULT.setAnnotationValue(dc, merge, MergedSequences.MERGE_FAILED);
6215 16 Apr 21 nicklas 390             }
6215 16 Apr 21 nicklas 391             else
6215 16 Apr 21 nicklas 392             {
6215 16 Apr 21 nicklas 393               numUnconfirmed++;
6215 16 Apr 21 nicklas 394             }
6187 26 Mar 21 nicklas 395           }
6187 26 Mar 21 nicklas 396         }
6187 26 Mar 21 nicklas 397         
6187 26 Mar 21 nicklas 398         if (numHisatAlign > 0)
6187 26 Mar 21 nicklas 399         {
6187 26 Mar 21 nicklas 400           jsonMessages.add(numHisatAlign + " libraries confirmed for Hisat alignment");
6187 26 Mar 21 nicklas 401         }
6187 26 Mar 21 nicklas 402         else
6187 26 Mar 21 nicklas 403         {
6187 26 Mar 21 nicklas 404           jsonMessages.add("No libraries confirmed for Hisat alignment");
6187 26 Mar 21 nicklas 405         }
6809 24 Aug 22 nicklas 406         if (numHisat2023Align > 0)
6809 24 Aug 22 nicklas 407         {
6809 24 Aug 22 nicklas 408           jsonMessages.add(numHisat2023Align + " libraries confirmed for Hisat/2023 alignment");
6809 24 Aug 22 nicklas 409         }
6809 24 Aug 22 nicklas 410         else
6809 24 Aug 22 nicklas 411         {
6809 24 Aug 22 nicklas 412           jsonMessages.add("No libraries confirmed for Hisat/2023 alignment");
6809 24 Aug 22 nicklas 413         }
6187 26 Mar 21 nicklas 414         if (numLegacyAlign > 0)
6187 26 Mar 21 nicklas 415         {
6187 26 Mar 21 nicklas 416           jsonMessages.add(numLegacyAlign + " libraries confirmed for legacy alignment");
6187 26 Mar 21 nicklas 417         }
6187 26 Mar 21 nicklas 418         else
6187 26 Mar 21 nicklas 419         {
6187 26 Mar 21 nicklas 420           jsonMessages.add("No libraries confirmed for legacy alignment");
6187 26 Mar 21 nicklas 421         }
6187 26 Mar 21 nicklas 422         if (numConfirmed > 0)
6187 26 Mar 21 nicklas 423         {
6187 26 Mar 21 nicklas 424           ActivityDef.FASTQ_IMPORT_CONFIRMED.merge(dc, numConfirmed);
6187 26 Mar 21 nicklas 425         }
6215 16 Apr 21 nicklas 426         if (numReImport > 0)
6215 16 Apr 21 nicklas 427         {
6215 16 Apr 21 nicklas 428           jsonMessages.add(numReImport + " items flagged for re-importing");
6215 16 Apr 21 nicklas 429         }
6215 16 Apr 21 nicklas 430         if (numDeleted > 0)
6215 16 Apr 21 nicklas 431         {
6215 16 Apr 21 nicklas 432           jsonMessages.add(numDeleted + " libraries deleted due to failure");
6215 16 Apr 21 nicklas 433           if (toDelete.size() > numDeleted)
6215 16 Apr 21 nicklas 434           {
6215 16 Apr 21 nicklas 435             jsonMessages.add((toDelete.size() - numDeleted) + " linked items (eg. parent items and files) deleted");
6215 16 Apr 21 nicklas 436           }
6215 16 Apr 21 nicklas 437         }
6215 16 Apr 21 nicklas 438
6187 26 Mar 21 nicklas 439         if (numFlaggedRna > 0)
6187 26 Mar 21 nicklas 440         {
6187 26 Mar 21 nicklas 441           jsonMessages.add("Added " + numFlaggedRna + " RNA items to the '" + flaggedRna.getName() + "' list");
6187 26 Mar 21 nicklas 442         }
6215 16 Apr 21 nicklas 443         if (numUnconfirmed > 0)
6187 26 Mar 21 nicklas 444         {
6215 16 Apr 21 nicklas 445           jsonMessages.add(numUnconfirmed + " libraries remain unconfirmed");
6187 26 Mar 21 nicklas 446         }
6215 16 Apr 21 nicklas 447         dc.commit();
6215 16 Apr 21 nicklas 448         if (toDelete.size() > 0)
6215 16 Apr 21 nicklas 449         {
6215 16 Apr 21 nicklas 450           try
6215 16 Apr 21 nicklas 451           {
6215 16 Apr 21 nicklas 452             Trashcan.delete(sc, toDelete, false, null);
6215 16 Apr 21 nicklas 453           }
6215 16 Apr 21 nicklas 454           catch (RuntimeException ex)
6215 16 Apr 21 nicklas 455           {
6215 16 Apr 21 nicklas 456             ex.printStackTrace();
6215 16 Apr 21 nicklas 457             jsonMessages.add("[Error]Could not delete all items created by failed jobs: " + ex.getMessage());
6215 16 Apr 21 nicklas 458           }
6215 16 Apr 21 nicklas 459         }
6187 26 Mar 21 nicklas 460       }
6187 26 Mar 21 nicklas 461
6180 24 Mar 21 nicklas 462       json.put("messages", jsonMessages);
6180 24 Mar 21 nicklas 463       CounterService.getInstance().setForceCount();
6180 24 Mar 21 nicklas 464     }
6180 24 Mar 21 nicklas 465     catch (Throwable t)
6180 24 Mar 21 nicklas 466     {
6180 24 Mar 21 nicklas 467       t.printStackTrace();
6180 24 Mar 21 nicklas 468       json.clear();
6180 24 Mar 21 nicklas 469       json.put("status", "error");
6180 24 Mar 21 nicklas 470       json.put("message", t.getMessage());
6180 24 Mar 21 nicklas 471       json.put("stacktrace", ThrowableUtil.stackTraceToString(t));
6180 24 Mar 21 nicklas 472     }
6180 24 Mar 21 nicklas 473     finally
6180 24 Mar 21 nicklas 474     {
6180 24 Mar 21 nicklas 475       if (dc != null) dc.close();
6180 24 Mar 21 nicklas 476       json.writeJSONString(resp.getWriter());
6180 24 Mar 21 nicklas 477     }
6180 24 Mar 21 nicklas 478     
6180 24 Mar 21 nicklas 479   }
6180 24 Mar 21 nicklas 480   
6180 24 Mar 21 nicklas 481   
6180 24 Mar 21 nicklas 482
6180 24 Mar 21 nicklas 483 }