package genomeObjects; //import importExport.DadesExternes; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.Serializable; import java.text.DecimalFormat; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Set; import operonClustering.*; public class ExtendedCRON implements Serializable{ //fields private String Name; private String ContextSetName; private String SearchType; private String ContextType; private LinkedHashMap<String, String> SourceSpeciesNames; private LinkedHashMap<String, HashSet<String>> SourceContigNames; private LinkedHashMap<String, LinkedList<GenomicElementAndQueryMatch>> Contexts; //<species-num, list of genomic elements private LinkedList<Double> Distances; private int NumberOfEntries = 0; private LinkedList<String> Dissimilarities; private LinkedList<String> DissimilaritiesAsMatrix; private String DissimilarityType; private String[] Queries; private int[] ClusterNumbers; private LinkedList<CustomDissimilarity> CustomDissimilarities; // this linked list relates elements returned by Keys() in this way: //(0,1), (0,2) , ... , (0,n), (1,2), (1,3), ... (1,n), (2,3), (2,4), ... (n-1,n) //public DadesExternes de; /* * This data type comes from the MultiDendrograms software package */ //constructor public ExtendedCRON() { super(); } // ----------------------- Hierarchical Clustering ------------------// //compute pairwise distances, using an external distance method public void computePairwiseDistances(String DissimilarityMethod){ //retrieve distances method //uberDistancesAnnotation distMethod = new uberDistancesAnnotation(); boolean UseCustomMethod = false; OperonDissimilarityMeasure distMethod = null; //select appropriate operon dissimilarity measure if (DissimilarityMethod.equals("Common Genes - Dice")){ if (SearchType.equals("annotation")){ distMethod = new DicebyAnnotation(); } else if (SearchType.equals("cluster")){ distMethod = new DicebyClusterID(); } } else if (DissimilarityMethod.equals("Common Genes - Jaccard")){ if (SearchType.equals("annotation")){ distMethod = new JaccardbyAnnotation(); } else if (SearchType.equals("cluster")){ distMethod = new JaccardbyClusterID(); } } else if (DissimilarityMethod.equals("Total Length")){ distMethod = new TotalSize(); } else if (DissimilarityMethod.equals("Moving Distances")){ if (SearchType.equals("annotation")){ distMethod = new MovingDistancesbyAnnotation(); } else if (SearchType.equals("cluster")){ distMethod = new MovingDistancesbyClusterID(); } } else { UseCustomMethod = true; } //do not use a custom method if (!UseCustomMethod){ //initialize output list LinkedList<Double> D = new LinkedList<Double>(); //retrieve key set Object[] Keys = this.Contexts.keySet().toArray(); //iterate over keys for (int i = 0; i < Keys.length; i++){ //debugging variable String str = ""; for (int j = i+1; j < Keys.length; j++){ double dist = distMethod.computeDissimilarity(this.Contexts.get(Keys[i]),this.Contexts.get(Keys[j])); //print statements - also reveals the order of keys (debugging) //System.out.println("Distance between " + Keys[i] + " and " + Keys[j] + ": " + "(" + i + "," + j + "): "+ dist); str = str + String.valueOf(dist) + " "; //add value to linked list D.add(dist); } //debugging - view matrix //System.out.println(str); } //set list to ECRON structure. this.setDistances(D); } else { //Uses a custom method. //initialize output list LinkedList<Double> D = new LinkedList<Double>(); //retrieve key set Object[] Keys = this.Contexts.keySet().toArray(); //retrieve dissimilarity measure CustomDissimilarity CustomDistMethod = null; for (CustomDissimilarity CD : this.CustomDissimilarities){ if (CD.getName().equals(DissimilarityMethod)){ CustomDistMethod = CD; break; } } //iterate over keys for (int i = 0; i < Keys.length; i++){ String str = ""; for (int j = i+1; j < Keys.length; j++){ double dist = CustomDistMethod.TotalDissimilarity(this.Contexts.get(Keys[i]), this.Contexts.get(Keys[j]), SearchType); // //only for customized // if (CustomDistMethod.DisplayMsgAboutInternalMotif){ // System.out.println(Name); // } //print statements - also reveals the order of keys // if (Keys[i].equals("Halococcus_saccharolyticus-1")){ // System.out.println("Distance between " + Keys[i] + " and " + Keys[j] + ": " + "(" + i + "," + j + "): " + dist); // } str = str + String.valueOf(dist) + " "; //add value to linked list D.add(dist); } //debugging - view matrix //System.out.println(str); } //set list to ECRON structure. this.setDistances(D); } } //Export dissimilarity set into a format MultiDendrogram readable format public void exportDistances(File dissimilarityMatrix){ //create file if it doesn't exist if(!dissimilarityMatrix.exists()){ try { dissimilarityMatrix.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } //import file writer, and write info to file. try { //import file writer BufferedWriter bw = new BufferedWriter(new FileWriter(dissimilarityMatrix.getPath())); //retrieve key set Object[] Keys = this.Contexts.keySet().toArray(); //initialize counter int Counter = -1; //iterate through to export the values to a text file. for (int i = 0; i < Keys.length; i++){ for (int j = i+1; j < Keys.length; j++){ //increment counter Counter++; //formatting - updated 7/18/2012 // String First = (String) Keys[i]; // String Second = (String) Keys[j]; // // DecimalFormat df = new DecimalFormat("#.##"); // String Distance = df.format(this.Distances.get(Counter)).toString(); // // String Row = First + ";" + Second + ";" + Distance; //Create each row String Row = (String) Keys[i] + ";" + (String) Keys[j] + ";" + this.Distances.get(Counter).toString(); //write row to file writer, followed by new line bw.write(Row); bw.newLine(); bw.flush(); } } //close output stream bw.close(); } catch (IOException e) { e.printStackTrace(); } } //Export dissimilarity set into an array of strings public void exportDistancesToField(){ //initialize relationships field LinkedList<String> PairwiseRelationships = new LinkedList<String>(); //initialize counter int Counter = -1; //retrieve key set Object[] Keys = this.Contexts.keySet().toArray(); //iterate through to export the values to a text file. for (int i = 0; i < Keys.length; i++){ for (int j = i+1; j < Keys.length; j++){ //increment counter Counter++; //Create each row String Row = (String) Keys[i] + ";" + (String) Keys[j] + ";" + this.Distances.get(Counter).toString(); //add this row to the linked list. PairwiseRelationships.add(Row); } } //set field setDissimilarities(PairwiseRelationships); //also make the matrix exportDissimilaritiesAsMatrix(); } //Export a dissimilarity set into a matrix public void exportDissimilaritiesAsMatrix(){ //initialize matrix DissimilaritiesAsMatrix = new LinkedList<String>(); //initialize counter int Counter = -1; //counter Object[] Keys = this.Contexts.keySet().toArray(); //retrieve keys int L = Keys.length; //width of array //System.out.println("L = " + L + "\n"); //create object array Object[][] Matrix = new Object[L][L+1]; //build matrix for (int i = 0; i < Keys.length; i++){ Matrix[i][0] = Keys[i]; //row name Matrix[i][i+1] = 0.0; //anything vs itself has diss of 0 for (int j = i+1; j < Keys.length; j++){ //increment counter Counter++; //print statement //System.out.println("(i,j) = (" + i +"," + j + "): " + this.Distances.get(Counter)); //write values Matrix[i][j+1] = this.Distances.get(Counter); //serves as D(i,j); Matrix[j][i+1] = this.Distances.get(Counter); } } //blank line //System.out.println(); //write rows to matrix for (int i = 0; i < Matrix.length; i++){ String str = ""; for (int j = 0; j < Matrix[i].length; j++){ str = str + String.valueOf(Matrix[i][j]) + "\t"; } //System.out.println(str); DissimilaritiesAsMatrix.add(str); } } // ---- Cosmetic ----- // public void displayDistancesToscreen(){ for(int i = 0; i<Dissimilarities.size(); i++){ System.out.println(Dissimilarities.get(i)); } } //----------------------- Getters and Setters -----------------------// public String getName() { return Name; } public void setName(String name) { Name = name; } public void setContexts(LinkedHashMap<String, LinkedList<GenomicElementAndQueryMatch>> operons) { Contexts = operons; } public HashMap<String, LinkedList<GenomicElementAndQueryMatch>> getContexts() { return Contexts; } public LinkedList<Double> getDistances() { return Distances; } public void setDistances(LinkedList<Double> distances) { Distances = distances; } public String getContextSetName() { return ContextSetName; } public void setContextSetName(String contextSetName) { ContextSetName = contextSetName; } public int getNumberOfEntries() { return NumberOfEntries; } public void setNumberOfEntries(int numberOfEntries) { NumberOfEntries = numberOfEntries; } public LinkedList<String> getDissimilarities() { return Dissimilarities; } public void setDissimilarities(LinkedList<String> dissimilarities) { Dissimilarities = dissimilarities; } public String getSearchType() { return SearchType; } public void setSearchType(String type) { SearchType = type; } public LinkedHashMap<String, String> getSourceSpeciesNames() { return SourceSpeciesNames; } public void setSourceSpeciesNames( LinkedHashMap<String, String> sourceSpeciesNames) { SourceSpeciesNames = sourceSpeciesNames; } public LinkedHashMap<String, HashSet<String>> getSourceContigNames() { return SourceContigNames; } public void setSourceContigNames(LinkedHashMap<String, HashSet<String>> sourceContigNames) { SourceContigNames = sourceContigNames; } public String getDissimilarityType() { return DissimilarityType; } public void setDissimilarityType(String dissimilarityType) { DissimilarityType = dissimilarityType; } public String getContextType() { return ContextType; } public void setContextType(String contextType) { ContextType = contextType; } public String[] getQueries() { return Queries; } public void setQueries(String[] queries) { Queries = queries; } public int[] getClusterNumbers() { return ClusterNumbers; } public void setClusterNumbers(int[] clusterNumbers) { ClusterNumbers = clusterNumbers; } public LinkedList<CustomDissimilarity> getCustomDissimilarities() { return CustomDissimilarities; } public void setCustomDissimilarities(LinkedList<CustomDissimilarity> customDissimilarities) { CustomDissimilarities = customDissimilarities; } public LinkedList<String> getDissimilaritiesAsMatrix() { return DissimilaritiesAsMatrix; } public void setDissimilaritiesAsMatrix(LinkedList<String> dissimilaritiesAsMatrix) { DissimilaritiesAsMatrix = dissimilaritiesAsMatrix; } }