extensions/net.sf.basedb.meludi/trunk/src/net/sf/basedb/meludi/dao/Dna.java

Code
Comments
Other
Rev Date Author Line
3028 11 Dec 14 olle 1 package net.sf.basedb.meludi.dao;
3028 11 Dec 14 olle 2
3028 11 Dec 14 olle 3 import java.util.ArrayList;
3028 11 Dec 14 olle 4 import java.util.Collection;
3028 11 Dec 14 olle 5 import java.util.List;
3028 11 Dec 14 olle 6
3028 11 Dec 14 olle 7 import org.json.simple.JSONObject;
3028 11 Dec 14 olle 8
5115 20 Nov 18 olle 9 import net.sf.basedb.core.AnnotationSimpleRestriction;
5115 20 Nov 18 olle 10 import net.sf.basedb.core.AnnotationType;
3028 11 Dec 14 olle 11 import net.sf.basedb.core.DbControl;
3028 11 Dec 14 olle 12 import net.sf.basedb.core.Extract;
3180 17 Mar 15 olle 13 import net.sf.basedb.core.Include;
3180 17 Mar 15 olle 14 import net.sf.basedb.core.InvalidDataException;
3028 11 Dec 14 olle 15 import net.sf.basedb.core.ItemQuery;
5115 20 Nov 18 olle 16 import net.sf.basedb.core.Operator;
5115 20 Nov 18 olle 17 import net.sf.basedb.core.Sample;
3028 11 Dec 14 olle 18 import net.sf.basedb.core.Type;
3028 11 Dec 14 olle 19 import net.sf.basedb.core.query.Expressions;
3028 11 Dec 14 olle 20 import net.sf.basedb.core.query.Hql;
3176 06 Mar 15 olle 21 import net.sf.basedb.core.query.Orders;
3028 11 Dec 14 olle 22 import net.sf.basedb.core.query.Restrictions;
3028 11 Dec 14 olle 23 import net.sf.basedb.meludi.JsonUtil;
3176 06 Mar 15 olle 24 import net.sf.basedb.meludi.Meludi;
3028 11 Dec 14 olle 25
3028 11 Dec 14 olle 26 /**
3028 11 Dec 14 olle 27   Class for loading information that is related to DNA extracts.
3028 11 Dec 14 olle 28   
3028 11 Dec 14 olle 29   @author nicklas
3028 11 Dec 14 olle 30   @since 2.13
3028 11 Dec 14 olle 31 */
3028 11 Dec 14 olle 32 public class Dna 
3028 11 Dec 14 olle 33   extends MeludiItem<Extract>
3028 11 Dec 14 olle 34 {
3028 11 Dec 14 olle 35
3028 11 Dec 14 olle 36
3028 11 Dec 14 olle 37   /**
3028 11 Dec 14 olle 38     Find all DNA items by case name. This method will check for {@link Subtype#DNA}
3028 11 Dec 14 olle 39     extracts with a name matching the case name (eg. xxx.d).
3028 11 Dec 14 olle 40   */
3028 11 Dec 14 olle 41   public static List<Dna> findByCaseName(DbControl dc, String name)
3028 11 Dec 14 olle 42   {
3423 24 Jun 15 olle 43     // Remove suffix starting with dot "."
3423 24 Jun 15 olle 44     int firstDotIndex = name.indexOf(".");
3423 24 Jun 15 olle 45     if (firstDotIndex >= 0)
3423 24 Jun 15 olle 46     {
3423 24 Jun 15 olle 47       name = name.substring(0, firstDotIndex);
3423 24 Jun 15 olle 48     }
5115 20 Nov 18 olle 49
3028 11 Dec 14 olle 50     // Look for a dna with the given name 
3028 11 Dec 14 olle 51     ItemQuery<Extract> dnaQuery = Extract.getQuery();
3028 11 Dec 14 olle 52     Subtype.DNA.addFilter(dc, dnaQuery);
3028 11 Dec 14 olle 53     dnaQuery.restrict(Restrictions.like(Hql.property("name"), Expressions.parameter("name", name+".%", Type.STRING)));
3028 11 Dec 14 olle 54     
3028 11 Dec 14 olle 55     List<Extract> tmp = dnaQuery.list(dc);
3028 11 Dec 14 olle 56     List<Dna> dna = new ArrayList<Dna>(tmp.size());
3028 11 Dec 14 olle 57     for (Extract e : tmp)
3028 11 Dec 14 olle 58     {
3028 11 Dec 14 olle 59       dna.add(new Dna(e));
3028 11 Dec 14 olle 60     }
5115 20 Nov 18 olle 61
5115 20 Nov 18 olle 62     if (dna.size() == 0)
5115 20 Nov 18 olle 63     {
5115 20 Nov 18 olle 64       // Try to use specimen name as input
5115 20 Nov 18 olle 65       ItemQuery<Sample> specimenQuery = Sample.getQuery();
5115 20 Nov 18 olle 66       String caseId = name;
5115 20 Nov 18 olle 67       AnnotationType caseIdType = Annotationtype.CASE_ID.load(dc);
5115 20 Nov 18 olle 68       specimenQuery = Sample.getQuery();
5115 20 Nov 18 olle 69       Subtype.SPECIMEN.addFilter(dc, specimenQuery);
5115 20 Nov 18 olle 70       specimenQuery.restrict(new AnnotationSimpleRestriction(null, caseIdType, Operator.EQ, caseId, true, false));
5115 20 Nov 18 olle 71       specimenQuery.setIncludes(Meludi.INCLUDE_IN_CURRENT_PROJECT);
5115 20 Nov 18 olle 72       specimenQuery.order(Orders.asc(Hql.property("name")));
5115 20 Nov 18 olle 73
5115 20 Nov 18 olle 74       // Look for a dna with the given name 
5115 20 Nov 18 olle 75       dnaQuery = Extract.getQuery();
5115 20 Nov 18 olle 76
5115 20 Nov 18 olle 77       for (Sample s : specimenQuery.list(dc))
5115 20 Nov 18 olle 78       {    
5115 20 Nov 18 olle 79         String specName = s.getName();
5115 20 Nov 18 olle 80         dnaQuery.reset();
5115 20 Nov 18 olle 81         Subtype.DNA.addFilter(dc, dnaQuery);
5115 20 Nov 18 olle 82         dnaQuery.restrict(Restrictions.like(Hql.property("name"), Expressions.parameter("name", specName+".%", Type.STRING)));
5115 20 Nov 18 olle 83         
5115 20 Nov 18 olle 84         tmp = dnaQuery.list(dc);
5115 20 Nov 18 olle 85         for (Extract e : tmp)
5115 20 Nov 18 olle 86         {
5115 20 Nov 18 olle 87           dna.add(new Dna(e));
5115 20 Nov 18 olle 88         }
5115 20 Nov 18 olle 89       }
5115 20 Nov 18 olle 90     }
3028 11 Dec 14 olle 91     return dna;
3028 11 Dec 14 olle 92   }
3180 17 Mar 15 olle 93   
3180 17 Mar 15 olle 94   /**
3180 17 Mar 15 olle 95     Find a DNA item with the given name.
3180 17 Mar 15 olle 96     @return A DNA item, or null if not found.
3180 17 Mar 15 olle 97   */
3180 17 Mar 15 olle 98   public static Dna findByName(DbControl dc, String name)
3180 17 Mar 15 olle 99   {
3180 17 Mar 15 olle 100     Dna dna = null;
3028 11 Dec 14 olle 101
3180 17 Mar 15 olle 102     ItemQuery<Extract> dnaQuery = Extract.getQuery();
3180 17 Mar 15 olle 103     Subtype.DNA.addFilter(dc, dnaQuery);
3180 17 Mar 15 olle 104     dnaQuery.restrict(Restrictions.like(Hql.property("name"), Expressions.string(name)));
3180 17 Mar 15 olle 105     dnaQuery.order(Orders.desc(Hql.property("name")));        
3180 17 Mar 15 olle 106     dnaQuery.include(Include.ALL);
3028 11 Dec 14 olle 107   
3180 17 Mar 15 olle 108     List<Extract> tmp = dnaQuery.list(dc);
3180 17 Mar 15 olle 109     if (tmp.size() > 1)
3180 17 Mar 15 olle 110     {
3343 19 May 15 olle 111       String extractIds = "";
3343 19 May 15 olle 112       for (int i = 0; i < tmp.size(); i++)
3343 19 May 15 olle 113       {
3343 19 May 15 olle 114         Dna tmpDna = new Dna(tmp.get(i));
3343 19 May 15 olle 115         int id = tmpDna.getItem().getId();
3343 19 May 15 olle 116         if (!extractIds.equals(""))
3343 19 May 15 olle 117         {
3343 19 May 15 olle 118           extractIds += ", ";
3343 19 May 15 olle 119         }
3343 19 May 15 olle 120         extractIds += id;
3343 19 May 15 olle 121       }
3180 17 Mar 15 olle 122       throw new InvalidDataException(
3180 17 Mar 15 olle 123           "More than one DNA item with the name " + name + " was found. " +
3343 19 May 15 olle 124           " The ID values are " + extractIds + ". " +
3180 17 Mar 15 olle 125           "This wizard can't be used until that is corrected.");
3180 17 Mar 15 olle 126     }
3180 17 Mar 15 olle 127     if (tmp.size() == 1)
3180 17 Mar 15 olle 128     {
3180 17 Mar 15 olle 129       dna = new Dna(tmp.get(0));
3180 17 Mar 15 olle 130     }
3180 17 Mar 15 olle 131     return dna;
3180 17 Mar 15 olle 132   }
3180 17 Mar 15 olle 133
3028 11 Dec 14 olle 134   /**
3176 06 Mar 15 olle 135     Find unquantified DNA. An DNA item that has not been quantified
3176 06 Mar 15 olle 136     has a 'null' {@link MeasuredBioMaterial#getOriginalQuantity()}
3176 06 Mar 15 olle 137     and has no extracts.
3176 06 Mar 15 olle 138     @since 1.2
3176 06 Mar 15 olle 139    */
3176 06 Mar 15 olle 140   public static List<Dna> findUnquantifiedDna(DbControl dc)
3176 06 Mar 15 olle 141   {
3176 06 Mar 15 olle 142     List<Dna> unQuantifiedDna = new ArrayList<Dna>();
3176 06 Mar 15 olle 143
3176 06 Mar 15 olle 144     ItemQuery<Extract> extractQuery = Extract.getQuery();
3176 06 Mar 15 olle 145     Subtype.DNA.addFilter(dc, extractQuery);
3176 06 Mar 15 olle 146     extractQuery.restrict(Restrictions.eq(Hql.property("originalQuantity"), null));
3176 06 Mar 15 olle 147     extractQuery.order(Orders.asc(Hql.property("id")));
3176 06 Mar 15 olle 148     extractQuery.setIncludes(Meludi.INCLUDE_IN_CURRENT_PROJECT);
3176 06 Mar 15 olle 149     List<Extract> extracts = extractQuery.list(dc);
3176 06 Mar 15 olle 150     for (Extract extract : extracts)
3176 06 Mar 15 olle 151     {
3176 06 Mar 15 olle 152       if (extract.countExtracts() == 0)
3176 06 Mar 15 olle 153       {
3176 06 Mar 15 olle 154         unQuantifiedDna.add(new Dna(extract));
3176 06 Mar 15 olle 155       }
3176 06 Mar 15 olle 156     }
3176 06 Mar 15 olle 157     return unQuantifiedDna;
3176 06 Mar 15 olle 158   }
3176 06 Mar 15 olle 159
3176 06 Mar 15 olle 160   /**
3028 11 Dec 14 olle 161     Get a DNA extract when the id is known.
3028 11 Dec 14 olle 162   */
3028 11 Dec 14 olle 163   public static Dna getById(DbControl dc, int id)
3028 11 Dec 14 olle 164   {
3028 11 Dec 14 olle 165     return new Dna(Extract.getById(dc, id));
3028 11 Dec 14 olle 166   }
3028 11 Dec 14 olle 167   
3028 11 Dec 14 olle 168   public static Dna get(Extract extract)
3028 11 Dec 14 olle 169   {
3028 11 Dec 14 olle 170     return new Dna(extract);
3028 11 Dec 14 olle 171   }
3028 11 Dec 14 olle 172   
3449 28 Jul 15 olle 173   public static List<Dna> toList(Collection<Extract> extracts)
3449 28 Jul 15 olle 174   {
3449 28 Jul 15 olle 175     List<Dna> dna = new ArrayList<Dna>(extracts.size());
3449 28 Jul 15 olle 176     for (Extract e : extracts)
3449 28 Jul 15 olle 177     {
3449 28 Jul 15 olle 178       dna.add(new Dna(e));
3449 28 Jul 15 olle 179     }
3449 28 Jul 15 olle 180     return dna;
3449 28 Jul 15 olle 181   }
3449 28 Jul 15 olle 182   
3028 11 Dec 14 olle 183   public static List<Dna> toDna(Collection<Extract> extracts)
3028 11 Dec 14 olle 184   {
3028 11 Dec 14 olle 185     List<Dna> dna = new ArrayList<Dna>(extracts.size());
3028 11 Dec 14 olle 186     for (Extract e : extracts)
3028 11 Dec 14 olle 187     {
3028 11 Dec 14 olle 188       dna.add(new Dna(e));
3028 11 Dec 14 olle 189     }
3028 11 Dec 14 olle 190     return dna;
3028 11 Dec 14 olle 191   }
3028 11 Dec 14 olle 192   
3028 11 Dec 14 olle 193   private JSONObject jsonWell;
3028 11 Dec 14 olle 194   
3028 11 Dec 14 olle 195   private Dna(Extract extract)
3028 11 Dec 14 olle 196   {
3028 11 Dec 14 olle 197     super(extract);
3028 11 Dec 14 olle 198   }  
3028 11 Dec 14 olle 199   
3028 11 Dec 14 olle 200   
3028 11 Dec 14 olle 201   /**
3028 11 Dec 14 olle 202     Get the real extract that represents this DNA in BASE.
3028 11 Dec 14 olle 203   */
3028 11 Dec 14 olle 204   public Extract getExtract()
3028 11 Dec 14 olle 205   {
3028 11 Dec 14 olle 206     return getItem();
3028 11 Dec 14 olle 207   }
3028 11 Dec 14 olle 208
3028 11 Dec 14 olle 209   @SuppressWarnings("unchecked")
3028 11 Dec 14 olle 210   @Override
3028 11 Dec 14 olle 211   protected void initJSON(JSONObject json) 
3028 11 Dec 14 olle 212   {
3028 11 Dec 14 olle 213     super.initJSON(json);
3028 11 Dec 14 olle 214     if (jsonWell != null) json.put("bioWell", jsonWell);
3028 11 Dec 14 olle 215     
3028 11 Dec 14 olle 216   }
3028 11 Dec 14 olle 217   
3028 11 Dec 14 olle 218   /**
3028 11 Dec 14 olle 219     Load information about the plate and location the current FlowThrough
3028 11 Dec 14 olle 220     is located on.
3028 11 Dec 14 olle 221   */
3028 11 Dec 14 olle 222   public JSONObject loadBioPlateLocation()
3028 11 Dec 14 olle 223   {
3028 11 Dec 14 olle 224     if (jsonWell == null)
3028 11 Dec 14 olle 225     {
3028 11 Dec 14 olle 226       jsonWell = JsonUtil.getBioWellAsJSON(getItem().getBioWell(), true);
3028 11 Dec 14 olle 227     }
3028 11 Dec 14 olle 228     return jsonWell;
3028 11 Dec 14 olle 229   }
3028 11 Dec 14 olle 230   
3028 11 Dec 14 olle 231 }