extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/plugins/cmd/DnaInfo.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 DNA. 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 DnaInfo 
6207 12 Apr 21 nicklas 23 {
7232 02 Jun 23 nicklas 24   public Extract mergeWith;
6711 27 Apr 22 nicklas 25   public String tubeLabel;
6207 12 Apr 21 nicklas 26   public Date qiacubeDate;
6207 12 Apr 21 nicklas 27   public Integer qiacubePos;
6207 12 Apr 21 nicklas 28   public Integer qiacubeRunNumber;
6510 03 Dec 21 nicklas 29   public String qiacubeRunId;
6207 12 Apr 21 nicklas 30   public String operator;
6207 12 Apr 21 nicklas 31   public Float qubitConc;
6714 29 Apr 22 nicklas 32   public Float originalQuantity_ng;
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 DnaInfo(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 = findDNAForMerge(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, "-DNA")));
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       qiacubeRunId = section.getRequiredEntry("Qiacube run number", PatternValidator.CMD_ID);
6510 03 Dec 21 nicklas 55       if (rna != null)
6510 03 Dec 21 nicklas 56       {
6739 10 May 22 nicklas 57         if (qiacubeRunId != null && rna.qiacubeRunId != null & !qiacubeRunId.equals(rna.qiacubeRunId))
6510 03 Dec 21 nicklas 58         {
6510 03 Dec 21 nicklas 59           section.addErrorMessage("DNA/Qiacube run doesn't match RNA/Qiacube run: "+qiacubeRunId + "<>"+rna.qiacubeRunId);
6510 03 Dec 21 nicklas 60         }
6739 10 May 22 nicklas 61         else if (qiacubePos != null && rna.qiacubePos != null && !qiacubePos.equals(rna.qiacubePos))
6510 03 Dec 21 nicklas 62         {
6510 03 Dec 21 nicklas 63           section.addErrorMessage("DNA/Qiacube position doesn't match RNA/Qiacube position: "+qiacubePos + "<>"+rna.qiacubePos);
6510 03 Dec 21 nicklas 64         }
6510 03 Dec 21 nicklas 65         qiacubeRunNumber = rna.qiacubeRunNumber;
6510 03 Dec 21 nicklas 66       }
6510 03 Dec 21 nicklas 67       
6344 29 Jun 21 nicklas 68       qubitConc = section.getRequiredEntry("Concentration (ng/ul)", FloatValidator.POSITIVE);
6221 23 Apr 21 nicklas 69       protocol = section.getRequiredEntry("Protocol", ProtocolValidator.EXTRACTION_PROTOCOL);
6714 29 Apr 22 nicklas 70       originalQuantity_ng = section.getOptionalEntry("Original quantity (ng)", NullValidator.warnIfNull(FloatValidator.POSITIVE));
6714 29 Apr 22 nicklas 71       if (lysate != null)
6714 29 Apr 22 nicklas 72       {
6714 29 Apr 22 nicklas 73         usedVolumeFromLysate_ul = lysate.usedVolumePerChildItem_ul;
6714 29 Apr 22 nicklas 74       }
6510 03 Dec 21 nicklas 75       
6918 01 Dec 22 nicklas 76       // TODO -- maybe this will change in the future
6918 01 Dec 22 nicklas 77       storageLocation = section.getOptionalEntry("Storage location", NullValidator.allowNull(String.class));
6207 12 Apr 21 nicklas 78     }
6207 12 Apr 21 nicklas 79     valid = section != null && !section.hasError();
6207 12 Apr 21 nicklas 80   }
6207 12 Apr 21 nicklas 81   
7232 02 Jun 23 nicklas 82   /**
7232 02 Jun 23 nicklas 83     If there is a Lysate to be merged, try to find a single child DNA
7232 02 Jun 23 nicklas 84     item that should also be merged.
7232 02 Jun 23 nicklas 85   */
7232 02 Jun 23 nicklas 86   private Extract findDNAForMerge(LysateInfo lysate, JsonSection section)
7232 02 Jun 23 nicklas 87   {
7232 02 Jun 23 nicklas 88     DbControl dc = section.getFile().dc();
7232 02 Jun 23 nicklas 89     ItemQuery<Extract> query = lysate.mergeWith.getChildExtracts();
7232 02 Jun 23 nicklas 90     query.setIncludes(Reggie.INCLUDE_IN_CURRENT_PROJECT);
7232 02 Jun 23 nicklas 91     query.restrict(Subtype.DNA.restriction(dc, null));
7232 02 Jun 23 nicklas 92     
7232 02 Jun 23 nicklas 93     Extract merge = null;
7232 02 Jun 23 nicklas 94     List<Extract> extracts = query.list(dc);
7232 02 Jun 23 nicklas 95     if (extracts.size() == 1)
7232 02 Jun 23 nicklas 96     {
7232 02 Jun 23 nicklas 97       merge = extracts.get(0);
7232 02 Jun 23 nicklas 98     }
7232 02 Jun 23 nicklas 99     else if (extracts.size() == 0)
7232 02 Jun 23 nicklas 100     {
7232 02 Jun 23 nicklas 101       // TODO -- we could allow this without an error and create a new child DNA
7232 02 Jun 23 nicklas 102       // but there is no current use case for this scenario
7232 02 Jun 23 nicklas 103       section.addErrorMessage("Found a Specimen for merge but it has no child DNA: "+lysate.mergeWith.getName());
7232 02 Jun 23 nicklas 104     }
7232 02 Jun 23 nicklas 105     else
7232 02 Jun 23 nicklas 106     {
7232 02 Jun 23 nicklas 107       section.addErrorMessage("Found a Specimen for merge but there are "+extracts.size()+" child DNA: "+lysate.mergeWith.getName());
7232 02 Jun 23 nicklas 108     }
7232 02 Jun 23 nicklas 109     return merge;
7232 02 Jun 23 nicklas 110   }
7232 02 Jun 23 nicklas 111
6207 12 Apr 21 nicklas 112 }