Changeset 5865


Ignore:
Timestamp:
Mar 12, 2020, 1:51:28 PM (21 months ago)
Author:
Nicklas Nordborg
Message:

References #1231: Add support for sequencing with NovaSeq?

Demuxing NovaSeq? data should now work.

Introduced the BarcodeSet annotation to be used on barcodes for grouping possible barcodes that belong together. The main reason for this is so that we can output a logical set of barcodes for the UNUSED tag when demuxing to help us catch errors with incorrectly barcoded libraries.

There are currently two possible values for the BarcodeSet annotation on the RNAseq pipeline:

  • TruSeqSingle: Used by the regular RNA-seq pipeline thas is sequenced on a NextSeq
  • TruSeqUniqueDual: Used by the "external" pipeline that is sequenced on the a NovaSeq


The MIPs pipline currently doesn't need this annotation.

Location:
extensions/net.sf.basedb.reggie/trunk
Files:
1 added
8 edited

Legend:

Unmodified
Added
Removed
  • extensions/net.sf.basedb.reggie/trunk/config/reggie-config.xml

    r5846 r5865  
    235235        <!-- static options for the picard IlluminaBasecallsToFastq step -->
    236236        <fastq-options>-INCLUDE_NON_PF_READS false -MAX_READS_IN_RAM_PER_TILE 5000000 -QUIET true -VERBOSITY WARNING</fastq-options>
    237         <!-- number of tiles to process when debugging (default=2 (HiSeq), 16 (NextSeq)) -->
     237        <!-- number of tiles to process when debugging (default=2 (HiSeq, NovaSeq), 16 (NextSeq)) -->
    238238        <debug-tile-limit-hiseq>2</debug-tile-limit-hiseq>
     239        <debug-tile-limit-novaseq>2</debug-tile-limit-novaseq>
    239240        <debug-tile-limit-nextseq>16</debug-tile-limit-nextseq>
    240241        <!-- static options for Bowtie when used for estimating fragment size -->
  • extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/dao/Annotationtype.java

    r5843 r5865  
    14111411    new Annotationtype("OmitLanes", Type.INT, false, Item.DERIVEDBIOASSAY);
    14121412
     1413  /**
     1414    The "BarcodeSet" annotation, used for tags (Barcode).
     1415    It is a string annotation for grouping possible barcodes
     1416    that are typically used together when sequencing.
     1417    @since 4.26
     1418  */
     1419  public static final Annotationtype BARCODE_SET =
     1420    new Annotationtype("BarcodeSet", Type.STRING, false, Item.TAG);
     1421
     1422 
    14131423  /**
    14141424    The "BarcodeSequence" annotation, used for tags (Barcode).
  • extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/dao/Pipeline.java

    r5725 r5865  
    3131    The RNA sequencing pipeline.
    3232  */
    33   public static final Pipeline RNA_SEQ = new Pipeline("RNA_SEQ", "RNAseq");
     33  public static final Pipeline RNA_SEQ = new Pipeline("RNA_SEQ", "RNAseq")
     34    {
     35      /**
     36        On the NovaSeq we use the TruSeq Unique Dual indexes, otherwise, the TruSeq Single indexes
     37      */
     38      @Override
     39      public BarcodeSet getBarcodeSet(String flowcellType)
     40      {
     41        return FlowCell.FLOW_CELL_TYPE_NOVASEQ.equals(flowcellType) ? BarcodeSet.TRUSEQ_UNIQUE_DUAL : BarcodeSet.TRUSEQ_SINGLE;
     42      }
     43    };
    3444 
    3545  /**
     
    173183 
    174184  /**
     185    Get a default barcode set depending on the flow cell type.
     186    The default implemenation returns null.
     187    @since 4.26
     188  */
     189  public BarcodeSet getBarcodeSet(String flowcellType)
     190  {
     191    return null;
     192  }
     193 
     194  /**
    175195    Get the information as a JSON object ready to be sent as an AJAX response.
    176196  */
  • extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/grid/DemuxJobCreator.java

    r5791 r5865  
    369369    // Export all required barcode files, 2 files per lane per flow cell
    370370    StringWriter out = new StringWriter();
    371     exporter.exportBarcodesFile(dc, flowCellId, lane.laneNo, useReverseComplementOnBarcode2, lane.mergedInPool, lane.doNotUseInPool, out);
     371    exporter.exportBarcodesFile(dc, flowCellId, lane.laneNo, def.numBarcodeReads, useReverseComplementOnBarcode2, lane.mergedInPool, lane.doNotUseInPool, out);
    372372    jobDef.addFile(new StringUploadSource(lane.barcodesFile, out.toString()));
    373373   
    374374    out = new StringWriter();
    375     exporter.exportMultiplexFile(dc, flowCellId, lane.laneNo, useReverseComplementOnBarcode2, lane.mergedInPool, lane.doNotUseInPool, out, "fastq");
     375    exporter.exportMultiplexFile(dc, flowCellId, lane.laneNo, def.numBarcodeReads, useReverseComplementOnBarcode2, lane.mergedInPool, lane.doNotUseInPool, out, "fastq");
    376376    jobDef.addFile(new StringUploadSource(lane.multiplexFile, out.toString()));
    377377  }
     
    399399    final SequencingRun seqRun;
    400400    final String readString;
     401    final int numBarcodeReads;
    401402    final List<Integer> omitLanes;
    402403    final boolean excludeDoNotUse;
     
    406407      this.seqRun = seqRun;
    407408      this.readString = readString;
     409      this.numBarcodeReads = count(readString, 'B');
    408410      this.omitLanes = new ArrayList<Integer>();
    409411      if (omitLanes != null)
     
    442444      }
    443445      return (String)Annotationtype.FLOWCELL_ID.getAnnotationValue(dc, flowCell);
     446    }
     447   
     448    private int count(String readString, char match)
     449    {
     450      int count = 0;
     451      for (int i = 0; i < readString.length(); i++)
     452      {
     453        if (readString.charAt(i) == match) count++;
     454      }
     455      return count;
    444456    }
    445457  }
  • extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/grid/MipsDemuxJobCreator.java

    r5804 r5865  
    182182      // Maps Library->MergedSequences that are created by this job
    183183      Map<Extract, DerivedBioAssay> mergedSequences = new TreeMap<Extract, DerivedBioAssay>(new NameableComparator<Extract>(false));
    184       BarcodeFilesForDemuxExporter exporter = new BarcodeFilesForDemuxExporter(dc, allTags, 2);
     184      BarcodeFilesForDemuxExporter exporter = new BarcodeFilesForDemuxExporter(dc, allTags);
    185185      Map<String, String> DT = new HashMap<>(); // We need sequencing started dates (DT) in the "Read group" files
    186186 
  • extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/grid/RnaSeqDemuxJobCreator.java

    r5619 r5865  
    147147    String demux_extractOptions = cfg.getConfig("demux/extract-options", demuxParameterSet, null);
    148148    String demux_fastqOptions = cfg.getConfig("demux/fastq-options", demuxParameterSet, null);
    149     String debug_tileLimitHiSeq = cfg.getConfig("demux/debug-tile-limit-hiseq", demuxParameterSet, "2");
    150     String debug_tileLimitNextSeq = cfg.getConfig("demux/debug-tile-limit-nextseq", demuxParameterSet, "16");
    151149    String demux_bowtieOptions = cfg.getRequiredConfig("demux/bowtie-options", mergeParameterSet);
    152150    String demux_bowtieGidx = cfg.getRequiredConfig("align/reference-gidx", mergeParameterSet);
     
    223221      // Maps Library->MergedSequences that are created by this job
    224222      Map<Extract, DerivedBioAssay> mergedSequences = new TreeMap<Extract, DerivedBioAssay>(new NameableComparator<Extract>(false));
    225       BarcodeFilesForDemuxExporter exporter = new BarcodeFilesForDemuxExporter(dc, allTags, 1);
     223      BarcodeFilesForDemuxExporter exporter = new BarcodeFilesForDemuxExporter(dc, allTags);
    226224 
    227225      for (DemuxDefinition def : demuxDefs)
     
    245243        String flowCellBarcode = ScriptUtil.checkValidScriptParameter((String)Annotationtype.FLOWCELL_ID.getAnnotationValue(dc, flowCell));
    246244        String flowCellType = (String)Annotationtype.FLOWCELL_TYPE.getAnnotationValue(dc, flowCell);
    247         String debug_tileLimit = "NextSeq".equals(flowCellType) ? debug_tileLimitNextSeq : debug_tileLimitHiSeq;
     245        String debug_tileLimit = cfg.getConfig("demux/debug-tile-limit-"+flowCellType.toLowerCase(), demuxParameterSet, "2");
    248246
    249247        int totalLanes = def.laneInfo.size();
  • extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/plugins/BarcodeFilesForDemuxExporter.java

    r5592 r5865  
    3939  private final Pattern barcodePattern;
    4040  private final Pattern tagNamePattern;
    41   private final int numBarcodeReads;
    4241  // Merged name --> List of demuxed file prefixes
    4342  private final Map<String, List<OutputFileData>> outputFilePrefixes;
     
    4746    @param allBarcodes Optional, if given, the exported file contain dummy lines for all
    4847      borcodes that are not used by libraries on the flow cell
    49     @param numBarcodeReads 1 or 2 (default is 1)
    50   */
    51   public BarcodeFilesForDemuxExporter(DbControl dc, Collection<Tag> allBarcodes, int numBarcodeReads)
     48  */
     49  public BarcodeFilesForDemuxExporter(DbControl dc, Collection<Tag> allBarcodes)
    5250  {
    5351    this.allBarcodes = allBarcodes;
    5452    this.barcodePattern = Pattern.compile("[ACGT]+");
    5553    this.tagNamePattern = Pattern.compile("[a-zA-Z0-9\\-\\.]+");
    56     this.numBarcodeReads = numBarcodeReads == 2 ? 2 : 1;
    5754    this.outputFilePrefixes = new HashMap<>();
    5855  }
     
    6259    when running "picard ExtractIlluminaBarcodes" for the given lane.
    6360  */
    64   public void exportBarcodesFile(DbControl dc, String flowCellId, int laneNo, boolean useReverseComplementOnBarcode2, List<DerivedBioAssay> mergedInLane, List<Extract> libIgnore, Writer out)
     61  public void exportBarcodesFile(DbControl dc, String flowCellId, int laneNo, int numBarcodeReads, boolean useReverseComplementOnBarcode2, List<DerivedBioAssay> mergedInLane, List<Extract> libIgnore, Writer out)
    6562  {
    6663    TableWriter tw = createTableWriter(out);
     
    7370    Object[] info = new Object[headers.length];
    7471    Set<Tag> barcodes = new HashSet<Tag>(allBarcodes);
     72    Set<String> barcodeSets = new HashSet<>();
    7573    for (DerivedBioAssay merged : mergedInLane)
    7674    {
    7775      Extract lib = merged.getExtract();
    7876      Tag barcode = lib.getTag();
     77      String barcodeSet = (String)Annotationtype.BARCODE_SET.getAnnotationValue(dc, barcode);
     78      if (barcodeSet != null) barcodeSets.add(barcodeSet);
    7979
    8080      int index = 0;
     
    115115      for (Tag barcode : barcodes)
    116116      {
     117        if (barcodeSets.size() > 0)
     118        {
     119          // Check if the barocode is in the same "barcode set" as used by the libraries
     120          // If not, we do not need to output "UNUSED" entry for it
     121          String barcodeSet = (String)Annotationtype.BARCODE_SET.getAnnotationValue(dc, barcode);
     122          if (!barcodeSets.contains(barcodeSet)) continue;
     123        }
    117124        int index = 0;
    118125        info[index++] = checkValidBarcodeSequence(dc, barcode, Annotationtype.BARCODE_SEQUENCE);
     
    134141    when running "picard IlluminaBasecallsToFastq" for the given lane.
    135142  */
    136   public void exportMultiplexFile(DbControl dc, String flowcellId, int laneNo, boolean useReverseComplementOnBarcode2, List<DerivedBioAssay> mergedInLane, List<Extract> libIgnore, Writer out, String outFolder)
     143  public void exportMultiplexFile(DbControl dc, String flowcellId, int laneNo, int numBarcodeReads, boolean useReverseComplementOnBarcode2, List<DerivedBioAssay> mergedInLane, List<Extract> libIgnore, Writer out, String outFolder)
    137144  {
    138145    TableWriter tw = createTableWriter(out);
     
    144151   
    145152    Object[] info = new Object[headers.length];
    146     Set<Tag> barcodes = new HashSet<Tag>(allBarcodes);
    147153    for (DerivedBioAssay merged : mergedInLane)
    148154    {
     
    170176      }
    171177      tw.tablePrintData(info);
    172       barcodes.remove(barcode);
    173178    }
    174179   
  • extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/servlet/InstallServlet.java

    r5855 r5865  
    6868import net.sf.basedb.reggie.counter.CounterService;
    6969import net.sf.basedb.reggie.dao.Annotationtype;
     70import net.sf.basedb.reggie.dao.BarcodeSet;
    7071import net.sf.basedb.reggie.dao.BiomaterialList;
    7172import net.sf.basedb.reggie.dao.BioplateEventtype;
     
    661662        jsonChecks.add(checkAnnotationType(dc, Annotationtype.DO_NOT_USE_COMMENT, 1, null, createIfMissing, effectivePermissionsUse));
    662663       
     664        jsonChecks.add(checkAnnotationType(dc, Annotationtype.BARCODE_SET, 1,
     665            new ValueOptions(BarcodeSet.TRUSEQ_SINGLE.getName(), BarcodeSet.TRUSEQ_UNIQUE_DUAL.getName()),
     666            createIfMissing, effectivePermissionsUse));
    663667        jsonChecks.add(checkAnnotationType(dc, Annotationtype.BARCODE_SEQUENCE, 1, null, createIfMissing, effectivePermissionsUse));
    664668        jsonChecks.add(checkAnnotationType(dc, Annotationtype.BARCODE_SEQUENCE_2, 1, null, createIfMissing, effectivePermissionsUse));
     
    983987        jsonChecks.add(checkAnnotationTypeCategory(dc, Subtype.BARCODE, createIfMissing,
    984988            Annotationtype.BARCODE_SEQUENCE, Annotationtype.BARCODE_SEQUENCE_2,
    985             Annotationtype.PIPELINE
     989            Annotationtype.PIPELINE, Annotationtype.BARCODE_SET
    986990          ));
    987991       
     
    11371141
    11381142        // Tags
     1143        // TruSeq single indexes
    11391144        for (int i = 1; i <= 27; i++)
    11401145        {
     
    11421147          if (i == 17 || i == 24 || i == 26) continue;
    11431148          jsonChecks.add(checkTag(dc, "AD"+(i < 10 ? "00" : "0")+i, Subtype.BARCODE, Pipeline.RNA_SEQ,
    1144             "TruSeq Adapter Index " + i,
     1149            BarcodeSet.TRUSEQ_SINGLE, "TruSeq Adapter Index " + i,
     1150            effectivePermissionsUse, createIfMissing));
     1151        }
     1152        // TruSeq Unique Dual indexes
     1153        for (int i = 1; i <= 32; i++)
     1154        {
     1155          jsonChecks.add(checkTag(dc, "UDI"+(i < 10 ? "000" : "00")+i, Subtype.BARCODE, Pipeline.RNA_SEQ,
     1156            BarcodeSet.TRUSEQ_UNIQUE_DUAL, "TruSeq Unique Dual Index " + i,
    11451157            effectivePermissionsUse, createIfMissing));
    11461158        }
     
    18591871    @since 2.12
    18601872  */
    1861   public Tag createTag(SessionControl sc, String name, Subtype subtype, Pipeline pipeline, String description, PermissionOptions permissions)
     1873  public Tag createTag(SessionControl sc, String name, Subtype subtype, Pipeline pipeline, BarcodeSet barcodeSet, String description, PermissionOptions permissions)
    18621874  {
    18631875    Tag tag = null;
     
    18711883      if (permissions != null) permissions.applyPermissions(tag);
    18721884      if (pipeline != null) pipeline.setAnnotation(dc, tag);
     1885      if (barcodeSet != null) Annotationtype.BARCODE_SET.setAnnotationValue(dc, tag, barcodeSet.getName());
     1886      String seq1 = lookupSequence(name);
     1887      String seq2 = lookupSequence2(name);
     1888      if (seq1 != null) Annotationtype.BARCODE_SEQUENCE.setAnnotationValue(dc, tag, seq1);
     1889      if (seq2 != null) Annotationtype.BARCODE_SEQUENCE_2.setAnnotationValue(dc, tag, seq2);
    18731890      dc.saveItem(tag);
    18741891      dc.commit();
     
    18951912    @since 2.12
    18961913  */
    1897   public JSONObject checkTag(DbControl dc, String name, Subtype subtype, Pipeline pipeline, String description, PermissionOptions permissions, boolean createIfMissing)
     1914  public JSONObject checkTag(DbControl dc, String name, Subtype subtype, Pipeline pipeline, BarcodeSet barcodeSet, String description, PermissionOptions permissions, boolean createIfMissing)
    18981915  {
    18991916 
     
    19151932      if (createIfMissing)
    19161933      {
    1917         Tag t = createTag(dc.getSessionControl(), name, subtype, pipeline, description, permissions);
     1934        Tag t = createTag(dc.getSessionControl(), name, subtype, pipeline, barcodeSet, description, permissions);
    19181935        json.put("id", t.getId());
    19191936        json.put("status", "ok");
     
    19571974      }
    19581975      AnnotationType barcodeSequenceType = Annotationtype.BARCODE_SEQUENCE.get(dc);
    1959       if (barcodeSequenceType != null)
     1976      AnnotationType barcodeSequence2Type = Annotationtype.BARCODE_SEQUENCE_2.get(dc);
     1977      if (barcodeSequenceType != null && barcodeSequence2Type != null)
    19601978      {
    19611979        String barcodeSequence = (String)Annotationtype.BARCODE_SEQUENCE.getAnnotationValue(dc, t);
     1980        String barcodeSequence2 = (String)Annotationtype.BARCODE_SEQUENCE_2.getAnnotationValue(dc, t);
    19621981        if (barcodeSequence == null)
    19631982        {
     
    19741993          }
    19751994        }
     1995        if (barcodeSequence2 == null)
     1996        {
     1997          barcodeSequence2 = lookupSequence2(name);
     1998          if (barcodeSequence2 != null)
     1999          {
     2000            if (createIfMissing)
     2001            {
     2002              Annotationtype.BARCODE_SEQUENCE_2.setAnnotationValue(dc, t, barcodeSequence2);
     2003              if (jsonMessages.size() == 0) jsonMessages.add("Fixed");
     2004            }
     2005            else
     2006            {
     2007              json.put("status", "incomplete");
     2008              jsonMessages.add("Missing BarcodeSequence2 annotation");
     2009            }
     2010          }
     2011        }
    19762012      }
    19772013      AnnotationType pipelineType = Annotationtype.PIPELINE.get(dc);
     
    19902026            json.put("status", "incomplete");
    19912027            jsonMessages.add(existing == null ? "Missing Pipeline annotation" : "Pipeline annotation: expected " + pipeline.getName() + "; found " + existing);
     2028          }
     2029        }
     2030      }
     2031      AnnotationType barcodeSetType = Annotationtype.BARCODE_SET.get(dc);
     2032      if (barcodeSetType != null && barcodeSet != null)
     2033      {
     2034        String existing = (String)Annotationtype.BARCODE_SET.getAnnotationValue(dc, t);
     2035        if (existing == null || !existing.equals(barcodeSet.getName()))
     2036        {
     2037          if (createIfMissing)
     2038          {
     2039            Annotationtype.BARCODE_SET.setAnnotationValue(dc, t, barcodeSet.getName());
     2040            if (jsonMessages.size() == 0) jsonMessages.add("Fixed");
     2041          }
     2042          else
     2043          {
     2044            json.put("status", "incomplete");
     2045            jsonMessages.add(existing == null ? "Missing BarcodeSet annotation" : "BarcodeSet annotation: expected " + barcodeSet.getName() + "; found " + existing);
    19922046          }
    19932047        }
     
    33963450
    33973451  private Map<String, String> barcodeSequences;
     3452  private Map<String, String> barcodeSequences2;
    33983453  /**
    33993454    Maps barcode name (AD001, AD002, ...) to gene sequence.
     
    34283483      barcodeSequences.put("AD025", "ACTGATA");
    34293484      barcodeSequences.put("AD027", "ATTCCTA");
     3485     
     3486      barcodeSequences.put("UDI0001", "CCGCGGTT");
     3487      barcodeSequences.put("UDI0002", "TTATAACC");
     3488      barcodeSequences.put("UDI0003", "GGACTTGG");
     3489      barcodeSequences.put("UDI0004", "AAGTCCAA");
     3490      barcodeSequences.put("UDI0005", "ATCCACTG");
     3491      barcodeSequences.put("UDI0006", "GCTTGTCA");
     3492      barcodeSequences.put("UDI0007", "CAAGCTAG");
     3493      barcodeSequences.put("UDI0008", "TGGATCGA");
     3494      barcodeSequences.put("UDI0009", "AGTTCAGG");
     3495      barcodeSequences.put("UDI0010", "GACCTGAA");
     3496      barcodeSequences.put("UDI0011", "TCTCTACT");
     3497      barcodeSequences.put("UDI0012", "CTCTCGTC");
     3498      barcodeSequences.put("UDI0013", "CCAAGTCT");
     3499      barcodeSequences.put("UDI0014", "TTGGACTC");
     3500      barcodeSequences.put("UDI0015", "GGCTTAAG");
     3501      barcodeSequences.put("UDI0016", "AATCCGGA");
     3502      barcodeSequences.put("UDI0017", "TAATACAG");
     3503      barcodeSequences.put("UDI0018", "CGGCGTGA");
     3504      barcodeSequences.put("UDI0019", "ATGTAAGT");
     3505      barcodeSequences.put("UDI0020", "GCACGGAC");
     3506      barcodeSequences.put("UDI0021", "GGTACCTT");
     3507      barcodeSequences.put("UDI0022", "AACGTTCC");
     3508      barcodeSequences.put("UDI0023", "GCAGAATT");
     3509      barcodeSequences.put("UDI0024", "ATGAGGCC");
     3510      barcodeSequences.put("UDI0025", "ACTAAGAT");
     3511      barcodeSequences.put("UDI0026", "GTCGGAGC");
     3512      barcodeSequences.put("UDI0027", "CTTGGTAT");
     3513      barcodeSequences.put("UDI0028", "TCCAACGC");
     3514      barcodeSequences.put("UDI0029", "CCGTGAAG");
     3515      barcodeSequences.put("UDI0030", "TTACAGGA");
     3516      barcodeSequences.put("UDI0031", "GGCATTCT");
     3517      barcodeSequences.put("UDI0032", "AATGCCTC");
    34303518    }
    34313519   
    34323520    return barcodeSequences.get(barcode);
     3521  }
     3522 
     3523  /**
     3524    Maps barcode name to gene sequence for second barcode.
     3525  */
     3526  private String lookupSequence2(String barcode)
     3527  {
     3528    if (barcodeSequences2 == null)
     3529    {
     3530      barcodeSequences2 = new HashMap<String, String>();
     3531     
     3532      barcodeSequences2.put("UDI0001", "AGCGCTAG");
     3533      barcodeSequences2.put("UDI0002", "GATATCGA");
     3534      barcodeSequences2.put("UDI0003", "CGCAGACG");
     3535      barcodeSequences2.put("UDI0004", "TATGAGTA");
     3536      barcodeSequences2.put("UDI0005", "AGGTGCGT");
     3537      barcodeSequences2.put("UDI0006", "GAACATAC");
     3538      barcodeSequences2.put("UDI0007", "ACATAGCG");
     3539      barcodeSequences2.put("UDI0008", "GTGCGATA");
     3540      barcodeSequences2.put("UDI0009", "CCAACAGA");
     3541      barcodeSequences2.put("UDI0010", "TTGGTGAG");
     3542      barcodeSequences2.put("UDI0011", "CGCGGTTC");
     3543      barcodeSequences2.put("UDI0012", "TATAACCT");
     3544      barcodeSequences2.put("UDI0013", "AAGGATGA");
     3545      barcodeSequences2.put("UDI0014", "GGAAGCAG");
     3546      barcodeSequences2.put("UDI0015", "TCGTGACC");
     3547      barcodeSequences2.put("UDI0016", "CTACAGTT");
     3548      barcodeSequences2.put("UDI0017", "ATATTCAC");
     3549      barcodeSequences2.put("UDI0018", "GCGCCTGT");
     3550      barcodeSequences2.put("UDI0019", "ACTCTATG");
     3551      barcodeSequences2.put("UDI0020", "GTCTCGCA");
     3552      barcodeSequences2.put("UDI0021", "AAGACGTC");
     3553      barcodeSequences2.put("UDI0022", "GGAGTACT");
     3554      barcodeSequences2.put("UDI0023", "ACCGGCCA");
     3555      barcodeSequences2.put("UDI0024", "GTTAATTG");
     3556      barcodeSequences2.put("UDI0025", "AACCGCGG");
     3557      barcodeSequences2.put("UDI0026", "GGTTATAA");
     3558      barcodeSequences2.put("UDI0027", "CCAAGTCC");
     3559      barcodeSequences2.put("UDI0028", "TTGGACTT");
     3560      barcodeSequences2.put("UDI0029", "CAGTGGAT");
     3561      barcodeSequences2.put("UDI0030", "TGACAAGC");
     3562      barcodeSequences2.put("UDI0031", "CTAGCTTG");
     3563      barcodeSequences2.put("UDI0032", "TCGATCCA");
     3564    }
     3565   
     3566    return barcodeSequences2.get(barcode);
    34333567  }
    34343568
Note: See TracChangeset for help on using the changeset viewer.