mev-4.0.01/source/org/tigr/microarray/mev/cgh/CGHAlgorithms/NumberOfAlterations/RegionAlterations/RegionAlterations.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2  * RegionAlterations.java
2 26 Feb 07 jari 3  *
2 26 Feb 07 jari 4  * Created on May 19, 2003, 6:17 PM
2 26 Feb 07 jari 5  */
2 26 Feb 07 jari 6
2 26 Feb 07 jari 7 package org.tigr.microarray.mev.cgh.CGHAlgorithms.NumberOfAlterations.RegionAlterations;
2 26 Feb 07 jari 8
2 26 Feb 07 jari 9
2 26 Feb 07 jari 10 import java.util.Collections;
2 26 Feb 07 jari 11 import java.util.Iterator;
2 26 Feb 07 jari 12 import java.util.Vector;
2 26 Feb 07 jari 13
2 26 Feb 07 jari 14 import javax.swing.tree.DefaultMutableTreeNode;
2 26 Feb 07 jari 15
2 26 Feb 07 jari 16 import org.tigr.microarray.mev.ISlideData;
2 26 Feb 07 jari 17 import org.tigr.microarray.mev.MultipleArrayData;
2 26 Feb 07 jari 18 import org.tigr.microarray.mev.cgh.CGHAlgorithms.NumberOfAlterations.NumberOfAlterationsCalculator;
2 26 Feb 07 jari 19 import org.tigr.microarray.mev.cgh.CGHDataObj.AlterationRegion;
2 26 Feb 07 jari 20 import org.tigr.microarray.mev.cgh.CGHDataObj.AlterationRegions;
2 26 Feb 07 jari 21 import org.tigr.microarray.mev.cgh.CGHDataObj.AlterationRegionsComparator;
2 26 Feb 07 jari 22 import org.tigr.microarray.mev.cgh.CGHDataObj.FlankingRegion;
2 26 Feb 07 jari 23 import org.tigr.microarray.mev.cluster.algorithm.AbortException;
2 26 Feb 07 jari 24 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmException;
2 26 Feb 07 jari 25 import org.tigr.microarray.mev.cluster.gui.IFramework;
2 26 Feb 07 jari 26
2 26 Feb 07 jari 27 /**
2 26 Feb 07 jari 28  *
2 26 Feb 07 jari 29  * @author  Adam Margolin
2 26 Feb 07 jari 30  * @author Raktim Sinha
2 26 Feb 07 jari 31  */
2 26 Feb 07 jari 32
2 26 Feb 07 jari 33 public abstract class RegionAlterations extends NumberOfAlterationsCalculator{
2 26 Feb 07 jari 34
2 26 Feb 07 jari 35     /** Creates a new instance of RegionAlterations */
2 26 Feb 07 jari 36     public RegionAlterations() {
2 26 Feb 07 jari 37     }
2 26 Feb 07 jari 38
2 26 Feb 07 jari 39     /** This method should return a tree with calculation results or
2 26 Feb 07 jari 40      * null, if analysis start was canceled.
2 26 Feb 07 jari 41      *
2 26 Feb 07 jari 42      * @param framework the reference to <code>IFramework</code> implementation,
2 26 Feb 07 jari 43      *        which is used to obtain an initial analysis data and parameters.
2 26 Feb 07 jari 44      * @throws AlgorithmException if calculation was failed.
2 26 Feb 07 jari 45      * @throws AbortException if calculation was canceled.
2 26 Feb 07 jari 46      * @see IFramework
2 26 Feb 07 jari 47      */
2 26 Feb 07 jari 48     public DefaultMutableTreeNode execute(IFramework framework) throws AlgorithmException {
2 26 Feb 07 jari 49         this.framework = framework;
2 26 Feb 07 jari 50
2 26 Feb 07 jari 51         MultipleArrayData data = (MultipleArrayData)framework.getData();
2 26 Feb 07 jari 52         Vector allAlterationRegions = new Vector();
2 26 Feb 07 jari 53
2 26 Feb 07 jari 54         for(int chromIndex = 0; chromIndex < data.getNumChromosomes(); chromIndex++){
2 26 Feb 07 jari 55
2 26 Feb 07 jari 56             AlterationRegions curAlterationRegions = new AlterationRegions(chromIndex);
2 26 Feb 07 jari 57             Vector curFlankingRegions = new Vector(data.getFeaturesCount());
2 26 Feb 07 jari 58
2 26 Feb 07 jari 59             Iterator featuresIt = data.getFeaturesList().iterator();
2 26 Feb 07 jari 60
2 26 Feb 07 jari 61             while(featuresIt.hasNext()){
2 26 Feb 07 jari 62                 Vector curFrs = ((ISlideData)featuresIt.next()).getFlankingRegions()[chromIndex];
2 26 Feb 07 jari 63                 curFlankingRegions.add( curFrs.clone() );
2 26 Feb 07 jari 64             }
2 26 Feb 07 jari 65
2 26 Feb 07 jari 66             int[] indices = new int[data.getFeaturesCount()];
2 26 Feb 07 jari 67             for(int i = 0; i < data.getFeaturesCount(); i++){
2 26 Feb 07 jari 68                 indices[i] = 0;
2 26 Feb 07 jari 69             }
2 26 Feb 07 jari 70
2 26 Feb 07 jari 71             boolean more = true;
2 26 Feb 07 jari 72
2 26 Feb 07 jari 73             while(more){
2 26 Feb 07 jari 74
2 26 Feb 07 jari 75                 for(int i = 0; i < indices.length; i++){
2 26 Feb 07 jari 76                     Vector expRegions = (Vector) curFlankingRegions.get(i);
2 26 Feb 07 jari 77                     while(indices[i] < expRegions.size() && ((FlankingRegion)expRegions.get(indices[i])).getType() != getFlankingRegionType()  ){
2 26 Feb 07 jari 78                         indices[i] += 1;
2 26 Feb 07 jari 79                     }
2 26 Feb 07 jari 80                 }
2 26 Feb 07 jari 81
2 26 Feb 07 jari 82                 int minStartIndex = getMinStartIndex(curFlankingRegions, indices);
2 26 Feb 07 jari 83                 int minEndIndex = getMinEndIndex(curFlankingRegions, indices, minStartIndex);
2 26 Feb 07 jari 84
2 26 Feb 07 jari 85                 for(int i = 0; i < indices.length; i++){
2 26 Feb 07 jari 86                     Vector expRegions = (Vector) curFlankingRegions.get(i);
2 26 Feb 07 jari 87
2 26 Feb 07 jari 88                     if(indices[i] < expRegions.size()){
2 26 Feb 07 jari 89                         FlankingRegion fr = (FlankingRegion) expRegions.get(indices[i]);
2 26 Feb 07 jari 90                         int start = fr.getStart();
2 26 Feb 07 jari 91                         int stop = fr.getStop();
2 26 Feb 07 jari 92
2 26 Feb 07 jari 93                         if(start == minStartIndex){
2 26 Feb 07 jari 94
2 26 Feb 07 jari 95                             AlterationRegion curAlterationRegion = curAlterationRegions.getAlterationRegion(minStartIndex, minEndIndex, getFlankingRegionType(), data.getFeaturesCount());
2 26 Feb 07 jari 96                             curAlterationRegion.incrementAlterations();
2 26 Feb 07 jari 97                             curAlterationRegion.getAlteredExperiments().add(new Integer(i));
2 26 Feb 07 jari 98
2 26 Feb 07 jari 99                             if(stop == minEndIndex){
2 26 Feb 07 jari 100                                 indices[i] += 1;
2 26 Feb 07 jari 101                             }else{
2 26 Feb 07 jari 102                                 FlankingRegion tmp = new FlankingRegion(minEndIndex, fr.getStop(),
2 26 Feb 07 jari 103                                 getFlankingRegionType(), chromIndex);
2 26 Feb 07 jari 104                                 expRegions.set(indices[i], tmp);
2 26 Feb 07 jari 105
2 26 Feb 07 jari 106                             }
2 26 Feb 07 jari 107                         }
2 26 Feb 07 jari 108                     }
2 26 Feb 07 jari 109                 }
2 26 Feb 07 jari 110                 more = false;
2 26 Feb 07 jari 111                 for(int i = 0; i < indices.length; i++){
2 26 Feb 07 jari 112                     Vector expRegions = (Vector) curFlankingRegions.get(i);
2 26 Feb 07 jari 113                     if(indices[i] < expRegions.size()){
2 26 Feb 07 jari 114                         more = true;
2 26 Feb 07 jari 115                     }
2 26 Feb 07 jari 116                 }
2 26 Feb 07 jari 117             }
2 26 Feb 07 jari 118             allAlterationRegions.addAll(curAlterationRegions.getAlterationRegions());
2 26 Feb 07 jari 119         }
2 26 Feb 07 jari 120         Collections.sort(allAlterationRegions, new AlterationRegionsComparator());
2 26 Feb 07 jari 121         return createResultsTree(allAlterationRegions);
2 26 Feb 07 jari 122     }
2 26 Feb 07 jari 123
2 26 Feb 07 jari 124
2 26 Feb 07 jari 125     private int getMinStartIndex(Vector flankingRegions, int[] indices){
2 26 Feb 07 jari 126         int min = Integer.MAX_VALUE;
2 26 Feb 07 jari 127
2 26 Feb 07 jari 128         for(int i = 0; i < indices.length; i++){
2 26 Feb 07 jari 129             Vector expRegions = (Vector) flankingRegions.get(i);
2 26 Feb 07 jari 130
2 26 Feb 07 jari 131             if(indices[i] < expRegions.size()){
2 26 Feb 07 jari 132                 min = Math.min(min, ((FlankingRegion) expRegions.get(indices[i])).getStart());
2 26 Feb 07 jari 133             }
2 26 Feb 07 jari 134         }
2 26 Feb 07 jari 135
2 26 Feb 07 jari 136         return min;
2 26 Feb 07 jari 137     }
2 26 Feb 07 jari 138
2 26 Feb 07 jari 139     private int getMinEndIndex(Vector flankingRegions, int[] indices, int minStartIndex) {
2 26 Feb 07 jari 140         int min = Integer.MAX_VALUE;
2 26 Feb 07 jari 141
2 26 Feb 07 jari 142         for(int i = 0; i < indices.length; i++){
2 26 Feb 07 jari 143             Vector expRegions = (Vector) flankingRegions.get(i);
2 26 Feb 07 jari 144
2 26 Feb 07 jari 145             if(indices[i] < expRegions.size()){
2 26 Feb 07 jari 146                 int start = ((FlankingRegion) expRegions.get(indices[i])).getStart();
2 26 Feb 07 jari 147                 if(start == minStartIndex){
2 26 Feb 07 jari 148                     start = ((FlankingRegion) expRegions.get(indices[i])).getStop();
2 26 Feb 07 jari 149                 }
2 26 Feb 07 jari 150
2 26 Feb 07 jari 151                 min = Math.min(min, start);
2 26 Feb 07 jari 152             }
2 26 Feb 07 jari 153         }
2 26 Feb 07 jari 154
2 26 Feb 07 jari 155         return min;
2 26 Feb 07 jari 156     }
2 26 Feb 07 jari 157
2 26 Feb 07 jari 158     public abstract int getFlankingRegionType();
2 26 Feb 07 jari 159
2 26 Feb 07 jari 160 }