mev-4.0.01/source/org/tigr/microarray/mev/cgh/CGHDataGenerator/CGHCopyNumberCalculator.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2  * CGHCopyNumberCalculator.java
2 26 Feb 07 jari 3  * Raktim Sinha
2 26 Feb 07 jari 4  * Created on October 31, 2005
2 26 Feb 07 jari 5  */
2 26 Feb 07 jari 6
2 26 Feb 07 jari 7 package org.tigr.microarray.mev.cgh.CGHDataGenerator;
2 26 Feb 07 jari 8
2 26 Feb 07 jari 9 import java.util.ArrayList;
2 26 Feb 07 jari 10
2 26 Feb 07 jari 11 import org.tigr.microarray.mev.ISlideData;
2 26 Feb 07 jari 12 import org.tigr.microarray.mev.MultipleArrayData;
2 26 Feb 07 jari 13 import org.tigr.microarray.mev.cluster.gui.ICGHCloneValueMenu;
2 26 Feb 07 jari 14 import org.tigr.microarray.mev.cluster.gui.IFramework;
2 26 Feb 07 jari 15 /**
2 26 Feb 07 jari 16  * This class is used to make determinations about a CGHMultipleArrayData object
2 26 Feb 07 jari 17  * that must rely on other information.  For example, this class makes copy number
2 26 Feb 07 jari 18  * determinations based on data stored in a CGHMultipleArrayData object and parameters
2 26 Feb 07 jari 19  * stored in an IFramework object
2 26 Feb 07 jari 20  *
2 26 Feb 07 jari 21  * @author  Adam Margolin
2 26 Feb 07 jari 22  * @author Raktim Sinha
2 26 Feb 07 jari 23  *
2 26 Feb 07 jari 24  */
2 26 Feb 07 jari 25
2 26 Feb 07 jari 26 public class CGHCopyNumberCalculator {
2 26 Feb 07 jari 27   public static final int BAD_CLONE = -10;
2 26 Feb 07 jari 28     public static final int NO_COPY_CHANGE = -11;
2 26 Feb 07 jari 29
2 26 Feb 07 jari 30     MultipleArrayData data;
2 26 Feb 07 jari 31     IFramework framework;
2 26 Feb 07 jari 32     //CGHMultipleArrayDataFcd fcd;
2 26 Feb 07 jari 33
2 26 Feb 07 jari 34     float ampThresh, delThresh, ampThresh2Copy, delThresh2Copy;
2 26 Feb 07 jari 35     float cloneDistributionPThresh;
2 26 Feb 07 jari 36
2 26 Feb 07 jari 37     /** Creates a new instance of CGHMultipleArrayDataFcd */
2 26 Feb 07 jari 38     //public CGHCopyNumberCalculator(MultipleArrayData data, IFramework framework, CGHMultipleArrayDataFcd fcd) {
2 26 Feb 07 jari 39     public CGHCopyNumberCalculator(MultipleArrayData data) {
2 26 Feb 07 jari 40         this.data = data;
2 26 Feb 07 jari 41         //this.framework = framework;
2 26 Feb 07 jari 42         //this.fcd = fcd;
2 26 Feb 07 jari 43     }
2 26 Feb 07 jari 44
2 26 Feb 07 jari 45     public void onCopyDeterminationChanged(ICGHCloneValueMenu menu){
2 26 Feb 07 jari 46         this.ampThresh = menu.getAmpThresh();
2 26 Feb 07 jari 47         this.delThresh = menu.getDelThresh();
2 26 Feb 07 jari 48         this.ampThresh2Copy = menu.getAmpThresh2Copy();
2 26 Feb 07 jari 49         this.delThresh2Copy = menu.getDelThresh2Copy();
2 26 Feb 07 jari 50         this.cloneDistributionPThresh = menu.getClonePThresh();
2 26 Feb 07 jari 51     }
2 26 Feb 07 jari 52
2 26 Feb 07 jari 53     public int getCopyNumberDetermination(int experiment, int clone, int chromosome){
2 26 Feb 07 jari 54         return getCopyNumberDetermination(experiment, data.getCloneIndex(clone, chromosome));
2 26 Feb 07 jari 55     }
2 26 Feb 07 jari 56
2 26 Feb 07 jari 57     public int getCopyNumberDetermination(int experiment, int clone){
2 26 Feb 07 jari 58         ArrayList featuresList = data.getFeaturesList();
2 26 Feb 07 jari 59         ISlideData sampleData = (ISlideData)featuresList.get(experiment);
2 26 Feb 07 jari 60         return getCopyNumberDetermination(sampleData, clone);
2 26 Feb 07 jari 61     }
2 26 Feb 07 jari 62
2 26 Feb 07 jari 63     public int getCopyNumberDetermination(ISlideData sampleData, int clone, int chromosome){
2 26 Feb 07 jari 64         return getCopyNumberDetermination(sampleData, data.getCloneIndex(clone, chromosome));
2 26 Feb 07 jari 65     }
2 26 Feb 07 jari 66
2 26 Feb 07 jari 67     /**
2 26 Feb 07 jari 68      * Raktim Oct 31, 2005
2 26 Feb 07 jari 69      * Chnaged to suit MeV struct
2 26 Feb 07 jari 70      * @param sampleData
2 26 Feb 07 jari 71      * @param clone
2 26 Feb 07 jari 72      * @return
2 26 Feb 07 jari 73      */
2 26 Feb 07 jari 74     public int getCopyNumberDetermination(ISlideData sampleData, int clone){
2 26 Feb 07 jari 75         int copyNumber = determineCopyNumber(sampleData, clone);
2 26 Feb 07 jari 76
2 26 Feb 07 jari 77         if(copyNumber == CGHCopyNumberCalculator.BAD_CLONE){
2 26 Feb 07 jari 78             return CGHCopyNumberCalculator.BAD_CLONE;
2 26 Feb 07 jari 79         }
2 26 Feb 07 jari 80         if(copyNumber == CGHCopyNumberCalculator.NO_COPY_CHANGE){
2 26 Feb 07 jari 81             return CGHCopyNumberCalculator.NO_COPY_CHANGE;
2 26 Feb 07 jari 82         }else{
2 26 Feb 07 jari 83             if(copyNumber == -2  || copyNumber == -1){
2 26 Feb 07 jari 84                 return -1;
2 26 Feb 07 jari 85             }else if(copyNumber  == 2 || copyNumber == 1 ){
2 26 Feb 07 jari 86                 return 1;
2 26 Feb 07 jari 87             }
2 26 Feb 07 jari 88             return CGHCopyNumberCalculator.NO_COPY_CHANGE;
2 26 Feb 07 jari 89         }
2 26 Feb 07 jari 90     }
2 26 Feb 07 jari 91
2 26 Feb 07 jari 92     /*
2 26 Feb 07 jari 93     public int getCopyNumberDetermination(ISlideData sampleData, int clone){
2 26 Feb 07 jari 94
2 26 Feb 07 jari 95         int cy3CopyNumber = determineCopyNumber(sampleData, clone, ISlideData.CY3_SLIDES);
2 26 Feb 07 jari 96         int cy5CopyNumber = determineCopyNumber(sampleData, clone, ISlideData.CY5_SLIDES);
2 26 Feb 07 jari 97
2 26 Feb 07 jari 98         if(cy3CopyNumber == CGHCopyNumberCalculator.BAD_CLONE || cy5CopyNumber == CGHCopyNumberCalculator.BAD_CLONE){
2 26 Feb 07 jari 99             return CGHCopyNumberCalculator.BAD_CLONE;
2 26 Feb 07 jari 100         }
2 26 Feb 07 jari 101         if(cy3CopyNumber == CGHCopyNumberCalculator.NO_COPY_CHANGE || cy5CopyNumber == CGHCopyNumberCalculator.NO_COPY_CHANGE){
2 26 Feb 07 jari 102             return CGHCopyNumberCalculator.NO_COPY_CHANGE;
2 26 Feb 07 jari 103         }else if(cy3CopyNumber == cy5CopyNumber){
2 26 Feb 07 jari 104             return cy3CopyNumber;
2 26 Feb 07 jari 105         }else{
2 26 Feb 07 jari 106             if((cy3CopyNumber == -2 && cy5CopyNumber == -1) || (cy3CopyNumber == -1 && cy5CopyNumber == -2)){
2 26 Feb 07 jari 107                 return -1;
2 26 Feb 07 jari 108             }else if((cy3CopyNumber  == 2 && cy5CopyNumber == 1) || (cy3CopyNumber == 1 && cy5CopyNumber == 2)){
2 26 Feb 07 jari 109                 return 1;
2 26 Feb 07 jari 110             }
2 26 Feb 07 jari 111
2 26 Feb 07 jari 112             return CGHCopyNumberCalculator.NO_COPY_CHANGE;
2 26 Feb 07 jari 113         }
2 26 Feb 07 jari 114     }
2 26 Feb 07 jari 115     */
2 26 Feb 07 jari 116
2 26 Feb 07 jari 117     /*
2 26 Feb 07 jari 118      *
2 26 Feb 07 jari 119      * Old. Not to be Used now. May be used if CY3 & CY5 data are loaded separately
2 26 Feb 07 jari 120     public int determineCopyNumber(Vector slides, int clone, int testDye){
2 26 Feb 07 jari 121         return determineCopyNumberByThreshold(slides, clone, testDye);
2 26 Feb 07 jari 122     }
2 26 Feb 07 jari 123     */
2 26 Feb 07 jari 124
2 26 Feb 07 jari 125     /*
2 26 Feb 07 jari 126      * Conforming to CGH Data Struct
2 26 Feb 07 jari 127     public int determineCopyNumberByThreshold(Vector slides, int clone, int testDye){
2 26 Feb 07 jari 128         Iterator it = slides.iterator();
2 26 Feb 07 jari 129         int copyNumber = CGHCopyNumberCalculator.BAD_CLONE;
2 26 Feb 07 jari 130
2 26 Feb 07 jari 131         if(it.hasNext()){
2 26 Feb 07 jari 132             CGHSlideData slideData = (CGHSlideData)it.next();
2 26 Feb 07 jari 133             copyNumber = determineCopyNumberByThreshold(slideData, clone, testDye);
2 26 Feb 07 jari 134         }
2 26 Feb 07 jari 135
2 26 Feb 07 jari 136         while(it.hasNext()){
2 26 Feb 07 jari 137             CGHSlideData slideData = (CGHSlideData)it.next();
2 26 Feb 07 jari 138             int slideCopyNumber = determineCopyNumberByThreshold(slideData, clone, testDye);
2 26 Feb 07 jari 139             if(slideCopyNumber != CGHCopyNumberCalculator.BAD_CLONE){
2 26 Feb 07 jari 140                 if(copyNumber == CGHCopyNumberCalculator.BAD_CLONE){
2 26 Feb 07 jari 141                     copyNumber = slideCopyNumber;
2 26 Feb 07 jari 142                 }else if (slideCopyNumber != copyNumber){
2 26 Feb 07 jari 143                     if((copyNumber == -2 && slideCopyNumber == -1) || (copyNumber == -1 && slideCopyNumber == -2)){
2 26 Feb 07 jari 144                         copyNumber = -1;
2 26 Feb 07 jari 145                     }else if((copyNumber == 2 && slideCopyNumber == 1) || (copyNumber == 1 && slideCopyNumber == 2)){
2 26 Feb 07 jari 146                         copyNumber = 1;
2 26 Feb 07 jari 147                     }else{
2 26 Feb 07 jari 148                         return CGHCopyNumberCalculator.NO_COPY_CHANGE;
2 26 Feb 07 jari 149                     }
2 26 Feb 07 jari 150                 }
2 26 Feb 07 jari 151             }
2 26 Feb 07 jari 152         }
2 26 Feb 07 jari 153
2 26 Feb 07 jari 154         return copyNumber;
2 26 Feb 07 jari 155     }
2 26 Feb 07 jari 156     */
2 26 Feb 07 jari 157     //Test
2 26 Feb 07 jari 158     /*
2 26 Feb 07 jari 159     public int determineCopyNumberByThreshold(ISlideData slide, int clone, int testDye){
2 26 Feb 07 jari 160         float ratio = slide.getRatio(clone, 0);
2 26 Feb 07 jari 161         if(Float.isNaN(ratio) || ratio <= 0){
2 26 Feb 07 jari 162             return CGHCopyNumberCalculator.BAD_CLONE;
2 26 Feb 07 jari 163         }
2 26 Feb 07 jari 164
2 26 Feb 07 jari 165         if(testDye == ISlideData.CY3_SLIDES){
2 26 Feb 07 jari 166             return determineCy3CopyNumberByThreshold(ratio);
2 26 Feb 07 jari 167         }else{
2 26 Feb 07 jari 168             return determineCy5CopyNumberByThreshold(ratio);
2 26 Feb 07 jari 169         }
2 26 Feb 07 jari 170     }
2 26 Feb 07 jari 171     */
2 26 Feb 07 jari 172     /**
2 26 Feb 07 jari 173      * Raktim Oct 31, 2005
2 26 Feb 07 jari 174      * @param slide
2 26 Feb 07 jari 175      * @param clone
2 26 Feb 07 jari 176      * @param testDye
2 26 Feb 07 jari 177      * @return
2 26 Feb 07 jari 178
2 26 Feb 07 jari 179     public int determineCopyNumber(ISlideData slide, int clone, int testDye){
2 26 Feb 07 jari 180         return determineCopyNumberByThreshold(slide, clone, testDye);
2 26 Feb 07 jari 181     }
2 26 Feb 07 jari 182     */
2 26 Feb 07 jari 183     /**
2 26 Feb 07 jari 184      * Raktim Oct 31, 2005
2 26 Feb 07 jari 185      * @param slides
2 26 Feb 07 jari 186      * @param clone
2 26 Feb 07 jari 187      * @return
2 26 Feb 07 jari 188      */
2 26 Feb 07 jari 189     public int determineCopyNumber(ISlideData slide, int clone){
2 26 Feb 07 jari 190         return determineCopyNumberByThreshold(slide, clone);
2 26 Feb 07 jari 191     }
2 26 Feb 07 jari 192
2 26 Feb 07 jari 193     /**
2 26 Feb 07 jari 194      * Remember getRatio Glitch
2 26 Feb 07 jari 195      * Raktim Oct 31, 2005
2 26 Feb 07 jari 196      * @param slide
2 26 Feb 07 jari 197      * @param clone
2 26 Feb 07 jari 198      * @return
2 26 Feb 07 jari 199      */
2 26 Feb 07 jari 200     public int determineCopyNumberByThreshold(ISlideData slide, int clone){
2 26 Feb 07 jari 201         float ratio = slide.getRatio(clone, 0);
2 26 Feb 07 jari 202         if(Float.isNaN(ratio) /*|| ratio <= 0*/){
2 26 Feb 07 jari 203             return CGHCopyNumberCalculator.BAD_CLONE;
2 26 Feb 07 jari 204         }
2 26 Feb 07 jari 205
2 26 Feb 07 jari 206         if(ratio < delThresh2Copy){ return -2; }
2 26 Feb 07 jari 207         if(ratio < delThresh){ return -1; }
2 26 Feb 07 jari 208         if(ratio > ampThresh2Copy){ return 2; }
2 26 Feb 07 jari 209         if(ratio > ampThresh){ return 1; }
2 26 Feb 07 jari 210         return CGHCopyNumberCalculator.NO_COPY_CHANGE;
2 26 Feb 07 jari 211     }
2 26 Feb 07 jari 212
2 26 Feb 07 jari 213     /*
2 26 Feb 07 jari 214     //Old Adama Func
2 26 Feb 07 jari 215     public int determineCy3CopyNumberByThreshold(float ratio){
2 26 Feb 07 jari 216         if(ratio < delThresh2Copy){ return -2; }
2 26 Feb 07 jari 217         if(ratio < delThresh){ return -1; }
2 26 Feb 07 jari 218         if(ratio > ampThresh2Copy){ return 2; }
2 26 Feb 07 jari 219         if(ratio > ampThresh){ return 1; }
2 26 Feb 07 jari 220         return CGHCopyNumberCalculator.NO_COPY_CHANGE;
2 26 Feb 07 jari 221     }
2 26 Feb 07 jari 222     //Old Adama Func
2 26 Feb 07 jari 223     public int determineCy5CopyNumberByThreshold(float ratio){
2 26 Feb 07 jari 224         if(ratio < delThresh2Copy){ return 2; }
2 26 Feb 07 jari 225         if(ratio < delThresh){ return 1; }
2 26 Feb 07 jari 226         if(ratio > ampThresh2Copy){ return -2; }
2 26 Feb 07 jari 227         if(ratio > ampThresh){ return -1; }
2 26 Feb 07 jari 228         return CGHCopyNumberCalculator.NO_COPY_CHANGE;
2 26 Feb 07 jari 229     }
2 26 Feb 07 jari 230     */
2 26 Feb 07 jari 231
2 26 Feb 07 jari 232     public int getCopyNumberDeterminationByLogCloneDistribution(int experiment, int clone){
2 26 Feb 07 jari 233
2 26 Feb 07 jari 234         int cy3CopyNumber = determineCopyNumberByLogCloneDistribution(experiment, clone, ISlideData.CY3_SLIDES);
2 26 Feb 07 jari 235         int cy5CopyNumber = determineCopyNumberByLogCloneDistribution(experiment, clone, ISlideData.CY5_SLIDES);
2 26 Feb 07 jari 236
2 26 Feb 07 jari 237         if(cy3CopyNumber == CGHCopyNumberCalculator.BAD_CLONE || cy5CopyNumber == CGHCopyNumberCalculator.BAD_CLONE){
2 26 Feb 07 jari 238             return CGHCopyNumberCalculator.BAD_CLONE;
2 26 Feb 07 jari 239         }else if(cy3CopyNumber == cy5CopyNumber){
2 26 Feb 07 jari 240             return cy3CopyNumber;
2 26 Feb 07 jari 241         }else{
2 26 Feb 07 jari 242             return CGHCopyNumberCalculator.NO_COPY_CHANGE;
2 26 Feb 07 jari 243         }
2 26 Feb 07 jari 244     }
2 26 Feb 07 jari 245
2 26 Feb 07 jari 246     /**
2 26 Feb 07 jari 247      * Raktim Oct 31, 2005
2 26 Feb 07 jari 248      * Modified for MeV data format
2 26 Feb 07 jari 249      * @param experiment
2 26 Feb 07 jari 250      * @param clone
2 26 Feb 07 jari 251      * @return
2 26 Feb 07 jari 252      */
2 26 Feb 07 jari 253     public int determineCopyNumberByLogCloneDistribution(int experiment, int clone){
2 26 Feb 07 jari 254         float pValue = data.getPValueByLogCloneDistribution(experiment, clone);
2 26 Feb 07 jari 255         if(Float.isNaN(pValue)){
2 26 Feb 07 jari 256             return CGHCopyNumberCalculator.BAD_CLONE;
2 26 Feb 07 jari 257         }
2 26 Feb 07 jari 258
2 26 Feb 07 jari 259         if(pValue > cloneDistributionPThresh){
2 26 Feb 07 jari 260           return 1;
2 26 Feb 07 jari 261         }else if (pValue < 1 - cloneDistributionPThresh){
2 26 Feb 07 jari 262           return -1;
2 26 Feb 07 jari 263         }else
2 26 Feb 07 jari 264              return CGHCopyNumberCalculator.NO_COPY_CHANGE;
2 26 Feb 07 jari 265     }
2 26 Feb 07 jari 266
2 26 Feb 07 jari 267     /**
2 26 Feb 07 jari 268      * Old Func. May be used later if CY3 & CY5 data are loaded separately
2 26 Feb 07 jari 269      * @param experiment
2 26 Feb 07 jari 270      * @param clone
2 26 Feb 07 jari 271      * @param testDye
2 26 Feb 07 jari 272      * @return
2 26 Feb 07 jari 273      */
2 26 Feb 07 jari 274     public int determineCopyNumberByLogCloneDistribution(int experiment, int clone, int testDye){
2 26 Feb 07 jari 275         float pValue = data.getPValueByLogCloneDistribution(experiment, clone);
2 26 Feb 07 jari 276         if(Float.isNaN(pValue)){
2 26 Feb 07 jari 277             return CGHCopyNumberCalculator.BAD_CLONE;
2 26 Feb 07 jari 278         }
2 26 Feb 07 jari 279
2 26 Feb 07 jari 280         if(testDye == ISlideData.CY3_SLIDES){
2 26 Feb 07 jari 281             if(pValue > cloneDistributionPThresh){
2 26 Feb 07 jari 282                 return 1;
2 26 Feb 07 jari 283             }else if (pValue < 1 - cloneDistributionPThresh){
2 26 Feb 07 jari 284                 return -1;
2 26 Feb 07 jari 285
2 26 Feb 07 jari 286             }
2 26 Feb 07 jari 287         }else{
2 26 Feb 07 jari 288             if(pValue > cloneDistributionPThresh){
2 26 Feb 07 jari 289                 return -1;
2 26 Feb 07 jari 290             }else if (pValue < 1 - cloneDistributionPThresh){
2 26 Feb 07 jari 291                 return 1;
2 26 Feb 07 jari 292             }
2 26 Feb 07 jari 293         }
2 26 Feb 07 jari 294         return CGHCopyNumberCalculator.NO_COPY_CHANGE;
2 26 Feb 07 jari 295     }
2 26 Feb 07 jari 296
2 26 Feb 07 jari 297     public int getCopyNumberDeterminationByThresholdOrCloneDistribution(int experiment, int clone){
2 26 Feb 07 jari 298         int threshCopyNumber = getCopyNumberDetermination(experiment, clone);
2 26 Feb 07 jari 299         int distCopyNumber = getCopyNumberDeterminationByLogCloneDistribution(experiment, clone);
2 26 Feb 07 jari 300
2 26 Feb 07 jari 301         if(threshCopyNumber == CGHCopyNumberCalculator.BAD_CLONE){
2 26 Feb 07 jari 302             return distCopyNumber;
2 26 Feb 07 jari 303         }
2 26 Feb 07 jari 304
2 26 Feb 07 jari 305         if(distCopyNumber == CGHCopyNumberCalculator.BAD_CLONE){
2 26 Feb 07 jari 306             return threshCopyNumber;
2 26 Feb 07 jari 307         }
2 26 Feb 07 jari 308
2 26 Feb 07 jari 309         if(threshCopyNumber == CGHCopyNumberCalculator.NO_COPY_CHANGE){
2 26 Feb 07 jari 310             return distCopyNumber;
2 26 Feb 07 jari 311         }
2 26 Feb 07 jari 312
2 26 Feb 07 jari 313         if(distCopyNumber == CGHCopyNumberCalculator.NO_COPY_CHANGE){
2 26 Feb 07 jari 314             return threshCopyNumber;
2 26 Feb 07 jari 315         }
2 26 Feb 07 jari 316
2 26 Feb 07 jari 317         if(distCopyNumber < 0 && threshCopyNumber < 0){
2 26 Feb 07 jari 318             return Math.min(distCopyNumber, threshCopyNumber);
2 26 Feb 07 jari 319         }
2 26 Feb 07 jari 320
2 26 Feb 07 jari 321         if(distCopyNumber > 0 && threshCopyNumber > 0){
2 26 Feb 07 jari 322             return Math.max(distCopyNumber, threshCopyNumber);
2 26 Feb 07 jari 323         }
2 26 Feb 07 jari 324
2 26 Feb 07 jari 325         //if we get here, then one method said the clone is amplified and the other said it is deleted.  This would
2 26 Feb 07 jari 326         // be bizzare (actually impossible unless the thresholds are set incorrectly), so I will just say it's a bad clone
2 26 Feb 07 jari 327         return CGHCopyNumberCalculator.BAD_CLONE;
2 26 Feb 07 jari 328     }
2 26 Feb 07 jari 329
2 26 Feb 07 jari 330     /** Getter for property data.
2 26 Feb 07 jari 331      * @return Value of property data.
2 26 Feb 07 jari 332      */
2 26 Feb 07 jari 333     public MultipleArrayData getData() {
2 26 Feb 07 jari 334         return data;
2 26 Feb 07 jari 335     }
2 26 Feb 07 jari 336
2 26 Feb 07 jari 337     /** Setter for property data.
2 26 Feb 07 jari 338      * @param data New value of property data.
2 26 Feb 07 jari 339      */
2 26 Feb 07 jari 340     public void setData(MultipleArrayData data) {
2 26 Feb 07 jari 341         this.data = data;
2 26 Feb 07 jari 342     }
2 26 Feb 07 jari 343
2 26 Feb 07 jari 344 }