extensions/net.sf.basedb.meludi/trunk/src/net/sf/basedb/meludi/dao/BioplateType.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.lang.reflect.Field;
2933 14 Nov 14 olle 4 import java.util.ArrayList;
2933 14 Nov 14 olle 5 import java.util.List;
2933 14 Nov 14 olle 6
2933 14 Nov 14 olle 7 import net.sf.basedb.core.BioPlate;
2933 14 Nov 14 olle 8 import net.sf.basedb.core.BioPlateType;
2933 14 Nov 14 olle 9 import net.sf.basedb.core.BioWell.LockMode;
2933 14 Nov 14 olle 10 import net.sf.basedb.core.DbControl;
2933 14 Nov 14 olle 11 import net.sf.basedb.core.Include;
2933 14 Nov 14 olle 12 import net.sf.basedb.core.InvalidDataException;
2933 14 Nov 14 olle 13 import net.sf.basedb.core.Item;
2933 14 Nov 14 olle 14 import net.sf.basedb.core.ItemNotFoundException;
2933 14 Nov 14 olle 15 import net.sf.basedb.core.ItemQuery;
2933 14 Nov 14 olle 16 import net.sf.basedb.core.PlateGeometry;
2933 14 Nov 14 olle 17 import net.sf.basedb.core.Type;
2933 14 Nov 14 olle 18 import net.sf.basedb.core.query.Expressions;
2933 14 Nov 14 olle 19 import net.sf.basedb.core.query.Hql;
2933 14 Nov 14 olle 20 import net.sf.basedb.core.query.Orders;
2933 14 Nov 14 olle 21 import net.sf.basedb.core.query.Restrictions;
2933 14 Nov 14 olle 22 import net.sf.basedb.util.MD5;
2933 14 Nov 14 olle 23
2933 14 Nov 14 olle 24 /**
2933 14 Nov 14 olle 25   Used to define a bioplate types by name and main item type and item subtype.
2933 14 Nov 14 olle 26   
2933 14 Nov 14 olle 27   @author nicklas
2933 14 Nov 14 olle 28   @since 2.4
2933 14 Nov 14 olle 29 */
2933 14 Nov 14 olle 30 public class BioplateType 
2933 14 Nov 14 olle 31 {
2933 14 Nov 14 olle 32
2933 14 Nov 14 olle 33   /**
2933 14 Nov 14 olle 34     The definition of the "Bioanalyzer RNA Quality control" plate type.
2933 14 Nov 14 olle 35   */
3044 16 Dec 14 olle 36 /*
2933 14 Nov 14 olle 37   public static final BioplateType BA_RNAQC = 
2933 14 Nov 14 olle 38     new BioplateType("Bioanalyzer RNAQC reaction plate", Item.EXTRACT, Subtype.RNAQC, LockMode.LOCKED_AFTER_ADD, Geometry.ONE_BY_TWELVE, "BAPlate", 4);
3044 16 Dec 14 olle 39 */
2933 14 Nov 14 olle 40
2933 14 Nov 14 olle 41   /**
2933 14 Nov 14 olle 42     The definition of the "Caliper RNA Quality control" plate type.
2933 14 Nov 14 olle 43   */
3044 16 Dec 14 olle 44 /*
2933 14 Nov 14 olle 45   public static final BioplateType CALIPER_RNAQC = 
2933 14 Nov 14 olle 46     new BioplateType("Caliper RNAQC reaction plate", Item.EXTRACT, Subtype.RNAQC, LockMode.LOCKED_AFTER_ADD, Geometry.EIGHT_BY_TWELVE, "CaliperPlate", 4);
3044 16 Dec 14 olle 47 */
2933 14 Nov 14 olle 48
2933 14 Nov 14 olle 49   /**
2933 14 Nov 14 olle 50     The definition of the "Paraffin block" plate type.
2933 14 Nov 14 olle 51     @since 2.7
2933 14 Nov 14 olle 52   */
3044 16 Dec 14 olle 53 /*
2933 14 Nov 14 olle 54   public static final BioplateType PARAFFIN_BLOCK = 
2933 14 Nov 14 olle 55     new BioplateType("FFPE block", Item.SAMPLE, Subtype.HISTOLOGY, LockMode.LOCKED_AFTER_ADD, Geometry.THREE_BY_TWO, "PB", 5);
3044 16 Dec 14 olle 56 */
2933 14 Nov 14 olle 57
2933 14 Nov 14 olle 58   /**
5111 20 Nov 18 olle 59     The definition of the "HE stain glass" plate type. It is locked to samples
5111 20 Nov 18 olle 60     of subtype {@link Subtype#STAINED}.
5111 20 Nov 18 olle 61     @since 2.7
5111 20 Nov 18 olle 62   */
5111 20 Nov 18 olle 63   public static final BioplateType HE_GLASS = 
5111 20 Nov 18 olle 64     new BioplateType("HE stain glass", Item.SAMPLE, Subtype.STAINED, LockMode.LOCKED_AFTER_ADD, Geometry.THREE_BY_TWO, "HE", 5);
5111 20 Nov 18 olle 65
5111 20 Nov 18 olle 66   /**
2933 14 Nov 14 olle 67     The definition of the "mRNA reaction plate" type. It is locked to extracts
2933 14 Nov 14 olle 68     of subtype {@link Subtype#MRNA} and uses 8x12 geometry.
2933 14 Nov 14 olle 69     @since 2.12
2933 14 Nov 14 olle 70   */
3044 16 Dec 14 olle 71 /*
2933 14 Nov 14 olle 72   public static final BioplateType MRNA =
2933 14 Nov 14 olle 73     new BioplateType("mRNA reaction plate", Item.EXTRACT, Subtype.MRNA, LockMode.LOCKED_AFTER_ADD, Geometry.EIGHT_BY_TWELVE, "MRnaPlate", 4);
3044 16 Dec 14 olle 74 */
2933 14 Nov 14 olle 75
2933 14 Nov 14 olle 76   /**
2933 14 Nov 14 olle 77     The definition of the "cDNA reaction plate" type. It is locked to extracts
2933 14 Nov 14 olle 78     of subtype {@link Subtype#CDNA} and uses 8x12 geometry.
2933 14 Nov 14 olle 79     @since 2.12
2933 14 Nov 14 olle 80   */
3044 16 Dec 14 olle 81 /*
2933 14 Nov 14 olle 82   public static final BioplateType CDNA =
3180 17 Mar 15 olle 83     new BioplateType("cDNA reaction plate", Item.EXTRACT, Subtype.CDNA, LockMode.LOCKED_AFTER_ADD, Geometry.EIGHT_BY_TWELVE, "CDnaPlate", 4);
3044 16 Dec 14 olle 84 */
3044 16 Dec 14 olle 85
2933 14 Nov 14 olle 86   /**
3180 17 Mar 15 olle 87     The definition of the "DNA reaction plate" type. It is locked to extracts
3180 17 Mar 15 olle 88     of subtype {@link Subtype#DNA} and uses 8x12 geometry.
3180 17 Mar 15 olle 89     @since 1.2
3180 17 Mar 15 olle 90   */
3180 17 Mar 15 olle 91   public static final BioplateType DNA =
3180 17 Mar 15 olle 92     new BioplateType("DNA reaction plate", Item.EXTRACT, Subtype.DNA, LockMode.LOCKED_AFTER_ADD, Geometry.EIGHT_BY_TWELVE, "DnaPlate", 4);
3180 17 Mar 15 olle 93
3180 17 Mar 15 olle 94   /**
2933 14 Nov 14 olle 95     The definition of the "Library plate" type. It is locked to extracts
2933 14 Nov 14 olle 96     of subtype {@link Subtype#LIBRARY} and uses 8x12 geometry.
2933 14 Nov 14 olle 97     @since 2.12
2933 14 Nov 14 olle 98   */
2933 14 Nov 14 olle 99   public static final BioplateType LIBRARY =
2933 14 Nov 14 olle 100     new BioplateType("Library plate", Item.EXTRACT, Subtype.LIBRARY, LockMode.LOCKED_AFTER_ADD, Geometry.EIGHT_BY_TWELVE, "LibPlate", 4);
2933 14 Nov 14 olle 101
2933 14 Nov 14 olle 102   
2933 14 Nov 14 olle 103   /**
2933 14 Nov 14 olle 104     Get the bioplate type by name of the static constant defined in this class.
2933 14 Nov 14 olle 105     
2933 14 Nov 14 olle 106     @param cName The name of the static constant
2933 14 Nov 14 olle 107     @return A bioplate type object or null if not found
2933 14 Nov 14 olle 108    */
2933 14 Nov 14 olle 109   public static BioplateType getByCName(String cName)
2933 14 Nov 14 olle 110   {
2933 14 Nov 14 olle 111     if (cName == null) return null;
2933 14 Nov 14 olle 112     BioplateType bioplateType = null;
2933 14 Nov 14 olle 113     try
2933 14 Nov 14 olle 114     {
2933 14 Nov 14 olle 115       Field f = BioplateType.class.getDeclaredField(cName);
2933 14 Nov 14 olle 116       bioplateType = (BioplateType)f.get(null);
2933 14 Nov 14 olle 117     }
2933 14 Nov 14 olle 118     catch (NoSuchFieldException ex)
2933 14 Nov 14 olle 119     {}
2933 14 Nov 14 olle 120     catch (IllegalAccessException ex)
2933 14 Nov 14 olle 121     {}
2933 14 Nov 14 olle 122     catch (ClassCastException ex)
2933 14 Nov 14 olle 123     {}
2933 14 Nov 14 olle 124     return bioplateType;
2933 14 Nov 14 olle 125   }
2933 14 Nov 14 olle 126
2933 14 Nov 14 olle 127   
2933 14 Nov 14 olle 128   private final String name;
2933 14 Nov 14 olle 129   private final Item bioMaterialType;
2933 14 Nov 14 olle 130   private final Subtype subtype;
2933 14 Nov 14 olle 131   private final LockMode lockMode;
2933 14 Nov 14 olle 132   private final Geometry geometry;
3449 28 Jul 15 olle 133 /*
2933 14 Nov 14 olle 134   private final String plateNamePrefix;
2933 14 Nov 14 olle 135   private final int numDigitsInName;
3449 28 Jul 15 olle 136 */
3449 28 Jul 15 olle 137   private String plateNamePrefix;
3449 28 Jul 15 olle 138   private int numDigitsInName;
2933 14 Nov 14 olle 139   private int id;
2933 14 Nov 14 olle 140   private int geometryId;
2933 14 Nov 14 olle 141   
2933 14 Nov 14 olle 142   /**
2933 14 Nov 14 olle 143     Create a new definition
2933 14 Nov 14 olle 144     @param name The name of the subtype
2933 14 Nov 14 olle 145     @param bioMaterialType The type of biomaterial that can be placed on the bioplate 
2933 14 Nov 14 olle 146     @param subtype The subtype of biomaterial that can be placed on the bioplate
2933 14 Nov 14 olle 147   */
2933 14 Nov 14 olle 148   private BioplateType(String name, Item bioMaterialType, Subtype subtype, LockMode lockMode, Geometry geometry, String plateNamePrefix, int numDigitsInName)
2933 14 Nov 14 olle 149   {
2933 14 Nov 14 olle 150     this.name = name;
2933 14 Nov 14 olle 151     this.bioMaterialType = bioMaterialType;
2933 14 Nov 14 olle 152     this.subtype = subtype;
2933 14 Nov 14 olle 153     this.lockMode = lockMode;
2933 14 Nov 14 olle 154     this.geometry = geometry;
2933 14 Nov 14 olle 155     this.plateNamePrefix = plateNamePrefix;
2933 14 Nov 14 olle 156     this.numDigitsInName = numDigitsInName;
2933 14 Nov 14 olle 157   }
2933 14 Nov 14 olle 158     
2933 14 Nov 14 olle 159   /**
2933 14 Nov 14 olle 160     Get the name of the plate type.
2933 14 Nov 14 olle 161   */
2933 14 Nov 14 olle 162   public String getName()
2933 14 Nov 14 olle 163   {
2933 14 Nov 14 olle 164     return name;
2933 14 Nov 14 olle 165   }
2933 14 Nov 14 olle 166   
2933 14 Nov 14 olle 167   /**
2933 14 Nov 14 olle 168     Get the biomaterial item type that can be used on the plate.
2933 14 Nov 14 olle 169   */
2933 14 Nov 14 olle 170   public Item getBioMaterialType()
2933 14 Nov 14 olle 171   {
2933 14 Nov 14 olle 172     return bioMaterialType;
2933 14 Nov 14 olle 173   }
2933 14 Nov 14 olle 174   
2933 14 Nov 14 olle 175   /**
2933 14 Nov 14 olle 176     Get the biomaterial subtype that can be used on the plate.
2933 14 Nov 14 olle 177     Null if no restriction.
2933 14 Nov 14 olle 178   */
2933 14 Nov 14 olle 179   public Subtype getSubtype()
2933 14 Nov 14 olle 180   {
2933 14 Nov 14 olle 181     return subtype;
2933 14 Nov 14 olle 182   }
2933 14 Nov 14 olle 183   
2933 14 Nov 14 olle 184   /**
2933 14 Nov 14 olle 185     Get the prefix that is used when creating new plates of this plate 
2933 14 Nov 14 olle 186     type.
2933 14 Nov 14 olle 187     @since 2.7
2933 14 Nov 14 olle 188   */
2933 14 Nov 14 olle 189   public String getPlateNamePrefix()
2933 14 Nov 14 olle 190   {
2933 14 Nov 14 olle 191     return plateNamePrefix;
2933 14 Nov 14 olle 192   }
2933 14 Nov 14 olle 193   
2933 14 Nov 14 olle 194   /**
3449 28 Jul 15 olle 195     Set the prefix that is used when creating new plates of this plate 
3449 28 Jul 15 olle 196     type.
3449 28 Jul 15 olle 197
3449 28 Jul 15 olle 198     @param plateNamePrefix String The plate name prefix to use.
3449 28 Jul 15 olle 199     @since 1.3
3449 28 Jul 15 olle 200   */
3449 28 Jul 15 olle 201   public void setPlateNamePrefix(String plateNamePrefix)
3449 28 Jul 15 olle 202   {
3449 28 Jul 15 olle 203     this.plateNamePrefix = plateNamePrefix;
3449 28 Jul 15 olle 204   }
3449 28 Jul 15 olle 205
3449 28 Jul 15 olle 206   /**
3449 28 Jul 15 olle 207     Get the number of digits in the name of this plate.
3449 28 Jul 15 olle 208     @since 1.3
3449 28 Jul 15 olle 209    */
3449 28 Jul 15 olle 210   public int getNumDigitsInName()
3449 28 Jul 15 olle 211   {
3449 28 Jul 15 olle 212     return numDigitsInName;
3449 28 Jul 15 olle 213   }
3449 28 Jul 15 olle 214
3449 28 Jul 15 olle 215   /**
3449 28 Jul 15 olle 216     Set the number of digits in the name of this plate.
3449 28 Jul 15 olle 217
3449 28 Jul 15 olle 218     @param numDigitsInName int The number of digits in the name of the plate.
3449 28 Jul 15 olle 219     @since 1.3
3449 28 Jul 15 olle 220    */
3449 28 Jul 15 olle 221   public void setNumDigitsInName(int numDigitsInName)
3449 28 Jul 15 olle 222   {
3449 28 Jul 15 olle 223     this.numDigitsInName = numDigitsInName;
3449 28 Jul 15 olle 224   }
3449 28 Jul 15 olle 225
3449 28 Jul 15 olle 226   /**
2933 14 Nov 14 olle 227     Get the lock mode for wells.
2933 14 Nov 14 olle 228   */
2933 14 Nov 14 olle 229   public LockMode getLockMode()
2933 14 Nov 14 olle 230   {
2933 14 Nov 14 olle 231     return lockMode;
2933 14 Nov 14 olle 232   }
2933 14 Nov 14 olle 233   
2933 14 Nov 14 olle 234   /**
2933 14 Nov 14 olle 235     Load the subtype as a BASE item.
2933 14 Nov 14 olle 236     @param dc The DbControl to use for database access
2933 14 Nov 14 olle 237     @return An ItemSubtype object
2933 14 Nov 14 olle 238   */
2933 14 Nov 14 olle 239   public BioPlateType load(DbControl dc)
2933 14 Nov 14 olle 240   {
2933 14 Nov 14 olle 241     BioPlateType plateType = null;
2933 14 Nov 14 olle 242     if (id == 0)
2933 14 Nov 14 olle 243     {
2933 14 Nov 14 olle 244       List<BioPlateType> result = list(dc);
2933 14 Nov 14 olle 245       if (result.size() == 0)
2933 14 Nov 14 olle 246       {
2933 14 Nov 14 olle 247         throw new ItemNotFoundException("BioPlateType["+getName()+"]");
2933 14 Nov 14 olle 248       }
2933 14 Nov 14 olle 249       else if (result.size() > 1)
2933 14 Nov 14 olle 250       {
2933 14 Nov 14 olle 251         throw new InvalidDataException("Found > 1 BioPlateType["+getName()+"]");
2933 14 Nov 14 olle 252       }
2933 14 Nov 14 olle 253       plateType = result.get(0);
2933 14 Nov 14 olle 254       id = plateType.getId();
2933 14 Nov 14 olle 255     }
2933 14 Nov 14 olle 256     else
2933 14 Nov 14 olle 257     {
2933 14 Nov 14 olle 258       plateType = BioPlateType.getById(dc, id);
2933 14 Nov 14 olle 259     }
2933 14 Nov 14 olle 260     return plateType;
2933 14 Nov 14 olle 261   }
2933 14 Nov 14 olle 262   
2933 14 Nov 14 olle 263   /**
2933 14 Nov 14 olle 264     List all bioplate types registered in BASE with a name matching this bioplate type
2933 14 Nov 14 olle 265     definition. Normally, only a single bioplate type should be returned.
2933 14 Nov 14 olle 266   */
2933 14 Nov 14 olle 267   public List<BioPlateType> list(DbControl dc)
2933 14 Nov 14 olle 268   {
2933 14 Nov 14 olle 269     ItemQuery<BioPlateType> query = BioPlateType.getQuery();
2933 14 Nov 14 olle 270     query.restrict(
2933 14 Nov 14 olle 271       Restrictions.eq(
2933 14 Nov 14 olle 272         Hql.property("name"), 
2933 14 Nov 14 olle 273         Expressions.parameter("name", getName(), Type.STRING)
2933 14 Nov 14 olle 274       ));
2933 14 Nov 14 olle 275     query.include(Include.ALL);
2933 14 Nov 14 olle 276     return query.list(dc);
2933 14 Nov 14 olle 277   }
2933 14 Nov 14 olle 278   
2933 14 Nov 14 olle 279   /**
2933 14 Nov 14 olle 280     Get the plate geometry this bioplate type normally uses.
2933 14 Nov 14 olle 281   */
2933 14 Nov 14 olle 282   public PlateGeometry getPlateGeometry(DbControl dc)
2933 14 Nov 14 olle 283   {
2933 14 Nov 14 olle 284     return geometry.load(dc);
2933 14 Nov 14 olle 285   }
2933 14 Nov 14 olle 286   
2933 14 Nov 14 olle 287   /**
2933 14 Nov 14 olle 288     Generate the next auto-generated bioplate name. This method will search all bioplates
2933 14 Nov 14 olle 289     starting with the plate type's prefix and find the one with the highest numeric suffix. 
2933 14 Nov 14 olle 290     The returned name is the found plate + offset.
2933 14 Nov 14 olle 291   */
2933 14 Nov 14 olle 292   public String generateNextName(DbControl dc, int offset)
2933 14 Nov 14 olle 293   {
2933 14 Nov 14 olle 294     return generateNamesForBatch(dc, offset, 1).get(0);
2933 14 Nov 14 olle 295   }
2933 14 Nov 14 olle 296
2933 14 Nov 14 olle 297   /**
2933 14 Nov 14 olle 298     Generate a sequence of names for the new bioplates. This method will search all bioplates
2933 14 Nov 14 olle 299     starting with the plate type's prefix and find the one with the highest numeric suffix. 
2933 14 Nov 14 olle 300     The returned names start with the found plate + offset and contains the numNames new
2933 14 Nov 14 olle 301     names.
2933 14 Nov 14 olle 302   */
2933 14 Nov 14 olle 303   public List<String> generateNamesForBatch(DbControl dc, int offset, int numNames)
2933 14 Nov 14 olle 304   {
2933 14 Nov 14 olle 305     ItemQuery<BioPlate> query = BioPlate.getQuery();
2933 14 Nov 14 olle 306     addFilter(dc, query, false);
2933 14 Nov 14 olle 307     query.restrict(Restrictions.rlike(Hql.property("name"), Expressions.string("^" + plateNamePrefix + "[0-9]+$")));
2933 14 Nov 14 olle 308     query.order(Orders.desc(Hql.property("name")));
2933 14 Nov 14 olle 309     query.setMaxResults(1);
2933 14 Nov 14 olle 310     query.include(Include.ALL);
2933 14 Nov 14 olle 311     List<BioPlate> plates = query.list(dc);
2933 14 Nov 14 olle 312     
2933 14 Nov 14 olle 313     int startIndex = offset;
2933 14 Nov 14 olle 314     if (plates.size() > 0)
2933 14 Nov 14 olle 315     {
2933 14 Nov 14 olle 316       String plateName = plates.get(0).getName().substring(plateNamePrefix.length());
2933 14 Nov 14 olle 317       startIndex = Integer.parseInt(plateName) + offset;
2933 14 Nov 14 olle 318     }
2933 14 Nov 14 olle 319     
2933 14 Nov 14 olle 320     List<String> names = new ArrayList<String>(numNames);
2933 14 Nov 14 olle 321     for (int i = 0; i < numNames; ++i)
2933 14 Nov 14 olle 322     {
2933 14 Nov 14 olle 323       names.add(plateNamePrefix + MD5.leftPad(Integer.toString(startIndex+i), '0', numDigitsInName));
2933 14 Nov 14 olle 324     }
2933 14 Nov 14 olle 325     return names;
2933 14 Nov 14 olle 326   }
2933 14 Nov 14 olle 327
2933 14 Nov 14 olle 328   
2933 14 Nov 14 olle 329   /**
2933 14 Nov 14 olle 330     Add a filter restriction the given bioplate query so that it
2933 14 Nov 14 olle 331     only return plates of this type.
2933 14 Nov 14 olle 332     
2933 14 Nov 14 olle 333     @param query The query to filter
2933 14 Nov 14 olle 334     @param excludeDestroyed If set, an additional filter is added so that only
2933 14 Nov 14 olle 335       non-destroyed bioplates are returned
2933 14 Nov 14 olle 336   */
2933 14 Nov 14 olle 337   public void addFilter(DbControl dc, ItemQuery<? extends BioPlate> query, boolean excludeDestroyed)
2933 14 Nov 14 olle 338   {
2933 14 Nov 14 olle 339     addFilter(dc, query, null, excludeDestroyed);
2933 14 Nov 14 olle 340   }
2933 14 Nov 14 olle 341
2933 14 Nov 14 olle 342   /**
2933 14 Nov 14 olle 343     Add a filter restriction to the given query based on the 
2933 14 Nov 14 olle 344     given subtype. If no alias is specified, the filter is
2933 14 Nov 14 olle 345     applied to the root item, otherwise it is applied
2933 14 Nov 14 olle 346     to the alias of a joined (eg. parent or child) item
2933 14 Nov 14 olle 347     
2933 14 Nov 14 olle 348     @param query The query to restrict
2933 14 Nov 14 olle 349     @param alias Specify an alias if the filter should be
2933 14 Nov 14 olle 350       placed on a joined (eg. child or parent) item instead
2933 14 Nov 14 olle 351       of the root item
2933 14 Nov 14 olle 352   */
2933 14 Nov 14 olle 353   public void addFilter(DbControl dc, ItemQuery<?> query, String alias, boolean excludeDestroyed)
2933 14 Nov 14 olle 354   {
2933 14 Nov 14 olle 355     if (id==0) load(dc); // Ensure that the subtype has been loaded
2933 14 Nov 14 olle 356     query.restrict(Restrictions.eq(Hql.property(alias, "bioPlateType"), Expressions.integer(id)));
2933 14 Nov 14 olle 357     if (excludeDestroyed)
2933 14 Nov 14 olle 358     {
2933 14 Nov 14 olle 359       query.restrict(Restrictions.eq(Hql.property(alias, "destroyed"), Expressions.parameter("destroyed", false, Type.BOOLEAN)));
2933 14 Nov 14 olle 360     }
2933 14 Nov 14 olle 361   }
2933 14 Nov 14 olle 362   
2933 14 Nov 14 olle 363 }