Ignore:
Timestamp:
06/29/14 11:11:30 (10 years ago)
Author:
rkrimmel
Message:

Multiple Alignment first version

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/pal/tree/UPGMAAligningTree.java

    r1584 r1585  
    1515 
    1616import java.util.ArrayList; 
     17import java.util.Iterator; 
     18import java.util.logging.Level; 
    1719 
    1820import de.ugoe.cs.autoquest.tasktrees.alignment.algorithms.NumberSequence; 
     21import de.ugoe.cs.autoquest.tasktrees.alignment.algorithms.SmithWatermanRepeated; 
    1922import de.ugoe.cs.autoquest.tasktrees.alignment.matrix.BinaryAlignmentStorage; 
     23import de.ugoe.cs.autoquest.tasktrees.alignment.matrix.ObjectDistanceSubstitionMatrix; 
    2024import de.ugoe.cs.autoquest.tasktrees.alignment.matrix.UPGMAMatrix; 
    2125import de.ugoe.cs.autoquest.tasktrees.alignment.pal.misc.Identifier; 
     26import de.ugoe.cs.util.console.Console; 
    2227 
    2328 
     
    4247         * @param m distance matrix 
    4348         */ 
    44         public UPGMAAligningTree(ArrayList<NumberSequence> numberseqs, BinaryAlignmentStorage alignments) 
     49        public UPGMAAligningTree(ArrayList<NumberSequence> numberseqs, BinaryAlignmentStorage alignments, ObjectDistanceSubstitionMatrix submat) 
    4550        { 
    4651                if (alignments.getDistanceMatrix().size() < 2) 
     
    5156                this.numberseqs = numberseqs; 
    5257                this.alignments = alignments; 
     58                this.submat = submat; 
    5359                init(alignments.getDistanceMatrix()); 
    5460 
     
    7682        private ArrayList<NumberSequence> numberseqs; 
    7783        private BinaryAlignmentStorage alignments; 
     84        private ObjectDistanceSubstitionMatrix submat; 
    7885        private int numClusters; 
    7986        private int besti, abi; 
     
    107114                        Node tmp = NodeFactory.createNode(); 
    108115                        tmp.setIdentifier(new Identifier(Integer.toString(i))); 
     116                        tmp.setNumber(i); 
    109117                        tmp.addSequence(numberseqs.get(i)); 
    110118                        getRoot().addChild(tmp); 
     
    181189                 
    182190                // Index besti now represent the new cluster 
    183                 getRoot().joinChildren(besti, bestj); 
     191                Node newNode = getRoot().joinChildren(besti, bestj); 
     192                 
     193                if(newNode instanceof FengDoolittleNode) { 
     194                        newNode.setSequences(alignSequences(newNode)); 
     195                } 
    184196                 
    185197                // Update alias 
     
    190202                 
    191203                numClusters--; 
     204        } 
     205         
     206         
     207        public ArrayList<NumberSequence> alignSequences(Node parent) { 
     208                ArrayList<NumberSequence> alignment = new ArrayList<NumberSequence>(); 
     209                if(parent.getChildCount()<3) { 
     210                         
     211                        Node node1 = parent.getChild(0); 
     212                        Node node2 = parent.getChild(1); 
     213                         
     214                        int seqCount1 = node1.getSequences().size(); 
     215                        int seqCount2 = node2.getSequences().size(); 
     216                        Console.traceln(Level.INFO,"Merging node " + node1.getIdentifier() + " with " + node2.getIdentifier()); 
     217                        //Console.println("SeqCount1: " + seqCount1 + " seqCount2 " + seqCount2); 
     218                        //Align 2 sequences 
     219                        if(seqCount1 == 1 && seqCount2 == 1) { 
     220                                alignment = (alignments.get(node1.getNumber(), node2.getNumber())).getAlignment(); 
     221                        } 
     222                        //Align a sequence to a group 
     223                        else if( seqCount1 > 1 && seqCount2 == 1) { 
     224                                alignment.addAll(node1.getSequences()); 
     225                                 
     226                                BinaryAlignmentStorage tempStorage = new BinaryAlignmentStorage(seqCount1,seqCount2); 
     227                                double maxScore = 0.0; 
     228                                int maxIndex = 0; 
     229                                for(int i=0;i<seqCount1;i++) { 
     230                                        tempStorage.set(i, 1, new SmithWatermanRepeated(node1.getSequence(i).getSequence(), node2.getSequence(0).getSequence() , submat, 5)); 
     231                                        if(maxScore < tempStorage.get(i, 1).getAlignmentScore()) { 
     232                                                maxScore = tempStorage.get(i, 1).getAlignmentScore(); 
     233                                                maxIndex = i; 
     234                                        } 
     235                                } 
     236                                alignment.add(tempStorage.get(maxIndex, 1).getAlignment().get(1)); 
     237                        } 
     238                        //Align a sequence to a group 
     239                        else if(seqCount1 == 1 && seqCount2 > 1) { 
     240                                alignment.addAll(node2.getSequences()); 
     241                                BinaryAlignmentStorage tempStorage = new BinaryAlignmentStorage(seqCount1,seqCount2); 
     242                                double maxScore = 0.0; 
     243                                int maxIndex = 0; 
     244                                for(int i=0;i<seqCount2;i++) { 
     245                                        tempStorage.set(1, i, new SmithWatermanRepeated(node2.getSequence(i).getSequence(), node1.getSequence(0).getSequence() , submat, 5)); 
     246                                        if(maxScore < tempStorage.get(1, i).getAlignmentScore()) { 
     247                                                maxScore = tempStorage.get(1, i).getAlignmentScore(); 
     248                                                maxIndex = i; 
     249                                        } 
     250                                } 
     251                                alignment.add(tempStorage.get(1,maxIndex).getAlignment().get(1)); 
     252                        } 
     253                        //Align 2 groups 
     254                        else if((seqCount1 > 1) && (seqCount2 > 1)){ 
     255                                        BinaryAlignmentStorage tempStorage1 = new BinaryAlignmentStorage(seqCount2,1); 
     256                                        BinaryAlignmentStorage tempStorage2 = new BinaryAlignmentStorage(seqCount1,1); 
     257                                        double maxScore1 = 0.0; 
     258                                        double maxScore2 = 0.0; 
     259                                        int maxIndex1 = 0; 
     260                                        int maxIndex2 = 0; 
     261                                        for(int i=0;i<seqCount1;i++) { 
     262                                                for(int j=0;j<seqCount2;j++) { 
     263                                                        tempStorage1.set(j, 0, new SmithWatermanRepeated(node1.getSequence(i).getSequence(), node2.getSequence(j).getSequence() , submat, 5)); 
     264                                                        if(maxScore1 < tempStorage1.get(j, 0).getAlignmentScore()) { 
     265                                                                maxScore1 = tempStorage1.get(j, 0).getAlignmentScore(); 
     266                                                                maxIndex1 = j; 
     267                                                        } 
     268                                                } 
     269                                                alignment.add(tempStorage1.get(maxIndex1,0).getAlignment().get(0)); 
     270                                        } 
     271                                        for(int i=0; i<seqCount2;i++) { 
     272                                                for (int j=0;j<seqCount1;j++) { 
     273                                                        tempStorage2.set(j, 0, new SmithWatermanRepeated(node2.getSequence(i).getSequence(),node1.getSequence(j).getSequence(),submat,5)); 
     274                                                        if(maxScore2 < tempStorage2.get(j, 0).getAlignmentScore()) { 
     275                                                                maxScore2 = tempStorage2.get(j, 0).getAlignmentScore(); 
     276                                                                maxIndex2 = j; 
     277                                                        } 
     278                                                } 
     279                                                alignment.add(tempStorage2.get(maxIndex2,0).getAlignment().get(0)); 
     280                                        } 
     281                                         
     282                        } 
     283                        else { 
     284                                Console.traceln(Level.WARNING,"No sequences to align while merging " + node1.getIdentifier() + " with " + node2.getIdentifier()); 
     285                        } 
     286                } 
     287                else { 
     288                        Console.traceln(Level.WARNING,"More than 2 children! This should never happen, it's a binary tree."); 
     289                } 
     290                return alignment; 
    192291        } 
    193292 
     
    217316        } 
    218317} 
     318 
     319 
Note: See TracChangeset for help on using the changeset viewer.