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

Code
Comments
Other
Rev Date Author Line
2933 14 Nov 14 olle 1 package net.sf.basedb.meludi.dao;
2933 14 Nov 14 olle 2
2933 14 Nov 14 olle 3 import java.util.ArrayList;
2933 14 Nov 14 olle 4 import java.util.List;
2933 14 Nov 14 olle 5
2933 14 Nov 14 olle 6 import org.json.simple.JSONArray;
2933 14 Nov 14 olle 7 import org.json.simple.JSONObject;
2933 14 Nov 14 olle 8
2933 14 Nov 14 olle 9 import net.sf.basedb.core.BioPlate;
2933 14 Nov 14 olle 10 import net.sf.basedb.core.BioPlateType;
2933 14 Nov 14 olle 11 import net.sf.basedb.core.BioWell;
2933 14 Nov 14 olle 12 import net.sf.basedb.core.DbControl;
2933 14 Nov 14 olle 13 import net.sf.basedb.core.InvalidDataException;
2933 14 Nov 14 olle 14 import net.sf.basedb.core.Item;
2933 14 Nov 14 olle 15 import net.sf.basedb.core.ItemNotFoundException;
2933 14 Nov 14 olle 16 import net.sf.basedb.core.ItemQuery;
2933 14 Nov 14 olle 17 import net.sf.basedb.core.ItemSubtype;
2933 14 Nov 14 olle 18 import net.sf.basedb.core.PlateGeometry;
2933 14 Nov 14 olle 19 import net.sf.basedb.core.Type;
2933 14 Nov 14 olle 20 import net.sf.basedb.core.query.Expressions;
2933 14 Nov 14 olle 21 import net.sf.basedb.core.query.Hql;
2933 14 Nov 14 olle 22 import net.sf.basedb.core.query.Orders;
2933 14 Nov 14 olle 23 import net.sf.basedb.core.query.Restrictions;
2933 14 Nov 14 olle 24 import net.sf.basedb.meludi.Meludi;
2933 14 Nov 14 olle 25
2933 14 Nov 14 olle 26 /**
2933 14 Nov 14 olle 27   Class for loading information that is related to storage bioplates.
2933 14 Nov 14 olle 28   
2933 14 Nov 14 olle 29   @author nicklas
2933 14 Nov 14 olle 30   @since 2.5
2933 14 Nov 14 olle 31 */
2933 14 Nov 14 olle 32 public class StoragePlate
2933 14 Nov 14 olle 33   extends MeludiItem<BioPlate>
2933 14 Nov 14 olle 34 {
2933 14 Nov 14 olle 35
2933 14 Nov 14 olle 36
2933 14 Nov 14 olle 37   /**
2933 14 Nov 14 olle 38     Find all storage plates which can hold biomaterial items of the given 
2933 14 Nov 14 olle 39     subtype.
2933 14 Nov 14 olle 40     
2933 14 Nov 14 olle 41     
2933 14 Nov 14 olle 42     @param dc
2933 14 Nov 14 olle 43     @param bioPlateType The required bioplate type, or null to not filter on bioplate type
2933 14 Nov 14 olle 44     @param subtype A biomaterial subtype, or null to not filter on subtype
2933 14 Nov 14 olle 45     @param runDateAnnotation The name of an annotation type, or null to not filter on annotation
2933 14 Nov 14 olle 46     @return
2933 14 Nov 14 olle 47   */
2933 14 Nov 14 olle 48   public static List<StoragePlate> findByBioMaterialSubtype(DbControl dc, 
2933 14 Nov 14 olle 49     BioplateType bioPlateType, Subtype subtype)
2933 14 Nov 14 olle 50   {
2933 14 Nov 14 olle 51     ItemQuery<BioPlate> query = BioPlate.getQuery();
2933 14 Nov 14 olle 52     query.setIncludes(Meludi.INCLUDE_IN_CURRENT_PROJECT);
2933 14 Nov 14 olle 53     if (subtype != null || bioPlateType != null)
2933 14 Nov 14 olle 54     {
2933 14 Nov 14 olle 55       query.join(Hql.innerJoin("bioPlateType", "bpt"));
2933 14 Nov 14 olle 56       if (bioPlateType != null) bioPlateType.addFilter(dc, query, false);
2933 14 Nov 14 olle 57       if (subtype != null) subtype.addFilter(dc, query, "bpt");
2933 14 Nov 14 olle 58     }
2933 14 Nov 14 olle 59     
2933 14 Nov 14 olle 60     query.order(Orders.asc(Hql.property("name")));
2933 14 Nov 14 olle 61     
2933 14 Nov 14 olle 62     List<BioPlate> tmp = query.list(dc);
2933 14 Nov 14 olle 63     List<StoragePlate> plates = new ArrayList<StoragePlate>(tmp.size());
2933 14 Nov 14 olle 64     for (BioPlate plate : tmp)
2933 14 Nov 14 olle 65     {
2933 14 Nov 14 olle 66       plates.add(new StoragePlate(plate));
2933 14 Nov 14 olle 67     }
2933 14 Nov 14 olle 68     return plates;
2933 14 Nov 14 olle 69   }
2933 14 Nov 14 olle 70   
2933 14 Nov 14 olle 71   /**
2933 14 Nov 14 olle 72     Find the storage plate with the given name.
2933 14 Nov 14 olle 73     @since 2.16
2933 14 Nov 14 olle 74    */
2933 14 Nov 14 olle 75   public static StoragePlate findByName(DbControl dc, String name)
2933 14 Nov 14 olle 76   {
2933 14 Nov 14 olle 77     
2933 14 Nov 14 olle 78     ItemQuery<BioPlate> query = BioPlate.getQuery();
2933 14 Nov 14 olle 79     query.restrict(Restrictions.eq(Hql.property("name"), Expressions.parameter("name", name, Type.STRING)));
2933 14 Nov 14 olle 80   
2933 14 Nov 14 olle 81     List<BioPlate> tmp = query.list(dc);
2933 14 Nov 14 olle 82     StoragePlate sp = null;
2933 14 Nov 14 olle 83     
2933 14 Nov 14 olle 84     if (tmp.size() > 1)
2933 14 Nov 14 olle 85     {
2933 14 Nov 14 olle 86       throw new InvalidDataException(
2933 14 Nov 14 olle 87         "Found " + tmp.size() + " storage plates with the same name (" + name + 
2933 14 Nov 14 olle 88         "). This wizard can't be used until that is corrected.");
2933 14 Nov 14 olle 89     }
2933 14 Nov 14 olle 90     else if (tmp.size() == 1)
2933 14 Nov 14 olle 91     {
2933 14 Nov 14 olle 92       sp = new StoragePlate(tmp.get(0));
2933 14 Nov 14 olle 93     }
2933 14 Nov 14 olle 94     
2933 14 Nov 14 olle 95     return sp;
2933 14 Nov 14 olle 96   }
2933 14 Nov 14 olle 97
2933 14 Nov 14 olle 98   
2933 14 Nov 14 olle 99   /**
2933 14 Nov 14 olle 100     Find the correct biowell location for a child item, given the location of a parent item.
2933 14 Nov 14 olle 101     The parentPrefix is the prefix on the parent bioplate which is replaced with the
2933 14 Nov 14 olle 102     child prefix. The resulting name is used to located the child bioplate. The child
2933 14 Nov 14 olle 103     item is expected to have the same position as the parent.
2933 14 Nov 14 olle 104   */
2933 14 Nov 14 olle 105   public static BioWell getChildBioWell(DbControl dc, BioWell parentWell, String parentPrefix, String childPrefix)
2933 14 Nov 14 olle 106   {
2933 14 Nov 14 olle 107     BioPlate parentPlate = parentWell.getPlate();
2933 14 Nov 14 olle 108     String childPlateName = parentPlate.getName().replace(parentPrefix, childPrefix);
2933 14 Nov 14 olle 109     
2933 14 Nov 14 olle 110     ItemQuery<BioPlate> query = BioPlate.getQuery();
2933 14 Nov 14 olle 111     query.restrict(Restrictions.eq(Hql.property("name"), Expressions.string(childPlateName)));
2933 14 Nov 14 olle 112     List<BioPlate> list = query.list(dc);
2933 14 Nov 14 olle 113     if (list.size() == 0)
2933 14 Nov 14 olle 114     {
2933 14 Nov 14 olle 115       throw new ItemNotFoundException("BioPlate[name="+childPlateName + "]");
2933 14 Nov 14 olle 116     }
2933 14 Nov 14 olle 117     return list.get(0).getBioWell(parentWell.getPlateCoordinate());
2933 14 Nov 14 olle 118   }
2933 14 Nov 14 olle 119   
2933 14 Nov 14 olle 120   public static StoragePlate getById(DbControl dc, int bioPlateId)
2933 14 Nov 14 olle 121   {
2933 14 Nov 14 olle 122     BioPlate plate = BioPlate.getById(dc, bioPlateId);
2933 14 Nov 14 olle 123     return plate == null ? null : new StoragePlate(plate);
2933 14 Nov 14 olle 124   }
2933 14 Nov 14 olle 125   
2933 14 Nov 14 olle 126   public static StoragePlate getNew(DbControl dc, BioplateType bioplateType)
2933 14 Nov 14 olle 127   {
2933 14 Nov 14 olle 128     BioPlate plate = BioPlate.getNew(dc, bioplateType.getPlateGeometry(dc), bioplateType.load(dc));
2933 14 Nov 14 olle 129     return new StoragePlate(plate);
2933 14 Nov 14 olle 130   }
2933 14 Nov 14 olle 131   
2933 14 Nov 14 olle 132   private JSONArray jsonWells;
2933 14 Nov 14 olle 133   
2933 14 Nov 14 olle 134   private StoragePlate(BioPlate plate)
2933 14 Nov 14 olle 135   {
2933 14 Nov 14 olle 136     super(plate);
2933 14 Nov 14 olle 137   }
2933 14 Nov 14 olle 138   
2933 14 Nov 14 olle 139   
2933 14 Nov 14 olle 140   /**
2933 14 Nov 14 olle 141     Get the real bioplate that represents this reaction plate in BASE.
2933 14 Nov 14 olle 142   */
2933 14 Nov 14 olle 143   public BioPlate getBioPlate()
2933 14 Nov 14 olle 144   {
2933 14 Nov 14 olle 145     return getItem();
2933 14 Nov 14 olle 146   }
2933 14 Nov 14 olle 147   
2933 14 Nov 14 olle 148   @SuppressWarnings("unchecked")
2933 14 Nov 14 olle 149   public void loadBioWells(DbControl dc)
2933 14 Nov 14 olle 150   {
2933 14 Nov 14 olle 151     if (jsonWells != null) return;
2933 14 Nov 14 olle 152     
2933 14 Nov 14 olle 153     BioPlate plate = getItem();
2933 14 Nov 14 olle 154     int rows = plate.getRows();
2933 14 Nov 14 olle 155     int cols = plate.getColumns();
2933 14 Nov 14 olle 156     
2933 14 Nov 14 olle 157     jsonWells = new JSONArray();
2933 14 Nov 14 olle 158     for (int r = 0; r < rows; ++r)
2933 14 Nov 14 olle 159     {
2933 14 Nov 14 olle 160       for (int c = 0; c < cols; ++c)
2933 14 Nov 14 olle 161       {
2933 14 Nov 14 olle 162         BioWell well = plate.getBioWell(r, c);
2933 14 Nov 14 olle 163         JSONObject jsonWell = new JSONObject();
2933 14 Nov 14 olle 164         jsonWell.put("id", well.getId());
2933 14 Nov 14 olle 165         jsonWell.put("row", well.getRow());
2933 14 Nov 14 olle 166         jsonWell.put("column", well.getColumn());
2933 14 Nov 14 olle 167         jsonWell.put("canAdd", well.canAddBioMaterial());
2933 14 Nov 14 olle 168         jsonWell.put("canRemove", well.canClearBioMaterial());
2933 14 Nov 14 olle 169         jsonWells.add(jsonWell);
2933 14 Nov 14 olle 170       }
2933 14 Nov 14 olle 171     }  
2933 14 Nov 14 olle 172   }
2933 14 Nov 14 olle 173   
2933 14 Nov 14 olle 174   @SuppressWarnings("unchecked")
2933 14 Nov 14 olle 175   @Override
2933 14 Nov 14 olle 176   protected void initJSON(JSONObject json)
2933 14 Nov 14 olle 177   {
2933 14 Nov 14 olle 178     super.initJSON(json);
2933 14 Nov 14 olle 179     BioPlate plate = getItem();
2933 14 Nov 14 olle 180     BioPlateType plateType = plate.getBioPlateType();
2933 14 Nov 14 olle 181     PlateGeometry geometry = plate.getPlateGeometry();
2933 14 Nov 14 olle 182     ItemSubtype bioMaterialSubtype = plateType.getItemSubtype();
2933 14 Nov 14 olle 183     Item bioMaterialType = plateType.getBioMaterialType();
2933 14 Nov 14 olle 184     
2933 14 Nov 14 olle 185     json.put("freeWells", plate.getFreeWells());
2933 14 Nov 14 olle 186     json.put("usedWells", plate.getUsedWells());
2933 14 Nov 14 olle 187     json.put("barcode", plate.getBarcode());
2933 14 Nov 14 olle 188     
2933 14 Nov 14 olle 189     JSONObject jsonBioPlateType = new JSONObject();
2933 14 Nov 14 olle 190     jsonBioPlateType.put("id", plateType.getId());
2933 14 Nov 14 olle 191     jsonBioPlateType.put("name", plateType.getName());
2933 14 Nov 14 olle 192     if (bioMaterialType != null)
2933 14 Nov 14 olle 193     {
2933 14 Nov 14 olle 194       jsonBioPlateType.put("bioMaterialType", bioMaterialType.name());
2933 14 Nov 14 olle 195     }
2933 14 Nov 14 olle 196     json.put("bioPlateType", jsonBioPlateType);
2933 14 Nov 14 olle 197     
2933 14 Nov 14 olle 198     JSONObject jsonGeometry = new JSONObject();
2933 14 Nov 14 olle 199     jsonGeometry.put("id", geometry.getId());
2933 14 Nov 14 olle 200     jsonGeometry.put("rows", geometry.getRows());
2933 14 Nov 14 olle 201     jsonGeometry.put("columns", geometry.getColumns());
2933 14 Nov 14 olle 202     json.put("geometry", jsonGeometry);
2933 14 Nov 14 olle 203     
2933 14 Nov 14 olle 204     if (bioMaterialSubtype != null)
2933 14 Nov 14 olle 205     {
2933 14 Nov 14 olle 206       json.put("bioMaterialSubtype", Subtype.get(bioMaterialSubtype).asJSONObject(null));
2933 14 Nov 14 olle 207     }
2933 14 Nov 14 olle 208     if (jsonWells != null)
2933 14 Nov 14 olle 209     {
2933 14 Nov 14 olle 210       json.put("bioWells", jsonWells);
2933 14 Nov 14 olle 211     }
2933 14 Nov 14 olle 212   }
2933 14 Nov 14 olle 213
2933 14 Nov 14 olle 214   
2933 14 Nov 14 olle 215 }