ref #10322, ref #10472 further remove model objects, use DerivationEvent and some...
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / model / molecular / SingleReadAlignment.java
index c5da53aeba3c0c515c200b5f506649ee0177c3a5..4bee6d613e66d9137d52fc496000e25b1efa4492 100644 (file)
@@ -1,12 +1,14 @@
 /**\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
@@ -31,73 +33,86 @@ import eu.etaxonomy.cdm.model.common.VersionableEntity;
        "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
@@ -105,10 +120,10 @@ public class SingleReadAlignment extends VersionableEntity {
                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
@@ -120,7 +135,7 @@ public class SingleReadAlignment extends VersionableEntity {
                this.consensusAlignment = consensusAlignment;\r
                if (consensusAlignment != null && ! consensusAlignment.getSingleReadAlignments().contains(this)){\r
                        consensusAlignment.addSingleReadAlignment(this);\r
-               }       \r
+               }\r
        }\r
 \r
        public SingleRead getSingleRead() {\r
@@ -133,15 +148,18 @@ public class SingleReadAlignment extends VersionableEntity {
                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
@@ -153,13 +171,85 @@ public class SingleReadAlignment extends VersionableEntity {
                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