- added more parameters to GGBN parser and test
authorPatric Plitzner <p.plitzner@bgbm.org>
Mon, 8 Jun 2015 08:28:10 +0000 (08:28 +0000)
committerPatric Plitzner <p.plitzner@bgbm.org>
Mon, 8 Jun 2015 08:28:10 +0000 (08:28 +0000)
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/specimen/abcd206/in/Abcd206Import.java
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/specimen/abcd206/in/ggbn/AbcdGgbnParser.java
cdmlib-io/src/test/java/eu/etaxonomy/cdm/io/specimen/abcd206/in/AbcdGgbnImportTest.java
cdmlib-io/src/test/resources/eu/etaxonomy/cdm/io/specimen/abcd206/in/db6.xml

index b04ea766fb754125ea10b9f8bf056ff4af7879e4..2167d4c90efbc2b8f83200a5ba7d290c9b2cf93c 100644 (file)
@@ -345,8 +345,8 @@ public class Abcd206Import extends SpecimenImportBase<Abcd206ImportConfigurator,
                 Element unitExtension = (Element) unitExtensions.item(i);
                 NodeList ggbn = unitExtension.getElementsByTagName("ggbn:GGBN");
                 if(ggbn.getLength()>0){
-                    AbcdGgbnParser ggbnParser = new AbcdGgbnParser();
-                    DnaSample dnaSample = ggbnParser.parse(ggbn);
+                    AbcdGgbnParser ggbnParser = new AbcdGgbnParser(report, cdmAppController);
+                    DnaSample dnaSample = ggbnParser.parse(ggbn, state);
                     save(dnaSample, state);
                     String specimenUnitID = null;
                     SpecimenOrObservationBase<?> parentSpecimen = parent;
index 1e1ddbc6ba0a5caede8029c588b469d4db5d6af6..ff570549ccc477f2c13c384574abaefe1c04de2e 100644 (file)
@@ -9,14 +9,28 @@
 */
 package eu.etaxonomy.cdm.io.specimen.abcd206.in.ggbn;
 
+import java.net.URI;
+import java.util.List;
+
 import org.apache.log4j.Logger;
 import org.joda.time.DateTime;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
+import eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration;
+import eu.etaxonomy.cdm.io.specimen.abcd206.in.Abcd206ImportReport;
+import eu.etaxonomy.cdm.io.specimen.abcd206.in.Abcd206ImportState;
+import eu.etaxonomy.cdm.model.common.DefinedTerm;
+import eu.etaxonomy.cdm.model.common.DefinedTermBase;
+import eu.etaxonomy.cdm.model.media.Media;
+import eu.etaxonomy.cdm.model.molecular.Amplification;
+import eu.etaxonomy.cdm.model.molecular.AmplificationResult;
 import eu.etaxonomy.cdm.model.molecular.DnaQuality;
 import eu.etaxonomy.cdm.model.molecular.DnaSample;
+import eu.etaxonomy.cdm.model.molecular.Sequence;
+import eu.etaxonomy.cdm.model.molecular.SequenceString;
+import eu.etaxonomy.cdm.persistence.query.MatchMode;
 
 /**
  * @author pplitzner
@@ -29,11 +43,16 @@ public class AbcdGgbnParser {
 
     private final String prefix = "ggbn:";
 
-    /**
-     * @param ggbn
-     * @return
-     */
-    public DnaSample parse(NodeList ggbn) {
+    private final Abcd206ImportReport report;
+
+    private final ICdmApplicationConfiguration cdmAppController;
+
+    public AbcdGgbnParser(Abcd206ImportReport report, ICdmApplicationConfiguration cdmAppController) {
+        this.report = report;
+        this.cdmAppController = cdmAppController;
+    }
+
+    public DnaSample parse(NodeList ggbn, Abcd206ImportState state) {
         DnaSample dnaSample = DnaSample.NewInstance();
 
         for(int i=0;i<ggbn.getLength();i++){
@@ -51,19 +70,16 @@ public class AbcdGgbnParser {
                 NodeList gelImageList = element.getElementsByTagName(prefix+"gelImage");
                 NodeList amplificationsList = element.getElementsByTagName(prefix+"Amplifications");
 
-                parseDnaQuality(element);
+//                dnaSample.setDnaQuality(parseDnaQuality(element, state));
 
-                parseGelImage(gelImageList);
-                parseAmplifications(amplificationsList);
+                parseGelImage(gelImageList, state);
+                parseAmplifications(amplificationsList, dnaSample, state);
             }
         }
         return dnaSample;
     }
 
-    /**
-     * @param element
-     */
-    private void parseDnaQuality(Element element) {
+    private DnaQuality parseDnaQuality(Element element, Abcd206ImportState state) {
         DnaQuality dnaQuality = DnaQuality.NewInstance();
 
         NodeList purificationMethodList = element.getElementsByTagName(prefix+"purificationMethod");
@@ -95,12 +111,10 @@ public class AbcdGgbnParser {
 
 //        dnaQuality.setQualityTerm(qualityTerm)
 
+        return dnaQuality;
     }
 
-    /**
-     * @param gelImageList
-     */
-    private void parseGelImage(NodeList gelImageList) {
+    private void parseGelImage(NodeList gelImageList, Abcd206ImportState state) {
         if(gelImageList.item(0)!=null && gelImageList.item(0) instanceof Element){
             Element gelImage = (Element)gelImageList.item(0);
             NodeList fileURIList = gelImage.getElementsByTagName("fileURI");
@@ -115,51 +129,114 @@ public class AbcdGgbnParser {
 
     }
 
-    /**
-     * @param amplificationsList
-     */
-    private void parseAmplifications(NodeList amplificationsList) {
+    private void parseAmplifications(NodeList amplificationsList, DnaSample dnaSample, Abcd206ImportState state) {
         if(amplificationsList.item(0)!=null && amplificationsList.item(0) instanceof Element){
+            AmplificationResult amplificationResult = AmplificationResult.NewInstance();
+            Amplification amplification = Amplification.NewInstance();
             NodeList amplificationList = ((Element) amplificationsList.item(0)).getElementsByTagName(prefix+"amplification");
             for(int i=0;i<amplificationList.getLength();i++){
                 if(amplificationList.item(i) instanceof Element){
-                    Element amplification = (Element)amplificationList.item(i);
-                    NodeList amplificationDateList = amplification.getElementsByTagName(prefix+"amplificationDate");
-                    NodeList amplificationStaffList = amplification.getElementsByTagName(prefix+"amplificationStaff");
-                    NodeList markerList = amplification.getElementsByTagName(prefix+"marker");
-                    NodeList markerSubfragmentList = amplification.getElementsByTagName(prefix+"markerSubfragment");
-                    NodeList amplificationSuccessList = amplification.getElementsByTagName(prefix+"amplificationSuccess");
-                    NodeList amplificationSuccessDetailsList = amplification.getElementsByTagName(prefix+"amplificationSuccessDetails");
-                    NodeList amplificationMethodList = amplification.getElementsByTagName(prefix+"amplificationMethod");
-                    NodeList purificationMethodList = amplification.getElementsByTagName(prefix+"purificationMethod");
-                    NodeList libReadsSeqdList = amplification.getElementsByTagName(prefix+"lib_reads_seqd");
-                    NodeList libScreenList = amplification.getElementsByTagName(prefix+"lib_screen");
-                    NodeList libVectorList = amplification.getElementsByTagName(prefix+"lib_vector");
-                    NodeList libConstMethList = amplification.getElementsByTagName(prefix+"lib_const_meth");
-                    NodeList plasmidList = amplification.getElementsByTagName(prefix+"plasmid");
-
-                    parseAmplificationSequencing(amplification.getElementsByTagName(prefix+"Sequencings"));
-                    parseAmplificationPrimers(amplification.getElementsByTagName(prefix+"AmplificationPrimers"));
+                    Element amplificationElement = (Element)amplificationList.item(i);
+                    NodeList amplificationDateList = amplificationElement.getElementsByTagName(prefix+"amplificationDate");
+                    NodeList amplificationStaffList = amplificationElement.getElementsByTagName(prefix+"amplificationStaff");
+
+                    NodeList markerList = amplificationElement.getElementsByTagName(prefix+"marker");
+                    if(markerList.item(0)!=null){
+                        String amplificationMarker = markerList.item(0).getTextContent();
+                        DefinedTerm dnaMarker = null;
+                        List<DefinedTermBase> markersFound = cdmAppController.getTermService().findByTitle(DefinedTerm.class, amplificationMarker, MatchMode.EXACT, null, null, null, null, null).getRecords();
+                        if(markersFound.size()==1){
+                            dnaMarker = (DefinedTerm) markersFound.get(0);
+                        }
+                        else{
+                            dnaMarker = DefinedTerm.NewDnaMarkerInstance(amplificationMarker, amplificationMarker, amplificationMarker);
+                            cdmAppController.getTermService().saveOrUpdate(dnaMarker);
+                        }
+                        amplification.setDnaMarker(dnaMarker);
+                    }
+
+                    NodeList markerSubfragmentList = amplificationElement.getElementsByTagName(prefix+"markerSubfragment");
+                    NodeList amplificationSuccessList = amplificationElement.getElementsByTagName(prefix+"amplificationSuccess");
+                    NodeList amplificationSuccessDetailsList = amplificationElement.getElementsByTagName(prefix+"amplificationSuccessDetails");
+                    NodeList amplificationMethodList = amplificationElement.getElementsByTagName(prefix+"amplificationMethod");
+                    NodeList purificationMethodList = amplificationElement.getElementsByTagName(prefix+"purificationMethod");
+                    NodeList libReadsSeqdList = amplificationElement.getElementsByTagName(prefix+"lib_reads_seqd");
+                    NodeList libScreenList = amplificationElement.getElementsByTagName(prefix+"lib_screen");
+                    NodeList libVectorList = amplificationElement.getElementsByTagName(prefix+"lib_vector");
+                    NodeList libConstMethList = amplificationElement.getElementsByTagName(prefix+"lib_const_meth");
+                    NodeList plasmidList = amplificationElement.getElementsByTagName(prefix+"plasmid");
+
+                    NodeList sequencingsList = amplificationElement.getElementsByTagName(prefix+"Sequencings");
+                    if(sequencingsList.item(0)!=null && sequencingsList.item(0) instanceof Element){
+                        parseAmplificationSequencings((Element)sequencingsList.item(0), dnaSample, state);
+                    }
+                    parseAmplificationPrimers(amplificationElement.getElementsByTagName(prefix+"AmplificationPrimers"));
                 }
             }
+            amplificationResult.setAmplification(amplification);
+            dnaSample.addAmplificationResult(amplificationResult);
         }
     }
 
-    /**
-     * @param elementsByTagName
-     */
     private void parseAmplificationPrimers(NodeList elementsByTagName) {
         // TODO Auto-generated method stub
 
     }
 
-    /**
-     * @param nodeList
-     *
-     */
-    private void parseAmplificationSequencing(NodeList nodeList) {
-        // TODO Auto-generated method stub
+    private void parseAmplificationSequencings(Element sequencings, DnaSample dnaSample, Abcd206ImportState state) {
+        NodeList sequencingList = sequencings.getElementsByTagName(prefix+"sequencing");
+        for(int i=0;i<sequencingList.getLength();i++){
+            Sequence sequence = Sequence.NewInstance("");
+            dnaSample.addSequence(sequence);
 
+            if(sequencingList.item(i) instanceof Element){
+                Element sequencing = (Element)sequencingList.item(i);
+                //Consensus sequence
+                NodeList consensusSequencesList = sequencing.getElementsByTagName(prefix+"consensusSequence");
+                if(consensusSequencesList.item(0)!=null){
+                    String sequenceString = consensusSequencesList.item(0).getTextContent();
+                    sequenceString = sequenceString.replaceAll("\n", "");
+                    sequenceString = sequenceString.replaceAll("( )+", " ");
+                    sequence.setConsensusSequence(SequenceString.NewInstance(sequenceString));
+                }
+                //sequence length
+                NodeList consensusSequencesLengthList = sequencing.getElementsByTagName(prefix+"consensusSequenceLength");
+                if(sequence.getConsensusSequence()!=null){
+                    sequence.getConsensusSequence().setLength(parseFirstNodeDouble(consensusSequencesLengthList).intValue());
+                }
+                //contig file URL
+                NodeList consensusSequenceChromatogramFileURIList = sequencing.getElementsByTagName(prefix+"consensusSequenceChromatogramFileURI");
+                URI uri = parseFirstUri(consensusSequenceChromatogramFileURIList);
+                Media contigFile = Media.NewInstance(uri, null, null, null);
+                sequence.setContigFile(contigFile);
+            }
+        }
+//        if(nodeList.item(0)!=null && nodeList.item(0) instanceof Element){
+//        NodeList plasmidList = amplificationElement.getElementsByTagName(prefix+"plasmid");
+
+    }
+
+    private URI parseFirstUri(NodeList nodeList){
+        URI uri = null;
+        if(nodeList.item(0)!=null){
+            String textContent = nodeList.item(0).getTextContent();
+            if(textContent!=null){
+                try {
+                    uri = URI.create(textContent);
+                } catch (IllegalArgumentException e) {
+                    //nothing
+                }
+            }
+        }
+        return uri;
+    }
+
+    private String parseFirstTextContent(NodeList nodeList){
+        String string = null;
+        if(nodeList.getLength()>0){
+            string = nodeList.item(0).getTextContent();
+        }
+        return string;
     }
 
     private Double parseFirstNodeDouble(NodeList nodeList){
index 3bde6434025176c8fa67bfac486951e5619bd7b0..891bbb645c7b02719dce1415aae99745a9f8a27c 100644 (file)
@@ -14,9 +14,11 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;\r
 \r
 import java.io.FileNotFoundException;\r
+import java.net.URI;\r
 import java.net.URISyntaxException;\r
 import java.net.URL;\r
 import java.util.List;\r
+import java.util.Set;\r
 import java.util.UUID;\r
 \r
 import org.junit.Assert;\r
@@ -27,7 +29,13 @@ import org.unitils.spring.annotation.SpringBeanByType;
 \r
 import eu.etaxonomy.cdm.api.service.IOccurrenceService;\r
 import eu.etaxonomy.cdm.io.common.CdmApplicationAwareDefaultImport;\r
+import eu.etaxonomy.cdm.model.common.DefinedTerm;\r
+import eu.etaxonomy.cdm.model.media.MediaUtils;\r
+import eu.etaxonomy.cdm.model.molecular.Amplification;\r
+import eu.etaxonomy.cdm.model.molecular.AmplificationResult;\r
 import eu.etaxonomy.cdm.model.molecular.DnaSample;\r
+import eu.etaxonomy.cdm.model.molecular.Sequence;\r
+import eu.etaxonomy.cdm.model.molecular.SequenceString;\r
 import eu.etaxonomy.cdm.model.occurrence.DerivationEventType;\r
 import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;\r
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;\r
@@ -68,8 +76,55 @@ public class AbcdGgbnImportTest extends CdmTransactionalIntegrationTest {
         assertEquals("Number of dna samples is incorrect", 1, occurrenceService.count(DnaSample.class));\r
         DnaSample dnaSample = occurrenceService.list(DnaSample.class, null, null, null, null).get(0);\r
         assertEquals("Wrong derivation type!", DerivationEventType.DNA_EXTRACTION(), dnaSample.getDerivedFrom().getType());\r
-\r
         assertEquals("Wrong number of originals", 1, dnaSample.getDerivedFrom().getOriginals().size());\r
+\r
+        //dna quality\r
+//        DnaQuality dnaQuality = dnaSample.getDnaQuality();\r
+//        assertNotNull("Dna quality is null", dnaQuality!=null);\r
+//        assertEquals(new Double("0,77"),dnaQuality.getRatioOfAbsorbance260_230());\r
+//        assertEquals(new Double("1,38"),dnaQuality.getRatioOfAbsorbance260_280());\r
+\r
+        //amplifications\r
+        Set<AmplificationResult> amplificationResults = dnaSample.getAmplificationResults();\r
+        assertNotNull(amplificationResults);\r
+        assertEquals(1,  amplificationResults.size());\r
+        AmplificationResult amplificationResult = amplificationResults.iterator().next();\r
+        Amplification amplification = amplificationResult.getAmplification();\r
+        assertNotNull("Amplification is null", amplification);\r
+        DefinedTerm dnaMarker = amplification.getDnaMarker();\r
+        assertNotNull(dnaMarker);\r
+        assertEquals("ITS (ITS1, 5.8S rRNA, ITS2)", dnaMarker.getLabel());\r
+\r
+        //sequencing\r
+        Set<Sequence> sequences = dnaSample.getSequences();\r
+        assertNotNull(sequences);\r
+        assertEquals(1, sequences.size());\r
+        Sequence sequence = sequences.iterator().next();\r
+        SequenceString consensusSequence = sequence.getConsensusSequence();\r
+        assertNotNull(consensusSequence);\r
+//        assertEquals(\r
+//                "TTTCGGGTCC TTTATAGTGA AGATATAGCA TAGATAGTTG TAATCCATTA" +\r
+//                     " TGTATCATTG GGGAAGGAAG GAGAATATTT TTTTGATAGA ATACAAGTAT" +\r
+//                     " GGATTATTGA AACTAATACG CCATGTATTT GGATATTTCC CTTGAACTGC" +\r
+//                     " ATAATATTCT TTATTTTCCA TGAATAGTGT AAGGGAATTT TTCGAAGAGA" +\r
+//                     " AAATGGATTA TGGGAGTGTG TGACTTGAGC TATTGATTGG TCTGTGCAGA" +\r
+//                     " TACGGGCTTT TATCTATCTG CCACATTGTA ATTCACAAAC CAATGTGTCT" +\r
+//                     " TTGTTCCAAC CATCGCGTAA GCCCCATACA GAAGATAGGC TGGTTCGCTT" +\r
+//                     " GAAGAGAATC TTTTCTATGA TCAGATCCGA ATTATGTCGT ACATGAGCAG" +\r
+//                     " GCTCCGTAAG ATCTAGTTGA CTTAAGTCAA ACTTCAATAG TATAAAAATG" +\r
+//                     " CACTCATTTC CTCTGCATTG ACACGAGCTA TGAGACTATC GGAGTGAAAG" +\r
+//                     " AAAGGGTCTA AAGAAGAAGA AAGCTTGGGC TAGATTAGTA ACAAGTAAAT" +\r
+//                     " CCTTTGTGTG TGTGTTTGTA ATTAGTAAAT GGGCTCTCAA TATTTTGGGG" +\r
+//                     " CTAATTACTG ATCCTAAGGT TTGAGACGAC CCAGAAAGCA CTTGATCATA" +\r
+//                     " TCACGATTGA CTTTGTAAGC CTACTTGGGT ATTGAGTATT TACTTGTAAG" +\r
+//                     " AACCGAATTC TTTGGGGGAT AGTTGCAAAA AGAATCCAGT CAATTGTTCT" +\r
+//                     " TACGTAAAAC CATTCATATC TCGTATATGG ATATGTCTAG ATAGGCTATC" +\r
+//                     " GATTTTCGAT GGATTCGTTT GGTTCTTTTG ATTATTGCTC GAGCTGGATG" +\r
+//                     " ATGAAAAATT ATCATGTCCG GTTCCTTCG",consensusSequence.getString());\r
+//        assertEquals((Integer)912, consensusSequence.getLength());\r
+        assertNotNull(sequence.getContigFile());\r
+        assertEquals(URI.create("http://ww2.biocase.org/websvn/filedetails.php?repname=campanula&path=%2FCAM385_Campa_drabifolia.pde"), MediaUtils.getFirstMediaRepresentationPart(sequence.getContigFile()).getUri());\r
+\r
        }\r
 \r
        @Test\r
index 1e041dede47898babaa77f87d5a89ab47f5dda75..28cf65f34c868fbf85df54e3b765b7bd683e051e 100644 (file)
                   <ggbn:marker>ITS (ITS1, 5.8S rRNA, ITS2)</ggbn:marker>\r
                   <ggbn:Sequencings>\r
                     <ggbn:sequencing>\r
-<!--                       <ggbn:SingleSequencings> -->\r
-<!--                         <ggbn:singleSequencing> -->\r
-<!--                           <ggbn:sequencingDirection>forward</ggbn:sequencingDirection> -->\r
-<!--                           <ggbn:chromatogramFileURI>http://ww2.biocase.org/websvn/filedetails.php?repname=campanula&path=%2FCAM385_GM312-petD_F.ab1</ggbn:chromatogramFileURI> -->\r
-<!--                           <ggbn:SequencingPrimers> -->\r
-<!--                             <ggbn:sequencingPrimer> -->\r
-<!--                               <ggbn:primerSequence -->\r
-<!--                                 Direction="forward">5´-GCCGTMTTTATGTTAATGC-3´</ggbn:primerSequence> -->\r
-<!--                               <ggbn:primerName>PIpetB1411F</ggbn:primerName> -->\r
-<!--                               <ggbn:primerReferenceCitation>Löhne & -->\r
-<!--                                 Borsch 2005</ggbn:primerReferenceCitation> -->\r
-<!--                             </ggbn:sequencingPrimer> -->\r
-<!--                           </ggbn:SequencingPrimers> -->\r
-<!--                         </ggbn:singleSequencing> -->\r
-<!--                         <ggbn:singleSequencing> -->\r
-<!--                           <ggbn:sequencingDirection>reverse</ggbn:sequencingDirection> -->\r
-<!--                           <ggbn:chromatogramFileURI>http://ww2.biocase.org/websvn/filedetails.php?repname=campanula&path=%2FCAM385_GM312-petD_R.ab1</ggbn:chromatogramFileURI> -->\r
-<!--                           <ggbn:SequencingPrimers> -->\r
-<!--                             <ggbn:sequencingPrimer> -->\r
-<!--                               <ggbn:primerSequence -->\r
-<!--                                 Direction="reverse">5´-AATTTAGCYCTTAATACAGG-3´</ggbn:primerSequence> -->\r
-<!--                               <ggbn:primerName>PIpetD738R</ggbn:primerName> -->\r
-<!--                               <ggbn:primerReferenceCitation>Löhne & -->\r
-<!--                                 Borsch 2005</ggbn:primerReferenceCitation> -->\r
-<!--                             </ggbn:sequencingPrimer> -->\r
-<!--                           </ggbn:SequencingPrimers> -->\r
-<!--                         </ggbn:singleSequencing> -->\r
-<!--                       </ggbn:SingleSequencings> -->\r
-<!--                       <ggbn:consensusSequence>TTTCGGGTCC TTTATAGTGA -->\r
-<!--                         AGATATAGCA TAGATAGTTG -->\r
-<!--                         TAATCCATTA -->\r
-<!--                         TGTATCATTG GGGAAGGAAG GAGAATATTT TTTTGATAGA ATACAAGTAT -->\r
-<!--                         GGATTATTGA AACTAATACG CCATGTATTT GGATATTTCC CTTGAACTGC -->\r
-<!--                         ATAATATTCT TTATTTTCCA TGAATAGTGT AAGGGAATTT TTCGAAGAGA -->\r
-<!--                         AAATGGATTA TGGGAGTGTG TGACTTGAGC TATTGATTGG TCTGTGCAGA -->\r
-<!--                         TACGGGCTTT TATCTATCTG CCACATTGTA ATTCACAAAC CAATGTGTCT -->\r
-<!--                         TTGTTCCAAC CATCGCGTAA GCCCCATACA GAAGATAGGC TGGTTCGCTT -->\r
-<!--                         GAAGAGAATC TTTTCTATGA TCAGATCCGA ATTATGTCGT ACATGAGCAG -->\r
-<!--                         GCTCCGTAAG ATCTAGTTGA CTTAAGTCAA ACTTCAATAG TATAAAAATG -->\r
-<!--                         CACTCATTTC CTCTGCATTG ACACGAGCTA TGAGACTATC GGAGTGAAAG -->\r
-<!--                         AAAGGGTCTA AAGAAGAAGA AAGCTTGGGC TAGATTAGTA ACAAGTAAAT -->\r
-<!--                         CCTTTGTGTG TGTGTTTGTA ATTAGTAAAT GGGCTCTCAA TATTTTGGGG -->\r
-<!--                         CTAATTACTG ATCCTAAGGT TTGAGACGAC CCAGAAAGCA CTTGATCATA -->\r
-<!--                         TCACGATTGA CTTTGTAAGC CTACTTGGGT ATTGAGTATT TACTTGTAAG -->\r
-<!--                         AACCGAATTC TTTGGGGGAT AGTTGCAAAA AGAATCCAGT CAATTGTTCT -->\r
-<!--                         TACGTAAAAC CATTCATATC TCGTATATGG ATATGTCTAG ATAGGCTATC -->\r
-<!--                         GATTTTCGAT GGATTCGTTT GGTTCTTTTG ATTATTGCTC GAGCTGGATG -->\r
-<!--                         ATGAAAAATT ATCATGTCCG GTTCCTTCG</ggbn:consensusSequence> -->\r
-<!--                       <ggbn:consensusSequenceLength>912</ggbn:consensusSequenceLength> -->\r
-<!--                       <ggbn:consensusSequenceChromatogramFileURI>http://ww2.biocase.org/websvn/filedetails.php?repname=campanula&path=%2FCAM385_Campa_drabifolia.pde</ggbn:consensusSequenceChromatogramFileURI> -->\r
-<!--                       <ggbn:geneticAccession> -->\r
-<!--                         <ggbn:geneticAccessionNumber>AJ746397</ggbn:geneticAccessionNumber> -->\r
-<!--                         <ggbn:geneticAccessionNumberURI>http://www.ncbi.nlm.nih.gov/nuccore/56310613</ggbn:geneticAccessionNumberURI> -->\r
-<!--                       </ggbn:geneticAccession> -->\r
-<!--                       <ggbn:References> -->\r
-<!--                         <ggbn:Reference> -->\r
-<!--                           <ggbn:ReferenceCitation>Gemeinholzer,B., -->\r
-<!--                             Bachmann,K. (2005): Examining morphological -->\r
-<!--                             and molecular diagnostic character states in -->\r
-<!--                             Cichorium intybus L. (Asteraceae) and -->\r
-<!--                             Cichorium spinosum L. Plant Systematics and -->\r
-<!--                             Evolution 253 (1-3): 105-123.</ggbn:ReferenceCitation> -->\r
-<!--                         </ggbn:Reference> -->\r
-<!--                       </ggbn:References> -->\r
+                      <ggbn:SingleSequencings>\r
+                        <ggbn:singleSequencing>\r
+                          <ggbn:sequencingDirection>forward</ggbn:sequencingDirection>\r
+                          <ggbn:chromatogramFileURI>http://ww2.biocase.org/websvn/filedetails.php?repname=campanula&amp;path=%2FCAM385_GM312-petD_F.ab1</ggbn:chromatogramFileURI>\r
+                          <ggbn:SequencingPrimers>\r
+                            <ggbn:sequencingPrimer>\r
+                              <ggbn:primerSequence\r
+                                Direction="forward">5´-GCCGTMTTTATGTTAATGC-3´</ggbn:primerSequence>\r
+                              <ggbn:primerName>PIpetB1411F</ggbn:primerName>\r
+                              <ggbn:primerReferenceCitation>Löhne &amp;\r
+                                Borsch 2005</ggbn:primerReferenceCitation>\r
+                            </ggbn:sequencingPrimer>\r
+                          </ggbn:SequencingPrimers>\r
+                        </ggbn:singleSequencing>\r
+                        <ggbn:singleSequencing>\r
+                          <ggbn:sequencingDirection>reverse</ggbn:sequencingDirection>\r
+                          <ggbn:chromatogramFileURI>http://ww2.biocase.org/websvn/filedetails.php?repname=campanula&amp;path=%2FCAM385_GM312-petD_R.ab1</ggbn:chromatogramFileURI>\r
+                          <ggbn:SequencingPrimers>\r
+                            <ggbn:sequencingPrimer>\r
+                              <ggbn:primerSequence\r
+                                Direction="reverse">5´-AATTTAGCYCTTAATACAGG-3´</ggbn:primerSequence>\r
+                              <ggbn:primerName>PIpetD738R</ggbn:primerName>\r
+                              <ggbn:primerReferenceCitation>Löhne &amp;\r
+                                Borsch 2005</ggbn:primerReferenceCitation>\r
+                            </ggbn:sequencingPrimer>\r
+                          </ggbn:SequencingPrimers>\r
+                        </ggbn:singleSequencing>\r
+                      </ggbn:SingleSequencings>\r
+                      <ggbn:consensusSequence>\r
+                      TTTCGGGTCC TTTATAGTGA AGATATAGCA TAGATAGTTG\r
+                      TAATCCATTA TGTATCATTG GGGAAGGAAG GAGAATATTT\r
+                      TTTTGATAGA ATACAAGTAT GGATTATTGA AACTAATACG\r
+                      CCATGTATTT GGATATTTCC CTTGAACTGC ATAATATTCT\r
+                      TTATTTTCCA TGAATAGTGT AAGGGAATTT TTCGAAGAGA\r
+                      AAATGGATTA TGGGAGTGTG TGACTTGAGC TATTGATTGG\r
+                      TCTGTGCAGA TACGGGCTTT TATCTATCTG CCACATTGTA\r
+                      ATTCACAAAC CAATGTGTCT TTGTTCCAAC CATCGCGTAA\r
+                      GCCCCATACA GAAGATAGGC TGGTTCGCTT GAAGAGAATC\r
+                      TTTTCTATGA TCAGATCCGA ATTATGTCGT ACATGAGCAG\r
+                      GCTCCGTAAG ATCTAGTTGA CTTAAGTCAA ACTTCAATAG\r
+                      TATAAAAATG CACTCATTTC CTCTGCATTG ACACGAGCTA\r
+                      TGAGACTATC GGAGTGAAAG AAAGGGTCTA AAGAAGAAGA\r
+                      AAGCTTGGGC TAGATTAGTA ACAAGTAAAT CCTTTGTGTG\r
+                      TGTGTTTGTA ATTAGTAAAT GGGCTCTCAA TATTTTGGGG\r
+                      CTAATTACTG ATCCTAAGGT TTGAGACGAC CCAGAAAGCA\r
+                      CTTGATCATA TCACGATTGA CTTTGTAAGC CTACTTGGGT\r
+                      ATTGAGTATT TACTTGTAAG AACCGAATTC TTTGGGGGAT\r
+                      AGTTGCAAAA AGAATCCAGT CAATTGTTCT TACGTAAAAC\r
+                      CATTCATATC TCGTATATGG ATATGTCTAG ATAGGCTATC\r
+                      GATTTTCGAT GGATTCGTTT GGTTCTTTTG ATTATTGCTC\r
+                      GAGCTGGATG ATGAAAAATT ATCATGTCCG GTTCCTTCG</ggbn:consensusSequence>\r
+                      <ggbn:consensusSequenceLength>912</ggbn:consensusSequenceLength>\r
+                      <ggbn:consensusSequenceChromatogramFileURI>http://ww2.biocase.org/websvn/filedetails.php?repname=campanula&amp;path=%2FCAM385_Campa_drabifolia.pde</ggbn:consensusSequenceChromatogramFileURI>\r
+                      <ggbn:geneticAccession>\r
+                        <ggbn:geneticAccessionNumber>AJ746397</ggbn:geneticAccessionNumber>\r
+                        <ggbn:geneticAccessionNumberURI>http://www.ncbi.nlm.nih.gov/nuccore/56310613</ggbn:geneticAccessionNumberURI>\r
+                      </ggbn:geneticAccession>\r
+                      <ggbn:References>\r
+                        <ggbn:Reference>\r
+                          <ggbn:ReferenceCitation>Gemeinholzer,B.,\r
+                            Bachmann,K. (2005): Examining morphological\r
+                            and molecular diagnostic character states in\r
+                            Cichorium intybus L. (Asteraceae) and\r
+                            Cichorium spinosum L. Plant Systematics and\r
+                            Evolution 253 (1-3): 105-123.</ggbn:ReferenceCitation>\r
+                        </ggbn:Reference>\r
+                      </ggbn:References>\r
                     </ggbn:sequencing>\r
                   </ggbn:Sequencings>\r
                 </ggbn:amplification>\r