CCL Home Page
Up Directory CCL mweight.java
 /*
 * Copyright (c) 1994-1996 Sun Microsystems, Inc. All Rights Reserved.
 * Copyright (c) 1998-1999 ChemicaLogic. All Rights Reserved.
 * Permission to use, copy, modify, and distribute this software
 * and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and
 * without fee is hereby granted.
 * Please refer to the file http://java.sun.com/copy_trademarks.html
 * for further important copyright and trademark information and to
 * http://java.sun.com/licensing.html for further important licensing
 * information for the Java (tm) Technology.
 *
 * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
 * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
 * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
 * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
 * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
 *
 * THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE
 * CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE
 * PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT
 * NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE
 * SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE
 * SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE
 * PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES").  SUN
 * SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR
 * HIGH RISK ACTIVITIES.
 */

// Molecular Weight Calculator - version 1.05 (experimental)
// max formula length = 1000
// max single level parentheses = 100

// 1.Control of elements orthography                  (identification of error condition)
// 2.Control of special characters                    (identification of error condition)         
// 3.Control of existence of multiple parentheses     (identification of error condition)         
// 4.Control of element's coefficients (integers <=99)(identification of error not available)

import java.awt.*;
import java.applet.*;
import java.net.*;

// for file input/output
import java.io.*;
import java.lang.*;
import java.util.*;


public class mweight extends Applet
{

                String  text, temp1;
                Font    f1;

                String msg1, msg2, msg3, msg, msg4, msg5;
                TextField tfa;
                TextField controla;
                Label  lbl1, lbl2, vuoto1;

        public void init()
        {

                Color cverdea = new Color(0, 128, 128);
                Color crosso = new Color(255, 0, 0);
                setBackground(cverdea);
                setForeground(Color.white);

                setLayout (new FlowLayout (FlowLayout.LEFT));
                
                tfa=new TextField("(NH4)4Ce(SO4)4*2H2O",38);
                controla=new TextField("",26);

                Button but1;
                but1=new Button("Calculation");
                Button but2;
                but2=new Button("Clear Values");
                
                lbl2 = new Label("Molecular formula : ");
                add(lbl2);
                add(tfa);
                add(controla);

                //setForeground(crosso);
                vuoto1 = new Label("Copyright ChemicaLogic, 1998-99.                                                                         ");
                add(vuoto1);
                add(but1);
                add(but2);

                repaint();

        }


        public void start()
        {
        msg1 = "";
        msg2 = "";
        f1 = new Font("TimesRoman", Font.BOLD, 12);
        setFont(f1);

        repaint();
        }

