/**\r
- * \r
+ *\r
*/\r
package eu.etaxonomy.cdm.model.molecular;\r
\r
+import java.io.Serializable;\r
+\r
import javax.persistence.Entity;\r
import javax.persistence.FetchType;\r
import javax.persistence.Lob;\r
-import javax.persistence.ManyToOne;\r
+import javax.persistence.OneToOne;\r
import javax.xml.bind.annotation.XmlAccessType;\r
import javax.xml.bind.annotation.XmlAccessorType;\r
import javax.xml.bind.annotation.XmlElement;\r
"singleRead",\r
"shifts",\r
"editedSequence",\r
- "reverseComplement"\r
+ "reverseComplement",\r
+ "firstSeqPosition",\r
+ "leftCutPosition",\r
+ "rightCutPosition"\r
})\r
@XmlRootElement(name = "SingleReadAlignment")\r
@Entity\r
@Audited\r
-public class SingleReadAlignment extends VersionableEntity {\r
+public class SingleReadAlignment extends VersionableEntity implements Serializable {\r
private static final long serialVersionUID = 6141518347067279304L;\r
\r
/** @see #getDnaMarker() */\r
@XmlElement(name = "ConsensusAlignment")\r
@XmlIDREF\r
@XmlSchemaType(name = "IDREF")\r
- @ManyToOne(fetch = FetchType.LAZY)\r
+ @OneToOne(fetch = FetchType.LAZY)\r
//for now we do not cascade but expect the user to save the sequence manually\r
private Sequence consensusAlignment;\r
- \r
+\r
/** @see #getDnaMarker() */\r
@XmlElement(name = "SingleRead")\r
@XmlIDREF\r
@XmlSchemaType(name = "IDREF")\r
- @ManyToOne(fetch = FetchType.LAZY)\r
+ @OneToOne(fetch = FetchType.LAZY)\r
@Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE})\r
private SingleRead singleRead;\r
- \r
+\r
//TODO XML mapping / user type\r
@Type(type="shiftUserType")\r
- private Shift[] shifts;\r
- \r
+ private Shift[] shifts = new Shift[0];\r
+\r
+ private Integer firstSeqPosition;\r
+\r
+ private Integer leftCutPosition;\r
+\r
+ private Integer rightCutPosition;\r
+\r
@XmlElement(name = "EditedSequence")\r
@Lob\r
private String editedSequence;\r
- \r
+\r
@XmlElement(name = "ReverseComplement")\r
private boolean reverseComplement;\r
- \r
- \r
- public static class Shift{\r
+\r
+\r
+ public static class Shift implements Cloneable, Serializable {\r
public int position;\r
public int shift;\r
- \r
+\r
public Shift(){};\r
public Shift(int position, int steps) {\r
- this.position = position; \r
+ this.position = position;\r
this.shift = steps;\r
}\r
- \r
+\r
@Override\r
public String toString(){\r
return String.valueOf(position) + "," + String.valueOf(shift);\r
}\r
+ @Override\r
+ protected Object clone() throws CloneNotSupportedException {\r
+ return super.clone();\r
+ }\r
}\r
- \r
+\r
//****************** FACTORY *******************/\r
- \r
+\r
public static SingleReadAlignment NewInstance(Sequence consensusSequence, SingleRead singleRead){\r
return new SingleReadAlignment(consensusSequence, singleRead, null, null);\r
}\r
- \r
+\r
public static SingleReadAlignment NewInstance(Sequence consensusSequence, SingleRead singleRead,\r
Shift[] shifts, String editedSequence){\r
return new SingleReadAlignment(consensusSequence, singleRead, shifts, editedSequence);\r
}\r
\r
-// ***************** CONSTRUCTOR *************************/ \r
- \r
+// ***************** CONSTRUCTOR *************************/\r
+\r
protected SingleReadAlignment(){};\r
- \r
+\r
private SingleReadAlignment(Sequence consensusAlignment, SingleRead singleRead,\r
Shift[] shifts, String editedSequence){\r
setConsensusAlignment(consensusAlignment);\r
this.shifts = shifts;\r
this.editedSequence = editedSequence;\r
}\r
- \r
\r
-// ****************** GETTER / SETTER ***********************/ \r
- \r
+\r
+// ****************** GETTER / SETTER ***********************/\r
+\r
//consensus sequence\r
public Sequence getConsensusSequence() {\r
return consensusAlignment;\r
this.consensusAlignment = consensusAlignment;\r
if (consensusAlignment != null && ! consensusAlignment.getSingleReadAlignments().contains(this)){\r
consensusAlignment.addSingleReadAlignment(this);\r
- } \r
+ }\r
}\r
\r
public SingleRead getSingleRead() {\r
this.singleRead = singleRead;\r
// if (singleRead != null && singleRead.getSingleReadAlignments().contains(this)){\r
// singleRead.addSingleReadAlignment(this);\r
-// } \r
+// }\r
}\r
- \r
+\r
//shifts\r
public Shift[] getShifts() {\r
- return shifts;\r
+ return shifts == null ? new Shift[0] : shifts;\r
}\r
public void setShifts(Shift[] shifts) {\r
this.shifts = shifts;\r
+ if (shifts == null){\r
+ shifts = new Shift[0];\r
+ }\r
}\r
\r
//edited sequence\r
this.editedSequence = editedSequence;\r
}\r
\r
-// ******************* CLONE *********************/\r
\r
+ public boolean isReverseComplement() {\r
+ return reverseComplement;\r
+ }\r
\r
+ public void setReverseComplement(boolean reverseComplement) {\r
+ this.reverseComplement = reverseComplement;\r
+ }\r
+\r
+// ******************* CLONE *********************/\r
\r
@Override\r
- public Object clone() throws CloneNotSupportedException {\r
- //all objects can be reused\r
- return super.clone();\r
+ public SingleReadAlignment clone() throws CloneNotSupportedException {\r
+\r
+ SingleReadAlignment result = (SingleReadAlignment)super.clone();\r
+\r
+ //deep copy shifts\r
+ Shift[] oldShifts = this.getShifts();\r
+ int shiftLength = oldShifts.length;\r
+ Shift[] newShift = new Shift[shiftLength];\r
+ for (int i = 0; i< shiftLength; i++){\r
+ Shift oldShift = oldShifts[i];\r
+ newShift[0] = (Shift)oldShift.clone();\r
+ }\r
+\r
+ //all other objects can be reused\r
+ return result;\r
}\r
+\r
+ /**\r
+ * Returns the position in the {@link Sequence sequence}\r
+ * this {@link SingleReadAlignment single read align} is attached to\r
+ * where the output of the visible part of the pherogram starts.\r
+ * @return a valid index in the sequence carrying this data area\r
+ * @see http://bioinfweb.info/LibrAlign/Documentation/api/latest/info/bioinfweb/libralign/dataarea/implementations/pherogram/PherogramArea.html#getFirstSeqPos\r
+ *\r
+ */\r
+ public Integer getFirstSeqPosition() {\r
+ return firstSeqPosition;\r
+ }\r
+\r
+ /**\r
+ * @see #getFirstSeqPosition()\r
+ */\r
+ public void setFirstSeqPosition(Integer firstSeqPosition) {\r
+ this.firstSeqPosition = firstSeqPosition;\r
+ }\r
+\r
+ /**\r
+ * Returns the first base call index of the pherogram which has not been cut off.\r
+ * @return a base call index > 0\r
+ * @see http://bioinfweb.info/LibrAlign/Documentation/api/latest/info/bioinfweb/libralign/pherogram/PherogramComponent.html#getLeftCutPosition\r
+ */\r
+ public Integer getLeftCutPosition() {\r
+ return leftCutPosition;\r
+ }\r
+\r
+ /**\r
+ * @param see {@link #getLeftCutPosition()}\r
+ */\r
+ public void setLeftCutPosition(Integer leftCutPosition) {\r
+ this.leftCutPosition = leftCutPosition;\r
+ }\r
+\r
+ /**\r
+ * Returns the first base call index of the pherogram that has been cut off (so that the length of the visible\r
+ * area of the pherogram can be calculated as getRightCutPosition()\r
+ * @return a base call inde\r
+ * @see http://bioinfweb.info/LibrAlign/Documentation/api/latest/info/bioinfweb/libralign/pherogram/PherogramComponent.html#getRightCutPosition\r
+ */\r
+ public Integer getRightCutPosition() {\r
+ return rightCutPosition;\r
+ }\r
+\r
+ /**\r
+ * @param see {@link #getRightCutPosition()}\r
+ */\r
+ public void setRightCutPosition(Integer rightCutPosition) {\r
+ this.rightCutPosition = rightCutPosition;\r
+ }\r
+\r
}\r