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

Code
Comments
Other
Rev Date Author Line
1894 04 Mar 13 nicklas 1 package net.sf.basedb.reggie.dao;
1894 04 Mar 13 nicklas 2
1894 04 Mar 13 nicklas 3 import java.util.ArrayList;
1894 04 Mar 13 nicklas 4 import java.util.Collection;
1894 04 Mar 13 nicklas 5 import java.util.List;
1894 04 Mar 13 nicklas 6
1894 04 Mar 13 nicklas 7 import org.json.simple.JSONObject;
1894 04 Mar 13 nicklas 8
5786 13 Dec 19 nicklas 9 import net.sf.basedb.core.BioMaterial;
1894 04 Mar 13 nicklas 10 import net.sf.basedb.core.BioWell;
1894 04 Mar 13 nicklas 11 import net.sf.basedb.core.DbControl;
2267 05 Mar 14 nicklas 12 import net.sf.basedb.core.DerivedBioAssay;
1894 04 Mar 13 nicklas 13 import net.sf.basedb.core.Extract;
2267 05 Mar 14 nicklas 14 import net.sf.basedb.core.Include;
3309 06 May 15 nicklas 15 import net.sf.basedb.core.Item;
1959 03 May 13 nicklas 16 import net.sf.basedb.core.ItemQuery;
3309 06 May 15 nicklas 17 import net.sf.basedb.core.ItemSubtype;
5786 13 Dec 19 nicklas 18 import net.sf.basedb.core.Sample;
1894 04 Mar 13 nicklas 19 import net.sf.basedb.core.Tag;
2050 07 Oct 13 olle 20 import net.sf.basedb.core.Type;
2050 07 Oct 13 olle 21 import net.sf.basedb.core.query.Expressions;
1959 03 May 13 nicklas 22 import net.sf.basedb.core.query.Hql;
1959 03 May 13 nicklas 23 import net.sf.basedb.core.query.Orders;
2050 07 Oct 13 olle 24 import net.sf.basedb.core.query.Restrictions;
1959 03 May 13 nicklas 25 import net.sf.basedb.reggie.JsonUtil;
1959 03 May 13 nicklas 26 import net.sf.basedb.reggie.Reggie;
5198 19 Dec 18 nicklas 27 import net.sf.basedb.util.filter.Filter;
5198 19 Dec 18 nicklas 28 import net.sf.basedb.util.filter.StaticFilter;
1894 04 Mar 13 nicklas 29
1894 04 Mar 13 nicklas 30 /**
1894 04 Mar 13 nicklas 31   Class for loading information that is related to Library extracts.
1894 04 Mar 13 nicklas 32   
1894 04 Mar 13 nicklas 33   @author nicklas
1894 04 Mar 13 nicklas 34   @since 2.12
1894 04 Mar 13 nicklas 35 */
1894 04 Mar 13 nicklas 36 public class Library 
1894 04 Mar 13 nicklas 37   extends ReggieItem<Extract>
1894 04 Mar 13 nicklas 38 {
2050 07 Oct 13 olle 39   /**
2050 07 Oct 13 olle 40     Find all library items by case name. This method will check for {@link Subtype#LIBRARY}
2050 07 Oct 13 olle 41     extracts with a name matching the case name (eg. xxx.r.m.c.lib).
2050 07 Oct 13 olle 42     @since 2.13
2050 07 Oct 13 olle 43    */
2050 07 Oct 13 olle 44   public static List<Library> findByCaseName(DbControl dc, String name)
2050 07 Oct 13 olle 45   {
2050 07 Oct 13 olle 46     // Get rid of suffixes in the name (eg. 'C' which is used for pre-neoadjuvant forms)
2050 07 Oct 13 olle 47     if (name.length() > 7) name = name.substring(0, 7);    
1894 04 Mar 13 nicklas 48
2050 07 Oct 13 olle 49     // Look for a library with the given name 
2050 07 Oct 13 olle 50     ItemQuery<Extract> libQuery = Extract.getQuery();
2050 07 Oct 13 olle 51     Subtype.LIBRARY.addFilter(dc, libQuery);
2917 11 Nov 14 nicklas 52     libQuery.setIncludes(Reggie.INCLUDE_IN_CURRENT_PROJECT);
2050 07 Oct 13 olle 53     libQuery.restrict(Restrictions.like(Hql.property("name"), Expressions.parameter("name", name+".%", Type.STRING)));
2917 11 Nov 14 nicklas 54     libQuery.order(Orders.asc(Hql.property("name")));
2050 07 Oct 13 olle 55
2050 07 Oct 13 olle 56     List<Extract> tmp = libQuery.list(dc);
2050 07 Oct 13 olle 57     List<Library> lib = new ArrayList<Library>(tmp.size());
2050 07 Oct 13 olle 58     for (Extract e : tmp)
2050 07 Oct 13 olle 59     {
2050 07 Oct 13 olle 60       lib.add(new Library(e));
2050 07 Oct 13 olle 61     }
2050 07 Oct 13 olle 62     return lib;
2050 07 Oct 13 olle 63   }
2050 07 Oct 13 olle 64
2050 07 Oct 13 olle 65
1894 04 Mar 13 nicklas 66   /**
1894 04 Mar 13 nicklas 67     Get a Library extract when the id is known.
1894 04 Mar 13 nicklas 68   */
1894 04 Mar 13 nicklas 69   public static Library getById(DbControl dc, int id)
1894 04 Mar 13 nicklas 70   {
1894 04 Mar 13 nicklas 71     return new Library(Extract.getById(dc, id));
1894 04 Mar 13 nicklas 72   }
1894 04 Mar 13 nicklas 73   
2907 07 Nov 14 nicklas 74   /**
2907 07 Nov 14 nicklas 75     @since 2.18
2907 07 Nov 14 nicklas 76   */
2907 07 Nov 14 nicklas 77   public static Library get(Extract extract)
2907 07 Nov 14 nicklas 78   {
2907 07 Nov 14 nicklas 79     return new Library(extract);
2907 07 Nov 14 nicklas 80   }
2907 07 Nov 14 nicklas 81
2907 07 Nov 14 nicklas 82   
1959 03 May 13 nicklas 83   public static List<Library> getByPool(DbControl dc, PooledLibrary pool)
1959 03 May 13 nicklas 84   {
5363 16 Apr 19 nicklas 85     ItemQuery<Extract> libQuery = pool.getExtract().getCreationEvent().getSources();
1959 03 May 13 nicklas 86     Subtype.LIBRARY.addFilter(dc, libQuery);
1959 03 May 13 nicklas 87     libQuery.include(Reggie.INCLUDE_IN_CURRENT_PROJECT);
1959 03 May 13 nicklas 88     
1959 03 May 13 nicklas 89     libQuery.join(Hql.innerJoin(null, "bioWell", "bw", true));
1959 03 May 13 nicklas 90     libQuery.join(Hql.innerJoin("bw", "bioPlate", "bp", true));
1959 03 May 13 nicklas 91     
1959 03 May 13 nicklas 92     libQuery.order(Orders.asc(Hql.property("bp", "name")));
1959 03 May 13 nicklas 93     libQuery.order(Orders.asc(Hql.property("bw", "column")));
1959 03 May 13 nicklas 94     libQuery.order(Orders.asc(Hql.property("bw", "row")));
1959 03 May 13 nicklas 95     
1959 03 May 13 nicklas 96     List<Extract> tmp = libQuery.list(dc);
1959 03 May 13 nicklas 97
1959 03 May 13 nicklas 98     return toList(tmp);
1959 03 May 13 nicklas 99   }
1959 03 May 13 nicklas 100   
1894 04 Mar 13 nicklas 101   public static List<Library> toList(Collection<Extract> extracts)
1894 04 Mar 13 nicklas 102   {
5198 19 Dec 18 nicklas 103     return toList(extracts, new StaticFilter<>(true));
5198 19 Dec 18 nicklas 104   }
5198 19 Dec 18 nicklas 105   
5198 19 Dec 18 nicklas 106   public static List<Library> toList(Collection<Extract> extracts, Filter<Extract> filter)
5198 19 Dec 18 nicklas 107   {
1894 04 Mar 13 nicklas 108     List<Library> lib = new ArrayList<Library>(extracts.size());
1894 04 Mar 13 nicklas 109     for (Extract e : extracts)
1894 04 Mar 13 nicklas 110     {
5198 19 Dec 18 nicklas 111       if (filter.evaluate(e)) lib.add(new Library(e));
1894 04 Mar 13 nicklas 112     }
1894 04 Mar 13 nicklas 113     return lib;
1894 04 Mar 13 nicklas 114   }
1894 04 Mar 13 nicklas 115   
1894 04 Mar 13 nicklas 116   private JSONObject jsonWell;
1894 04 Mar 13 nicklas 117   private JSONObject jsonBarcode;
1894 04 Mar 13 nicklas 118   
1894 04 Mar 13 nicklas 119   private Library(Extract extract)
1894 04 Mar 13 nicklas 120   {
1894 04 Mar 13 nicklas 121     super(extract);
1894 04 Mar 13 nicklas 122
1894 04 Mar 13 nicklas 123   }  
1894 04 Mar 13 nicklas 124   
1894 04 Mar 13 nicklas 125   /**
1894 04 Mar 13 nicklas 126     Get the real extract that represents this Library in BASE.
1894 04 Mar 13 nicklas 127   */
1894 04 Mar 13 nicklas 128   public Extract getExtract()
1894 04 Mar 13 nicklas 129   {
1894 04 Mar 13 nicklas 130     return getItem();
1894 04 Mar 13 nicklas 131   }
1894 04 Mar 13 nicklas 132
2907 07 Nov 14 nicklas 133   /**
3309 06 May 15 nicklas 134     Get the parent cDNA item. If the parent item is not
3309 06 May 15 nicklas 135     a cDNA null is returned.
3309 06 May 15 nicklas 136     @since 3.4
2907 07 Nov 14 nicklas 137   */
3309 06 May 15 nicklas 138   public CDna getCDna(DbControl dc)
2907 07 Nov 14 nicklas 139   {
2907 07 Nov 14 nicklas 140     Extract lib = getItem();    
2907 07 Nov 14 nicklas 141     Extract cdna = (Extract)lib.getParent();
3309 06 May 15 nicklas 142     ItemSubtype c = Subtype.CDNA.load(dc);
3309 06 May 15 nicklas 143     return c.equals(cdna.getItemSubtype()) ? CDna.get(cdna) : null;
2907 07 Nov 14 nicklas 144   }
2907 07 Nov 14 nicklas 145
3309 06 May 15 nicklas 146   /**
3309 06 May 15 nicklas 147     Get the parent RNA or RNANormalizedAliquot item.
3309 06 May 15 nicklas 148     @param acceptPrenormalized If TRUE, the RNA item may be a prenormalized
3309 06 May 15 nicklas 149       aliquot
3309 06 May 15 nicklas 150     @since 3.4
3309 06 May 15 nicklas 151   */
3309 06 May 15 nicklas 152   public Rna getRna(DbControl dc, boolean acceptPrenormalized)
3309 06 May 15 nicklas 153   {
3309 06 May 15 nicklas 154     Extract e = getItem();
3309 06 May 15 nicklas 155     ItemSubtype rnaType = Subtype.RNA.load(dc);
3309 06 May 15 nicklas 156     ItemSubtype normalizedType = Subtype.RNA_NORMALIZED_ALIQUOT.load(dc);
3309 06 May 15 nicklas 157     
3309 06 May 15 nicklas 158     while (e.getParentType() == Item.EXTRACT)
3309 06 May 15 nicklas 159     {
3309 06 May 15 nicklas 160       Extract parent = (Extract)e.getParent();
3309 06 May 15 nicklas 161       ItemSubtype parentType = parent.getItemSubtype();
3309 06 May 15 nicklas 162       if (rnaType.equals(parentType) || acceptPrenormalized && normalizedType.equals(parentType))
3309 06 May 15 nicklas 163       {
3309 06 May 15 nicklas 164         return Rna.get(parent);
3309 06 May 15 nicklas 165       }
3309 06 May 15 nicklas 166       e = parent;
3309 06 May 15 nicklas 167     }
3309 06 May 15 nicklas 168     return null;
3309 06 May 15 nicklas 169   }
2907 07 Nov 14 nicklas 170   
5424 13 May 19 nicklas 171   /**
5424 13 May 19 nicklas 172     Get the parent DNA or DNANormalizedAliquot item.
5424 13 May 19 nicklas 173     @param acceptPrenormalized If TRUE, the DNA item may be a prenormalized
5424 13 May 19 nicklas 174       aliquot
5424 13 May 19 nicklas 175     @since 4.23
5424 13 May 19 nicklas 176   */
5424 13 May 19 nicklas 177   public Dna getDna(DbControl dc, boolean acceptPrenormalized)
5424 13 May 19 nicklas 178   {
5424 13 May 19 nicklas 179     Extract e = getItem();
5424 13 May 19 nicklas 180     ItemSubtype dnaType = Subtype.DNA.load(dc);
5424 13 May 19 nicklas 181     ItemSubtype normalizedType = Subtype.DNA_NORMALIZED_ALIQUOT.load(dc);
5424 13 May 19 nicklas 182     
5424 13 May 19 nicklas 183     while (e.getParentType() == Item.EXTRACT)
5424 13 May 19 nicklas 184     {
5424 13 May 19 nicklas 185       Extract parent = (Extract)e.getParent();
5424 13 May 19 nicklas 186       ItemSubtype parentType = parent.getItemSubtype();
5424 13 May 19 nicklas 187       if (dnaType.equals(parentType) || acceptPrenormalized && normalizedType.equals(parentType))
5424 13 May 19 nicklas 188       {
5424 13 May 19 nicklas 189         return Dna.get(parent);
5424 13 May 19 nicklas 190       }
5424 13 May 19 nicklas 191       e = parent;
5424 13 May 19 nicklas 192     }
5424 13 May 19 nicklas 193     return null;
5424 13 May 19 nicklas 194   }
5424 13 May 19 nicklas 195
5523 24 Jun 19 nicklas 196   /**
5786 13 Dec 19 nicklas 197     Load the top-most parent item that is an extract or sample. This method is primarily
5786 13 Dec 19 nicklas 198     intended to find the root item (RNA, DNA or Specimen) for an external library.
5786 13 Dec 19 nicklas 199     @since 4.23, 4.25
5523 24 Jun 19 nicklas 200   */
5786 13 Dec 19 nicklas 201   public BioMaterial getTopExtractOrSample(DbControl dc)
5523 24 Jun 19 nicklas 202   {
5523 24 Jun 19 nicklas 203     Extract e = getItem();
5786 13 Dec 19 nicklas 204     Sample s = null;
5523 24 Jun 19 nicklas 205     while (e.getParentType() == Item.EXTRACT)
5523 24 Jun 19 nicklas 206     {
5523 24 Jun 19 nicklas 207       e = (Extract)e.getParent();
5523 24 Jun 19 nicklas 208     }
5786 13 Dec 19 nicklas 209     if (e.getParentType() == Item.SAMPLE)
5786 13 Dec 19 nicklas 210     {
5786 13 Dec 19 nicklas 211       s = (Sample)e.getParent();
5786 13 Dec 19 nicklas 212       while (s.getParentType() == Item.SAMPLE)
5786 13 Dec 19 nicklas 213       {
5786 13 Dec 19 nicklas 214         s = (Sample)s.getParent();
5786 13 Dec 19 nicklas 215       }
5786 13 Dec 19 nicklas 216     }
5786 13 Dec 19 nicklas 217     return s == null ? e : s;
5523 24 Jun 19 nicklas 218   }
5424 13 May 19 nicklas 219   
5523 24 Jun 19 nicklas 220   
1894 04 Mar 13 nicklas 221   @Override
1894 04 Mar 13 nicklas 222   protected void initJSON(JSONObject json) 
1894 04 Mar 13 nicklas 223   {
1894 04 Mar 13 nicklas 224     super.initJSON(json);
1894 04 Mar 13 nicklas 225     if (jsonBarcode == null)
1894 04 Mar 13 nicklas 226     {
1894 04 Mar 13 nicklas 227       Tag barcode = getExtract().getTag();
1894 04 Mar 13 nicklas 228       jsonBarcode = new JSONObject();
1894 04 Mar 13 nicklas 229       if (barcode != null)
1894 04 Mar 13 nicklas 230       {
1894 04 Mar 13 nicklas 231         jsonBarcode.put("id", barcode.getId());
1894 04 Mar 13 nicklas 232         jsonBarcode.put("name", barcode.getName());
1894 04 Mar 13 nicklas 233       }
1894 04 Mar 13 nicklas 234     }
1894 04 Mar 13 nicklas 235     json.put("barcode", jsonBarcode);
1894 04 Mar 13 nicklas 236     if (jsonWell != null) json.put("bioWell", jsonWell);
1894 04 Mar 13 nicklas 237   }
1894 04 Mar 13 nicklas 238
1894 04 Mar 13 nicklas 239   /**
1894 04 Mar 13 nicklas 240     Load information about the plate and location the current Library
1894 04 Mar 13 nicklas 241     is located on.
1894 04 Mar 13 nicklas 242   */
1894 04 Mar 13 nicklas 243   public JSONObject loadBioPlateLocation()
1894 04 Mar 13 nicklas 244   {
1894 04 Mar 13 nicklas 245     if (jsonWell != null) return jsonWell;
1894 04 Mar 13 nicklas 246
1959 03 May 13 nicklas 247     Extract lib = getItem();
1959 03 May 13 nicklas 248     BioWell well = lib.getBioWell();
1894 04 Mar 13 nicklas 249
1894 04 Mar 13 nicklas 250     if (well != null)
1894 04 Mar 13 nicklas 251     {
2134 11 Nov 13 nicklas 252       jsonWell = JsonUtil.getBioWellAsJSON(well, true);
1894 04 Mar 13 nicklas 253     }
1894 04 Mar 13 nicklas 254
1894 04 Mar 13 nicklas 255     return jsonWell;
1894 04 Mar 13 nicklas 256   }
2267 05 Mar 14 nicklas 257   
2267 05 Mar 14 nicklas 258   /**
2819 16 Oct 14 nicklas 259     Get all pools with this library.
2819 16 Oct 14 nicklas 260     @since 2.16.2
2819 16 Oct 14 nicklas 261   */
2819 16 Oct 14 nicklas 262   public List<PooledLibrary> getPools(DbControl dc)
2819 16 Oct 14 nicklas 263   {
2819 16 Oct 14 nicklas 264     ItemQuery<Extract> query = Extract.getQuery();
2819 16 Oct 14 nicklas 265     Subtype.POOLED_LIBRARY.addFilter(dc, query);
2819 16 Oct 14 nicklas 266     query.setIncludes(Reggie.INCLUDE_IN_CURRENT_PROJECT);
2819 16 Oct 14 nicklas 267     
2819 16 Oct 14 nicklas 268     // Join libraries
2819 16 Oct 14 nicklas 269     query.join(Hql.innerJoin("creationEvent", "ce"));
2819 16 Oct 14 nicklas 270     query.join(Hql.innerJoin("ce", "sources", "src"));
2819 16 Oct 14 nicklas 271     query.restrict(Restrictions.eq(Hql.property("src", "bioMaterial"), Hql.entity(getItem())));
2819 16 Oct 14 nicklas 272     
2819 16 Oct 14 nicklas 273     query.order(Orders.asc(Hql.property("name")));
2819 16 Oct 14 nicklas 274     
2819 16 Oct 14 nicklas 275     return PooledLibrary.toList(query.list(dc));
2819 16 Oct 14 nicklas 276   }
2819 16 Oct 14 nicklas 277   
2819 16 Oct 14 nicklas 278   /**
4886 04 Jul 18 nicklas 279     Find the next name to give the temporary child item that is sometimes 
4886 04 Jul 18 nicklas 280     used for mixing an aliquot of proper concentration before pooling. 
4886 04 Jul 18 nicklas 281     The child item is also of the Library subtype, but has 'dil'
4886 04 Jul 18 nicklas 282     as suffix.
4886 04 Jul 18 nicklas 283     @return The next unused name
4886 04 Jul 18 nicklas 284     @since 4.19
4886 04 Jul 18 nicklas 285   */
4886 04 Jul 18 nicklas 286   public String getNextTemporaryDilName(DbControl dc)
4886 04 Jul 18 nicklas 287   {
4886 04 Jul 18 nicklas 288     Extract lib = getItem();
6193 30 Mar 21 nicklas 289     ItemQuery<Extract> query = null;
6193 30 Mar 21 nicklas 290     if (lib.isInDatabase())
6193 30 Mar 21 nicklas 291     {
6193 30 Mar 21 nicklas 292       query = lib.getChildExtracts();
6193 30 Mar 21 nicklas 293       Subtype.LIBRARY.addFilter(dc, query);
6193 30 Mar 21 nicklas 294       query.restrict(Restrictions.like(Hql.property("name"), Expressions.string(lib.getName()+".dil%")));
6193 30 Mar 21 nicklas 295       query.setIncludes(Include.ALL);
6193 30 Mar 21 nicklas 296     }
4886 04 Jul 18 nicklas 297     return getNextChildItemName(dc, query, "dil", true);
4886 04 Jul 18 nicklas 298   }
4886 04 Jul 18 nicklas 299   
4886 04 Jul 18 nicklas 300   /**
2267 05 Mar 14 nicklas 301     Find the next name to give a "MergedSequences" child item. This assumes that
2267 05 Mar 14 nicklas 302     all child items are using the naming convention. foo.g, foo.g2, and
2267 05 Mar 14 nicklas 303     so on. NOTE! The first child item have no number!
2267 05 Mar 14 nicklas 304     @return The next unused name
2267 05 Mar 14 nicklas 305   */
2267 05 Mar 14 nicklas 306   public String getNextMergedSequencesName(DbControl dc)
2267 05 Mar 14 nicklas 307   {
2267 05 Mar 14 nicklas 308     Extract lib = getItem();
6193 30 Mar 21 nicklas 309     ItemQuery<DerivedBioAssay> query = null;
6193 30 Mar 21 nicklas 310     if (lib.isInDatabase())
6193 30 Mar 21 nicklas 311     {
6193 30 Mar 21 nicklas 312       query = DerivedBioAssay.getQuery();
6193 30 Mar 21 nicklas 313       Subtype.MERGED_SEQUENCES.addFilter(dc, query);
6193 30 Mar 21 nicklas 314       query.setIncludes(Include.ALL);
6193 30 Mar 21 nicklas 315       query.restrict(Restrictions.eq(Hql.property("extract"), Hql.entity(lib)));
6193 30 Mar 21 nicklas 316     }
4882 03 Jul 18 nicklas 317     return getNextChildItemName(dc, query, Subtype.MERGED_SEQUENCES.getItemSuffix(), true);
2267 05 Mar 14 nicklas 318   }
2267 05 Mar 14 nicklas 319
6215 16 Apr 21 nicklas 320   /**
6215 16 Apr 21 nicklas 321     Find the next name to give a "DemuxedSequences" child item. This assumes that
6215 16 Apr 21 nicklas 322     all child items are using the naming convention. foo.x, foo.x2, and
6215 16 Apr 21 nicklas 323     so on. NOTE! The first child item have no number!
6215 16 Apr 21 nicklas 324     @return The next unused name
6215 16 Apr 21 nicklas 325   */
6215 16 Apr 21 nicklas 326   public String getNextDemuxedSequencesName(DbControl dc)
6215 16 Apr 21 nicklas 327   {
6215 16 Apr 21 nicklas 328     Extract lib = getItem();
6215 16 Apr 21 nicklas 329     ItemQuery<DerivedBioAssay> query = null;
6215 16 Apr 21 nicklas 330     if (lib.isInDatabase())
6215 16 Apr 21 nicklas 331     {
6215 16 Apr 21 nicklas 332       query = DerivedBioAssay.getQuery();
6215 16 Apr 21 nicklas 333       Subtype.DEMUXED_SEQUENCES.addFilter(dc, query);
6215 16 Apr 21 nicklas 334       query.setIncludes(Include.ALL);
6215 16 Apr 21 nicklas 335       query.restrict(Restrictions.eq(Hql.property("extract"), Hql.entity(lib)));
6215 16 Apr 21 nicklas 336     }
6215 16 Apr 21 nicklas 337     return getNextChildItemName(dc, query, Subtype.DEMUXED_SEQUENCES.getItemSuffix(), true);
6215 16 Apr 21 nicklas 338   }
6215 16 Apr 21 nicklas 339
6215 16 Apr 21 nicklas 340   
1894 04 Mar 13 nicklas 341 }