Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
package net.maizegenetics.analysis.gbs.v2;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.LinkedHashMap;
import java.util.Set;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.ini4j.Ini;
import org.ini4j.Profile;
/**
* This class contains a list of all the enzymes supported for GBS.
* @author dpavelec
*/
public class EnzymeList {
private static final Logger myLogger = LogManager.getLogger(EnzymeList.class);
/**
* This is the application level default that will initiate using the EnzymeList
* default constructor.
*/
public static final EnzymeList defaultCache = new EnzymeList();
/**
* Looks for "enzymes.ini" config file in the lib path.
* Loads default Enzymes if not found
*/
public EnzymeList() {
String parentPath = getJarPath(Ini.class).getPath();
File iniFile = new File(parentPath + "/enzymes.ini");
if (!loadFromFile(iniFile)) {
loadDefaults();
}
}
/**
* Custom Config file
* @param iniFile
*/
public EnzymeList(File iniFile) {
if (!loadFromFile(iniFile)) {
loadDefaults();
}
}
private synchronized boolean loadFromFile(File iniFile) {
if(map==null){
map = new LinkedHashMap();
}
try {
Ini ini = new Ini(iniFile);
if (!iniFile.exists()) {
return false;
}
ini.load();
//List all = ini.getAll(ini);
Set keySet = ini.keySet();
String empty = null;
for(String key : keySet){
Profile.Section section = (Profile.Section) ini.get(key);
String name = section.get("name", empty);
String initialCutSiteRemnant = section.get("initialCutSiteRemnant", empty);
String likelyReadEnd = section.get("likelyReadEnd", empty);
String readLenString = section.get("readEndCutSiteRemnantLength", "-1");
int readEndCutSiteRemnantLength = Integer.parseInt(readLenString);
if(name==null|initialCutSiteRemnant==null|likelyReadEnd==null|readEndCutSiteRemnantLength<0){
myLogger.warn("WARNING! Cannot load Enzyme section" + key);
continue;
}else{
map.put(key.trim().toUpperCase(), new Enzyme(name, initialCutSiteRemnant.split(","), likelyReadEnd.split(","), readEndCutSiteRemnantLength));
}
}
} catch (Exception ex) {
myLogger.warn("ERROR! Cannot load Enzyme List -- " + iniFile.getPath());
return false;
}
return true;
}
private void loadDefaults() {
if(map==null){
map = new LinkedHashMap();
}
map.put("APEKI", new Enzyme("ApeKI"
,new String[]{"CAGC", "CTGC"}
,new String[]{"GCAGC", "GCTGC", "GCAGAGAT", "GCTGAGAT"} // full cut site (from partial digest or chimera) or common adapter start
,4));
map.put("PSTI", new Enzyme("PstI"
,new String[]{"TGCAG"}
,new String[]{"CTGCAG", "CTGCAAGAT"} // full cut site (from partial digest or chimera) or common adapter start
,5));
map.put("ECOT22I", new Enzyme("EcoT22I"
,new String[]{"TGCAT"}
,new String[]{"ATGCAT", "ATGCAAGAT"} // full cut site (from partial digest or chimera) or common adapter start
,5));
map.put("PASI", new Enzyme("PasI"
,new String[]{"CAGGG", "CTGGG"}
,new String[]{"CCCAGGG", "CCCTGGG", "CCCTGAGAT", "CCCAGAGAT"} // full cut site (from partial digest or chimera) or common adapter start
,5));
map.put("HPAII", new Enzyme("HpaII"
,new String[]{"CGG"}
,new String[]{"CCGG", "CCGAGATCGG"} // full cut site (from partial digest or chimera) or common adapter start
,3));
map.put("MSPI", new Enzyme("MspI" // MspI and HpaII are isoschizomers (same recognition seq and overhang)
,new String[]{"CGG"}
,new String[]{"CCGG", "CCGAGATCGG"} // full cut site (from partial digest or chimera) or common adapter start
,3));
map.put("PSTI-APEKI", new Enzyme("PstI-ApeKI"
,new String[]{"TGCAG"}
,new String[]{"GCAGC", "GCTGC", "CTGCAG", "GCAGAGAT", "GCTGAGAT"} // look for ApeKI site, PstI site, or common adapter for ApeKI
,4));
map.put("PSTI-BFAI", new Enzyme("PstI-BfaI" // PstI: CTGCA^G BfaI: C^TAG
,new String[]{"TGCAG"}
,new String[]{"CTGCAG", "CTAG", "CTAAGATC"} // look for PstI site, BfaI site, or common adapter start for BfaI
,3));
map.put("PSTI-ECOT22I", new Enzyme("PstI-EcoT22I"
,new String[]{"TGCAG", "TGCAT"}
,new String[]{"ATGCAT", "CTGCAG", "CTGCAAGAT", "ATGCAAGAT"} // look for EcoT22I site, PstI site, or common adapter for PstI/EcoT22I
,5));
map.put("PSTI-MSPI", new Enzyme("PstI-MspI"
,new String[]{"TGCAG"}
,new String[]{"CCGG", "CTGCAG", "CCGAGATC"} // look for MspI site, PstI site, or common adapter for MspI
,3));
map.put("PSTI-MSPI-GDF-CUSTOM", new Enzyme("PstI-MspI-GDFcustom"
,new String[]{"TGCAG"}
// changed from CCGAGAT to CCGCTCAGG, as IGD/GDF used a custom Y adapter for MspI
,new String[]{"CCGG", "CTGCAG", "CCGCTCAGG"} // look for MspI site, PstI site, or GDF custom common adapter for MspI
,3));
map.put("PSTI-TAQI", new Enzyme("PstI-TaqI"
,new String[]{"TGCAG"}
,new String[]{"TCGA", "CTGCAG", "TCGAGATC"} // look for TaqI site, PstI site, or common adapter for TaqI
,3));
map.put("NSII-MSPI", new Enzyme("NsiI-MspI" // ATGCA^T C^CGG
,new String[]{"TGCAT"}
,new String[]{"CCGG", "ATGCAT", "CCGAGATC"} // look for MspI site, NsiI site, or common adapter for MspI
,3));
map.put("PAER7I-HHAI", new Enzyme("PaeR7I-HhaI"
// Requested by Ye, Songqing, use same Y adapter as Polland paper -QS
,new String[]{"TCGAG"}
,new String[]{"GCGC", "CTCGAG", "GCGAGATC"} // look for HhaI site, PaeR7I site, or common adapter for HhaI
,3));
map.put("SBFI-MSPI", new Enzyme("SbfI-MspI" // CCTGCA^GG C^CGG
,new String[]{"TGCAGG"}
,new String[]{"CCGG", "CCTGCAGG", "CCGAGATC"} // look for MspI site, SbfI site, or common adapter for MspI
,3));
map.put("SBFI-HPAII", new Enzyme("SbfI-HpaII" // CCTGCA^GG C^CGG Nb: HpaII is an isoschizomer of MspI
,new String[]{"TGCAGG"}
,new String[]{"CCGG", "CCTGCAGG", "CCGAGATC"} // look for HpaII site, SbfI site, or common adapter for HpaII
,3));
map.put("SBFI-BFAI", new Enzyme("SbfI-BfaI" // CCTGCA^GG C^TAG
,new String[]{"TGCAGG"}
,new String[]{"CTAG", "CCTGCAGG", "CTAAGATC"} // look for BfaI site, SbfI site, or common adapter for BfaI
,3));
map.put("SPHI-ECORI", new Enzyme("SphI-EcoRI" // GCATG^C G^AATTC
,new String[]{"CATGC"} // SphI overhang from the genomic DNA fragment (top strand)
,new String[]{"GCATGC", "GAATTC", "GAATTAGATC"} // look for SphI site, EcoRI site, or common adapter for EcoRI
,5));
map.put("ASISI-MSPI", new Enzyme("AsiSI-MspI"
,new String[]{"ATCGC"}
,new String[]{"CCGG", "GCGATCGC", "CCGAGATC"} // look for MspI site, AsiSI site, or common adapter for MspI
,3));
map.put("BSSHII-MSPI", new Enzyme("BssHII-MspI"
,new String[]{"CGCGC"}
,new String[]{"CCGG", "GCGCGC", "CCGAGATC"} // look for MspI site, BssHII site, or common adapter for MspI
,3));
map.put("FSEI-MSPI", new Enzyme("FseI-MspI"
,new String[]{"CCGGCC"}
,new String[]{"CCGG", "GGCCGGCC", "CCGAGATC"} // look for MspI site, FseI site, or common adapter for MspI
,3));
map.put("SALI-MSPI", new Enzyme("SalI-MspI"
,new String[]{"TCGAC"}
,new String[]{"CCGG", "GTCGAC", "CCGAGATC"} // look for MspI site, SalI site, or common adapter for MspI
,3));
map.put("ECORI-MSPI", new Enzyme("EcoRI-MspI" // G^AATTC C^CGG
,new String[]{"AATTC"}
,new String[]{"CCGG", "GAATTC", "CCGAGATC"} // look for MspI site, EcoRI site, or Poland et al. 2012 Y-adapter for MspI
,3));
map.put("HINDIII-MSPI", new Enzyme("HindIII-MspI" // A^AGCTT C^CGG
,new String[]{"AGCTT"}
,new String[]{"CCGG", "AAGCTT", "CCGAGATC"} // look for MspI site, HindIII site, or Poland et al. 2012 Y-adapter for MspI
,3));
map.put("HINDIII-NLAIII", new Enzyme("HindIII-NlaIII" // A^AGCTT ^CATG (not blunt)
,new String[]{"AGCTT"}
,new String[]{"CATG", "AAGCTT", "CATGAGATC"} // look for NlaIII site, HindIII site, or Poland et al. 2012 Y-adapter for Nla3
,4));
map.put("SEXAI-SAU3AI", new Enzyme("SexAI-Sau3AI" // A^CCWGGT ^GATC (not blunt)
,new String[]{"CCAGGT", "CCTGGT"}
,new String[]{"GATC", "ACCAGGT", "ACCTGGT", "GATCAGATC"} // look for SexAI site, Sau3AI site, or Poland et al. 2012 Y-adapter for Sau3AI
,4));
map.put("BAMHI-MLUCI", new Enzyme("BamHI-MluCI" // G^GATCC ^AATT (not blunt)
,new String[]{"GATCC"}
,new String[]{"AATT", "GGATCC", "AATTAGATC"} // look for MluCI site, BamHI site, or Poland et al. 2012 Y-adapter for MluCI
,4));
map.put("PSTI-MLUCI", new Enzyme("PstI-MluCI" // CTGCA^G ^AATT (not blunt)
,new String[]{"TGCAG"}
,new String[]{"AATT", "CTGCAG", "AATTAGATC"} // look for MluCI site, PstI site, or Poland et al. 2012 Y-adapter for MluCI
,4));
map.put("PSTI-MSEI", new Enzyme("PstI-MseI" // CTGCA^G T^TAA
,new String[]{"TGCAG"}
,new String[]{"TTAA", "CTGCAG", "TTAAGATC"} // look for MseI site, PstI site, or Poland et al. 2012 Y-adapter for MseI
,3));
map.put("AVAII-MSEI", new Enzyme("AvaII-MseI" // G^GWCC T^TAA W=AorT
,new String[]{"GACC", "GTCC"}
,new String[]{"TTAA", "GGACC", "GGTCC", "TTAAGATC"} // look for MseI site, AvaII site, or Poland et al. 2012 Y-adapter for MseI
,3));
map.put("ECORI-MSEI", new Enzyme("EcoRI-MseI" // G^AATTC T^TAA
,new String[]{"AATTC"}
,new String[]{"TTAA", "GAATTC", "TTAAGATC"} // look for MseI site, EcoRI site, or Poland et al. 2012 Y-adapter for MseI
,3));
map.put("ECORI-AVAII", new Enzyme("EcoRI-AvaII" // G^AATTC G^GWCC
,new String[]{"AATTC"}
,new String[]{"GGACC", "GGTCC", "GAATTC", "GGACAGATC", "GGTCAGATC"} // look for AvaII site, EcoRI site, or Poland et al. 2012 Y-adapter for AvaII
,4));
map.put("ECORI-HINFI", new Enzyme("EcoRI-HinfI" // G^AATTC G^ANTC
,new String[]{"AATTC"}
,new String[]{"GAATC", "GACTC", "GAGTC", "GATTC", "GAATTC", "GAATAGATC", "GACTAGATC", "GAGTAGATC", "GATTAGATC"} // look for HinfI site, EcoRI site, or Poland et al. 2012 Y-adapter for HinfI
,4));
map.put("BBVCI-MSPI", new Enzyme("BbvCI-MspI" // CCTCAGC (-5/-2) C^CGG
,new String[]{"TCAGC"}
,new String[]{"CCGG", "CCTCAGC", "CCGAGATC"} // look for MspI site, BbvCI site, or Poland et al. 2012 Y-adapter for MspI
,3));
map.put("MSPI-APEKI", new Enzyme("MspI-ApeKI" // C^CGG G^CWGC
,new String[]{"CGG", "CAGC", "CTGC"}
,new String[]{"CCGG", "GCAGC", "GCTGC", "CCGAGATCGG", "GCAGAGAT", "GCTGAGAT"}
,3 ));
map.put("APOI", new Enzyme("ApoI"
,new String[]{"AATTC","AATTT"}
,new String[]{"AAATTC","AAATTT","GAATTC","GAATTT","AAATTAGAT","GAATTAGAT"} // full cut site (from partial digest or chimera) or common adapter start
,5));
map.put("BAMHI", new Enzyme("BamHI"
,new String[]{"GATCC"}
,new String[]{"GGATCC", "GGATCAGAT"} // full cut site (from partial digest or chimera) or common adapter start
// ,new String[]{"GGATCC", "AGATCGGAA", "AGATCGGAAGAGCGGTTCAGCAGGAATGCCGAG"} // <-- corrected from this by Jeff Glaubitz on 2012/09/12
,5));
map.put("MSEI", new Enzyme("MseI"
,new String[]{"TAA"}
,new String[]{"TTAA", "TTAAGAT"} // full cut site (from partial digest or chimera) or common adapter start
,3));
map.put("SAU3AI", new Enzyme("Sau3AI"
,new String[]{"GATC"}
,new String[]{"GATC","GATCAGAT"} // full cut site (from partial digest or chimera) or common adapter start
,4));
map.put("NDEI", new Enzyme("NdeI"
,new String[]{"TATG"}
,new String[]{"CATATG","CATAAGAT"} // full cut site (from partial digest or chimera) or common adapter start
,4));
map.put("HINP1I", new Enzyme("HinP1I"
,new String[]{"CGC"}
,new String[]{"GCGC","GCGAGAT"} // full cut site (from partial digest or chimera) or common adapter start
,3));
map.put("SBFI", new Enzyme("SbfI"
,new String[]{"TGCAGG"}
,new String[]{"CCTGCAGG","CCTGCAAGAT"} // full cut site (from partial digest or chimera) or common adapter start
,6));
map.put("HINDIII", new Enzyme("HindIII" // A^AGCTT
,new String[]{"AGCTT"}
,new String[]{"AAGCTT","AAGCTAGAT"} // full cut site (from partial digest or chimera) or common adapter start
,5));
map.put("ECORI", new Enzyme("EcoRI" // G^AATTC
,new String[]{"AATTC"}
,new String[]{"GAATTC","GAATTAGAT"} // full cut site (from partial digest or chimera) or common adapter start
,5));
map.put("CVI1I", new Enzyme("CviQI" // CviQI and Csp6I are isoschizomers (same recognition seq and overhang)
,new String[]{"TAC"}
,new String[]{"GTAC","GTAAGATCGG"} // full cut site (from partial digest or chimera) or common adapter start
,3));
map.put("CSP6I", new Enzyme("Csp6I" // Csp6I and CviQI are isoschizomers (same recognition seq and overhang)
,new String[]{"TAC"}
,new String[]{"GTAC","GTAAGATCGG"} // full cut site (from partial digest or chimera) or common adapter start
,3));
map.put("NLAIII", new Enzyme("NlaIII" // CATG^
,new String[]{"CATG"}
,new String[]{"CATG","CATGAGAT"} // full cut site (from partial digest or chimera) or common adapter start
,4));
map.put("SPHI", new Enzyme("SphI" // GCATG^C
,new String[]{"CATGC"}
,new String[]{"GCATGC","GCATGAGAT"} // full cut site (from partial digest or chimera) or common adapter start
,5));
map.put("NSPI", new Enzyme("NspI" // RCATG^Y
,new String[]{"CATGC","CATGT"}
,new String[]{"ACATGT","GCATGC","ACATGAGAT","GCATGAGAT"} // full cut site (from partial digest or chimera) or common adapter start
,5));
map.put("KPNI", new Enzyme("KpnI" // GGTAC^C
,new String[]{"GTACC"}
,new String[]{"GGTACC","GGTACAGAT"} // full cut site (from partial digest or chimera) or common adapter start
,5));
map.put("STYI", new Enzyme("StyI" // C^CWWGG
,new String[]{"CAAGG","CATGG","CTAGG","CTTGG"}
,new String[]{"CCAAGG","CCATGG","CCTAGG","CCTTGG","CCAAGAGAT","CCATGAGAT","CCTAGAGAT","CCTTGAGAT"} // full cut site (from partial digest or chimera) or common adapter start
,5));
map.put("STYI-MSEI", new Enzyme("StyI-MseI" // C^CWWGG & T^TAA
,new String[]{"CAAGG","CATGG","CTAGG","CTTGG"}
,new String[]{"TTAA","CCAAGG","CCATGG","CCTAGG","CCTTGG","TTAAGAT"} // full cut site (from partial digest or chimera) or common adapter start
,3));
map.put("FSEI", new Enzyme("FseI" // GGCCGG^CC
,new String[]{"CCGGCC"}
,new String[]{"GGCCGGCC","AGATCGGAAG"} // full cut site (from partial digest or chimera) or Morishige et al (BMC Genomics, 2013) T adapter start
,0)); // assumes that common T adapter is far more likely than a second full cut site));
map.put("NgoMIV", new Enzyme("NgoMIV" // G^CCGGC
,new String[]{"CCGGC"}
,new String[]{"GCCGGC","AGATCGGAAG"} // full cut site (from partial digest or chimera) or Morishige et al (BMC Genomics, 2013) T adapter start
,0)); // assumes that common T adapter is far more likely than a second full cut site));
map.put("MSLI", new Enzyme("MslI" // CAYNN^NNRTG -- has 32 different cut sites (assuming constrained to palindromic YNN -- 32^2 otherwise)
,new String[]{""}
,new String[]{"AGATCGGA"} // common adapter start only (too many possible cut sites!)
,0 ));
map.put("ASEI", new Enzyme("AseI" // AT^TAAT
,new String[]{"TAAT"}
,new String[]{"ATTAAT","ATTAAGAT"} // full cut site (from partial digest or chimera) or common adapter start
,4 ));
map.put("AVAII", new Enzyme("AvaII" // G^GWCC
,new String[]{"GACC","GTCC"}
,new String[]{"GGACC","GGTCC","GGACAGAT","GGTCAGAT"} // full cut site (from partial digest or chimera) or common adapter start
,4 ));
map.put("KPNI-MSPI", new Enzyme("KpnI-MspI" // KpnI: GGTAC^C MspI: C^CGG
,new String[]{"GTACC"}
,new String[]{"CCGG", "GGTACC", "CCGAGATC"} // look for MspI site, KpnI site, or common adapter start for MspI
,3));
map.put("RBSTA", new Enzyme("RBSTA"
,new String[]{"TA"}
,new String[]{"TTAA", "GTAC", "CTAG", "TTAAGAT", "GTAAGAT", "CTAAGAT"} // full cut site (from partial digest or chimera) of MseI, CVIQi, XspI or common adapter start
,3));
map.put("RBSCG", new Enzyme("RBSCG"
,new String[]{"CG"}
,new String[]{"CCGC", "TCGA", "GCGC", "CCGG", "ACGT", "CCGAGAT", "TCGAGAT", "GCGAGAT", "ACGAGAT"} // full cut site (from partial digest or chimera) of AciI, TaqaI, HinpI, HpaII, HpyCH4IV or common adapter start
,3));
map.put("IGNORE", new Enzyme("unspecified" // can be used for new enzymes -- only looks for barcodes and common adapter starts
,new String[]{""}
,new String[]{"AGATCGGA"} // common adapter start only
,0));
}
/**
* Gets the file location of the jar file containing the specified class.
* NOTE: may not work with remote files.
*
* @param clazz class to find
* @return the location of the jar
*/
static File getJarPath(Class clazz) {
try {
URL location = clazz.getProtectionDomain().getCodeSource().getLocation();
File f = new File(location.toURI().getPath());
if (!f.exists()) {
File nf = new File(location.getPath());
if (nf.exists()) {
f = nf;
}
}
if (f.getName().toLowerCase().endsWith(".jar")) {
return f.getParentFile();
}
return f;
} catch (URISyntaxException ex) {
return new File(clazz.getProtectionDomain().getCodeSource().getLocation().getPath());
}
}
/**
* Get the Enzyme by the section name
* Replaces the previous new GBSEnzyme(String enzyme)
* @param key The section name specified the enzyme configuration file
* @return Enzyme
*/
public synchronized Enzyme getEnzyme(String key) {
if(map==null){
loadDefaults();
}
return map.get(key.trim().toUpperCase());
}
/**
* Add Enzyme to a configuration file
* @param ini the config file
* @param enzyme The enzyme to add
* @param key The name of the key/section. Uses Enzyme.name if Empty or null.
*/
static void add(Ini ini,Enzyme enzyme, String key) {
//key should be upper case and no leading or trailing whitespace
if(key == null){
key = enzyme.name.trim().toUpperCase();
}else{
key = key.trim().toUpperCase();
}
Profile.Section section = ini.containsKey(key) ? (Profile.Section) ini.get(key) : ini.add(key);
section.put("name", enzyme.name);
//initialCutSiteRemnant
StringBuilder builder = new StringBuilder(enzyme.initialCutSiteRemnant[0]);
for (int i = 1; i < enzyme.initialCutSiteRemnant.length; ++i) {
builder.append(",");
builder.append(enzyme.initialCutSiteRemnant[i]);
}
section.put("initialCutSiteRemnant", builder.toString());
//likelyReadEnd
builder = new StringBuilder(enzyme.likelyReadEnd[0]);
for (int i = 1; i < enzyme.likelyReadEnd.length; ++i) {
builder.append(",");
builder.append(enzyme.likelyReadEnd[i]);
}
section.put("likelyReadEnd", builder.toString());
section.put("readEndCutSiteRemnantLength", enzyme.readEndCutSiteRemnantLength);
}
/**
* Prints the list of Enzymes loaded in this object
* @param print
* @throws IOException
*/
public void printEnzymes(PrintStream print) throws IOException{
Ini ini = new Ini(); //using the Ini object format the output
ini.getConfig().setLineSeparator("\n");
if(this.map==null){
loadDefaults();
}
for(String key : this.map.keySet()){
Enzyme enzyme = this.map.get(key);
add(ini,enzyme,key);
}
ini.store(print);
}
/**
* Prints default enzyme list and exists
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException{
EnzymeList.defaultCache.printEnzymes(System.out);
}
private LinkedHashMap map;
/**
* Replaces the previous GBSEnzyme class
*/
public static class Enzyme {
private Enzyme(
String name,
String[] initialCutSiteRemnant,
String[] likelyReadEnd,
int readEndCutSiteRemnantLength) {
this.name = name;
this.initialCutSiteRemnant = initialCutSiteRemnant;
this.likelyReadEnd = likelyReadEnd;
this.readEndCutSiteRemnantLength = readEndCutSiteRemnantLength;
}
public final String name;
public final String[] initialCutSiteRemnant;
public final String[] likelyReadEnd;
public final int readEndCutSiteRemnantLength;
/**
* This methods is for convenience based on old code. Use Enzyme.name
* @deprecated
*/
public String enzyme() {return name;}
/**
* This methods is for convenience based on old code. Use Enzyme.initialCutSiteRemnant
* @deprecated
*/
public String[] initialCutSiteRemnant() {return initialCutSiteRemnant;}
/**
* This methods is for convenience based on old code. Use Enzyme.likelyReadEnd
* @deprecated
*/
public String[] likelyReadEnd() {return likelyReadEnd;}
/**
* This methods is for convenience based on old code. Use Enzyme.readEndCutSiteRemnantLength
* @deprecated
*/
public int readEndCutSiteRemnantLength() {return readEndCutSiteRemnantLength;}
}
}