mev-4.0.01/source/org/tigr/microarray/mev/script/ScriptHandler.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2  * ScriptHandler.java
2 26 Feb 07 jari 3  *
2 26 Feb 07 jari 4  * Created on February 14, 2004, 10:44 PM
2 26 Feb 07 jari 5  */
2 26 Feb 07 jari 6
2 26 Feb 07 jari 7 package org.tigr.microarray.mev.script;
2 26 Feb 07 jari 8
2 26 Feb 07 jari 9 import java.io.IOException;
2 26 Feb 07 jari 10 import java.io.Writer;
2 26 Feb 07 jari 11 import java.util.Iterator;
2 26 Feb 07 jari 12 import java.util.Map;
2 26 Feb 07 jari 13 import java.util.Set;
2 26 Feb 07 jari 14
2 26 Feb 07 jari 15 import org.apache.xerces.dom.DOMImplementationImpl;
2 26 Feb 07 jari 16 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmData;
2 26 Feb 07 jari 17 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmParameters;
2 26 Feb 07 jari 18 import org.tigr.util.FloatMatrix;
2 26 Feb 07 jari 19 import org.w3c.dom.Document;
2 26 Feb 07 jari 20 import org.w3c.dom.Element;
2 26 Feb 07 jari 21 import org.w3c.dom.NamedNodeMap;
2 26 Feb 07 jari 22 import org.w3c.dom.Node;
2 26 Feb 07 jari 23 import org.w3c.dom.NodeList;
2 26 Feb 07 jari 24 import org.w3c.dom.Text;
2 26 Feb 07 jari 25
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  braisted
2 26 Feb 07 jari 30  */
2 26 Feb 07 jari 31 public class ScriptHandler {
2 26 Feb 07 jari 32     
2 26 Feb 07 jari 33     String tm4ScriptVersion = "1.0";
2 26 Feb 07 jari 34     String mevScriptVersion = "1.0";
2 26 Feb 07 jari 35     
2 26 Feb 07 jari 36     Document document;
2 26 Feb 07 jari 37     Element root;
2 26 Feb 07 jari 38     Element mevElement;
2 26 Feb 07 jari 39     Element primaryDataElement;
2 26 Feb 07 jari 40     
2 26 Feb 07 jari 41     Element analysisElement;
2 26 Feb 07 jari 42     int currAnalysisID = 1;
2 26 Feb 07 jari 43     int currDataID = 1;
2 26 Feb 07 jari 44     String lineSeparator = "\n";
2 26 Feb 07 jari 45     String indent = "   ";
2 26 Feb 07 jari 46     
2 26 Feb 07 jari 47     /** Creates a new instance of ScriptHandler */
2 26 Feb 07 jari 48     public ScriptHandler() {
2 26 Feb 07 jari 49         DOMImplementationImpl impl = new DOMImplementationImpl();
2 26 Feb 07 jari 50         document = impl.createDocument(null, "tm4", null);
2 26 Feb 07 jari 51         
2 26 Feb 07 jari 52         root = document.getDocumentElement();
2 26 Feb 07 jari 53         root.setAttribute("version", tm4ScriptVersion);
2 26 Feb 07 jari 54         
2 26 Feb 07 jari 55         mevElement = document.createElement("mev");
2 26 Feb 07 jari 56         mevElement.setAttribute("version", mevScriptVersion);
2 26 Feb 07 jari 57         root.appendChild(mevElement);
2 26 Feb 07 jari 58         
2 26 Feb 07 jari 59         analysisElement = document.createElement("analysis");
2 26 Feb 07 jari 60         
2 26 Feb 07 jari 61         primaryDataElement = document.createElement("primary_data");
2 26 Feb 07 jari 62         Element fileListElement = document.createElement("file_list");
2 26 Feb 07 jari 63         primaryDataElement.appendChild(fileListElement);
2 26 Feb 07 jari 64         
2 26 Feb 07 jari 65         mevElement.appendChild(primaryDataElement);
2 26 Feb 07 jari 66         mevElement.appendChild(analysisElement);
2 26 Feb 07 jari 67         
2 26 Feb 07 jari 68         // Element rootElement = new Element("tm4");
2 26 Feb 07 jari 69         // document = new Document(rootElement);
2 26 Feb 07 jari 70     }
2 26 Feb 07 jari 71     
2 26 Feb 07 jari 72     public Document getDocument() {
2 26 Feb 07 jari 73         return this.document;
2 26 Feb 07 jari 74     }
2 26 Feb 07 jari 75     
2 26 Feb 07 jari 76     public void createAlgorithmSet(int setID, int dataRef){
2 26 Feb 07 jari 77         Element algSetElement = document.createElement("alg_set");
2 26 Feb 07 jari 78         algSetElement.setAttribute("set_id", String.valueOf(setID));
2 26 Feb 07 jari 79         algSetElement.setAttribute("input_data_ref", String.valueOf(dataRef));
2 26 Feb 07 jari 80         analysisElement.appendChild(algSetElement);
2 26 Feb 07 jari 81     }
2 26 Feb 07 jari 82     
2 26 Feb 07 jari 83     public Element getAlgorithmSetByID(int setID){
2 26 Feb 07 jari 84         String id = String.valueOf(setID);
2 26 Feb 07 jari 85         NodeList elements = analysisElement.getElementsByTagName("alg_set");
2 26 Feb 07 jari 86         
2 26 Feb 07 jari 87         for(int i = 0; i < elements.getLength(); i++) {
2 26 Feb 07 jari 88             if(id.equals(((Element)elements.item(i)).getAttribute("set_id")))
2 26 Feb 07 jari 89                 return (Element)elements.item(i);
2 26 Feb 07 jari 90         }
2 26 Feb 07 jari 91         return null;
2 26 Feb 07 jari 92     }
2 26 Feb 07 jari 93     
2 26 Feb 07 jari 94     
2 26 Feb 07 jari 95     public boolean appendAlgorithm(AlgorithmData data, int algID, int algSetRef, int inputDataRef) {
2 26 Feb 07 jari 96         
2 26 Feb 07 jari 97         Element algElement = document.createElement("algorithm");
2 26 Feb 07 jari 98         Element currElement;
2 26 Feb 07 jari 99 //        Element nameElement;, paramsElement, paramElement, keyElement, valueElement;
2 26 Feb 07 jari 100         
2 26 Feb 07 jari 101         Element algSetElement = this.getAlgorithmSetByID(algSetRef);
2 26 Feb 07 jari 102         if(algSetElement == null)
2 26 Feb 07 jari 103             return false;
2 26 Feb 07 jari 104         
2 26 Feb 07 jari 105         Text nameText, keyText, valueText;
2 26 Feb 07 jari 106         
2 26 Feb 07 jari 107         AlgorithmParameters params = data.getParams();
2 26 Feb 07 jari 108         String name = params.getString("name");
2 26 Feb 07 jari 109
2 26 Feb 07 jari 110         
2 26 Feb 07 jari 111         if(name != null){
2 26 Feb 07 jari 112             
2 26 Feb 07 jari 113             //set attributes, name and input ref
2 26 Feb 07 jari 114             algElement.setAttribute("name", name);
2 26 Feb 07 jari 115             algElement.setAttribute("input_data_ref", String.valueOf(inputDataRef));
2 26 Feb 07 jari 116             algElement.setAttribute("alg_id", String.valueOf(algID));
2 26 Feb 07 jari 117             
2 26 Feb 07 jari 118             //add parameter list with params
2 26 Feb 07 jari 119             addParameterList(algElement, params);
2 26 Feb 07 jari 120             
2 26 Feb 07 jari 121             
2 26 Feb 07 jari 122             //add matrices (or arrays, one dim matrices)
2 26 Feb 07 jari 123             Element matrices = document.createElement("mlist");
2 26 Feb 07 jari 124             
2 26 Feb 07 jari 125             //Int arrays
2 26 Feb 07 jari 126             Map map = data.getIntArrays();
2 26 Feb 07 jari 127             if(map.size() > 0) {
2 26 Feb 07 jari 128                 addIntArrays(map, matrices);
2 26 Feb 07 jari 129             }
2 26 Feb 07 jari 130             
2 26 Feb 07 jari 131             //String arrays
2 26 Feb 07 jari 132             map = data.getStringArrays();
2 26 Feb 07 jari 133             if(map.size() > 0) {
2 26 Feb 07 jari 134                 addStringArrays(map, matrices);
2 26 Feb 07 jari 135             }
2 26 Feb 07 jari 136             
2 26 Feb 07 jari 137             //matrices
2 26 Feb 07 jari 138             map = data.getMatrixes();
2 26 Feb 07 jari 139             if(map.size() > 0) {
2 26 Feb 07 jari 140                 addMatrices(map, matrices);
2 26 Feb 07 jari 141             }
2 26 Feb 07 jari 142            
2 26 Feb 07 jari 143             //if there are matrices, add them
2 26 Feb 07 jari 144             if(matrices.getChildNodes().getLength() > 0)
2 26 Feb 07 jari 145                 algElement.appendChild(matrices);
2 26 Feb 07 jari 146             
2 26 Feb 07 jari 147             //add output nodes
2 26 Feb 07 jari 148             String [] outputNodes = data.getStringArray("output-nodes");
2 26 Feb 07 jari 149             Element outputNodeElement, dataElement;
2 26 Feb 07 jari 150             if(outputNodes != null){
2 26 Feb 07 jari 151                 outputNodeElement = document.createElement("output_data");
2 26 Feb 07 jari 152                 for(int i = 0; i < outputNodes.length; i++) {
2 26 Feb 07 jari 153                     dataElement = document.createElement("data_node");
2 26 Feb 07 jari 154                     dataElement.setAttribute("data_node_id", String.valueOf(this.currDataID));
2 26 Feb 07 jari 155                     dataElement.setAttribute("name", outputNodes[i]);
2 26 Feb 07 jari 156                     outputNodeElement.appendChild(dataElement);
2 26 Feb 07 jari 157                     currDataID++;
2 26 Feb 07 jari 158                 }
2 26 Feb 07 jari 159                 algElement.appendChild(outputNodeElement);
2 26 Feb 07 jari 160             }
2 26 Feb 07 jari 161             
2 26 Feb 07 jari 162             //keySet.
2 26 Feb 07 jari 163         }
2 26 Feb 07 jari 164         algSetElement.appendChild(algElement);
2 26 Feb 07 jari 165         
2 26 Feb 07 jari 166         return true;
2 26 Feb 07 jari 167     }
2 26 Feb 07 jari 168     
2 26 Feb 07 jari 169     
2 26 Feb 07 jari 170     public void addParameterList(Element algElement, AlgorithmParameters params) {
2 26 Feb 07 jari 171         Map paramMap = params.getMap();
2 26 Feb 07 jari 172                 String key = "", value = "";
2 26 Feb 07 jari 173        Element paramsElement, paramElement, keyElement, valueElement;        
2 26 Feb 07 jari 174         
2 26 Feb 07 jari 175         if(paramMap.size() > 1) {
2 26 Feb 07 jari 176             Set keySet = paramMap.keySet();
2 26 Feb 07 jari 177             Iterator iter = keySet.iterator();
2 26 Feb 07 jari 178             paramsElement = document.createElement("plist");
2 26 Feb 07 jari 179             
2 26 Feb 07 jari 180             while(iter.hasNext()){
2 26 Feb 07 jari 181                 key = (String)iter.next();
2 26 Feb 07 jari 182                 value = ((String)(paramMap.get(key)));
2 26 Feb 07 jari 183                 
2 26 Feb 07 jari 184                 //if key is name move on
2 26 Feb 07 jari 185                 if(key.equals("name"))
2 26 Feb 07 jari 186                     continue;
2 26 Feb 07 jari 187                 
2 26 Feb 07 jari 188                 //make a param element
2 26 Feb 07 jari 189                 paramElement = document.createElement("param");
2 26 Feb 07 jari 190                 
2 26 Feb 07 jari 191                 //set key and value attributes
2 26 Feb 07 jari 192                 paramElement.setAttribute("key", key);
2 26 Feb 07 jari 193                 paramElement.setAttribute("val", value);
2 26 Feb 07 jari 194                 
2 26 Feb 07 jari 195                 //append param to params
2 26 Feb 07 jari 196                 paramsElement.appendChild(paramElement);
2 26 Feb 07 jari 197             }
2 26 Feb 07 jari 198             algElement.appendChild(paramsElement);
2 26 Feb 07 jari 199         }
2 26 Feb 07 jari 200     }
2 26 Feb 07 jari 201     
2 26 Feb 07 jari 202     
2 26 Feb 07 jari 203     public void addIntArrays(Map map, Element mlist) {
2 26 Feb 07 jari 204         Object [] arrayObjectNames = map.keySet().toArray();
2 26 Feb 07 jari 205         Element matrixElement, elementElement;
2 26 Feb 07 jari 206         int [] currentArray;
2 26 Feb 07 jari 207         
2 26 Feb 07 jari 208         String [] arrayNames = new String[arrayObjectNames.length];
2 26 Feb 07 jari 209         
2 26 Feb 07 jari 210         for (int i = 0; i < arrayNames.length; i++)
2 26 Feb 07 jari 211             arrayNames[i] = (String)arrayObjectNames[i];
2 26 Feb 07 jari 212         
2 26 Feb 07 jari 213         
2 26 Feb 07 jari 214         for(int i = 0; i < arrayNames.length; i++) {
2 26 Feb 07 jari 215             currentArray = (int [])map.get(arrayNames[i]);
2 26 Feb 07 jari 216             
2 26 Feb 07 jari 217             matrixElement = document.createElement("matrix");
2 26 Feb 07 jari 218             matrixElement.setAttribute("name", arrayNames[i]);
2 26 Feb 07 jari 219             matrixElement.setAttribute("type", "int");
2 26 Feb 07 jari 220             matrixElement.setAttribute("row_dim", String.valueOf(currentArray.length));
2 26 Feb 07 jari 221             
2 26 Feb 07 jari 222             for(int j = 0; j < currentArray.length; j++){
2 26 Feb 07 jari 223                 elementElement = document.createElement("element");
2 26 Feb 07 jari 224                 elementElement.setAttribute("row", String.valueOf(j));
2 26 Feb 07 jari 225                 elementElement.setAttribute("col", "0");
2 26 Feb 07 jari 226                 elementElement.setAttribute("val", String.valueOf(currentArray[i]));
2 26 Feb 07 jari 227                 matrixElement.appendChild(elementElement);
2 26 Feb 07 jari 228             }
2 26 Feb 07 jari 229             
2 26 Feb 07 jari 230             mlist.appendChild(matrixElement);
2 26 Feb 07 jari 231         }
2 26 Feb 07 jari 232     }
2 26 Feb 07 jari 233     
2 26 Feb 07 jari 234     public void addStringArrays(Map map, Element mlist) {
2 26 Feb 07 jari 235         Object [] arrayObjectNames = map.keySet().toArray();
2 26 Feb 07 jari 236         Element matrixElement, elementElement;
2 26 Feb 07 jari 237         String [] currentArray;
2 26 Feb 07 jari 238         
2 26 Feb 07 jari 239         String [] arrayNames = new String[arrayObjectNames.length];
2 26 Feb 07 jari 240         
2 26 Feb 07 jari 241         for (int i = 0; i < arrayNames.length; i++)
2 26 Feb 07 jari 242             arrayNames[i] = (String)arrayObjectNames[i];
2 26 Feb 07 jari 243         
2 26 Feb 07 jari 244         
2 26 Feb 07 jari 245         for(int i = 0; i < arrayNames.length; i++) {
2 26 Feb 07 jari 246             currentArray = (String [])map.get(arrayNames[i]);
2 26 Feb 07 jari 247             
2 26 Feb 07 jari 248             matrixElement = document.createElement("matrix");
2 26 Feb 07 jari 249             matrixElement.setAttribute("name", arrayNames[i]);
2 26 Feb 07 jari 250             matrixElement.setAttribute("type", "String");
2 26 Feb 07 jari 251             matrixElement.setAttribute("row_dim", String.valueOf(currentArray.length));
2 26 Feb 07 jari 252             
2 26 Feb 07 jari 253             for(int j = 0; j < currentArray.length; j++){
2 26 Feb 07 jari 254                 elementElement = document.createElement("element");
2 26 Feb 07 jari 255                 elementElement.setAttribute("row", String.valueOf(j));
2 26 Feb 07 jari 256                 elementElement.setAttribute("col", "0");
2 26 Feb 07 jari 257                 elementElement.setAttribute("val", currentArray[i]);
2 26 Feb 07 jari 258                 matrixElement.appendChild(elementElement);
2 26 Feb 07 jari 259             }
2 26 Feb 07 jari 260             
2 26 Feb 07 jari 261             mlist.appendChild(matrixElement);
2 26 Feb 07 jari 262         }
2 26 Feb 07 jari 263     }
2 26 Feb 07 jari 264     
2 26 Feb 07 jari 265     public void addMatrices(Map map, Element mlist) {
2 26 Feb 07 jari 266         Object [] matrixObjectNames = map.keySet().toArray();
2 26 Feb 07 jari 267         Element matrixElement;
2 26 Feb 07 jari 268         
2 26 Feb 07 jari 269         FloatMatrix currentFM;
2 26 Feb 07 jari 270         
2 26 Feb 07 jari 271         String [] matrixNames = new String[matrixObjectNames.length];
2 26 Feb 07 jari 272         
2 26 Feb 07 jari 273         for (int i = 0; i < matrixNames.length; i++)
2 26 Feb 07 jari 274             matrixNames[i] = (String)matrixObjectNames[i];
2 26 Feb 07 jari 275         
2 26 Feb 07 jari 276         
2 26 Feb 07 jari 277         for(int i = 0; i < matrixNames.length; i++) {
2 26 Feb 07 jari 278             currentFM = (FloatMatrix)map.get(matrixNames[i]);
2 26 Feb 07 jari 279             
2 26 Feb 07 jari 280             matrixElement = document.createElement("matrix");
2 26 Feb 07 jari 281             matrixElement.setAttribute("name", matrixNames[i]);
2 26 Feb 07 jari 282             matrixElement.setAttribute("type", "FloatMatrix");
2 26 Feb 07 jari 283             matrixElement.setAttribute("row_dim", String.valueOf(currentFM.getRowDimension()));
2 26 Feb 07 jari 284             
2 26 Feb 07 jari 285             addMatrixElements(currentFM, matrixElement);
2 26 Feb 07 jari 286             
2 26 Feb 07 jari 287             mlist.appendChild(matrixElement);
2 26 Feb 07 jari 288         }
2 26 Feb 07 jari 289     }
2 26 Feb 07 jari 290     
2 26 Feb 07 jari 291     public void addMatrixElements(FloatMatrix matrix, Element matrixElement) {
2 26 Feb 07 jari 292         Element elementElement;
2 26 Feb 07 jari 293         
2 26 Feb 07 jari 294         float [][] data = matrix.A;
2 26 Feb 07 jari 295         
2 26 Feb 07 jari 296         for(int i = 0; i < data.length; i++) {
2 26 Feb 07 jari 297             for(int j = 0; j < data[i].length; j++) {
2 26 Feb 07 jari 298                 elementElement = document.createElement("element");
2 26 Feb 07 jari 299                 elementElement.setAttribute("row", String.valueOf(i));
2 26 Feb 07 jari 300                 elementElement.setAttribute("col", String.valueOf(j));
2 26 Feb 07 jari 301                 elementElement.setAttribute("val", String.valueOf(data[i][j]));
2 26 Feb 07 jari 302                 matrixElement.appendChild(elementElement);                
2 26 Feb 07 jari 303             }            
2 26 Feb 07 jari 304         }                      
2 26 Feb 07 jari 305     }
2 26 Feb 07 jari 306                 
2 26 Feb 07 jari 307     public void writeDocument(String fileName) throws IOException {
2 26 Feb 07 jari 308         java.io.FileWriter writer = new java.io.FileWriter(fileName);
2 26 Feb 07 jari 309         serialize(document, writer);
2 26 Feb 07 jari 310         
2 26 Feb 07 jari 311         writer.flush();
2 26 Feb 07 jari 312         writer.close();
2 26 Feb 07 jari 313     }
2 26 Feb 07 jari 314     
2 26 Feb 07 jari 315     public void writeDocument(Document doc, Writer writer) throws IOException {
2 26 Feb 07 jari 316         serialize(doc, writer);
2 26 Feb 07 jari 317     }
2 26 Feb 07 jari 318     
2 26 Feb 07 jari 319     private void serialize(Document doc, Writer writer) throws IOException {
2 26 Feb 07 jari 320         serializeNode(doc, writer, "");
2 26 Feb 07 jari 321     }
2 26 Feb 07 jari 322     
2 26 Feb 07 jari 323     private void serializeNode(Node node, Writer writer, String indentLevel) throws IOException {
2 26 Feb 07 jari 324         String name;
2 26 Feb 07 jari 325         
2 26 Feb 07 jari 326         switch(node.getNodeType()) {
2 26 Feb 07 jari 327             case Node.DOCUMENT_NODE:
2 26 Feb 07 jari 328                 writer.write("<?xml version=\"1.0\"?>");
2 26 Feb 07 jari 329                 writer.write(lineSeparator);
2 26 Feb 07 jari 330                 
2 26 Feb 07 jari 331                 Document doc = (Document)node;
2 26 Feb 07 jari 332                 serializeNode(doc.getDocumentElement(), writer, " ");
2 26 Feb 07 jari 333                 break;
2 26 Feb 07 jari 334             case Node.ELEMENT_NODE:
2 26 Feb 07 jari 335                 name = node.getNodeName();
2 26 Feb 07 jari 336                 writer.write(indentLevel + "<" + name);
2 26 Feb 07 jari 337                 
2 26 Feb 07 jari 338                 //posible attributes
2 26 Feb 07 jari 339                 NamedNodeMap attrs = node.getAttributes();
2 26 Feb 07 jari 340                 for(int i = 0; i < attrs.getLength(); i++) {
2 26 Feb 07 jari 341                     Node attr = attrs.item(i);
2 26 Feb 07 jari 342                     writer.write(" "+ attr.getNodeName()+"=\""+attr.getNodeValue()+"\"");
2 26 Feb 07 jari 343                 }
2 26 Feb 07 jari 344                 
2 26 Feb 07 jari 345                 NodeList children = node.getChildNodes();
2 26 Feb 07 jari 346                 if(children.getLength() > 0) {
2 26 Feb 07 jari 347                     
2 26 Feb 07 jari 348                     writer.write(">");
2 26 Feb 07 jari 349                     
2 26 Feb 07 jari 350                     if((children.item(0) != null) &&
2 26 Feb 07 jari 351                     (children.item(0).getNodeType() == Node.ELEMENT_NODE )){
2 26 Feb 07 jari 352                         writer.write(lineSeparator);
2 26 Feb 07 jari 353                     }
2 26 Feb 07 jari 354                     for(int i = 0; i < children.getLength(); i++){
2 26 Feb 07 jari 355                         serializeNode(children.item(i), writer, indentLevel + indent);
2 26 Feb 07 jari 356                     }
2 26 Feb 07 jari 357                     if((children.item(0) != null) &&
2 26 Feb 07 jari 358                     (children.item(children.getLength()-1).getNodeType() == Node.ELEMENT_NODE)) {
2 26 Feb 07 jari 359                         writer.write(indentLevel);
2 26 Feb 07 jari 360                     }
2 26 Feb 07 jari 361                     
2 26 Feb 07 jari 362                     writer.write("</" + name + ">");
2 26 Feb 07 jari 363                     
2 26 Feb 07 jari 364                 } else {
2 26 Feb 07 jari 365                     writer.write("/>");
2 26 Feb 07 jari 366                 }
2 26 Feb 07 jari 367                 
2 26 Feb 07 jari 368                 writer.write(lineSeparator);
2 26 Feb 07 jari 369                 break;
2 26 Feb 07 jari 370             case Node.TEXT_NODE:
2 26 Feb 07 jari 371                 writer.write(node.getNodeValue());
2 26 Feb 07 jari 372                 break;
2 26 Feb 07 jari 373             case Node.COMMENT_NODE:
2 26 Feb 07 jari 374                 break;
2 26 Feb 07 jari 375         }
2 26 Feb 07 jari 376     }
2 26 Feb 07 jari 377     
2 26 Feb 07 jari 378 }