import java.awt.*; import java.awt.event.*; import java.io.*; import javax.swing.*; import java.

util.*; public class moon extends JFrame { static int SCROLLBARS_BOTH; File f; String textoEtiqueta=" "; String misatge,titul; Hashtable misDatos=new Hashtable(1400); Hashtable miPlantilla=new Hashtable(90); ArrayList codigos=new ArrayList(); TextArea encontrado = new TextArea(" ",15,80,SCROLLBARS_BOTH); JComboBox eligeCodigo=new JComboBox(); //para que el usuario seleccione un código. public moon() // constructor { super("Predicción de proteínas moonlighting"); getContentPane().setLayout(null); encontrado.setBounds(50,110,700,510); encontrado.setBackground(Color.white); encontrado.setEditable(false); getContentPane().add(encontrado); encontrado.setVisible(false); eligeCodigo.setBounds(200,10,150,25); eligeCodigo.setBackground(Color.white); eligeCodigo.setEditable(false); eligeCodigo.setMaximumRowCount(30); getContentPane().add(eligeCodigo); eligeCodigo.setVisible(false); ponMenu(); // da el menú principal } // cierra el constructor... public static void main(String [] args){ moon tp=new moon(); tp.setSize(950,700); tp.setBackground(Color.white); tp.setVisible(true); }// cierra main() private void ponMenu(){ JMenuBar mbar=new JMenuBar(); JMenu men1=new JMenu("Leer ficheros "); JMenu men2=new JMenu(" Búsquedas"); JMenuItem item1=new JMenuItem("Ficheros PSI-BLAST"); JMenuItem item2=new JMenuItem("Fichero Plantilla"); JMenuItem item3=new JMenuItem("Salir"); // cierra la aplicación JMenuItem item4=new JMenuItem("Por código"); item1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ buscaFicherosPsiBlast(); // lo busca y si lo encuentra lo lee y pasa datos al hashtable <misDatos>. } //cierro actionPerformed(ActionEvent e) }); // cierra item1.addActionListener item2.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ leerPlantilla(); // lo busca y si lo encuentra lo lee y pasa datos al hashtable <misDatos>. } //cierro actionPerformed(ActionEvent e) }); // cierra item1.addActionListener item3.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ System.exit(0); } //cierro actionPerformed(ActionEvent e) }); // cierra item3.addActionListener item4.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ encontrado.setVisible(false); repaint();

if(codigos.size()==0){//no se han cargado los códigos de la plantilla.. titul="¡ ATENCION !"; misatge="Primero debe leer el fichero plantilla.\n"; misatge=misatge+"Vaya al menú <Leer ficheros> opción <Fichero plantilla>"; JOptionPane.showMessageDialog(null,misatge,titul,JOptionPane.INFORMATION_MESSAGE); return; }else if(misDatos.size()==0){//no se han cargado ficheros psiblast... titul="¡ ATENCION !"; misatge="Primero debe cargar los ficheros psiblast.\n"; misatge=misatge+"Vaya al menú <Leer ficheros> opción <Ficheros psi-blast>"; JOptionPane.showMessageDialog(null,misatge,titul,JOptionPane.INFORMATION_MESSAGE); return; }else{ seleccionarCodigo(); } } //cierro actionPerformed(ActionEvent e) }); // cierra item4.addActionListener eligeCodigo.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ String cod=(String) eligeCodigo.getSelectedItem(); //textoEtiqueta="Código seleccionado: "+cod; eligeCodigo.setVisible(false); //encontrado.setText(textoEtiqueta); // encontrado.setVisible(true); repaint(); procesa(cod); //operaciones una vez elegido un código... //lire(); } //cierro actionPerformed(ActionEvent e) }); // cierra item5.addActionListener men1.add(item1); men1.add(item2); men1.add(item3); men2.add(item4); mbar.add(men1); mbar.add(men2); setJMenuBar(mbar); }// fin de ponMenu() private class Informe { String tipo,nom,score,evalue,fichero; Informe(String a,String b,String c,String d,String e){ // constructor tipo=a; nom=b; score=c; evalue=d; fichero=e; }//fin del constructor }//fin clase Informe private class Plantilla { String funcion1,funcion2; Plantilla(String a,String b){ // constructor funcion1=a; funcion2=b; }//fin del constructor }//fin clase Plantilla private void buscaFicherosPsiBlast(){ encontrado.setVisible(false); repaint(); String detalle=" "; String nomDirect=JOptionPane.showInputDialog("Dirección donde se encuentran los ficheros Psi-BLAST.(Ej: C:\\ \\ PSIBLAST)"); if(nomDirect==null||nomDirect.length()<2){ titul="¡ ATENCION !"; detalle="Debe indicar la dirección"; JOptionPane.showMessageDialog(null,detalle,titul,JOptionPane.INFORMATION_MESSAGE); return; }//cierra if(nomDirect==null||nomDirect.length()<2) File arch=new File(nomDirect); if (arch.exists()){

if (arch.isDirectory()){ textoEtiqueta="Subdirectorio: "+nomDirect; encontrado.setText(textoEtiqueta); encontrado.setVisible(true); String arr[]=arch.list(); // en el array arr están todos los ficheros del directorio indicado. for(int j=0; j<arr.length;j++){ textoEtiqueta=textoEtiqueta+"\n Leyendo fichero: "+arr[j]; encontrado.setText(textoEtiqueta); File f=new File(arr[j]); if (!llegeix(f)){ // ya tengo datos en el hashtable <misDatos>. if(misatge.length()>2){ // Error en el acceso al fichero, no se podía leer... titul="¡ ATENCION !"; JOptionPane.showMessageDialog(null,misatge,titul,JOptionPane.INFORMATION_MESSAGE); misatge=" "; }else{ titul="¡ ATENCION !"; detalle="SE HA PRODUCIDO UN ERROR EN LA LECTURA DEL FICHERO"; JOptionPane.showMessageDialog(null,detalle,titul,JOptionPane.INFORMATION_MESSAGE); misatge=" "; }//cierra f(misatge.length()>2) }// if (!llegeix(f)) }// cierro for(int j=0; j<arr.length;j++) textoEtiqueta=textoEtiqueta+"\n En hashtable se han almacenado "+misDatos.size()+" anotaciones..."; encontrado.setText(textoEtiqueta); }else{ titul="¡ ATENCION !"; detalle=nomDirect+" no es un directorio."; JOptionPane.showMessageDialog(null,detalle,titul,JOptionPane.INFORMATION_MESSAGE); return; } // cierro if (arch.isDirectory()) y su else... }else{ titul="¡ ATENCION !"; detalle="No existe el directorio indicado"; JOptionPane.showMessageDialog(null,detalle,titul,JOptionPane.INFORMATION_MESSAGE); return; } // cierro if (arch.exists()) con su else... }// fin de BuscaFicherosPsiBlast() //______________________________________________________________________________________________ _____________ boolean llegeix(File fit) { // lee el fichero <fit> y pasa parte de sus datos al hashtable <misDatos> int fase=0; //fase=0 significa que aun no hemos llegado a la linea que contiene <Sequences producing significant alignments> //fase=1 significará que ya hemos llegado a la linea que contiene <sequences producing significant alignments> //fase=2 significará que hemos llegado a una línea donde aparece <Alignments>, luego FIN int k,k1,k3; int cont=0; //para ver si se añaden datos al hashtable. String tipo,clave,nom,restos,score,evalue; DataInputStream dis = null; String record = null; if (fit.canRead()) { try { FileInputStream fis = new FileInputStream(fit); BufferedInputStream bis = new BufferedInputStream(fis); dis = new DataInputStream(bis); while ( (record=dis.readLine()) != null ) { switch (fase) { case 0: //estamos al principio del recorrido if (record.indexOf("Sequences")>-1){ if (record.indexOf("alignments")>-1){ fase=1; } } break;//salir del switch case 1: //ya pasamos la línea que contiene <Sequences producing significant alignments> //empieza la toma de datos. if (record.indexOf("Alignments")>-1){ //hemos llegado al final de nuestra zona de lectura, luego fin... fase=2; if(cont==0){//la etiqueta no indica el nombre de ningún fichero.

titul="¡ ATENCION !"; misatge="No se han recogido datos del fichero: "+fit.getName(); JOptionPane.showMessageDialog(null,misatge,titul,JOptionPane.INFORMATION_MESSAGE); }// fin de if(cont==0) return true; } else { if (record.length()<1){ //línea sin información break; }else{ k=record.indexOf('|'); //la primera posición donde está el caracter | (línea vertical). tipo=record.substring(0,k); k1=record.indexOf('|',k+1); //la posición donde está el caracter | (línea vertical). clave=record.substring(k+1,k1); int p=clave.indexOf('.'); //si en la clave hay un punto, eliminarlo, y lo que le sigue también. if(p>0) clave=clave.substring(0,p); clave=clave.trim(); nom=record.substring(k1+1,67); restos=record.substring(68); restos=restos.trim(); int k4=restos.indexOf(' '); score=restos.substring(0,k4); evalue=restos.substring(k4); evalue=evalue.trim(); misDatos.put(clave, new Informe(tipo,nom,score,evalue,fit.getName())); cont++; // hemos añadido datos al hashtable. } } break; case 2: //hemos llegado al final de nuestra zona de lectura, luego fin... if(cont==0){//la etiqueta no indica el nombre de ningún fichero. titul="¡ ATENCION !"; misatge="No se han recogido datos del fichero: "+fit.getName(); JOptionPane.showMessageDialog(null,misatge,titul,JOptionPane.INFORMATION_MESSAGE); }// fin de if(cont==0) return true; }//fin del switch } //cierro while } catch (IOException e) { misatge="Excepció IOException!" + e.getMessage(); return false; } finally { if (dis != null) { try { dis.close(); } catch (IOException ioe) { misatge="Excepció IOException! al cierre " + ioe.getMessage(); return false; } } } } // del canRead if(cont==0){//la etiqueta no indica el nombre de ningún fichero. titul="¡ ATENCION !"; misatge="No se han recogido datos del fichero: "+fit.getName(); JOptionPane.showMessageDialog(null,misatge,titul,JOptionPane.INFORMATION_MESSAGE); }// fin de if(cont==0) return true; }// fin de llegeix //________________________________________________________________________ private void leerPlantilla (){ String detalle=" ";

int n=0; int k1,k2,k3; String mcodi,mf1,mf2; textoEtiqueta=" "; encontrado.setVisible(false); repaint(); String nomArchiu=JOptionPane.showInputDialog("Indica el nombre y extension del fichero plantilla."); if(nomArchiu==null||nomArchiu.length()<2){ titul="¡ ATENCION !"; detalle="Debe indicar un Archivo"; JOptionPane.showMessageDialog(null,detalle,titul,JOptionPane.INFORMATION_MESSAGE); return; }//cierra if(nomArchiu==null||nomArchiu.length()<2) f=new File(nomArchiu); textoEtiqueta="Leyendo el archivo "+nomArchiu; detalle=" "; DataInputStream dis = null; String record = null; if (f.canRead()) { try { FileInputStream fis = new FileInputStream(f); BufferedInputStream bis = new BufferedInputStream(fis); dis = new DataInputStream(bis); while ( (record=dis.readLine()) != null ) { k1=record.indexOf('\t'); // busco el primer tabulador if(k1>0){ mcodi=record.substring(0,k1); mcodi=mcodi.trim(); }else{ continue; }//fin de if(k1>0) k2=record.indexOf('\t',k1+1); // busco el siguiente tabulador if(k2>0){ mf1=record.substring(k1+1,k2); mf1=mf1.trim(); }else{ continue; }//fin de if(k2>0) k3=record.lastIndexOf('\t'); //busco posición del último tabulador if(k3>0){ mf2=record.substring(k3+1); mf2=mf2.trim(); }else{ continue; }//fin de if(k3>0) miPlantilla.put(mcodi, new Plantilla(mf1,mf2)); codigos.add(mcodi); //los códigos de la plantilla se añaden al ArrayList <codigos> para luego poder seleccionar uno. n++; //cuenta numero de codigos añadidos al hashtable miPlantilla textoEtiqueta=textoEtiqueta+"\n Encontrados: "+mcodi+"..."+mf1+"..."+mf2; }// cierra while ( (record=dis.readLine()) != null ) encontrado.setVisible(true); textoEtiqueta=textoEtiqueta+"\n En total "+n+" códigos"; encontrado.setText(textoEtiqueta); repaint(); } catch (IOException e) { misatge="Excepció IOException!" + e.getMessage(); } finally { if (dis != null) { try { dis.close(); } catch (IOException ioe) { misatge="Excepció IOException! al cierre " + ioe.getMessage();

} } } } }//fin de LeerPlantilla() //_________________________________ private void seleccionarCodigo(){ encontrado.setText(" "); encontrado.setVisible(false); repaint(); for (int j=0; j<codigos.size(); j++){ String opc=(String)codigos.get(j); //saco un código del ArrayList <codigos>... eligeCodigo.addItem(opc); //y lo anoto en la caja de selección JComboBox <eligecodigo> }// cierro for (int j=0; j<codigos.size(); j++) eligeCodigo.setVisible(true); repaint(); }// cierra private void SeleccionaCodigo() private void procesa(String mcod){ Plantilla p=(Plantilla) miPlantilla.get(mcod); if (p==null){ titul="¡ ATENCION !"; misatge=mcod+" no consta en el hashtable de la plantilla."; JOptionPane.showMessageDialog(null,misatge,titul,JOptionPane.INFORMATION_MESSAGE); return; }//cierro if (p==null) String mf1=p.funcion1; String mf2=p.funcion2; //textoEtiqueta="codigo: "+mcod+" funcion1: "+mf1+" funcion2: "+mf2; //encontrado.setText(textoEtiqueta); //encontrado.setVisible(true); //repaint(); buscar(mcod,mf1,mf2);//En todos los ficheros psiblast buscará el código mcod, y si lo encuentra en un fichero, lo recorrerá //para buscar las funciones mf1 y mf2 }// fin de private void procesa() //______________________________________________________________________________________________ __________ private void buscar(String codi, String f1, String f2){ int scorf1=-100000; int scorf2=-100000; String evalf1=" "; String evalf2=" "; Informe inf=(Informe)misDatos.get(codi); if (inf==null){ titul="¡ ATENCION !"; misatge=codi+" no consta en el hashtable psiblast."; JOptionPane.showMessageDialog(null,misatge,titul,JOptionPane.INFORMATION_MESSAGE); return; }//cierro if (inf==null) String ficher=inf.fichero; //fichero donde estaba el codigo <codi> que buscabamos. if (ficher==null){ titul="¡ ATENCION !"; misatge=" No consta fichero en el hashtable psiblast de clave: "+codi; JOptionPane.showMessageDialog(null,misatge,titul,JOptionPane.INFORMATION_MESSAGE); return; }//cierro if (ficher==null) Enumeration lista=misDatos.elements(); //lista con todos los objetos Informe del hashtable psiblast. while (lista.hasMoreElements()){ Informe in=(Informe) lista.nextElement(); //objeto guardado en una posición del hashtable <misDatos>. String f=in.fichero; if(f.equals(ficher)){//el objeto guardado es del mismo fichero donde estaba el código buscado. String fun=in.nom; //la función indicada en ese objeto. if(fun==null){ titul="¡ ATENCION !"; misatge=" No consta función en el hashtable psiblast."; JOptionPane.showMessageDialog(null,misatge,titul,JOptionPane.INFORMATION_MESSAGE); return; }// cierra if(fun==null) int pos=fun.indexOf(f1); if(pos>0){ //encuentra la función <f1> correspondiente al código buscado. if(in.score==null){ titul="¡ ATENCION !"; misatge=" No consta score en el hashtable psiblast.";

