extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/plugins/cmd/FlowThroughInfo.java

Code
Comments
Other
Rev Date Author Line
6207 12 Apr 21 nicklas 1 package net.sf.basedb.reggie.plugins.cmd;
6207 12 Apr 21 nicklas 2
6207 12 Apr 21 nicklas 3 import java.util.Date;
7232 02 Jun 23 nicklas 4 import java.util.List;
7232 02 Jun 23 nicklas 5
7232 02 Jun 23 nicklas 6 import net.sf.basedb.core.DbControl;
7232 02 Jun 23 nicklas 7 import net.sf.basedb.core.Extract;
7232 02 Jun 23 nicklas 8 import net.sf.basedb.core.ItemQuery;
6207 12 Apr 21 nicklas 9 import net.sf.basedb.core.Protocol;
6207 12 Apr 21 nicklas 10 import net.sf.basedb.core.data.PlateCoordinate;
7232 02 Jun 23 nicklas 11 import net.sf.basedb.reggie.Reggie;
7232 02 Jun 23 nicklas 12 import net.sf.basedb.reggie.dao.Subtype;
6207 12 Apr 21 nicklas 13
6207 12 Apr 21 nicklas 14 /**
6207 12 Apr 21 nicklas 15   Holds all information about a FlowThrough. Validation will
6207 12 Apr 21 nicklas 16   be done at construction and errors are reported to
6207 12 Apr 21 nicklas 17   the JsonSection. Check the 'valid' flag before using
6207 12 Apr 21 nicklas 18   the information.
6207 12 Apr 21 nicklas 19   
6207 12 Apr 21 nicklas 20   @since 4.32
6207 12 Apr 21 nicklas 21 */
6207 12 Apr 21 nicklas 22 public class FlowThroughInfo 
6207 12 Apr 21 nicklas 23 {
7232 02 Jun 23 nicklas 24   public Extract mergeWith;
7232 02 Jun 23 nicklas 25   
6711 27 Apr 22 nicklas 26   public String tubeLabel;
6207 12 Apr 21 nicklas 27   public Date qiacubeDate;
6207 12 Apr 21 nicklas 28   public Integer qiacubePos;
6207 12 Apr 21 nicklas 29   public Integer qiacubeRunNumber;
6510 03 Dec 21 nicklas 30   public String qiacubeRunId;
6207 12 Apr 21 nicklas 31   public String operator;
6714 29 Apr 22 nicklas 32   public Float originalVolume_ul;
6714 29 Apr 22 nicklas 33   public Float usedVolumeFromLysate_ul;
6918 01 Dec 22 nicklas 34   public String storageLocation;
6207 12 Apr 21 nicklas 35
6207 12 Apr 21 nicklas 36   public Protocol protocol;
6207 12 Apr 21 nicklas 37   public boolean valid;
6207 12 Apr 21 nicklas 38   
6893 25 Nov 22 nicklas 39   public FlowThroughInfo(JsonSection section, SpecimenInfo specimen, LysateInfo lysate, RnaInfo rna, MainInfo main)
6207 12 Apr 21 nicklas 40   {
6207 12 Apr 21 nicklas 41     if (section != null)
6207 12 Apr 21 nicklas 42     {
7232 02 Jun 23 nicklas 43       if (lysate != null && lysate.mergeWith != null) 
7232 02 Jun 23 nicklas 44       {
7232 02 Jun 23 nicklas 45         mergeWith = findFlowThroughForMerge(lysate, section);
7232 02 Jun 23 nicklas 46       }
7232 02 Jun 23 nicklas 47       
6732 05 May 22 nicklas 48       tubeLabel = section.getOptionalEntry("Specimen-ID", NullValidator.warnIfNull(PatternValidator.SPECIMEN_ID.withPrefixSuffix(specimen != null?specimen.tubeLabel:null, "-Prot")));
6893 25 Nov 22 nicklas 49       qiacubeDate = section.getRequiredEntry("Qiacube date", DateValidator.YYYY_MM_DD.warnIfFutureOrOlder(lysate!=null?lysate.partitionDate:null, main.refDate));
6207 12 Apr 21 nicklas 50       PlateCoordinate tmp = section.getRequiredEntry("Qiacube position", PlateWellValidator.QIACUBE);
6207 12 Apr 21 nicklas 51       if (tmp != null) qiacubePos = 6*tmp.getColumn()+tmp.getRow()+1;
6212 14 Apr 21 nicklas 52       operator = section.getOptionalEntry("Qiacube operator", null);
6207 12 Apr 21 nicklas 53       
6510 03 Dec 21 nicklas 54       if (rna != null)
6510 03 Dec 21 nicklas 55       {
6739 10 May 22 nicklas 56         if (qiacubeRunId != null && rna.qiacubeRunId != null && !qiacubeRunId.equals(rna.qiacubeRunId))
6510 03 Dec 21 nicklas 57         {
6510 03 Dec 21 nicklas 58           section.addErrorMessage("FlowThrough/Qiacube run doesn't match RNA/Qiacube run: "+qiacubeRunId + "<>"+rna.qiacubeRunId);
6510 03 Dec 21 nicklas 59         }
6739 10 May 22 nicklas 60         else if (qiacubePos != null && rna.qiacubePos != null && !qiacubePos.equals(rna.qiacubePos))
6510 03 Dec 21 nicklas 61         {
6510 03 Dec 21 nicklas 62           section.addErrorMessage("FlowThrough/Qiacube position doesn't match RNA/Qiacube position: "+qiacubePos + "<>"+rna.qiacubePos);
6510 03 Dec 21 nicklas 63         }
6510 03 Dec 21 nicklas 64         qiacubeRunNumber = rna.qiacubeRunNumber;
6510 03 Dec 21 nicklas 65       }
6510 03 Dec 21 nicklas 66       
6221 23 Apr 21 nicklas 67       protocol = section.getRequiredEntry("Protocol", ProtocolValidator.EXTRACTION_PROTOCOL);
6714 29 Apr 22 nicklas 68       originalVolume_ul = section.getOptionalEntry("Original volume (ul)", NullValidator.warnIfNull(FloatValidator.POSITIVE));
6714 29 Apr 22 nicklas 69       if (lysate != null)
6714 29 Apr 22 nicklas 70       {
6714 29 Apr 22 nicklas 71         usedVolumeFromLysate_ul = lysate.usedVolumePerChildItem_ul;
6714 29 Apr 22 nicklas 72       }
6714 29 Apr 22 nicklas 73
6918 01 Dec 22 nicklas 74       // TODO -- maybe this will change in the future
6918 01 Dec 22 nicklas 75       storageLocation = section.getOptionalEntry("Storage location", NullValidator.allowNull(String.class));
6207 12 Apr 21 nicklas 76     }
6207 12 Apr 21 nicklas 77     valid = section != null && !section.hasError();
6207 12 Apr 21 nicklas 78   }
6207 12 Apr 21 nicklas 79   
7232 02 Jun 23 nicklas 80   /**
7232 02 Jun 23 nicklas 81     If there is a Lysate to be merged, try to find a single child FlowThrough
7232 02 Jun 23 nicklas 82     item that should also be merged.
7232 02 Jun 23 nicklas 83   */
7232 02 Jun 23 nicklas 84   private Extract findFlowThroughForMerge(LysateInfo lysate, JsonSection section)
7232 02 Jun 23 nicklas 85   {
7232 02 Jun 23 nicklas 86     DbControl dc = section.getFile().dc();
7232 02 Jun 23 nicklas 87     ItemQuery<Extract> query = lysate.mergeWith.getChildExtracts();
7232 02 Jun 23 nicklas 88     query.setIncludes(Reggie.INCLUDE_IN_CURRENT_PROJECT);
7232 02 Jun 23 nicklas 89     query.restrict(Subtype.FLOW_THROUGH.restriction(dc, null));
7232 02 Jun 23 nicklas 90     
7232 02 Jun 23 nicklas 91     Extract merge = null;
7232 02 Jun 23 nicklas 92     List<Extract> extracts = query.list(dc);
7232 02 Jun 23 nicklas 93     if (extracts.size() == 1)
7232 02 Jun 23 nicklas 94     {
7232 02 Jun 23 nicklas 95       merge = extracts.get(0);
7232 02 Jun 23 nicklas 96     }
7232 02 Jun 23 nicklas 97     else if (extracts.size() == 0)
7232 02 Jun 23 nicklas 98     {
7232 02 Jun 23 nicklas 99       // TODO -- we could allow this without an error and create a new child DNA
7232 02 Jun 23 nicklas 100       // but there is no current use case for this scenario
7232 02 Jun 23 nicklas 101       section.addErrorMessage("Found a Specimen for merge but it has no child FlowThrough: "+lysate.mergeWith.getName());
7232 02 Jun 23 nicklas 102     }
7232 02 Jun 23 nicklas 103     else
7232 02 Jun 23 nicklas 104     {
7232 02 Jun 23 nicklas 105       section.addErrorMessage("Found a Specimen for merge but there are "+extracts.size()+" child FlowThrough: "+lysate.mergeWith.getName());
7232 02 Jun 23 nicklas 106     }
7232 02 Jun 23 nicklas 107     return merge;
7232 02 Jun 23 nicklas 108   }
7232 02 Jun 23 nicklas 109
7232 02 Jun 23 nicklas 110   
6207 12 Apr 21 nicklas 111 }