extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/dao/MergedSequences.java

Code
Comments
Other
Rev Date Author Line
2364 15 Apr 14 nicklas 1 package net.sf.basedb.reggie.dao;
2364 15 Apr 14 nicklas 2
2364 15 Apr 14 nicklas 3 import java.util.ArrayList;
2364 15 Apr 14 nicklas 4 import java.util.Collection;
2364 15 Apr 14 nicklas 5 import java.util.List;
2364 15 Apr 14 nicklas 6
2364 15 Apr 14 nicklas 7 import org.json.simple.JSONObject;
2364 15 Apr 14 nicklas 8
2364 15 Apr 14 nicklas 9 import net.sf.basedb.core.DbControl;
2364 15 Apr 14 nicklas 10 import net.sf.basedb.core.DerivedBioAssay;
2389 28 Apr 14 nicklas 11 import net.sf.basedb.core.Include;
2365 16 Apr 14 nicklas 12 import net.sf.basedb.core.InvalidDataException;
2365 16 Apr 14 nicklas 13 import net.sf.basedb.core.ItemQuery;
2819 16 Oct 14 nicklas 14 import net.sf.basedb.core.Job;
3936 16 May 16 nicklas 15 import net.sf.basedb.core.PhysicalBioAssay;
2914 11 Nov 14 nicklas 16 import net.sf.basedb.core.Type;
2365 16 Apr 14 nicklas 17 import net.sf.basedb.core.query.Expressions;
2365 16 Apr 14 nicklas 18 import net.sf.basedb.core.query.Hql;
2819 16 Oct 14 nicklas 19 import net.sf.basedb.core.query.Orders;
2365 16 Apr 14 nicklas 20 import net.sf.basedb.core.query.Restrictions;
2365 16 Apr 14 nicklas 21 import net.sf.basedb.reggie.Reggie;
2364 15 Apr 14 nicklas 22
2364 15 Apr 14 nicklas 23 /**
2364 15 Apr 14 nicklas 24   Class for loading information that is related to merged sequences.
2364 15 Apr 14 nicklas 25   
2364 15 Apr 14 nicklas 26   @author nicklas
2364 15 Apr 14 nicklas 27   @since 2.16
2364 15 Apr 14 nicklas 28 */
2364 15 Apr 14 nicklas 29 public class MergedSequences 
2364 15 Apr 14 nicklas 30   extends ReggieItem<DerivedBioAssay>
2364 15 Apr 14 nicklas 31 {
2364 15 Apr 14 nicklas 32
2364 15 Apr 14 nicklas 33   /**
6184 26 Mar 21 nicklas 34     Value for the {@link Annotationtype#ANALYSIS_RESULT} annotation 
6184 26 Mar 21 nicklas 35     when the merge was successful.
6184 26 Mar 21 nicklas 36     @since 4.32
6184 26 Mar 21 nicklas 37   */
6184 26 Mar 21 nicklas 38   public static final String MERGE_SUCCESSFUL = "Successful";
6184 26 Mar 21 nicklas 39   
6184 26 Mar 21 nicklas 40   /**
6184 26 Mar 21 nicklas 41     Value for the {@link Annotationtype#ANALYSIS_RESULT} annotation when
6184 26 Mar 21 nicklas 42     the merge failed.
6184 26 Mar 21 nicklas 43     @since 4.32
6184 26 Mar 21 nicklas 44   */
6184 26 Mar 21 nicklas 45   public static final String MERGE_FAILED = "Failed";
6184 26 Mar 21 nicklas 46
6184 26 Mar 21 nicklas 47   
6184 26 Mar 21 nicklas 48   /**
2801 13 Oct 14 nicklas 49     Utility function for generating data files folder for a merged
2801 13 Oct 14 nicklas 50     bioassay. The folder structure is based on the name of the item.
5523 24 Jun 19 nicklas 51     
5523 24 Jun 19 nicklas 52     A rootName should only be given for external items, NOT for SCAN-B items.
5523 24 Jun 19 nicklas 53     
5523 24 Jun 19 nicklas 54     For SCAN-B items the top folder is site prefix+scanb-id+specimen number (1234567.1). 
5523 24 Jun 19 nicklas 55     Subfolder is all the rest. 
5523 24 Jun 19 nicklas 56     
5523 24 Jun 19 nicklas 57     For external items, we split on the first underscore and on the
5523 24 Jun 19 nicklas 58     root item name.
2801 13 Oct 14 nicklas 59      
2801 13 Oct 14 nicklas 60     Examples: 
4551 03 Jul 17 nicklas 61       1234567.1.l.r.m.c.lib.g --> /12/1234567.1/l.r.m.c.lib.g
2801 13 Oct 14 nicklas 62       Stratagene.r.m.c.lib.g --> /Stratagene/r.m.c.lib.g
2801 13 Oct 14 nicklas 63       SKBR3.m.c.lib.g --> /SKBR3/m.c.lib.g
3600 13 Nov 15 nicklas 64       NN_K562.m.c.lib.g --> /NN/K562/m.c.lib.g
5523 24 Jun 19 nicklas 65       NN_K562.2.m.c.lib.g --> /NN/K562.2/m.c.lib.g
2801 13 Oct 14 nicklas 66       
2801 13 Oct 14 nicklas 67     If the debug parameter is TRUE, the return path is prefixed with '/debug'
2801 13 Oct 14 nicklas 68   */
5523 24 Jun 19 nicklas 69   public static String generateDataFilesFolderForProjectArchive(String mergeName, String rootName, boolean debug)
2801 13 Oct 14 nicklas 70   {
5523 24 Jun 19 nicklas 71     String folderName = debug ? "/debug/" : "/";
5523 24 Jun 19 nicklas 72     if (rootName != null)
5523 24 Jun 19 nicklas 73     {
5523 24 Jun 19 nicklas 74       if (!mergeName.startsWith(rootName)) 
5523 24 Jun 19 nicklas 75       {
5523 24 Jun 19 nicklas 76         throw new InvalidDataException("'"+mergeName+"' was expected to start with '"+rootName+"'");
5523 24 Jun 19 nicklas 77       }
5523 24 Jun 19 nicklas 78       // First '_' replaced with '/' and '/' inserted after 'rootName' (+1 for removing the '.')
5523 24 Jun 19 nicklas 79       folderName += rootName.replaceFirst("_", "/")+"/"+mergeName.substring(rootName.length()+1);
5523 24 Jun 19 nicklas 80     }
5523 24 Jun 19 nicklas 81     else
5523 24 Jun 19 nicklas 82     {
5523 24 Jun 19 nicklas 83       // SCAN-B: First 2 digits repeated with a '/' inbetween and
5523 24 Jun 19 nicklas 84       // first '.' not followed by a digit is replaced with '/'
5523 24 Jun 19 nicklas 85       folderName += mergeName.replaceFirst("^(\\d\\d)", "$1/$1").replaceFirst("\\.(?!\\d)", "/");
5523 24 Jun 19 nicklas 86     }
5523 24 Jun 19 nicklas 87     return folderName;
2801 13 Oct 14 nicklas 88   }
2801 13 Oct 14 nicklas 89
2914 11 Nov 14 nicklas 90   /**
2914 11 Nov 14 nicklas 91     Find all merged sequences items by case name. This method will check for {@link Subtype#MERGED_SEQUENCES}
2914 11 Nov 14 nicklas 92     derived bioassays with a name matching the case name (eg. xxx.r.m.c.lib.g).
2914 11 Nov 14 nicklas 93     @since 2.18
2914 11 Nov 14 nicklas 94    */
2914 11 Nov 14 nicklas 95   public static List<MergedSequences> findByCaseName(DbControl dc, String name)
2914 11 Nov 14 nicklas 96   {
2914 11 Nov 14 nicklas 97     // Get rid of suffixes in the name (eg. 'C' which is used for pre-neoadjuvant forms)
2914 11 Nov 14 nicklas 98     if (name.length() > 7) name = name.substring(0, 7);    
2801 13 Oct 14 nicklas 99   
2914 11 Nov 14 nicklas 100     // Look for a library with the given name 
2914 11 Nov 14 nicklas 101     ItemQuery<DerivedBioAssay> query = DerivedBioAssay.getQuery();
2914 11 Nov 14 nicklas 102     Subtype.MERGED_SEQUENCES.addFilter(dc, query);
2917 11 Nov 14 nicklas 103     query.setIncludes(Reggie.INCLUDE_IN_CURRENT_PROJECT);
2914 11 Nov 14 nicklas 104     query.restrict(Restrictions.like(Hql.property("name"), Expressions.parameter("name", name+".%", Type.STRING)));
2914 11 Nov 14 nicklas 105     query.order(Orders.asc(Hql.property("name")));
2914 11 Nov 14 nicklas 106   
2914 11 Nov 14 nicklas 107     List<DerivedBioAssay> tmp = query.list(dc);
2914 11 Nov 14 nicklas 108     return toList(tmp);
2914 11 Nov 14 nicklas 109   }
2914 11 Nov 14 nicklas 110
2914 11 Nov 14 nicklas 111   
2801 13 Oct 14 nicklas 112   /**
2364 15 Apr 14 nicklas 113     Get demuxed sequences item when the id is known.
2364 15 Apr 14 nicklas 114   */
2364 15 Apr 14 nicklas 115   public static MergedSequences getById(DbControl dc, int id)
2364 15 Apr 14 nicklas 116   {
2364 15 Apr 14 nicklas 117     return new MergedSequences(DerivedBioAssay.getById(dc, id));
2364 15 Apr 14 nicklas 118   }
2364 15 Apr 14 nicklas 119   
6193 30 Mar 21 nicklas 120   public static MergedSequences get(DerivedBioAssay dba)
6193 30 Mar 21 nicklas 121   {
6193 30 Mar 21 nicklas 122     return new MergedSequences(dba);
6193 30 Mar 21 nicklas 123   }
6193 30 Mar 21 nicklas 124   
2365 16 Apr 14 nicklas 125   public static MergedSequences getByName(DbControl dc, String name)
2365 16 Apr 14 nicklas 126   {
2365 16 Apr 14 nicklas 127     ItemQuery<DerivedBioAssay> query = DerivedBioAssay.getQuery();
2365 16 Apr 14 nicklas 128     query.setIncludes(Reggie.INCLUDE_IN_CURRENT_PROJECT);
2365 16 Apr 14 nicklas 129     Subtype.MERGED_SEQUENCES.addFilter(dc, query);
2365 16 Apr 14 nicklas 130     query.restrict(Restrictions.eq(Hql.property("name"), Expressions.string(name)));
2365 16 Apr 14 nicklas 131     
2365 16 Apr 14 nicklas 132     List<DerivedBioAssay> list = query.list(dc);
2365 16 Apr 14 nicklas 133     if (list.size() > 1)
2365 16 Apr 14 nicklas 134     {
2365 16 Apr 14 nicklas 135       throw new InvalidDataException(
2365 16 Apr 14 nicklas 136           "More than one item with the name " + name + " was found. " +
2365 16 Apr 14 nicklas 137           "This wizard can't be used until that is corrected.");
2365 16 Apr 14 nicklas 138     }
2365 16 Apr 14 nicklas 139     MergedSequences merged = null;
2365 16 Apr 14 nicklas 140     if (list.size() == 1)
2365 16 Apr 14 nicklas 141     {
2365 16 Apr 14 nicklas 142       merged = new MergedSequences(list.get(0));
2365 16 Apr 14 nicklas 143     }
2365 16 Apr 14 nicklas 144     return merged;
2365 16 Apr 14 nicklas 145   }
2365 16 Apr 14 nicklas 146   
2819 16 Oct 14 nicklas 147   /**
2819 16 Oct 14 nicklas 148     @since 2.16.2
2819 16 Oct 14 nicklas 149   */
2819 16 Oct 14 nicklas 150   public static List<MergedSequences> findByJob(DbControl dc, Job job)
2819 16 Oct 14 nicklas 151   {
2819 16 Oct 14 nicklas 152     ItemQuery<DerivedBioAssay> query = DerivedBioAssay.getQuery();
2819 16 Oct 14 nicklas 153     query.setIncludes(Reggie.INCLUDE_IN_CURRENT_PROJECT);
2819 16 Oct 14 nicklas 154     Subtype.MERGED_SEQUENCES.addFilter(dc, query);
2819 16 Oct 14 nicklas 155     query.restrict(Restrictions.eq(Hql.property("job", "id"), Hql.entity(job)));
2819 16 Oct 14 nicklas 156     query.order(Orders.asc(Hql.property("name")));
2819 16 Oct 14 nicklas 157     return toList(query.list(dc));
2819 16 Oct 14 nicklas 158   }
2819 16 Oct 14 nicklas 159
6181 25 Mar 21 nicklas 160   /**
6181 25 Mar 21 nicklas 161     Call when a single job is expected to be associated with a single
6181 25 Mar 21 nicklas 162     merged items.
6181 25 Mar 21 nicklas 163     @since 4.32
6181 25 Mar 21 nicklas 164   */
6181 25 Mar 21 nicklas 165   public static MergedSequences getByJob(DbControl dc, Job job)
6181 25 Mar 21 nicklas 166   {
6181 25 Mar 21 nicklas 167     ItemQuery<DerivedBioAssay> query = DerivedBioAssay.getQuery();
6181 25 Mar 21 nicklas 168     query.setIncludes(Reggie.INCLUDE_IN_CURRENT_PROJECT);
6181 25 Mar 21 nicklas 169     Subtype.MERGED_SEQUENCES.addFilter(dc, query);
6181 25 Mar 21 nicklas 170     query.restrict(Restrictions.eq(Hql.property("job"), Hql.entity(job)));
6181 25 Mar 21 nicklas 171
6181 25 Mar 21 nicklas 172     List<DerivedBioAssay> list = query.list(dc);
6181 25 Mar 21 nicklas 173     if (list.size() > 1)
6181 25 Mar 21 nicklas 174     {
6181 25 Mar 21 nicklas 175       throw new InvalidDataException(
6181 25 Mar 21 nicklas 176           "More than one item with job " + job.getName() + " was found. " +
6181 25 Mar 21 nicklas 177           "This wizard can't be used until that is corrected.");
6181 25 Mar 21 nicklas 178     }
6181 25 Mar 21 nicklas 179     MergedSequences merged = null;
6181 25 Mar 21 nicklas 180     if (list.size() == 1)
6181 25 Mar 21 nicklas 181     {
6181 25 Mar 21 nicklas 182       merged = new MergedSequences(list.get(0));
6181 25 Mar 21 nicklas 183     }
6181 25 Mar 21 nicklas 184     return merged;
6181 25 Mar 21 nicklas 185   }
6181 25 Mar 21 nicklas 186
2819 16 Oct 14 nicklas 187   
2364 15 Apr 14 nicklas 188   public static List<MergedSequences> toList(Collection<DerivedBioAssay> bioassays)
2364 15 Apr 14 nicklas 189   {
2364 15 Apr 14 nicklas 190     List<MergedSequences> lib = new ArrayList<MergedSequences>(bioassays.size());
2364 15 Apr 14 nicklas 191     for (DerivedBioAssay ba : bioassays)
2364 15 Apr 14 nicklas 192     {
2364 15 Apr 14 nicklas 193       lib.add(new MergedSequences(ba));
2364 15 Apr 14 nicklas 194     }
2364 15 Apr 14 nicklas 195     return lib;
2364 15 Apr 14 nicklas 196   }
2364 15 Apr 14 nicklas 197   
2364 15 Apr 14 nicklas 198   
2364 15 Apr 14 nicklas 199   private MergedSequences(DerivedBioAssay bioAssay)
2364 15 Apr 14 nicklas 200   {
2364 15 Apr 14 nicklas 201     super(bioAssay);
2364 15 Apr 14 nicklas 202
2364 15 Apr 14 nicklas 203   }  
2364 15 Apr 14 nicklas 204   
2364 15 Apr 14 nicklas 205   /**
2364 15 Apr 14 nicklas 206     Get the derived bioassay that represents the demuxed sequences in BASE.
2364 15 Apr 14 nicklas 207   */
2364 15 Apr 14 nicklas 208   public DerivedBioAssay getDerivedBioAssay()
2364 15 Apr 14 nicklas 209   {
2364 15 Apr 14 nicklas 210     return getItem();
2364 15 Apr 14 nicklas 211   }
2364 15 Apr 14 nicklas 212
2364 15 Apr 14 nicklas 213   public Library getLibrary(DbControl dc)
2364 15 Apr 14 nicklas 214   {
2364 15 Apr 14 nicklas 215     return Library.getById(dc, getItem().getExtract().getId());
2364 15 Apr 14 nicklas 216   }
2364 15 Apr 14 nicklas 217   
2801 13 Oct 14 nicklas 218   public List<DemuxedSequences> getDemuxedSequences(DbControl dc)
2680 18 Sep 14 nicklas 219   {
2680 18 Sep 14 nicklas 220     ItemQuery<DerivedBioAssay> query = getItem().getParents();
2680 18 Sep 14 nicklas 221     Subtype.DEMUXED_SEQUENCES.addFilter(dc, query);
2680 18 Sep 14 nicklas 222     query.include(Reggie.INCLUDE_IN_CURRENT_PROJECT);
2680 18 Sep 14 nicklas 223
2680 18 Sep 14 nicklas 224     List<DerivedBioAssay> tmp = query.list(dc);
2801 13 Oct 14 nicklas 225     if (tmp.size() == 0)
2680 18 Sep 14 nicklas 226     {
2680 18 Sep 14 nicklas 227       throw new InvalidDataException(
2801 13 Oct 14 nicklas 228         "No parent item was found for " + getName() +
6215 16 Apr 21 nicklas 229         ". This wizard can't be used until that is corrected.");
2680 18 Sep 14 nicklas 230     }
2801 13 Oct 14 nicklas 231     
2801 13 Oct 14 nicklas 232     return DemuxedSequences.toList(tmp);
2680 18 Sep 14 nicklas 233   }
2680 18 Sep 14 nicklas 234
6215 16 Apr 21 nicklas 235   public DemuxedSequences getSingleDemuxedSequences(DbControl dc)
6214 15 Apr 21 nicklas 236   {
6214 15 Apr 21 nicklas 237     ItemQuery<DerivedBioAssay> query = getItem().getParents();
6214 15 Apr 21 nicklas 238     Subtype.DEMUXED_SEQUENCES.addFilter(dc, query);
6214 15 Apr 21 nicklas 239     query.include(Reggie.INCLUDE_IN_CURRENT_PROJECT);
6214 15 Apr 21 nicklas 240
6214 15 Apr 21 nicklas 241     List<DerivedBioAssay> tmp = query.list(dc);
6214 15 Apr 21 nicklas 242     if (tmp.size() == 0)
6214 15 Apr 21 nicklas 243     {
6214 15 Apr 21 nicklas 244       throw new InvalidDataException(
6214 15 Apr 21 nicklas 245         "No demux item was found for " + getName() +
6215 16 Apr 21 nicklas 246         ". This wizard can't be used until that is corrected.");
6214 15 Apr 21 nicklas 247     }
6214 15 Apr 21 nicklas 248     else if (tmp.size() > 1)
6214 15 Apr 21 nicklas 249     {
6214 15 Apr 21 nicklas 250       throw new InvalidDataException(
6214 15 Apr 21 nicklas 251         "More than one demux was found for " + getName() +
6215 16 Apr 21 nicklas 252         ". This wizard can't be used until that is corrected.");
6214 15 Apr 21 nicklas 253     }
6214 15 Apr 21 nicklas 254     return DemuxedSequences.get(tmp.get(0));
6214 15 Apr 21 nicklas 255   }
6214 15 Apr 21 nicklas 256   
2389 28 Apr 14 nicklas 257   /**
3936 16 May 16 nicklas 258     Get the parent flow cells.
3936 16 May 16 nicklas 259     @since 4.5
3936 16 May 16 nicklas 260   */
3936 16 May 16 nicklas 261   public List<FlowCell> getFlowCells(DbControl dc)
3936 16 May 16 nicklas 262   {
3936 16 May 16 nicklas 263     ItemQuery<PhysicalBioAssay> query = getItem().getPhysicalBioAssays();
3936 16 May 16 nicklas 264     Subtype.FLOW_CELL.addFilter(dc, query);
3936 16 May 16 nicklas 265     query.include(Reggie.INCLUDE_IN_CURRENT_PROJECT);
3936 16 May 16 nicklas 266   
3936 16 May 16 nicklas 267     List<PhysicalBioAssay> tmp = query.list(dc);
3936 16 May 16 nicklas 268     if (tmp.size() == 0)
3936 16 May 16 nicklas 269     {
3936 16 May 16 nicklas 270       throw new InvalidDataException(
3936 16 May 16 nicklas 271         "No parent item was found for " + getName() +
3936 16 May 16 nicklas 272         "This wizard can't be used until that is corrected.");
3936 16 May 16 nicklas 273     }
3936 16 May 16 nicklas 274     
3936 16 May 16 nicklas 275     return FlowCell.toList(tmp);
3936 16 May 16 nicklas 276   }
3936 16 May 16 nicklas 277
3936 16 May 16 nicklas 278   
3936 16 May 16 nicklas 279   /**
2420 13 May 14 nicklas 280     Find the next name to give a "MaskedSequences" child item. This assumes that
2420 13 May 14 nicklas 281     all child items are using the naming convention. foo.k, foo.k2, and
2389 28 Apr 14 nicklas 282     so on. NOTE! The first child item have no number!
2389 28 Apr 14 nicklas 283     @return The next unused name
2389 28 Apr 14 nicklas 284   */
2420 13 May 14 nicklas 285   public String getNextMaskedSequencesName(DbControl dc)
2389 28 Apr 14 nicklas 286   {
2389 28 Apr 14 nicklas 287     DerivedBioAssay merged = getItem();
6193 30 Mar 21 nicklas 288     ItemQuery<DerivedBioAssay> query = null;
6193 30 Mar 21 nicklas 289     if (merged.isInDatabase())
6193 30 Mar 21 nicklas 290     {
6193 30 Mar 21 nicklas 291       query = merged.getChildren();
6193 30 Mar 21 nicklas 292       Subtype.MASKED_SEQUENCES.addFilter(dc, query);
6193 30 Mar 21 nicklas 293       query.setIncludes(Include.ALL);
6193 30 Mar 21 nicklas 294     }
4881 03 Jul 18 nicklas 295     return getNextChildItemName(dc, query, Subtype.MASKED_SEQUENCES.getItemSuffix(), true);
2389 28 Apr 14 nicklas 296   }
4590 25 Sep 17 nicklas 297   
4590 25 Sep 17 nicklas 298   
4590 25 Sep 17 nicklas 299   /**
4590 25 Sep 17 nicklas 300     Find the next name to give a "AlignedSequences" child item. This assumes that
4590 25 Sep 17 nicklas 301     all child items are using the naming convention. foo.a, foo.a2, and
4590 25 Sep 17 nicklas 302     so on. NOTE! The first child item have no number!
4590 25 Sep 17 nicklas 303     @return The next unused name
4590 25 Sep 17 nicklas 304     @since 4.12
4590 25 Sep 17 nicklas 305   */
4590 25 Sep 17 nicklas 306   public String getNextAlignedSequencesName(DbControl dc)
4590 25 Sep 17 nicklas 307   {
4590 25 Sep 17 nicklas 308     DerivedBioAssay merged = getItem();
6193 30 Mar 21 nicklas 309     ItemQuery<DerivedBioAssay> query = null;
6193 30 Mar 21 nicklas 310     if (merged.isInDatabase())
6193 30 Mar 21 nicklas 311     {
6193 30 Mar 21 nicklas 312       query = merged.getChildren();
6193 30 Mar 21 nicklas 313       Subtype.ALIGNED_SEQUENCES.addFilter(dc, query);
6193 30 Mar 21 nicklas 314       query.setIncludes(Include.ALL);
6193 30 Mar 21 nicklas 315     }
4881 03 Jul 18 nicklas 316     return getNextChildItemName(dc, query, Subtype.ALIGNED_SEQUENCES.getItemSuffix(), true);
4590 25 Sep 17 nicklas 317   }
4590 25 Sep 17 nicklas 318   
2364 15 Apr 14 nicklas 319   @Override
2364 15 Apr 14 nicklas 320   protected void initJSON(JSONObject json) 
2364 15 Apr 14 nicklas 321   {
2364 15 Apr 14 nicklas 322     super.initJSON(json);
2364 15 Apr 14 nicklas 323   }
2364 15 Apr 14 nicklas 324   
2364 15 Apr 14 nicklas 325
2364 15 Apr 14 nicklas 326 }