            public boolean action(Event ev, Object arg)
            {

                        if (ev.target instanceof Button)
                        {

                            double mw[] = new double[104];
                            String elem[] =new String[104];
                            String special[]=new String[29];
                            String car[]   = new String[1001];

                            String pip[]   = new String[101];
                            int  aprip[]   = new int[101];
                            int  chiudip[] = new int[101];
                            int  coef[]   = new int[101];

                            String name, formula;
                            String txt, temp1;
                            String crystal, numcryst;
                            crystal  = "";
                            numcryst = "";
                            temp1    = "";
                            String flag1 = "";
                            String partea = "";
                            String parteb = "";
                            String carr = "";
                            String  s1 = "";
                            String ErrorCondition = "False";
                            String Controlstring = "";
                            String teststr1 = "";
                            String teststr2 = "";
                            String digit[] = {"False", "False"};

                            int     numelem=103;
                            int     j, l, ll, m, coe, k, n;
                            int countera = 0;
                            int counterb = 0;

                            double  sumcryst = 0.0;
                            double  valnumcryst = 0.0;
                            double  sum = 0.0;
                            double  sum1 = 0.0;

                        // Elements
                        elem[1] = "H"; 
                        elem[2] = "He";
                        elem[3] = "Li";
                        elem[4] = "Be";
                        elem[5] = "B"; 
                        elem[6] = "C"; 
                        elem[7] = "N"; 
                        elem[8] = "O"; 
                        elem[9] = "F"; 
                        elem[10] = "Ne";
                        elem[11] = "Na";
                        elem[12] = "Mg";
                        elem[13] = "Al";
                        elem[14] = "Si";
                        elem[15] = "P"; 
                        elem[16] = "S"; 
                        elem[17] = "Cl";
                        elem[18] = "Ar";
                        elem[19] = "K";
                        elem[20] = "Ca";
                        elem[21] = "Sc";
                        elem[22] = "Ti";
                        elem[23] = "V"; 
                        elem[24] = "Cr";
                        elem[25] = "Mn";
                        elem[26] = "Fe";
                        elem[27] = "Co";
                        elem[28] = "Ni";
                        elem[29] = "Cu";
                        elem[30] = "Zn";
                        elem[31] = "Ga";
                        elem[32] = "Ge";
                        elem[33] = "As";
                        elem[34] = "Se";
                        elem[35] = "Br";
                        elem[36] = "Kr";
                        elem[37] = "Rb";
                        elem[38] = "Sr";
                        elem[39] = "Y"; 
                        elem[40] = "Zr";
                        elem[41] = "Nb";
                        elem[42] = "Mo";
                        elem[43] = "Tc";
                        elem[44] = "Ru";
                        elem[45] = "Rh";
                        elem[46] = "Pd";
                        elem[47] = "Ag";
                        elem[48] = "Cd";
                        elem[49] = "In";
                        elem[50] = "Sn";
                        elem[51] = "Sb";
                        elem[52] = "Te";
                        elem[53] = "I"; 
                        elem[54] = "Xe";
                        elem[55] = "Cs";
                        elem[56] = "Ba";
                        elem[57] = "La";
                        elem[58] = "Ce";
                        elem[59] = "Pr";
                        elem[60] = "Nd";
                        elem[61] = "Pm";
                        elem[62] = "Sm";
                        elem[63] = "Eu";
                        elem[64] = "Gd";
                        elem[65] = "Tb";
                        elem[66] = "Dy";
                        elem[67] = "Ho";
                        elem[68] = "Er";
                        elem[69] = "Tm";
                        elem[70] = "Yb";
                        elem[71] = "Lu";
                        elem[72] = "Hf";
                        elem[73] = "Ta";
                        elem[74] = "W"; 
                        elem[75] = "Re";
                        elem[76] = "Os";
                        elem[77] = "Ir";
                        elem[78] = "Pt";
                        elem[79] = "Au";
                        elem[80] = "Hg";
                        elem[81] = "Tl";
                        elem[82] = "Pb";
                        elem[83] = "Bi";
                        elem[84] = "Po";
                        elem[85] = "At";
                        elem[86] = "Rn";
                        elem[87] = "Fr";
                        elem[88] = "Ra";
                        elem[89] = "Ac";
                        elem[90] = "Th";
                        elem[91] = "Pa";
                        elem[92] = "U"; 
                        elem[93] = "Np";
                        elem[94] = "Pu";
                        elem[95] = "Am";
                        elem[96] = "Cm";
                        elem[97] = "Bk"; 
                        elem[98] = "Cf";
                        elem[99] = "Es";
                        elem[100] = "Fm";
                        elem[101] = "Md";
                        elem[102] = "No";
                        elem[103] = "Lw";


                        // Molecular w.
                        mw[1] = 1.00797;
                        mw[2] = 4.0026;
                        mw[3] = 6.939;
                        mw[4] = 9.0122;
                        mw[5] = 10.811;
                        mw[6] = 12.01115;
                        mw[7] = 14.0067;
                        mw[8] = 15.9994;
                        mw[9] = 18.9984;
                        mw[10] = 20.183;
                        mw[11] = 22.9898;
                        mw[12] = 24.312;
                        mw[13] = 26.9815;
                        mw[14] = 28.086;
                        mw[15] = 30.9738;
                        mw[16] = 32.064;
                        mw[17] = 35.453;
                        mw[18] = 39.948;
                        mw[19] = 39.102;
                        mw[20] = 40.08;
                        mw[21] = 44.956;
                        mw[22] = 47.90;
                        mw[23] = 50.942;
                        mw[24] = 51.996;
                        mw[25] = 54.9381;
                        mw[26] = 55.847;
                        mw[27] = 58.9332;
                        mw[28] = 58.71;
                        mw[29] = 63.54;
                        mw[30] = 65.37;
                        mw[31] = 69.72;
                        mw[32] = 72.59;
                        mw[33] = 74.9216;
                        mw[34] = 78.96;
                        mw[35] = 79.904;
                        mw[36] = 83.80;
                        mw[37] = 85.47;
                        mw[38] = 87.62;
                        mw[39] = 88.905;
                        mw[40] = 91.22;
                        mw[41] = 92.906;
                        mw[42] = 95.94;
                        mw[43] = 99.0;
                        mw[44] = 101.07;
                        mw[45] = 102.905;
                        mw[46] = 106.4;
                        mw[47] = 107.868;
                        mw[48] = 112.40;
                        mw[49] = 114.82;
                        mw[50] = 118.69;
                        mw[51] = 121.75;
                        mw[52] = 127.60;
                        mw[53] = 126.9044;
                        mw[54] = 131.30;
                        mw[55] = 132.905;
                        mw[56] = 137.34;
                        mw[57] = 138.91;
                        mw[58] = 140.12;
                        mw[59] = 140.907;
                        mw[60] = 144.24;
                        mw[61] = 145.0;
                        mw[62] = 150.35;
                        mw[63] = 151.96;
                        mw[64] = 157.25;
                        mw[65] = 158.924;
                        mw[66] = 162.50;
                        mw[67] = 164.930;
                        mw[68] = 167.26;
                        mw[69] = 168.934;
                        mw[70] = 173.04;
                        mw[71] = 174.97;
                        mw[72] = 178.49;
                        mw[73] = 180.948;
                        mw[74] = 183.85;
                        mw[75] = 186.2;
                        mw[76] = 190.2;
                        mw[77] = 192.2;
                        mw[78] = 195.09;
                        mw[79] = 196.967;
                        mw[80] = 200.59;
                        mw[81] = 204.37;
                        mw[82] = 207.19;
                        mw[83] = 208.980;
                        mw[84] = 210.0;
                        mw[85] = 210.0;
                        mw[86] = 222.0;
                        mw[87] = 223.0;
                        mw[88] = 226.0;
                        mw[89] = 227.0;
                        mw[90] = 232.038;
                        mw[91] = 231.0;
                        mw[92] = 238.03;
                        mw[93] = 237.0;
                        mw[94] = 242.0;
                        mw[95] = 243.0;
                        mw[96] = 247.0;
                        mw[97] = 249.0;
                        mw[98] = 251.0;
                        mw[99] = 254.0;
                        mw[100] = 253.0;
                        mw[101] = 256.0;
                        mw[102] = 254.0;
                        mw[103] = 257.0;

                        // special characters
                        special[0] = "~";
                        special[1] = "!";
                        special[2] = "@";
                        special[3] = "#";
                        special[4] = "$";
                        special[5] = "%";
                        special[6] = "^";
                        special[7] = "&";
                        special[8] = "_";
                        special[9] = "+";
                        special[10] = "|";
                        special[11] = "\\";
                        special[12] = "[";
                        special[13] = "]";
                        special[14] = "{";
                        special[15] = "}";
                        special[16] = "<";
                        special[17] = ">";
                        special[18] = "?";
                        special[19] = "/";
                        special[20] = ",";
                        special[21] = ".";
                        special[22] = ":";
                        special[23] = ";";
                        special[24] = "\'";
                        special[25] = "\"";
                        special[26] = "-";
                        special[27] = "=";
                        special[28] = "`";

                                if ( arg.equals("Calculation") ) {

                                controla.setText("");
                                formula = tfa.getText();
                                formula = formula.trim();

                                if ( formula.length() > 1000 ) {
                                ErrorCondition = "True";
                                }

                                

                                  j = 1;
                                  while ( j <= formula.length() ) {
                                        car[j] = formula.substring(j-1, j);

                                        //control for space
                                        if ( " ".equals (car[j]) ) {
                                        ErrorCondition = "True";
                                        }


                                        // Se la molecola e' idratata, anche valori reali
                                        // di molecole d'acqua (1.5, 2, 52, 123,  ecc)
                                        if (  "*".equals (car[j])  ) {
                                        crystal = formula.substring(j, formula.length());

                                                if ( crystal.equals ("H2O") ) {
                                                numcryst = "1";
                                                } else {
                                                  numcryst = crystal.substring(0, crystal.length()-3);
                                                  }

                                        valnumcryst= Double.valueOf(numcryst).doubleValue();
                                        sumcryst   = valnumcryst * (mw[1] * 2 + mw[8]);
                                        temp1      = String.valueOf(sumcryst).toString();
                                        formula    = formula.substring(0,formula.length()-crystal.length()-1);

                                        }
                        
                                  j++;
                                  }

                                 j=100;
                                 while (j <= 999 ) {
                                    temp1 = String.valueOf(j).toString();
                                    if ( formula.indexOf(temp1) != -1 ) {
                                    ErrorCondition = "True";
                                    break;
                                    }
                                 j++;
                                 }


                                                 formula = formula + "  ";

                                                // analisi parentesi *************************************************
                                                j = 1;
                                                while (j <= formula.length() ) {
                                                car[j] = formula.substring(j-1, j);

                                                n = 0;
                                                while (n <= 28) {
                                                        if ( special[n].equals (car[j]) ) {
                                                        ErrorCondition = "True";
                                                        break;
                                                        }
                                                n++;
                                                }
                                              
                
                                                if ( "(".equals (car[j]) ) {
                                                        countera = countera + 1;
                                                        aprip[countera] = j;
                                                        Controlstring=Controlstring+"ap";
                                                        }

                                                if ( ")".equals (car[j]) ) {
                                                        counterb = counterb + 1;
                                                        chiudip[counterb] = j;
                                                        Controlstring=Controlstring+"ch";
                                                        }

                                                if ( countera >100 || counterb >100 ) {
                                                ErrorCondition = "True";
                                                }

                                                j++;
                                                }

                                                l = 1;
                                                while ( l <= countera ) {
                                                if ( ErrorCondition.equals  ("True") )
                                                                        break;


                                                n = 1;
                                                while (n <= Controlstring.length() ) {
                                                    if ( Controlstring.substring(n-1, n+3).equals ("apch") ) {
                    
                                                    } else {
                                                           ErrorCondition = "True";
                                                           }
                                                n = n+4;
                                                }

                                                pip[l] = formula.substring(aprip[l] , aprip[l] + (chiudip[l]-aprip[l]) -1 );
                                                digit[0]="False";
                                                digit[1]="False";

                                                        k=0;
                                                        while (k<=9) {
                                                              temp1 = String.valueOf(k).toString();
                                                              temp1 = temp1.trim();
                                                              if (temp1.equals (formula.substring(chiudip[l],chiudip[l] + 1 ))) {
                                                              digit[0]="True";
                                                              break;
                                                              }
                                                        k++;
                                                        }

                                                        k=0;
                                                        while (k<=9) {
                                                              temp1 = String.valueOf(k).toString();
                                                              temp1 = temp1.trim();
                                                              if (temp1.equals (formula.substring(chiudip[l]+1,chiudip[l] + 2 ))) {
                                                              digit[1]="True";
                                                              break;
                                                              }
                                                        k++;
                                                        }


                                                        if (digit[0].equals ("True") && digit[1].equals ("True") ) {
                                                        temp1 = formula.substring(chiudip[l],chiudip[l] + 2 );
                                                        coef[l] = Integer.parseInt(temp1);
                                                        }
                                                        if (digit[0].equals ("True") && digit[1].equals ("False") ) {
                                                        temp1 = formula.substring(chiudip[l],chiudip[l] + 1 );
                                                        coef[l] = Integer.parseInt(temp1);
                                                        }
                                                        if (digit[0].equals ("False") && digit[1].equals ("False")) {
                                                        coef[l] = -1;
                                                        }

                                                l++;
                                                }
                                                // fine analisi parentesi *************************************************

                                                // parte senza parentesi  *************************************************
                                                j = 1;
                                                while (j <= formula.length()) {
                                                if ( ErrorCondition.equals ("True") )
                                                                        break;
                                

                                                        l = 1;
                                                        while (l <= countera) {
                                                        temp1 = String.valueOf(coef[l]).toString();
                                                        temp1 = temp1.trim();

                                                                if (coef[l] == -1 ) {
                                                                   temp1="";
                                                                }

                                                                if ( j >= aprip[l] && j <= (chiudip[l] + temp1.length()) ) {
                                                                car[j] = "";
                                                                }
                                                        l++;
                                                        }
                                                j++;
                                                }

                                                j = 1;
                                                while (j <= formula.length() ) {
                                                if ( ErrorCondition.equals ("True") )
                                                                        break;

                                                partea = partea + car[j];
                                                j++;
                                                }

                                                pip[0] = partea;
                                                coef[0] = 1;

                                                l=1;
                                                while (l <= countera) {
                                                if ( ErrorCondition.equals ("True") )
                                                                        break;

                                                        if (coef[l] == -1 ) {
                                                        coef[l] = 1;
                                                        }
                                                l++;
                                                }



                                             m = 0;
                                             while (m <= countera) {
                                             if ( ErrorCondition.equals ("True") )
                                                                      break;

                                             formula = pip[m] + "  ";

                                                //CALCOLO DEL PESO MOLECOLARE
                                                sum = 0;
                                                flag1 = "";

                                                j = 1;
                                                while ( j <= formula.length() ) {
                                                        car[j] = formula.substring(j-1, j);
                                                j++;
                                                }
                                
                                                j = 1;
                                                while ( j <= formula.length() ) {
                                                flag1 = "";
                                     
                                                        //Controllo se si tratta di elemento con due lettere
                                                        l = 1;
                                                        while ( l <= numelem ) {
                                                                temp1 = car[j] + car[j + 1];
                                                                if ( temp1.equals (elem[l]) ) {

                                                                        teststr1 = "S";
                                                                        flag1 = "OK";
                                                                        digit[0]="False";
                                                                        digit[1]="False";
                              
                                                                        coe = 0;
                                                                        k=0;
                                                                        while (k<=9) {
                                                                              temp1 = String.valueOf(k).toString();
                                                                              temp1 = temp1.trim();
                                                                              if (temp1.equals (car[j + 2]) ) {
                                                                              digit[0]="True";
                                                                              break;
                                                                              }
                                                                        k++;
                                                                        }

                                                                        k=0;
                                                                        while (k<=9) {
                                                                              temp1 = String.valueOf(k).toString();
                                                                              temp1 = temp1.trim();
                                                                              if (temp1.equals (car[j + 3])) {
                                                                              digit[1]="True";
                                                                              break;
                                                                              }
                                                                        k++;
                                                                        }

                                                                        if (digit[0].equals ("True") && digit[1].equals ("True") ) {
                                                                        temp1 = (car[j + 2] + car[j + 3]);
                                                                        coe = Integer.parseInt(temp1);
                                                                        }
                                                                        if (digit[0].equals ("True") && digit[1].equals ("False") ) {
                                                                        temp1 = car[j + 2];
                                                                        coe = Integer.parseInt(temp1);
                                                                        }

                                                                                if ( coe == 0 ) {
                                                                                coe = 1;
                                                                                }
                        
                                                                        sum = sum + coe * mw[l];
                                                                        j = j + 1;
                                                                        break;
                                                                } else {
                                                                       teststr1 = "N";
                                                                       }
                                
                                                        l++;
                                                        }
                      
                                                        // Allora si tratta di elemento con una lettera solo
                                                        if ( flag1 != "OK" ) {
                        
                                                                l = 1;
                                                                while ( l <= numelem ) {
                                                                        temp1 = car[j];
                                                                        if ( temp1.equals (elem[l]) ) {

                                                                                teststr2 = "S";
                                                                                flag1 = "XX";
                                                                                digit[0]="False";
                                                                                digit[1]="False";

                                                                                coe = 0;
                                                                                k=0;
                                                                                while (k<=9) {
                                                                                      temp1 = String.valueOf(k).toString();
                                                                                      temp1 = temp1.trim();
                                                                                      if (temp1.equals (car[j + 1]) ) {
                                                                                      digit[0]="True";
                                                                                      break;
                                                                                      }
                                                                                k++;
                                                                                }
                                
                                                                                k=0;
                                                                                while (k<=9) {
                                                                                      temp1 = String.valueOf(k).toString();
                                                                                      temp1 = temp1.trim();
                                                                                      if (temp1.equals (car[j + 2])) {
                                                                                      digit[1]="True";
                                                                                      break;
                                                                                      }
                                                                                k++;
                                                                                }

                                                                                if (digit[0].equals ("True") && digit[1].equals ("True") ) {
                                                                                temp1 = (car[j + 1] + car[j + 2]);
                                                                                coe = Integer.parseInt(temp1);
                                                                                }
                                                                                if (digit[0].equals ("True") && digit[1].equals ("False") ) {
                                                                                temp1 = car[j + 1];
                                                                                coe = Integer.parseInt(temp1);
                                                                                }

                                                                                        if ( coe == 0 ) {
                                                                                        coe = 1;
                                                                                        }
                                                                                sum = sum + coe * mw[l];
                                                
                                                                        break;
                                                                        } else {
                                                                               teststr2 = "N";
                                                                               }

                                                                l++;
                                                                }
                                                        }
                
                                                        if ( car[j].equals (" ") || car[j].equals ("0") || car[j].equals ("1") || car[j].equals ("2") || car[j].equals ("3") || car[j].equals ("4") || car[j].equals ("5") || car[j].equals ("6") || car[j].equals ("7") || car[j].equals ("8") || car[j].equals ("9") ) {
                                                             teststr1 = "N";
                                                             teststr2 = "S";
                                                        } else {
                                                               
                                                                       if ( (teststr1+teststr2).equals ("NN") ) {
                                                                             ErrorCondition = "True";
                                                                       }
                                                               }


                                                j++;
                                                }


                                             sum1 = sum1 + sum * coef[m];
                                             m++;
                                             }


                                             if ( ErrorCondition.equals  ("False") ) {
                                                          temp1 = String.valueOf(sum1 + sumcryst).toString();
                                                          controla.setText("Molecular Weight : "+temp1+" g/mol ");
                                             } else {
                                                    controla.setText("An error occured...");
                                                    }


                                //---------------------------------------------------------------------

                                return true;
                                } else if ( arg.equals("Clear Values") ) {
                                    tfa.setText("");
                                    controla.setText("");

                                    return true;
                                    } 


                        return true;
                        }


            return false;
            }



                public void paint(Graphics g) {

                

                Color cblue = new Color(0, 0, 255);
                Color cverdea = new Color(0, 128, 128);
                Color cverdes = new Color(21, 101, 0);
                Color cverdem = new Color(32, 127, 0);
                Color crosso = new Color(255, 0, 0);
                Color cgiallo = new Color(255, 255, 0);
                Color cmagenda = new Color(255, 0, 255);
                Color cwhite = new Color(255, 255, 255);
                //g.setColor(cgiallo);
                }

}


Modified: Sat Feb 10 17:00:00 1996 GMT
Page accessed 3314 times since Wed Feb 5 06:51:27 2003 GMT