\r
/**\r
* Allows to export a single read alignment to various alignment formats using\r
- * <a href="http://bioinfweb.info/JPhyloIO/"><i>JPhyloIO</i>\r
- * </a>.\r
+ * <a href="http://bioinfweb.info/JPhyloIO/"><i>JPhyloIO</i></a>.\r
*\r
* @author Ben Stöver\r
* @date 24.04.2016\r
// Prepare writer parameters:\r
ReadWriteParameterMap parameters = new ReadWriteParameterMap();\r
parameters.put(ReadWriteParameterNames.KEY_APPLICATION_NAME, ApplicationUtil.getTitle());\r
- parameters.put(ReadWriteParameterNames.KEY_APPLICATION_VERSION, ApplicationUtil.getVersion());\r
+ //parameters.put(ReadWriteParameterNames.KEY_APPLICATION_VERSION, ApplicationUtil.getVersion()); // Setting the version unnecessary, since its already contained in the title.\r
parameters.put(ReadWriteParameterNames.KEY_APPLICATION_URL, "http://cybertaxonomy.eu/taxeditor/"); //TODO Specify URL obtained from a central class?\r
parameters.put(ReadWriteParameterNames.KEY_SEQUENCE_EXTENSION_TOKEN, wizard.getModel().getElongationToken());\r
\r
// Create writer and document adapters:\r
JPhyloIOEventWriter writer = factory.getWriter(wizard.getModel().getFormatInfo().getFormatID());\r
ListBasedDocumentDataAdapter document = new ListBasedDocumentDataAdapter();\r
- document.getMatrices().add(new CDMSequenceMatrixAdapter(sequence, wizard.getModel().getConsensusSequenceLabel()));\r
+ document.getMatrices().add(new CDMSequenceMatrixAdapter(sequence, wizard.getModel().getConsensusSequenceLabel(),\r
+ wizard.getModel().isExportConsensusSequence(), wizard.getModel().isExportSingleReads()));\r
\r
// Write document:\r
File file = new File(wizard.getModel().getFileName());\r
import java.io.IOException;\r
import java.net.URI;\r
import java.util.ArrayList;\r
+import java.util.Collections;\r
import java.util.Iterator;\r
import java.util.List;\r
\r
\r
\r
private Sequence sequence;\r
+ private boolean exportConsensus;\r
private List<SingleReadAlignment> singleReadList;\r
private String consensusSequenceLabel;\r
private ObjectListDataAdapter<TokenSetDefinitionEvent> tokenSetList;\r
/**\r
* Creates a new instance of this class.\r
*\r
- * @param sequence\r
- * @param consensusSequenceLabel\r
+ * @param sequence the <i>CDM</i> sequence object containing the data to be exported\r
+ * @param consensusSequenceLabel the label to be used for the consensus sequence (Maybe {@code null}.)\r
+ * @param exportConsensus Specify {@code true} here, if the consensus sequence shall be included in the export or {@code false}\r
+ * otherwise.\r
+ * @param exportSingleReads Specify {@code true} here, if the single reads shall be included in the export or {@code false}\r
+ * otherwise.\r
+ * @throws IllegalArgumentException if both {@code exportConsensus} and {@code exportSingleReads} are {@code false}\r
*/\r
- public CDMSequenceMatrixAdapter(Sequence sequence, String consensusSequenceLabel) {\r
+ public CDMSequenceMatrixAdapter(Sequence sequence, String consensusSequenceLabel, boolean exportConsensus, boolean exportSingleReads) {\r
super();\r
- this.sequence = sequence;\r
- this.consensusSequenceLabel = consensusSequenceLabel;\r
- tokenSetList = createTokenSetList();\r
- singleReadList = new ArrayList<SingleReadAlignment>(sequence.getSingleReadAlignments()); // Store references of single reads in defined order to allow random access.\r
- //TODO Omit single reads that do not have an edited sequence yet?\r
+ if (!exportConsensus && !exportSingleReads) {\r
+ throw new IllegalArgumentException("Either exportConsensus or exportSingleReads must be true. "\r
+ + "Otherwise no sequences would be contained in this matrix.");\r
+ }\r
+ else {\r
+ this.sequence = sequence;\r
+ this.exportConsensus = exportConsensus;\r
+ this.consensusSequenceLabel = consensusSequenceLabel;\r
+ tokenSetList = createTokenSetList();\r
+ if (exportSingleReads) {\r
+ singleReadList = new ArrayList<SingleReadAlignment>(sequence.getSingleReadAlignments()); // Store references of single reads in defined order to allow random access.\r
+ //TODO Omit single reads that do not have an edited sequence yet?\r
+ }\r
+ else {\r
+ singleReadList = Collections.emptyList();\r
+ }\r
+ }\r
}\r
\r
\r
\r
@Override\r
public long getColumnCount(ReadWriteParameterMap parameters) {\r
- return getCDMSequence().getSequenceString().length(); //TODO Consider that parts of single reads may lie outside of the current consensus sequence. Possibly return -1 in the future.\r
+ return -1; // Indicates that sequences may have different lengths. (Otherwise writing files without sequence elongation would not be possible.)\r
}\r
\r
\r
@Override\r
public long getSequenceCount(ReadWriteParameterMap parameters) {\r
- return singleReadList.size() + 1; // The last sequence is the consensus sequence.\r
+ int addend = 1;\r
+ if (!exportConsensus) {\r
+ addend = 0;\r
+ }\r
+ return singleReadList.size() + addend;\r
}\r
\r
\r
@Override\r
public Iterator<String> getSequenceIDIterator(ReadWriteParameterMap parameters) {\r
- return new SequenceIDIterator(getCDMSequence().getSingleReadAlignments().size());\r
+ return new SequenceIDIterator(singleReadList.size(), exportConsensus);\r
}\r
\r
\r
return 0;\r
}\r
}\r
- else if (CONSENSUS_SEQUENCE_ID.equals(sequenceID)) {\r
+ else if (exportConsensus && CONSENSUS_SEQUENCE_ID.equals(sequenceID)) {\r
return getCDMSequence().getSequenceString().length();\r
}\r
else {\r
return new LinkedLabeledIDEvent(EventContentType.SEQUENCE, sequenceID, "Single read " + singleReadIndex, null);\r
//TODO Use name displayed in derivate hierarchy or specified name as label instead?\r
}\r
- else if (CONSENSUS_SEQUENCE_ID.equals(sequenceID)) {\r
+ else if (exportConsensus && CONSENSUS_SEQUENCE_ID.equals(sequenceID)) {\r
return new LinkedLabeledIDEvent(EventContentType.SEQUENCE, sequenceID, consensusSequenceLabel, null);\r
}\r
else {\r
}\r
writeStringPart(receiver, singleRead.getEditedSequence(), startColumn, endColumn);\r
}\r
- else if (CONSENSUS_SEQUENCE_ID.equals(sequenceID)) {\r
+ else if (exportConsensus && CONSENSUS_SEQUENCE_ID.equals(sequenceID)) {\r
if (startColumn == 0) {\r
writeMetadataEvents(receiver, sequenceID, PREDICATE_IS_CONSENSUS_SEQUENCE, W3CXSConstants.DATA_TYPE_BOOLEAN, new Boolean(true));\r
//TODO Possibly export additional properties of sequence (e.g. isBarcode(), getDdbjId(), ...) as metadata?\r
* @date 29.04.2016\r
*/\r
class SequenceIDIterator implements Iterator<String> {\r
+ private boolean containsConsensus;\r
private int singleReadPos;\r
private int singleReadCount;\r
\r
*\r
* @param singleReadCount the number of single read IDs to be returned by this iterator before the consensus sequence\r
*/\r
- public SequenceIDIterator(int singleReadCount) {\r
+ public SequenceIDIterator(int singleReadCount, boolean containsConsensus) {\r
super();\r
+ this.containsConsensus = containsConsensus;\r
this.singleReadCount = singleReadCount;\r
this.singleReadPos = 0;\r
}\r
\r
@Override\r
public boolean hasNext() {\r
- return singleReadPos <= singleReadCount;\r
+ return (singleReadPos < singleReadCount) || (containsConsensus && (singleReadPos <= singleReadCount));\r
}\r
\r
\r
if (singleReadPos < singleReadCount) {\r
return CDMSequenceMatrixAdapter.SINGLE_READ_SEQUENCE_ID_PREFIX + (singleReadPos++);\r
}\r
- else if (singleReadPos == singleReadCount) {\r
+ else if (containsConsensus && (singleReadPos == singleReadCount)) {\r
singleReadPos++;\r
return CDMSequenceMatrixAdapter.CONSENSUS_SEQUENCE_ID;\r
}\r