JOptionPane.showMessageDialog(null,misatge,titul,JOptionPane.INFORMATION_MESSAGE); return; }// cierra if(in.score==null) int p=Integer.parseInt(in.score); if(p>scorf1){ scorf1=p; evalf1=in.evalue; }//cierra if(p>scorf1) }//cierra if(pos>0) pos=fun.indexOf(f2); if(pos>0){ //encuentra la función <f2> correspondiente al código buscado. if(in.score==null){ titul="¡ ATENCION !"; misatge=" No consta score en el hashtable psiblast."; JOptionPane.showMessageDialog(null,misatge,titul,JOptionPane.INFORMATION_MESSAGE); return; }// cierra if(in.score==null) int p=Integer.parseInt(in.score); if(p>scorf2){ scorf2=p; evalf2=in.evalue; }//cierra if(p>scorf2) }//cierra if(pos>0) }//cierra if(f.equals(ficher)) }//cierra while (lista.hasMoreElements() textoEtiqueta="\nEn la plantilla se seleccionó el código: "+codi+", con sus funciones: "+f1+" y "+f2+"\n\n"; textoEtiqueta=textoEtiqueta+"En los ficheros PSIBLAST el código seleccionado: "+codi+" se localizó en el fichero: "+ficher+"\n\n"; if(scorf1>0) textoEtiqueta=textoEtiqueta+"donde la función: "+f1+" consta con SCORE="+scorf1+ " y EVALUE="+evalf1+"\n\n"; else textoEtiqueta=textoEtiqueta+"pero no consta la función: "+f1+"\n\n"; if(scorf2>0) textoEtiqueta=textoEtiqueta+"y la función: "+f2+" consta con SCORE="+scorf2+ " y EVALUE="+evalf2; else textoEtiqueta=textoEtiqueta+"pero no consta la función: "+f2; encontrado.setText(textoEtiqueta); encontrado.setVisible(true); repaint(); }//fin de private void buscar(String codi, String f1, String f2) }// fin de public class moon extends JFrame