text:
package main.java.Utilities;
/* This class provides static methods to retrieve sequence information from
 * any number of protein data files
 *
 * The files containing the appropriate protein sequences should have one of
 * the following file extensions- .pdb, .fasta, .faa, .gbk
 *
 * @author     Jill Zapoticznyj
 * @author     Adam Bazinet
 * @author     Janine Garnham
 */

//import java.io.;  // input/output package

import main.java.Electro2D.Electro2D;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Hashtable;
import java.util.StringTokenizer;
import java.util.Vector;

public class GenomeFileParser {
    /**
     * This method calculates the pI from inputted sequence
     *
     * @param pro protein sequence
     * @return returns the pI value
     */
    public static double getpI(String pro) {

        // Calculate charge at a certain pH, starting with a pH of 7
        double pH = 7;

        // pH boundaries used to determine pH where charge is 0
        double lowpH = 0, highpH = 14;

        // Length of protein sequence
        int Plength = pro.length();

        // Total charge on the protein at specified pH, initialize to 1
        double charge = 1;

        // Type of AA: a - acid, b - base, n - neutral
        char type = 'n';

        // pK value of specified AA
        double pK = 0;

        // Calculate total charge at varying pH values until the
        // charge is within 0.005 of 0
        while (Math.abs(charge) >= .005) {

            // Reset charge to 0
            charge = 0;

            // Calculate the charge for each AA until reach end of sequence
            // Add the charge for each AA to the value of total charge
            for (int a = 0; a < Plength; a++) {

                // Determine appropriate pK value for current AA
                // If AA not acid or base, set to neutral
                // and give default pK of 0

                // pK values were obtained from Bjellqvist, B., Basse, B., Olsen, E.,
                // Celis, J., Reference points for comparisons of two-dimensional
                // maps of proteins from different human cell types defined in a
                // pH scale where isoelectric points correlate with polypeptide
                // compositions, Electro1DMain 1994, 15, 529-539.
                switch (pro.charAt(a)) {
                    case 'R':
                        type = 'b';
                        pK = 12;
                        break;
                    case 'D':
                        type = 'a';
                        pK = 4.05;
                        break;
                    case 'C':
                        type = 'a';
                        pK = 9;
                        break;
                    case 'E':
                        type = 'a';
                        pK = 4.75;
                        break;//pK = 4.45; break;
                    case 'H':
                        type = 'b';
                        pK = 5.98;
                        break;
                    case 'K':
                        type = 'b';
                        pK = 10;
                        break;
                    case 'Y':
                        type = 'a';
                        pK = 10;
                        break;
                    default:
                        type = 'n';
                        pK = 0;
                        break;
                }

                // Calculate charge for acids, then add to total charge
                if (type == 'a') {
                    charge += -1 /
                            (1 + Math.pow(10, pK - pH));
                }

                // Calculate charge for bases, then add to total charge
                if (type == 'b') {
                    charge += 1 / (1 + Math.pow(10, pH - pK));
                }
            }

            // Calculate charge on C-terminus and add to total charge
            charge += -1 /
                    (1 + Math.pow(10, 3.2 - pH));

            // Calculate charge on N-terminus and add to total charge
            charge += 1 / (1 + Math.pow(10, pH -/*9.53*/8.2));

            // If total charge is greater than +0.005, then
            // set pH to a higher value and recalculate charge
            if (charge > 0.005) {

                // Set lower pH limit to value of current pH
                lowpH = pH;

                // Set new pH to a value midway between current pH
                // and upper pH limit
                pH = (lowpH + highpH) / 2;
            }

            // If total charge is less than -0.005, then
            // set pH to a lower value and recalculate charge
            if (charge < -0.005) {

                // Set upper pH limit to value of current pH
                highpH = pH;

                // Set new pH to a value midway between current
                // pH and lower pH limit
                pH = (lowpH + highpH) / 2;
            }
        }
        return pH; // Method returns the pH at which charge is 0 (pI)
    }

    /**
     * This method calculates the molecular weight from inputted sequence
     *
     * @param pro protein sequence
     *
     * @return returns the molecular weight
     */
    public static double getMW(String pro) {

        // Length of protein sequence
        int Plength = pro.length();

        // Molecular weight of protein
        double weight = 0;//I( String pro ) {

        /* Determine the molecular weight for each AA until reach
       end of sequence. Add the weight for each AA to the value
	   of total weight. Since a water molecule (MW 18) is lost with
	   each bond, the weight given for each AA is its molecular
	   weight minus that of water. The MW of one water molecule is
	   then added to the total molecular weight of the protein sequence.
	   If the AA character does not match one of the 20 accepted
	   abbreviations, then a weight of 0 is given for that AA. */

        for (int f = 0; f < Plength; f++) {
            switch (pro.charAt(f)) {
                case 'A':
                    weight += 71.0938;
                    break;
                case 'R':
                    weight += 156.2022;
                    break;
                case 'N':
                    weight += 114.1188;
                    break;
                case 'D':
                    weight += 115.1036;
                    break;
                case 'C':
                    weight += 103.1538;
                    break;
                case 'Q':
                    weight += 128.1456;
                    break;
                case 'E':
                    weight += 129.1304;
                    break;
                case 'G':
                    weight += 57.067;
                    break;
                case 'H':
                    weight += 137.156;
                    break;
                case 'I':
                    weight += 113.1742;
                    break;
                case 'L':
                    weight += 113.1742;
                    break;
                case 'K':
                    weight += 128.1888;
                    break;
                case 'M':
                    weight += 131.2074;
                    break;
                case 'F':
                    weight += 147.1914;
                    break;
                case 'P':
                    weight += 97.1316;
                    break;
                case 'S':
                    weight += 87.0932;
                    break;
                case 'T':
                    weight += 101.12;
                    break;
                case 'W':
                    weight += 186.228;
                    break;
                case 'Y':
                    weight += 163.1908;
                    break;
                case 'V':
                    weight += 99.1474;
                    break;
                default:
                    weight += 0;
            }
        }

        // Add molecular weight of water to total weight
        weight += 18;

        // Return the molecular weight of the protein
        return weight;
    }

    /**
     * This method parses a .pdb file, extracting sequence information and
     * appropriate descriptor for the sequence.
     *
     * @param theFile   file to retrieve sequence data from
     * @param electro2D reference to calling applet
     * @param data      user-inputted file data
     * @param fileNum the file number
     */
    public static void pdbParse(String theFile, Electro2D electro2D,
                                String data, int fileNum) {
        //error in reading file?
        boolean anerror = false;

        //structures to hold file data
        Vector fileData = new Vector();  //holds complete file
        Vector compoundInfo = new Vector(); //holds COMPND tag data
        Vector sequenceInfo = new Vector(); //holds SEQRES tag data
        Vector keywordInfo = new Vector(); //holds KEYWDS info
        Vector moleculeTitles = new Vector(); //holds mol. titles
        Vector chainData = new Vector(); //holds chain designations
        Vector sequences = new Vector(); //holds sequence data
        Vector sequenceTitles = new Vector(); //holds sequence titles
        Vector functions = new Vector(); //holds protein function info
        Hashtable aminoConversions = new Hashtable(); //holds amino conversions
        String proteinFunction = ""; //holds the protein function
        String headerLine = ""; //holds the information from the HEADER line
        double maxPi = -1;
        double minPi = -1;
        double maxMW = -1;
        double minMW = -1;

        //file reading variable
        BufferedReader in = null;

        //structures to hold calculated MW and pI
        Vector molecularWeights = new Vector();
        Vector piValues = new Vector();

        //temporary variables used in parsing
        String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        String temp = "";
        String tempLabel = "";
        String proteinID = "";
        String chainValue = "";
        String totalChain = "";
        boolean hasMoleculeTag = true;
        boolean foundChain = false;
        boolean noChainData = false;
        boolean hasECnumber = false;
        int foundIndex = 0;

        if (data == null || data.equals("")) {  //read from server
            try {
                File f = new File("data" + File.separator + theFile);
                in = new BufferedReader
                        (new InputStreamReader(f.toURL().openStream()));
                String temp1;

                while ((temp1 = in.readLine()) != null) {

                    fileData.addElement(temp1);
                }
            } catch (Exception e) {
                MessageFrame error = new MessageFrame();
                error.setMessage("Error reading from file.  Be sure you " +
                        "typed the name correctly.");
                error.show();
                anerror = true;
                System.err.println("Exception was: " + e);
            }
        } else { //use data from textarea
            StringTokenizer fileSplitter = new StringTokenizer(data, "\r\n");
            while (fileSplitter.hasMoreTokens()) {
                fileData.addElement(fileSplitter.nextToken());
            }
        }
        if (anerror == false) {

            //assign protein ID based on file descriptor
            proteinID = theFile.substring(0, theFile.indexOf("."));

            //separate compound info and sequence info
            for (int x = 0; x < fileData.size(); x++) {
                temp = (String) fileData.elementAt(x);
                tempLabel = temp.substring(0, 6);

                if (tempLabel.equals("COMPND")) {
                    compoundInfo.addElement(temp);
                } else if (tempLabel.equals("SEQRES")) {
                    sequenceInfo.addElement(temp);
                }
                //if the label is KEYWDS store this in the keyword Info vector
                else if (tempLabel.equals("KEYWDS")) {
                    keywordInfo.addElement(temp);
                }
                //if the label is HEADER, store as the headerLine
                else if (tempLabel.equals("HEADER")) {
                    headerLine = temp;
                }
            }

            //determine whether or not the protein is an enzyme
            for (int i = 0; i < compoundInfo.size(); i++) {
                //if the COMPND section of the file listed an EC number,
                //the protein is an enzyme.  Store the information accordingly
                if (((String) compoundInfo.elementAt(i)).indexOf("EC\u003A") != -1) {
                    hasECnumber = true;
                    temp = (String) compoundInfo.elementAt(i);
                    temp = temp.substring(temp.indexOf("EC:") + 4, temp.indexOf(
                            "\u003B") + 1);
                    proteinFunction = proteinFunction + temp;
                }
            }
            if (hasECnumber) {
                proteinFunction = "Enzyme " + proteinFunction;
                int index = proteinFunction.indexOf(",");
                if (index != -1) {
                    proteinFunction = proteinFunction.replace(',', '\u003B');
                }
            }

            //determine the number of molecules
            for (int x = 0; x < compoundInfo.size(); x++) {
                temp = (String) compoundInfo.elementAt(x);
                if (temp.indexOf("MOLECULE:") != -1) {
                    temp = temp.substring(temp.indexOf("MOLECULE:") + 10);
                    temp = temp.trim();
                    moleculeTitles.addElement(temp);
                }
            }

            //if moleculeTitles is empty, pull main title from concatenating all
            //COMPND tags
            if (moleculeTitles.size() == 0) {

                totalChain = "";
                hasMoleculeTag = false;
                for (int x = 0; x < compoundInfo.size(); x++) {
                    temp = (String) compoundInfo.elementAt(x);
                    totalChain += ((String) compoundInfo.elementAt(x)).substring
                            (temp.indexOf("COMPND") + 10, temp.indexOf(proteinID));
                }

                //remove excess whitespace
                totalChain = totalChain.trim();
                for (int x = 0; x < totalChain.length(); x++) {
                    tempLabel = totalChain.substring(x, x + 1);
                    if (tempLabel.equals(" ")) {
                        tempLabel = totalChain.substring(x + 1, x + 2);
                        if (tempLabel.equals(" ")) {
                            //remove this extra space
                            totalChain = totalChain.substring(0, x + 1) +
                                    totalChain.substring(x + 2);

                            x -= 1;
                        }
                    }
                }

                //add temp to moleculeTitles
                moleculeTitles.addElement(totalChain);

            } else { //pull chain data

                int counter = 0; //sequenceTitle counter

                for (int x = 0; x < compoundInfo.size(); x++) {
                    temp = (String) compoundInfo.elementAt(x);
                    foundIndex = temp.indexOf("CHAIN:");
                    if (foundIndex != -1) {
                        //isolate first letter or number
                        tempLabel = temp.substring(foundIndex + 7, foundIndex + 8);
                        chainData.addElement(tempLabel);

                        sequenceTitles.addElement((String) moleculeTitles.
                                elementAt(counter));

                        while (temp.charAt(foundIndex + 8) == ',') {
                            temp = temp.substring(0, foundIndex + 7) +
                                    temp.substring(foundIndex + 10);

                            tempLabel = temp.substring(foundIndex + 7,
                                    foundIndex + 8);
                            chainData.addElement(tempLabel);
                            sequenceTitles.addElement((String) moleculeTitles.
                                    elementAt(counter));
                        }
                        counter++;
                    }
                }
            }

            //extract sequences

            //handle special case where there is no chain data
            temp = (String) sequenceInfo.elementAt(0);
            tempLabel = temp.substring(11, 12);
            if (tempLabel.equals(" ")) {
                noChainData = true;
                temp = "";
                //must be only one chain
                for (int x = 0; x < sequenceInfo.size(); x++) {
                    //may include whitespace
                    temp += ((String) sequenceInfo.elementAt(x)).substring(19, 70);
                    temp += " ";
                }

                //add sequence
                if (!(temp = temp.trim()).equals("")) {
                    sequences.addElement(temp);
                    sequenceTitles.addElement((String) moleculeTitles.elementAt(0));
                }

            } else if (hasMoleculeTag == false) {

	    /* handle special case where chains are lettered, but there
	       was no chain tag to tell which labels to look for */

                //cycle through the alphabet
                for (int whichChain = 0; whichChain < 26; whichChain++) {
                    //find the chain we're looking for
                    chainValue = alphabet.substring(whichChain, whichChain + 1);
                    totalChain = "";
                    foundChain = false;
                    for (int x = 0; x < sequenceInfo.size(); x++) {
                        temp = (String) sequenceInfo.elementAt(x);
                        tempLabel = temp.substring(11, 12);
                        if (tempLabel.equals(chainValue)) {
                            foundChain = true;
                            totalChain += ((String) sequenceInfo.elementAt(x)).
                                    substring(19, 70);
                            totalChain += " ";
                        }
                    }

                    //add chain data
                    if (foundChain == true) {
                        chainData.addElement(alphabet.substring
                                (whichChain, whichChain + 1));
                        //should only be one
                        sequenceTitles.addElement
                                ((String) moleculeTitles.elementAt(0));
                    }
                    //add sequence
                    if (!(totalChain = totalChain.trim()).equals("")) {
                        sequences.addElement(totalChain);
                    }
                }

            } else { //"normal" case, has predefined chain data

                for (int whichChain = 0; whichChain < chainData.size(); whichChain++) {
                    //find which chain we're looking for
                    chainValue = (String) chainData.elementAt(whichChain);
                    totalChain = "";
                    for (int x = 0; x < sequenceInfo.size(); x++) {
                        temp = (String) sequenceInfo.elementAt(x);
                        tempLabel = temp.substring(11, 12);
                        if (tempLabel.equals(chainValue)) {
                            totalChain += ((String) sequenceInfo.elementAt(x)).
                                    substring(19, 70);
                            totalChain += " ";
                        }
                    }

                    //add sequence
                    if (!(totalChain = totalChain.trim()).equals("")) {
                        sequences.addElement(totalChain);
                    }
                }
            }

            try {
                //read in aminoconversiontable
                File f = new File("./aminoconversiontable.txt");
                in = new BufferedReader(new InputStreamReader(
                        f.toURL().openStream()));

                while ((temp = in.readLine()) != null) {
                    aminoConversions.put(temp.substring(0, 3), temp.substring(4, 5));
                }
            } catch (Exception e) {
                System.err.println("Exception was: " + e);
            }

            //convert sequence data
            for (int x = 0; x < sequences.size(); x++) {
                totalChain = (String) sequences.elementAt(x);
                for (int y = 0; y < totalChain.length() - 2; y++) {
                    if (aminoConversions.containsKey(totalChain.substring(y, y + 3))) {
                        totalChain = totalChain.substring(0, y) +
                                (String) aminoConversions.get
                                        (totalChain.substring(y, y + 3)) +
                                totalChain.substring(y + 3);
                    }
                }

                totalChain = totalChain.trim(); //remove whitespace from ends
                //remove excess whitespace from middle
                for (int z = 0; z < totalChain.length(); z++) {
                    tempLabel = totalChain.substring(z, z + 1);
                    if (tempLabel.equals(" ")) {
                        totalChain = totalChain.substring(0, z) +
                                totalChain.substring(z + 1);

                        z -= 1;
                    }
                }

                sequences.setElementAt(totalChain, x);
            }

            //temp data storage
            double mW = 0.0;
            double pI = 0.0;
            String mWstring = "";
            String pIstring = "";

            // For each sequence in the file, determine the pI and MW
            for (int x = 0; x < sequences.size(); x++) {

                temp = (String) sequences.elementAt(x);

                // Determine the MW from the getMW method
                mW = getMW(temp);
                // Determine the pI from the getpI method
                pI = getpI(temp);
                // Convert the MW from a double to a string data type
                mWstring = String.valueOf(mW);
                // Set format to two decimal places
                if (mWstring.length() >
                        mWstring.indexOf('.') + 3) {

                    mWstring = mWstring.substring(0, mWstring.indexOf('.') + 3);
                }

                double doubleValue = Double.parseDouble(mWstring);
                if (minMW == -1 || doubleValue <= minMW) {
                    minMW = doubleValue;
                }
                if (maxMW == -1 || doubleValue >= maxMW) {
                    maxMW = doubleValue;
                }

                molecularWeights.addElement(mWstring);

                // Convert the pI from a double to a string data type
                pIstring = String.valueOf(pI);
                // Set format to two decimal places
                if (pIstring.length() > pIstring.indexOf('.') + 3) {
                    pIstring = pIstring.substring(0, pIstring.indexOf('.') + 3);
                }

                doubleValue = Double.parseDouble(pIstring);
                if (minPi == -1 || doubleValue <= minPi) {
                    minPi = doubleValue;
                }
                if (maxPi == -1 || doubleValue >= maxPi) {
                    maxPi = doubleValue;
                }

                piValues.addElement(pIstring);

            }

            //if the protein was an enzyme, store the EC number as the function
            if (hasECnumber) {
                for (int fcn = 0; fcn < sequenceTitles.size(); fcn++) {
                    functions.addElement(proteinFunction);
                }
            }
            //otherwise if there was a KEYWDS section, store the data from the
            //section as the protien function
            else if (keywordInfo.size() > 0) {
                for (int fcn = 0; fcn < keywordInfo.size(); fcn++) {
                    if (fcn == 0) {
                        temp = ((String) keywordInfo.elementAt(fcn)).substring(10);
                        //while( (temp.substring( temp.length() - 1 )).equals(" ")){
                        temp.trim();
                        // }
                    } else {
                        temp = temp +
                                ((String) keywordInfo.elementAt(fcn)).substring(10);
                        //  while((temp.substring(temp.length() - 1)).equals(" ")){
                        temp.trim();
                        //   }
                    }
                }
                proteinFunction = temp;
                for (int fcn = 0; fcn < sequenceTitles.size(); fcn++) {
                    functions.addElement(proteinFunction);
                }
            }
            //otherwise, if there was a header line, store the protein function
            //as the HEADER line
            else if (!headerLine.equals("")) {
                headerLine = headerLine.substring(10, 50);
                headerLine.trim();
                for (int fcn = 0; fcn < sequenceTitles.size(); fcn++) {
                    functions.addElement(headerLine);
                }
            }
            //otherwise, store the function as a null string ("")
            else {
                for (int fcn = 0; fcn < sequenceTitles.size(); fcn++) {
                    functions.addElement(proteinFunction);
                }
            }

            //set vectors in calling applet based on results of this file read
            if (fileNum == 1) {
                electro2D.setSequences(sequences);
                electro2D.setSequenceTitles(sequenceTitles);
                electro2D.setMolecularWeights(molecularWeights);
                electro2D.setPiValues(piValues);
                electro2D.setFunctionValues(functions);
                // store the file name in Electro2D.Electro2D
                electro2D.setLastFileLoaded(theFile);
                electro2D.setMaxAndMinVals(maxMW, minMW, maxPi, minPi);
            } else if (fileNum == 2) {
                electro2D.setSequences2(sequences);
                electro2D.setSequenceTitles2(sequenceTitles);
                electro2D.setMolecularWeights2(molecularWeights);
                electro2D.setPiValues2(piValues);
                electro2D.setFunctionValues2(functions);
                // store the file name in Electro2D.Electro2D
                electro2D.setLastFileLoaded(theFile);
                electro2D.setMaxAndMinVals(maxMW, minMW, maxPi, minPi);
            }

        }
        try {
            if (in != null) {
                in.close();
            }
        } catch (IOException e) {
        }

        Preprocessor p = new Preprocessor(electro2D);
        p.writeToFile();
    }

    /**
     * This method parses a FASTA file, extracting sequence information and
     * appropriate descriptor for the sequence.
     *
     * @param fileNum the file number
     * @param theFile the file
     * @param electro2D electro2D reference
     * @param data the data
     */
    public static void fastaParse(String theFile, Electro2D electro2D,
                                  String data, int fileNum) {

        //was there an error in file reading?
        boolean anerror = false;

        //structures to hold file data
        Vector fileData = new Vector();  //holds complete file
        Vector chainData = new Vector(); //holds chain designations
        Vector sequences = new Vector(); //holds sequence data
        Vector sequenceTitles = new Vector(); //holds sequence titles
        Vector functions = new Vector(); //holds the protein functions
        double maxMW = -1;
        double minMW = -1;
        double maxPi = -1;
        double minPi = -1;
        double doubleVal;

        //file reading variable
        BufferedReader in = null;

        //structures to hold calculated MW and pI
        Vector molecularWeights = new Vector();
        Vector piValues = new Vector();

        //temporary variables used in parsing
        String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        String temp = "";
        String proteinID = "";
        String totalChain = "";
        boolean foundChain = false;
        boolean noChainData = false;
        int foundIndex = 0;

        if (data == null || data.equals("")) {  //read from server

            try {
                File f = new File("data" + File.separator + theFile);
                in = new BufferedReader
                        (new InputStreamReader(f.toURL().openStream()));
                String temp1;

                while ((temp1 = in.readLine()) != null) {

                    fileData.addElement(temp1);
                }
            } catch (Exception e) {
                MessageFrame error = new MessageFrame();
                error.setMessage("Error reading from file.  Be sure you " +
                        "typed the name correctly.");
                error.show();
                anerror = true;
                System.err.println("Exception was: " + e);
            }
        } else { //use data from textarea
            StringTokenizer fileSplitter = new StringTokenizer(data, "\r\n");
            while (fileSplitter.hasMoreTokens()) {
                fileData.addElement(fileSplitter.nextToken());
            }
        }

        if (anerror == false) {

            //assign protein ID based on file descriptor
            proteinID = theFile.substring(0, theFile.indexOf("."));

            for (int x = 0; x < fileData.size(); x++) {

                temp = (String) fileData.elementAt(x);
                if (temp.substring(0, 1).equals(">")) { //we know it's a header line

                    //if it's not the first line in the file
                    if (x > 0) {
                        //add the previous sequence
                        sequences.addElement(totalChain);
                    }

                    //add chain data
                    if (temp.indexOf(":") != -1) {

                        if (temp.indexOf("|") != -1 && temp.indexOf("|") <
                                temp.indexOf(":")) {
                            //this is most likely not chain data, so don't add
                        } else {
                            chainData.addElement(temp.substring
                                    (temp.indexOf(":") +
                                            1, temp.indexOf(":") + 2));
                        }
                    }

                    //add sequence title

                    // Edited 6/12/03 - Need to include whole line to
                    // account for possibility of different proteins with
                    // same name but different data.

                    //just add the whole line
                    sequenceTitles.addElement(temp.substring
                            (temp.indexOf(">") + 1));
                    //the function of the protein is the same as its title,
                    //minus the identification numbers
                    functions.addElement(temp.substring(temp.lastIndexOf("|")
                            + 1));

                    totalChain = "";

                } else {
                    //must be part of a sequence
                    totalChain += temp;

                    if (x == fileData.size() - 1) {
                        //add this final sequence
                        sequences.addElement(totalChain);
                    }
                }
            }

            //temp data storage
            double mW = 0.0;
            double pI = 0.0;
            String mWstring = "";
            String pIstring = "";

            // For each sequence in the file, determine the pI and MW
            for (int x = 0; x < sequences.size(); x++) {

                temp = (String) sequences.elementAt(x);

                // Determine the MW from the getMW method
                mW = getMW(temp);
                // Determine the pI from the getpI method
                pI = getpI(temp);
                // Convert the MW from a double to a string data type
                mWstring = String.valueOf(mW);
                // Set format to two decimal places
                if (mWstring.length() >
                        mWstring.indexOf('.') + 3) {

                    mWstring = mWstring.substring(0, mWstring.indexOf('.') + 3);
                }

                doubleVal = Double.parseDouble(mWstring);
                if (minMW == -1 || doubleVal <= minMW) {
                    minMW = doubleVal;
                }
                if (maxMW == -1 || doubleVal >= maxMW) {
                    maxMW = doubleVal;
                }

                molecularWeights.addElement(mWstring);

                // Convert the pI from a double to a string data type
                pIstring = String.valueOf(pI);
                // Set format to two decimal places
                if (pIstring.length() > pIstring.indexOf('.') + 3) {
                    pIstring = pIstring.substring(0, pIstring.indexOf('.') + 3);
                }

                doubleVal = Double.parseDouble(pIstring);
                if (minPi == -1 || doubleVal <= minPi) {
                    minPi = doubleVal;
                }
                if (maxPi == -1 || doubleVal >= maxPi) {
                    maxPi = doubleVal;
                }

                piValues.addElement(pIstring);

            }

            //set vectors in calling applet based on results of this file read
            if (fileNum == 1) {
                electro2D.setSequences(sequences);
                electro2D.setSequenceTitles(sequenceTitles);
                electro2D.setMolecularWeights(molecularWeights);
                electro2D.setPiValues(piValues);
                electro2D.setFunctionValues(functions);
                // store the file name in Electro2D.Electro2D
                electro2D.setLastFileLoaded(theFile);
                electro2D.setMaxAndMinVals(maxMW, minMW, maxPi, minPi);
            } else if (fileNum == 2) {
                electro2D.setSequences2(sequences);
                electro2D.setSequenceTitles2(sequenceTitles);
                electro2D.setMolecularWeights2(molecularWeights);
                electro2D.setPiValues2(piValues);
                electro2D.setFunctionValues2(functions);
                // store the file name in Electro2D.Electro2D
                electro2D.setLastFileLoaded(theFile);
                electro2D.setMaxAndMinVals(maxMW, minMW, maxPi, minPi);
            }
        }
        try {
            if (in != null) {
                in.close();
            }
        } catch (IOException e) {
        }

        Preprocessor p = new Preprocessor(electro2D);
        p.writeToFile();

    }

    /**
     * This method parses a .gbk file, extracting sequence information and
     * appropriate descriptor for the sequence.
     *
     * @return 0 on success, 1 on error
     *
     * @param data the data
     * @param fileNum the file number
     * @param electro2D electro2D reference
     * @param theFile the file
     */
    public static int gbkParse(String theFile, Electro2D electro2D,
                               String data, int fileNum) {

        //was there an error in file reading?
        boolean anerror = false;

        //structures to hold file data
        String organismID = "";
        String organismTitle = "";
        Vector fileData = new Vector();  //holds complete file
        Vector sequences = new Vector(); //holds sequence data
        Vector sequenceTitles = new Vector(); //holds sequence titles
        Vector functions = new Vector(); //holds protein functions
        double doubleVal;
        double minMW = -1;
        double maxMW = -1;
        double maxPi = -1;
        double minPi = -1;

        //file reading variable
        BufferedReader in = null;

        //structures to hold calculated MW and pI
        Vector molecularWeights = new Vector();
        Vector piValues = new Vector();

        //temporary variables used in parsing
        String temp = "";
        String totalChain = "";
        boolean foundTranslation = false;
        boolean foundGene = false;
        String function = "";
        boolean hadFunctionLine = false;
        boolean hadEnzymeClassNumber = false;

        if (data == null || data.equals("")) {  //read from server
            try {
                File f = new File("data" + File.separator + theFile);
                in = new BufferedReader
                        (new InputStreamReader((/*electro2D.getCodeBase()*/
						   /* "data/" + theFile*/
                                f.toURL()).openStream()));
                String temp1;

                while ((temp1 = in.readLine()) != null) {

                    fileData.addElement(temp1);
                }
            } catch (Exception e) {
                MessageFrame error = new MessageFrame();
                error.setMessage("Error reading from file.  Be sure you " +
                        "typed the name correctly.");
                error.show();

                anerror = true;
                System.err.println("Exception was: " + e);
            }
        } else { //use data from textarea
            StringTokenizer fileSplitter = new StringTokenizer(data, "\r\n");
            while (fileSplitter.hasMoreTokens()) {
                fileData.addElement(fileSplitter.nextToken());
            }
        }

        if (anerror == false) {

            //assign organism ID based on file descriptor
            organismID = theFile.substring(0, theFile.indexOf("."));

            for (int x = 0; x < fileData.size(); x++) {

                temp = (String) fileData.elementAt(x);

                if (temp.length() >= 10 &&
                        temp.substring(0, 10).equals("DEFINITION")) {
                    //assign organism title
                    organismTitle = temp.substring(12);
                }
                //look for a title for this sequence
                if (temp.length() >= 9 && temp.substring(5, 9).equals("gene")) {

                    //check to see if there was a translation for previous gene;
                    //if not, replace old gene with this gene
                    if (foundTranslation == false && sequenceTitles.size() >= 1) {
                        sequenceTitles.removeElementAt(sequenceTitles.size() - 1);
                    }
                    //add sequence title
                    while (foundGene == false) {
                        if (temp.length() >= 26 &&
                                temp.substring(21, 26).equals("/gene")) {
                            foundGene = true;
                        } else {
                            x++;
                            if (x < fileData.size()) {
                                temp = (String) fileData.elementAt(x);
                            } else {
                                return 1; //error code
                            }
                        }
                    }
                    sequenceTitles.addElement(temp.substring
                            (28, temp.lastIndexOf("\"")));
                    foundGene = false;
                    foundTranslation = false;
                }
                //here is where the sequence data should be
                //as well as information about the protein function
                if (temp.length() >= 8 && temp.substring(5, 8).equals("CDS")) {

                    while (foundTranslation == false) {
                        if (temp.length() >= 33 &&
                                temp.substring(21, 33).equals("/translation")) {
                            foundTranslation = true;
                        }
                        //if the line contains the enzyme commission number
                        //the protein function is an Enzyme
                        else if (temp.length() >= 33 &&
                                temp.substring(21, 31).equals("/EC_number")) {
                            if (function.equals("")) {
                                temp = temp.substring(33, temp.lastIndexOf("\""));
                                function = "Enzyme " + temp + "\u003B";
                            } else {
                                temp = temp.substring(33, temp.lastIndexOf("\""));
                                function = function + " " + temp + "\u003B";
                            }
                            x++;
                            if (x < fileData.size()) {
                                temp = (String) fileData.elementAt(x);
                            } else {
                                return 1; //error code
                            }
                        }
                        //if the line is the function line then its contents are
                        //included in the protein function
                        else if (temp.length() >= 30 &&
                                temp.substring(21, 30).equals("/function")) {
                            hadFunctionLine = true;
                            if (temp.substring(32).lastIndexOf("\"") != -1) {
                                temp = temp.substring(32);
                                function = function + " " + temp.substring(0,
                                        temp.lastIndexOf("\"")) + ".";
                            } else {
                                temp = temp.substring(32);
                                function = function + " " + temp;
                                x = x + 1; //jump to next line
                                temp = (String) fileData.elementAt(x);
                                while (temp.lastIndexOf("\"") == -1) {
                                    function = function + " " +
                                            temp.substring(21);
                                    x = x + 1;
                                    if (x < fileData.size()) {
                                        temp = (String) fileData.elementAt(x);
                                    } else {
                                        return 1; //error code
                                    }
                                }
                                function = function + temp.substring(21,
                                        temp.lastIndexOf("\"")) + ".";
                            }

                            x++;
                            if (x < fileData.size()) {
                                temp = (String) fileData.elementAt(x);
                            } else {
                                return 1; //error code
                            }
                        }
                        //if the line is the section containing notes about the
                        //protein, its contents are included in the function
                        else if (temp.length() >= 27 &&
                                temp.substring(21, 26).equals("/note")) {
                            if ((function.indexOf("unknown.") != -1) ||
                                    function.equals("")) {
                                hadFunctionLine = false;
                                function = "";
                            }
                            if (temp.substring(28).lastIndexOf("\"") != -1) {
                                temp = temp.substring(28);
                                function = function + " " + temp.substring(0,
                                        temp.lastIndexOf("\"")) + ".";
                            } else {
                                temp = temp.substring(28);
                                function = function + " " + temp;
                                x = x + 1;
                                temp = (String) fileData.elementAt(x);
                                while (temp.lastIndexOf("\"") == -1) {
                                    function = function + " " +
                                            temp.substring(21);
                                    x = x + 1;
                                    if (x < fileData.size()) {
                                        temp = (String) fileData.elementAt(x);
                                    } else {
                                        return 1; //error code
                                    }
                                }
                                function = function + " " + temp.substring(21,
                                        temp.lastIndexOf("\"")) + ".";
                            }

                            x++;
                            if (x < fileData.size()) {
                                temp = (String) fileData.elementAt(x);
                            } else {
                                return 1; //error code
                            }
                        }
                        //if the line is the product information of the protein,
                        //its contents are included in the function
                        else if (temp.length() >= 30 &&
                                temp.substring(21, 29).equals("/product")) {
                            if (temp.substring(31).lastIndexOf("\"") != -1) {
                                temp = temp.substring(31);
                                function = function + " " + temp.substring(0,
                                        temp.lastIndexOf("\"")) + ".";
                            } else {
                                temp = temp.substring(31);
                                function = function + " " + temp;
                                x = x + 1;
                                temp = (String) fileData.elementAt(x);
                                while (temp.lastIndexOf("\"") == -1) {
                                    function = function + " " +
                                            temp.substring(21);
                                    x = x + 1;
                                    if (x < fileData.size()) {
                                        temp = (String) fileData.elementAt(x);
                                    } else {
                                        return 1;
                                    }
                                }
                                function = function + " " + temp.substring(21,
                                        temp.lastIndexOf("\"")) + ".";
                            }

                            x++;
                            if (x < fileData.size()) {
                                temp = (String) fileData.elementAt(x);
                            } else {
                                return 1; //error code
                            }
                        }

                        //otherwise move to next line
                        else {
                            x++;
                            if (x < fileData.size()) {
                                temp = (String) fileData.elementAt(x);
                            } else {
                                System.err.println("Error! Protein lacking " +
                                        "sequence.");
                                return 1; //error code
                            }
                        }
                    }
                    if (temp.length() >= 35 && temp.substring(35).lastIndexOf("\"") != -1) {
                        temp = temp.substring(35);
                        //add first line
                        totalChain += temp.substring(0, temp.lastIndexOf("\""));
                    } else /*if( temp.length() >= 35 )*/ {

                        //add first line
                        totalChain += temp.substring(35);
                        x++; //jump to next line
                        temp = (String) fileData.elementAt(x);

                        //add remaining lines
                        while (temp.lastIndexOf("\"") == -1) {

                            totalChain += temp.substring(21);
                            x++;
                            if (x < fileData.size()) {
                                temp = (String) fileData.elementAt(x);
                            } else {
                                return 1;
                            }
                        }

                        //add last line
                        totalChain += temp.substring(21, temp.lastIndexOf("\""));
                    }

                    sequences.addElement(totalChain); //add the sequence
                    totalChain = ""; //reset for next chain
                    functions.addElement(function); //add the function
                    function = ""; //reset for next chain
                    hadEnzymeClassNumber = false;
                    hadFunctionLine = false;
                }
            }

            //temp data storage
            double mW = 0.0;
            double pI = 0.0;
            String mWstring = "";
            String pIstring = "";

            // For each sequence in the file, determine the pI and MW
            for (int x = 0; x < sequences.size(); x++) {

                temp = (String) sequences.elementAt(x);

                // Determine the MW from the getMW method
                mW = getMW(temp);
                // Determine the pI from the getpI method
                pI = getpI(temp);
                // Convert the MW from a double to a string data type
                mWstring = String.valueOf(mW);
                // Set format to two decimal places
                if (mWstring.length() >
                        mWstring.indexOf('.') + 3) {

                    mWstring = mWstring.substring(0, mWstring.indexOf('.') + 3);
                }

                doubleVal = Double.parseDouble(mWstring);
                if (minMW == -1 || doubleVal <= minMW) {
                    minMW = doubleVal;
                }
                if (maxMW == -1 || doubleVal >= maxMW) {
                    maxMW = doubleVal;
                }

                molecularWeights.addElement(mWstring);

                // Convert the pI from a double to a string data type
                pIstring = String.valueOf(pI);
                // Set format to two decimal places
                if (pIstring.length() > pIstring.indexOf('.') + 3) {
                    pIstring = pIstring.substring(0, pIstring.indexOf('.') + 3);
                }

                doubleVal = Double.parseDouble(pIstring);
                if (minPi == -1 || doubleVal <= minPi) {
                    minPi = doubleVal;
                }
                if (maxPi == -1 || doubleVal >= maxPi) {
                    maxPi = doubleVal;
                }

                piValues.addElement(pIstring);

            }
            //set vectors in calling applet based on results of this file read
            if (fileNum == 1) {
                electro2D.setSequences(sequences);
                electro2D.setSequenceTitles(sequenceTitles);
                electro2D.setMolecularWeights(molecularWeights);
                electro2D.setPiValues(piValues);
                electro2D.setFunctionValues(functions);
                // store the file name in Electro2D.Electro2D
                electro2D.setLastFileLoaded(theFile);
                electro2D.setMaxAndMinVals(maxMW, minMW, maxPi, minPi);
            } else if (fileNum == 2) {
                electro2D.setSequences2(sequences);
                electro2D.setSequenceTitles2(sequenceTitles);
                electro2D.setMolecularWeights2(molecularWeights);
                electro2D.setPiValues2(piValues);
                electro2D.setFunctionValues2(functions);
                // store the file name in Electro2D.Electro2D
                electro2D.setLastFileLoaded(theFile);
                electro2D.setMaxAndMinVals(maxMW, minMW, maxPi, minPi);
            }
        }
        try {
            if (in != null) {
                in.close();
            }
        } catch (IOException e) {
        }

        // store the file name in Electro2D.Electro2D
        electro2D.setLastFileLoaded(theFile);

        Preprocessor p = new Preprocessor(electro2D);
        p.writeToFile();

        return 0;
    }

    /**
     * This method parses a .e2d file, extracting sequence information and
     * appropriate descriptor for the sequence.
     *
     * @param data the data
     * @param electro2D electro2D reference
     * @param fileNum the file number
     * @param theFile the file to be parsed
     * @return 0 on success, 1 on error
     */
    public static int e2dParse(String theFile, Electro2D electro2D, String data, int fileNum) {
        File f = new File("data" + File.separator + theFile);
        BufferedReader in = null;
        try {
            in = new BufferedReader(new InputStreamReader(f.toURL().openStream()));

        } catch (Exception e) {
            System.err.println("Error reading from file.  Double-check the file name and try again.");
        }
        Preprocessor.readFromFile(in, electro2D, fileNum);
        //	electro2D.setLastFileLoaded( theFile );
        return 0;
    }

} //MolWT

redpajama_set_name: RedPajamaGithub


The traditional program for the cluster will meet at St. Paul, Newhall.
Come pray the Stations of the Cross with us during the Lenten Season.
Please join us in the parish basement for our meeting.
First Communion will be celebrated at the four masses this weekend. Please join us and congratulate our Second Grade students.


text:
Norfolk IT consultant drowned in Cyprus, inquest hears
Norwich Coroners Court. Picture: ANTONY KELLY - Credit: Archant
An IT consultant from Cromer was found face down in the sea while in Cyprus, an inquest heard.
Ralph Raby, 70, of Louden Road, drowned in the coastal village of Kapparis, near Paralimni, on August 28 this year.
At the opening of his inquest in Norwich on Monday, assistant coroner Yvonne Blake said Mr Raby was found face down in the sea by his family members.
She said they carried out CPR, but he could not be revived and was declared dead in hospital.
His medical cause of death was given as asphyxia due to drowning in water.
The inquest was adjourned until November 5 at 11.30am.
Ms Blake also opened an inquest into the death of Tracy Salmon, who was found having a cardiac arrest at her home in Gorleston.
The 47-year-old, of Forsythia Road, was taken to the James Paget Hospital, but could not be revived.
She died on April 23. Her medical cause of death was given as a brain haemorrhage as a result of a fall.
The inquest was adjourned until January 23, 2019.

redpajama_set_name: RedPajamaCommonCrawl


text:
Charities Act 2011
Indemnity insurance for charity...
Previous: Provision
Next: Provision
Correction Slip - 02/08/2012
This is the original version (as it was originally enacted).
189Indemnity insurance for charity trustees and trustees
(1)The charity trustees of a charity may arrange for the purchase, out of the funds of the charity, of insurance designed to indemnify the charity trustees or any trustees for the charity against any personal liability in respect of—
(a)any breach of trust or breach of duty committed by them in their capacity as charity trustees or trustees for the charity, or
(b)any negligence, default, breach of duty or breach of trust committed by them in their capacity as directors or officers of—
(i)the charity (if it is a body corporate), or
(ii)any body corporate carrying on any activities on behalf of the charity.
(2)But the terms of such insurance must be so framed as to exclude the provision of any indemnity for a person ("P") in respect of—
(a)any liability incurred by P to pay—
(i)a fine imposed in criminal proceedings, or
(ii)a sum payable to a regulatory authority by way of a penalty in respect of non-compliance with any requirement of a regulatory nature (however arising),
(b)any liability incurred by P in defending any criminal proceedings in which P is convicted of an offence arising out of any fraud or dishonesty, or wilful or reckless misconduct, by P, or
(c)any liability incurred by P to the charity that arises out of any conduct—
(i)which P knew (or must reasonably be assumed to have known) was not in the interests of the charity, or
(ii)in the case of which P did not care whether it was in the best interests of the charity or not.
(3)For the purposes of subsection (2)(b)—
(a)the reference to any such conviction is a reference to one that has become final,
(b)a conviction becomes final—
(i)if not appealed against, at the end of the period for bringing an appeal, or
(ii)if appealed against, at the time when the appeal (or any further appeal) is disposed of, and
(c)an appeal is disposed of—
(i)if it is determined and the period for bringing any further appeal has ended, or
(ii)if it is abandoned or otherwise ceases to have effect.
(4)The charity trustees of a charity may not purchase insurance under this section unless they decide that they are satisfied that it is in the best interests of the charity for them to do so.
(5)The duty of care in section 1(1) of the Trustee Act 2000 applies to a charity trustee when making such a decision.
(6)This section—
(a)does not authorise the purchase of any insurance whose purchase is expressly prohibited by the trusts of the charity, but
(b)has effect despite any provision prohibiting the charity trustees or trustees for the charity receiving any personal benefit out of the funds of the charity.
PrintThe Whole Act
PDF The Whole Act
Web page The Whole Act
PrintThe Whole Part
PDF The Whole Part
Web page The Whole Part
PrintThe Whole Cross Heading
PDF The Whole Cross Heading
Web page The Whole Cross Heading
Web page This Section only
You have chosen to open The Whole Act
The Whole Act you have selected contains over 200 provisions and might take some time to download. You may also experience some issues with your browser, such as an alert box that a script is taking a long time to run.
Continue to open
You have chosen to open The Whole Act as a PDF
The Whole Act you have selected contains over 200 provisions and might take some time to download.
You have chosen to open The Whole Act without Schedules
The Whole Act without Schedules you have selected contains over 200 provisions and might take some time to download. You may also experience some issues with your browser, such as an alert box that a script is taking a long time to run.
You have chosen to open The Whole Act without Schedules as a PDF
The Whole Act without Schedules you have selected contains over 200 provisions and might take some time to download.
You have chosen to open Schedules only
The Schedules you have selected contains over 200 provisions and might take some time to download. You may also experience some issues with your browser, such as an alert box that a script is taking a long time to run.
Legislation is available in different versions:
Latest Available (revised):The latest available updated version of the legislation incorporating changes made by subsequent legislation and applied by our editorial team. Changes we have not yet applied to the text, can be found in the 'Changes to Legislation' area.
Original (As Enacted or Made): The original version of the legislation as it stood when it was enacted or made. No changes have been applied to the text.
Different options to open legislation in order to view more content on screen at once
Access essential accompanying documents and information for this legislation item from this tab. Dependent on the legislation item being viewed this may include:
the original print PDF of the as enacted version that was used for the print copy
lists of changes made by and/or affecting this legislation item
confers power and blanket amendment details
all formats of all associated documents
correction slips
links to related legislation and further information resources
Use this menu to access essential accompanying documents and information for this legislation item. Dependent on the legislation item being viewed this may include:
Click 'View More' or select 'More Resources' tab for additional information including:
All content is available under the Open Government Licence v3.0 except where otherwise stated. This site additionally contains content derived from EUR-Lex, reused under the terms of the Commission Decision 2011/833/EU on the reuse of documents from the EU institutions. For more information see the EUR-Lex public statement on re-use.
© Crown and database right


** We prefer teachers who are already in Beijing or in China. If you're abroad now, we hope you can enter China immediately with a 90 days' work visa (we can help apply for your Work Permit Notice)or other type of long term visa before the course starting schedule.
Teaching Place: In a state owned company training center located in Mentougou District of Beijing.
1.	Free bus from Beijing Foreign Studies University in Haidian to the teaching place in Mentougou each morning and afternoon.
2.	Free lunches and rooms for noon breaks every day.
3.	If you can provide the complete documents for work visa, we can assist in work visa appliacation process, and when the program is completed, we can help you transfer to your new employer in one month or cancel it.
4.	We can assist in house renting and provide part of housing allowance.


text:
import axios from 'axios';

export const FETCH_ISSUES = 'FETCH_ISSUES';
export const FETCH_ISSUE='FETCH_ISSUE';
export const FETCH_REPRESENTATIVES='FETCH_REPRESENTATIVES';
export const FETCH_BRAINTREE_TOKEN='FETCH_BRAINTREE_TOKEN';
export const SEND_POSTCARDS='SEND_POSTCARDS';

export function fetchIssues() {
	const request = axios.get(`/api/issues`)

	return {
		type: FETCH_ISSUES,
		payload: request
	};
}


text:
Judges Guidelines
Standard Piano List
Standard Percussion List
Room Captains
Sheet Music Download
Supporting the Arts for Over 40 Years
MICHIGAN MUSIC ASSOCIATION
Serving the arts for over 50 years
State Competiton
February 17-19 2023
Amway Grand Plaza
Contest Info
Scholarships/Poems/Cover Submissions
Open Division Review
Open Winners List
Q. Who can join and how do I become a member of MMA?
A. MMA is open to all private music teachers currently teaching in the state of Michigan. The membership form can be found here.
Q. What is my obligation to MMA if I become a member?
A. We ask that you take active part in the events that are planned. If you enter students in the competition, you are expected to room captain for your scheduled time.
Q. How can I support MMA in other ways?
A. Sheet Music Plus offers a percentage of any sales made through their website. Also visit www.goodsearch.com, select MMA as your organization, and we receive a donation for each search or purchase you make through the site. Donations are warmly accepted. (Tax deductible)
Q. What students are eligible to go to competition?
A. One whose teacher is a member of MMA.
Q. Is there an age limit on contestants?
A. Yes, students must be between the ages of 5 and 18. We do offer an Adult Hobbyist Division.
Q. Is there a dress code at competition?
A. We ask that all students dress appropriately. Please refrain from tennis shoes and jeans.
Q. Do I have to stay in the room till my whole group is finished performing?
A. No, we understand that you may have other performances to attend, however never leave or enter a room during a performance.
Q. Are photocopies allowed for performance?
A. No, all events (solos, duets, ensembles, etc.) must supply a separate original copy of the music for the judge. If a song is out of print, you must get permission from the publisher to copy the music.
Q. Am I allowed to use downloaded music?
A. Any downloaded music must be accompanied by a completed, signed internet music form, and the music must meet the specifications outlined on the form. Failure to provide this completed form to the judge will result in disqualification.
Q. Do I have to go to the luncheon?
A. The luncheon is highly encouraged. It is the culmination of the competition. Also, if the attendance is poor, the hotel costs increase and this increase is passed on to those attending.
Q. Do I have to attend the awards?
A. Someone who represents the teacher, studio, or student must be present at the awards. We do not ship unclaimed trophies.
Open division participants are expected to be at the awards in the event they win and will perform their piece at the awards ceremony.
Q. Do I have to play a different song in each division and do they need to be memorized?
A. Yes, you must play a different song for each division with the exception of evaluation. All events must be memorized with these exceptions: All evaluations-except vocal divisions-All duets except vocal divisions-All ensembles except vocal divisions.
Scholarship Winners for 2023
Click Here for Hotel Reservations


text:
Q: error= ImportError: cannot import name 'comb' #ImportError: cannot import name 'comb'

import scipy
from scipy.misc import comb

# Loading the vectorizer and classfier
with open('classifier.pickle','rb') as f:
classifier = pickle.load(f)

with open('tfidfmodel.pickle','rb') as f:
vectorizer = pickle.load(f)

both the files classifier.pickle and tfid.pickle as kept in same folder

A: This has nothing to do with the location of classifier or vectorizer (tfid does not appear in your question).
This is an import error, due to the fact that comb was moved to scipy.special. This would've been easy to find by googling "scipy.misc.comb" and seeing the result "scipy.special.comb" fairly high.

redpajama_set_name: RedPajamaStackExchange


We were delighted to run the first RE Quality Mark conference for school leaders whose schools have achieved the REQM award. Generously supported by the Hockerill Foundation, the conference focused on sharing examples of high quality practice which enabled schools to achieve the award. The keynote was given by Dr Mark Chater who scoped the opportunities as well as the challenges for RE leaders and encouraged delegates to take advantage of and contribute to the new cpd opportunities emerging through RE hubs. 7 subject leaders led sessions about enquiry based learning, the usefulness of networking, RE in a special school, spiritual development and RE, using ICT in RE and high quality learning in RE.
On Monday 7th October REQM Project Managers Jane Brooke and Mary Myatt led the assessor training for REQM Wales.
There were 7 assessors including four from schools which had received the award.
The Keswick Hall Trust has generously given funding for 6 REQM school in the Eastern region to work with 12 new schools to create REQM hubs through networks.
The project managers presented at the CStG Leaders Weekend in September.
Jane Brooke has started a pilot with Chester university on action research with teachers in a small group of REQM schools as part of project to encourage teachers to study for an MA.
high achieving young people who have worked very hard in a subject that is so important and so much fun to do.
RE Quality Mark Project Manager Jane Brooke, introduced the formal part of the afternoon, first by thanking Baroness Perry for hosting the event at the House of Lords and for the opportunity to celebrate the launch of the RE Quality Mark.
Students from RE Quality Mark award winning schools and RE Council Young Ambassadors for RE made presentations to MPs in the All Part Parliamentary Parliamentary Group (APPG) for RE.
A journalist from Sec-Ed, a national magazine for secondary education reported the story.
Read the full acount on the RE Council website.


text:
Dmitry Bivol: 'Jean Pascal is a very aggressive fighter, I look forward to a real war with him'
Photo by Amanda Westcott/SHOWTIME
by Anson Wainwright
The unbeaten Dmitry Bivol will put his WBA light heavyweight title on the line against former champion Jean Pascal at the Mark G. Etess Arena, Hard Rock Hotel and Casino in Atlantic City on Saturday.
Bivol, who is rated No. 2 by The Ring at 175 pounds, is headlining on HBO for the first time in one of the network's final boxing shows. Pascal is the biggest name the Russian power-puncher has faced to date.
"He is a very aggressive and exciting fighter, I look forward to a real war with him," Bivol (14-0, 11 knockouts) told The Ring through Alik Frolov. "He is a very good counterpuncher and very experienced. I think this will be an action-filled fight."
Following an excellent amateur career, Pascal (33-5-1, 20 knockouts) turned professional in February 2005 and won his first 21 fights before losing a WBC 168-pound title fight to Carl Froch.
However, Pascal had significant success at light heavyweight, winning the vacant WBC belt and The Ring championship with wins over Adrian Diaconu and Chad Dawson respectively. Pascal was eventually dethroned by the legendary Bernard Hopkins, and he also suffered a brace of world title defeats to then-unified champion Sergey Kovalev.
Despite earlier championship success, the challenger has seen better days and is no longer at his athletic peak. In fact, this is likely to be Pascal's last opportunity to win a world title, although Bivol, 27, refuses to look past him.
"I think he is always very dangerous," said the defending titleholder who has sparred with Pascal previously. "He has won many fights, even in the last year. When Hopkins fought Pascal, he was 40 and Pascal 28, and that was a very interesting fight."
Bivol has had an excellent breakthrough year, stopping Sullivan Barrera in the final round in March and outpointing the always awkward Isaac Chilemba in August.
His manager Vadim Kornilov expects his charge to continue to strive toward the summit of the light heavyweight division next year.
"Dmitry always talks about becoming undisputed champion of the light heavyweight division," said Kornilov. "We look forward to taking the first steps towards that goal in the next year."
Questions and/or comments can be sent to Anson at [email protected] and you can follow him on Twitter @AnsonWainwright
Struggling to locate a copy of The Ring Magazine? Try here or
You can order the current issue, which is on newsstands, or back issues from our subscribe page.
SIGN UP TO GET RING NEWS ALERTS
Thanks for signing up! Check your inbox or spam folder to confirm your subscription.


This item is out of stock for the season. Check back in the Spring!
It's so crazy, it just might work! We have fused the best condiment (BBQ sauce) with the best dessert (cotton candy) and the result is phenomenal. Savory and sweet, Sugar High BBQ Sauce Cotton Candy is the ideal addition to any cook-out.


Amy, you already have a glow about you. Please don't over do it next week. Hope your recheck apt goes well Monday.
I agree with Cheryl. You look lovely and I hope you continue to bounce back amidst school and getting into a routine!
You are beautiful. Your life is so full of courage, joy and grace - i am so glad i happened upon your blog. Thank you for sharing yourself with the world, i was feeling really down tonight but you've inspired me so much!


text:
The Comet > News > Health
COVID A Year On - How have residents fared during the pandemic?
Published: 10:15 AM March 23, 2021
Comet readers from Stevenage and North Herts responded to our survey on how they have fared during COVID-19 - Credit: PA
Last week we asked people across Stevenage and North Herts how they have found the past year of social distancing and lockdown restrictions.
Nearly 200 people responded to the survey, with results showing the impact the coronavirus pandemic has had on people's lives.
In Stevenage, 36 per cent of respondents said their priorities had changed a great deal since the pandemic began, with only 11 per cent saying their priorities had not changed at all. Meanwhile in North Herts 23 per cent said their priorities had substantially changed.
Sixty-six per cent of those who responded from Stevenage said their mental health has been worse than usual over the last 12 months, with 63 per cent saying their physical activity has decreased.
In North Herts, 72 per cent have experienced worsening mental health, and 56 per cent have seen a decline in their physical activity.
When it comes to employment, 22 per cent of Stevenage respondents and 17 per cent of North Herts respondents have suffered a job loss as a result of COVID-19.
Among those currently employed, in Stevenage 61 per cent are worried about losing their job in the next 12 months, while in North Herts the figure stands at 54 per cent.
Thirty per cent of Stevenage respondents and 24 per cent of North Herts respondents, many of whom have been working from home or furloughed, said they are looking forward to returning to their place of work once restrictions are lifted.
In Stevenage, 52 per cent of those who responded said they had been obeying all lockdown restrictions, compared to 47 per cent in North Herts.
However there is hope for the future, with 42 per cent of Stevenage respondents and 39 per cent of North Herts respondents saying they are very likely to visit high street shops once they reopen.
Thirty-four per cent of respondents from Stevenage and 47 per cent from North Herts said they will visit pubs once they reopen about as much as they did pre-COVID, while 39 per cent in Stevenage and 46 per cent in North Herts feel they will not change the amount they eat out compared to before the pandemic.
Only three per cent of Stevenage respondents plan to book a long-haul holiday this year, while the figure stands at four per cent in North Herts.


President Trump's election has affordable housing developers on pins and needles and numerous U.S. cities and housing advocates predicting disaster.
The newly elected president's pledge to cut the corporate tax rate from 35 percent to 15 percent has prompted large banks and other investors to back away from tax credits that reduce their tax burden in exchange for investing in low-income housing projects.
Investors believe that lower corporate taxes would reduce the value of these tax credits. And they may be right. Since Trump took office, their value reportedly has dropped between 10 and 15 percent, leaving affordable housing developers scrambling for funding.
The federal Low-Income Housing Tax Credit (LIHTC) program funds about 90 percent of affordable housing projects in the U.S. The program gives state and local LIHTC-allocating agencies nearly $8 billion a year for the acquisition, rehabilitation and new construction of low-income housing.
In March, the Trump administration released a partial outline of its 2018 budget, proposing billions of dollars in funding cuts for most government agencies, including the U.S. Department of Housing and Urban Development (HUD).
If Trump's budget passes, HUD is slated to lose about $6.2 billion next year, a 13.2 percent drop from 2016. The cuts are expected to aggravate an already desperate affordable housing crisis in the U.S.
HUD provides housing assistance to approximately 5 million Americans through rental vouchers, subsidies for landlords, public housing projects, and community grants.
Housing advocates claim the proposed budget cuts would force people out of their homes, negatively affect grant programs, and increase rental prices as low-income housing units decline, making housing even less affordable.
Affordable Housing Online, a database of available federal housing assistance in each state, estimates Puerto Rico would lose more than $115 million a year under Trump's 2018 budget. The HUD budget cuts would affect some 1,560 households on the island, the online service recently reported.
Source: Affordable Housing Online figures based on the proposed 2018 budget, HUD Resident Characteristics Report data, HUD HA Profiles data, HUD Exchange Funding data, HUD Voucher Management System data and other HUD data sources.
The Low-Income Housing Tax Credit has financed nearly 3 million homes in the U.S. and leveraged more than $100 million in private investment since its creation 30 years ago by President Reagan's 1986 Tax Reform Act.
The LIHTC program distributes federal income tax credits to affordable housing developers through state housing agencies. Developers sell the tax credits to investors to get funding for their projects. For each dollar invested on tax credits, investors save one dollar in taxes.
When tax rates drop, demand for tax-saving investments also drop. Since the election, the value of tax credits has dropped by 10 to 15 percent. As a result, developers are getting less than a dollar for each dollar's worth in tax credits they trade.
President Trump's promise to lower the corporate tax rate would reduce companies' tax burden and with it their need for tax credits to lower their tax bills. Because the LIHTC is the largest source for funding for low-income housing in many states, affordable housing developers are seeing red in budget gaps and future funding.
Investors already are shunning the low-income housing tax credit market, and those staying are paying less for the credits, according to industry experts and news reports.
Developers suddenly find themselves in a pickle, having to seek funding elsewhere, slash the number of units or suspend projects.
The uncertainty surrounding tax reform and budgets are slowing new development of affordable housing and stalling projects that were underway throughout the country, not only cutting into the number of available units but also raising the rents of others.
Meanwhile, affordable housing advocates and developers have their eyes on The Affordable Housing Credit Improvement Act of 2016, a bill introduced by Washington Senator Maria Cantwell (D-WA) that would strengthen and expand the LIHTC program by 50 percent over five years. The increase would create at least 400,000 additional affordable units over the next decade.
A report issued last year by the National Low Income Housing Coalition warns the U.S. faces a nationwide shortage of 7.4 million affordable rental homes available to extremely low-income citizens, up 60 percent from 2000, when the gap was 4.6 million, according to Cantwell's bill.
"There is no state in the U.S. where a minimum-wage worker working full time can afford a one-bedroom apartment at the fair market rent," Cantwell notes.
More than 7 million Americans lost their homes to foreclosure as a result of the 2008 economic crisis; consequently, home ownership rates have fallen from a high of 69.2 percent in the second quarter of 2004 to 63.4 percent in the second quarter of 2015, the lowest level since 1967, according to the bill. By mid-2015, some 43 million families and individuals were renters, up 9 million from 2005 and the largest gain in the number of renters during any 10-year period on record.
Despite growing demand for rental housing, the U.S. lost nearly 13 percent of its existing affordable rental housing stock between 2001 and 2013 and added only 2.2 million new units between 2005 and 2014, the lowest 10-year production rate on record since 1974, according to the bill.
Constrained supply and high demand for affordable housing have pushed rents up across the U.S. at an average rate of 3.5 percent, the highest in 30 years. With competition in the rental market at an all-time high and flat or lower incomes, affordable housing development has been unable to keep pace, leading to exploding unaffordability, Cantwell explains.
In addition to Cantwell's efforts, numerous businesses and organizations in the affordable housing industry are calling on Congress to address the nation's severe shortage of affordable rental housing.
A Call to Invest in Our Neighborhoods (ACTION) has organized a campaign representing more than 2,000 national, state, and local affordable housing stakeholders supporting the bill and urging Congress to expand and strengthen the LIHTC program.
The bottom line: These are uncertain times for the affordable housing market. While the future of tax reform, the HUD's budget and the LIHTC program hangs in the air, developers will have to keep their ears to the ground to ease their reliance on tax credits and find funding for their projects elsewhere.


text:
« Kubrick #2 – 2001: A Space Odyssey (1968)
Remake »
Kubrick #1 – Dr. Strangelove or: How I Learned to Stop Worrying and Love the Bomb (1964)
The movie that taught the world not to fight in the war room.
The Film: A rogue American general named Jack D. Ripper (Sterling Hayden) hatches a plan to nuke Russia in preemptive defense of his precious bodily fluids. President Merkin Muffley, Group Captain Lionel Mandrake, and defected German scientist Dr. Strangelove (all played by Peter Sellers) scramble to call back the bombers, but Ripper's plan is foolproof and, worse, it's likely to trigger a Russian doomsday device that will destroy the world. A combined American/Soviet effort brings down most of the planes, but nuclear peace is narrowly averted by the brave efforts of Major TJ "King" Kong (Slim Pickens) personally riding a bomb down to its target. As the leaders await the end, they hatch rival plans to become the undisputed world power of underground bomb shelters.
Pictured: an opportunity
The Production: The early 1960s was a weird time. The end of the human race never seemed closer than it did in the first few years of the decade, and yet new sexual and civil freedoms brought hope to young people who had otherwise lived their lives ducking and covering in school hallways. In the aftermath of the 1962 Cuban Missile Crisis, Kubrick—riding the surprise success of his supposedly toxic project, Lolita—acquired the rights to the novel Red Alert by Peter George, a serious thriller about the flaws inherent in automated nuclear war. Unfortunately, Kubrick ran into problems adapting the screenplay; the situation was too damn absurd.
Kubrick felt that the real Cold War policy of mutually assured destruction was, to put it mildly, incredibly stupid, so he shifted Red Alert onto an entirely different track, where it became a dark satire. Columbia Pictures, eager to stay in the Kubrick business but nervous about the film's tone, agreed to handle the picture only if Kubrick could convince Peter Sellers to play the leads—all of them (the studio believed Sellers had been the major draw for Lolita.) Sellers signed on to play four roles, but he had to abandon the part of Major Kong when he sprained his ankle and couldn't fit in the pilot's seat. Slim Pickens took over.
And he did his own stunts, may he rest in peace.
President Kennedy's assassination in Dallas delayed Dr. Strangelove for months and hindered its box office. Since its release, however, Strangelove has been universally embraced by frikkin' everybody. Many (including this writer) consider Strangelove to be Kubrick's best film and possibly one of the greatest films of the last ever. And he did it without the pie fight finale.
Best Moment: Peter Sellers made his millions playing lunatics—there's a reason this film is called Dr. Strangelove and not Lionel Mandrake—but the actor spent much of his career trying to squash this stereotype and find success as a complete performer, not just as a living cartoon. Sellers was an equally talented straight man, as he proves in his phone call to the unseen (and drunk) Russian premier. This is probably one of the funniest scenes in all the movies.
Lasting Impact: Please. Dr. Strangelove cast the nuclear conflict in a new light and may have played some small part in shifting the conversation away from the saber-rattling of the Red Scare and towards the dramatic peace movement of the late 60s. On a pure movie level, Strangelove invented its own damn genre. Every satirical war movie, from Canadian Bacon to Wag the Dog, to War, Inc., has been slapped with the label of "the new Dr. Strangelove," which of course they aren't. The film's shadow is very wide.
And we haven't even mentioned the young Darth Vader yet.
Overall: As we've discussed, Stanley Kubrick took flak throughout his career for being a fairly bloodless character. His best films came from a place of clinical curiosity, little experiments where he ran his characters through twisted mazes to see how far they'd go for some tiny piece of happiness. Films like 2001 and A Clockwork Orange were not strange digressions, but close approximations of how Kubrick really saw the world. Strangelove is different and unlike anything else in Kubrick's catalog, and not just because it's hilarious. Not at all. It's furious.
Great comedy comes from anger, and there is hardly an angrier film anywhere than Dr. Strangelove. The film is a plea from the peasants for some sign of sanity at the top. I don't think the film's proximity to the Cuban Missile Crisis can be overstated. For thirteen days in October of 1962, the entire world was hung up between two countries seemingly willing to wipe billions of people from the map rather than lose face in front of the world. Sure, each side made the usual case about white hats and black hats, and we can debate politics forever, but ultimately the planet came within a "Press A" of snuffing out over, basically, a sticky public relations crisis. Two years later, Buck Turgidson (George C. Scott) is on screen whining about a "mine shaft gap."
Mine shafts laugh at danger.
So, assuming he's the "I" in the subtitle, how did Kubrick learn to love the bomb? I think Kubrick decided that, hell, if the world can be taken to the very brink by posturing and bravado, then why not give up your sanity and, like Major Kong, enjoy the ride? This is a movie about grown men measuring their members and calling it war. I mentioned Turgidson above, definitely my favorite character in the film not played by Peter Sellers (who was brilliant in all three of his roles). Observe the way Turgidson squirms and fidgets while President Merkin Muffley (with two names referring, of course, to vaginas) works to call off the war that Ripper started. Turgidson humors the president the same way a football coach might wince at a child asking why he doesn't throw it at the goal line on every play.
"When you're dealing with nukes, you can't play man-to-man, you have to go with a general zone defense. In this case, a zone would be, let's say… Houston."
Or what about Ripper, a general willing to go to war because of fluoride in our drinking water, clearly a communist plot to destroy our bodies from within. We laugh now at Kubrick's absurd invention, forgetting that this was a totally real thing that people thought. And what was the role of women in this war? I mentioned the onset of new sexual and cultural freedoms in the 60s, but it hadn't yet hit the war room. I don't think it's a coincidence that the only woman in the film is seen in a bikini, with no thoughts or role of her own except to relay information between two men.
Kubrick's grand finale was intended to be a gigantic pie fight, but I think that may have been a bit too on the nose (why spend the money on all these pies if we're not going to throw them!?) As it is, he settled for a romantically bittersweet ending in which the bomb, the true protagonist of the film, wins the day.
Also, Peter Sellers just wins in general.
Kubrick never returned to broad comedy. It's as if dealing with these misfits, facing his dark opinion of human nature, changed him. After Strangelove, his films became increasingly detached, kicking off the second half of his legendary career, from 2001 all the way to the alien and alienating Eyes Wide Shut. Did he burn out his funny bone? Or did confronting these clowns, outsized avatars of the worst of our instincts, push Kubrick that much further away? If there is any truth behind Strangelove's satire, are we even worth saving? With a planet like this, who could blame Kubrick for falling in love with the end of the world?
The Stanley Kubrick Project
1. Dr. Strangelove or: How I Learned to Stop Worrying and Love the Bomb
2. 2001: A Space Odyssey
4. Full Metal Jacket
5. A Clockwork Orange
6. Paths of Glory
7. Eyes Wide Shut
8. Spartacus
9. Barry Lyndon
10. Lolita
11. The Killing
12. Killer's Kiss
13. Fear and Desire
This entry was posted on 09/07/2010, 4:05 PM and is filed under comedy, Countdown, Dr. Strangelove, film, Movies, Stanley Kubrick, war movie. You can follow any responses to this entry through RSS 2.0. Both comments and pings are currently closed.


The 2018 federal meeting of textile cleaners, scrubbers and dyers in Austria was recently held in the federal capital of Vienna. The motto of the event was "Fashion needs care".
The conference was attended by over 100 textile cleaners from all over the country. On Friday the event started with the annual gala evening at the conference hotel with dinner buffet and music. The main topics of the actual meeting on Saturday were the care of outerwear, the upcoming collective bargaining negotiations with the keyword minimum wage € 1,500.00 and the basic data protection regulation, since these themes affect each and every business considerably.
Some other items that also were discussed: RFID-technology, training & education in textile care, energy-saving possibilities in the steam production and textile protection in case of irremovable stains. The late afternoon podium discussion featured 'Does fashion still needs care in the future' and came up with a fashion-biased future scenario presented by branch experts and fashion manufacturers. All in all, the attendees witnessed an interesting program and were content with the excellent organisation of the event.


text:
NEW: 5 Big Things for Black St. Petersburg in November 2019
Posted on November 26, 2019 by Gypsy Gallardo in News 0 Comments
Ephraim Sykes (above) in performance that earned him a Tony nomination
–By Gypsy C. Gallardo
As we enter a new decade, the Power Broker magazine will be publishing a new monthly round-up featuring 5 new developments for "Black St. Petersburg," which refers to the roughly 65,000 residents of St. Petersburg who claim African heritage.
I've savored the idea for this spotlight for over two years, ever since I read about the national media outlet called Good Black News. It was created in 2010 for a similar purpose – to uplift more of our successes, specifically in order to a) counter the persistently negative narrative about our community, and b) to inspire more of us to pursue our dreams.
If it sounds trivial, it's not. As journalist Susan Taylor said "Whatever we believe about ourselves and our ability comes true for us." And unfortunately, African Americans' self-image is so often battered in the media that I believe it limits what we believe is possible for our lives.
I also believe what famous black Olympian Jesse Owens said: "Find the good. It's all around you. Find it, showcase it and you'll start believing in it."
This article is my way of doing that. I will release a "5 Big Things" line-up each week in December 2019, so please send me ideas and nominations (gypsy@powerbrokermagazine.com)!
Here's my take on 5 Big Things that happened for Black St. Petersburg this November (in reverse chronological order).
Big 1 – Sykes Cast in Long-Awaited Broadway Musical
On November 21st, it was announced that Tony nominee and St Pete native Ephraim Sykes – who recently starred in the Temptations musical Ain't Too Proud (pictured above) – has been cast to play Michael Jackson in MJ the Musicalon Broadway. Sykes is a graduate of Pinellas County Center for the Arts at Gibbs High School and of the Alvin Ailey/Fordham University BFA program.
The 34-year old works full-time in the arts. He made his Broadway debut with The Little Mermaid and later his principle debut as Bennyin the off-Broadway revival of Rent. He performed in The Wiz at Encores, and in Broadway's Memphis.
Sykes continued stage performances with Bring It On At the Alliance Theatre in Atlanta and returned to Broadway in Disney's Newsies. More recently, he was an original Broadway cast member in Motown: The Musical and performed in Hamilton as James Madison.
Sykes has appeared in films too, including a supporting role in Dance Flickand his first starring role in Leave It On the Floor, working alongside musical director Kimberly Burse and choreographer Frank Gatson Jr, who both worked with Destiny's Child.
In addition to stage and film, Sykes' television credits include Marvin in HBO's Vinyl, Woody Allen's Crisis in Six Scenes, Marvel's Netflix series Luke Cage, NBCs Smash, and 30 Rock.
When asked how he will handle the controversy that's engulfed Michael Jackson's legacy, Sykes told Essence magazine that he hopes to "show how human [Jackson] truly was." As son of a Pastor – Dr. Manual Sykes – of Bethel Community Baptist Church (where his sister Martina also works in ministry) – the young Sykes may bring a unique perspective to the rise, reputational fall, and elusive redemption of one of the world's biggest stars.
Vanity Fair quotes him as saying, "Hopefully we can all have a little bit more empathy with him, his downfalls, his demons, his struggles as well as." Read more at Vanity Fair.
Big 2 – Davis Selected as BET Artist of the Week
On November 18th, St. Pete's Nick Davis announced that he was featured as an Artist of the Week by BET (Black Entertainment Television). The news was shared nationally via a video interview of Nick on BET Instagram (view it at Instagram: ndartlife).
Davis, a Gibbs High grad who also studied at St. Petersburg College, is now working mostly full-time in his art while battling epilepsy. He was recently diagnosed with the disease after suffering seizures over the past four years. Davis is working to launch a website featuring his art. In other good news for Davis, the 28-year old celebrated four years marriage with his bride Tiffany earlier in November.
Big 3 – New Dialogue about Funding Our African American Museum
On November 14th, St. Pete's City Council voted "yes" to Chairman Charlie Gerdes' request to add a new discussion item to Budget Committee proceedings – use of excess City reserves to fund a large expansion of the Carter G. Woodson African American Museum.
The institution currently operates in a 4,000 square foot facility on the northern periphery of the Jordan Park housing complex. New designs envision an 18,000 square foot museum.
Council actions could anchor the type of public funding strategies that helped build world-class black museums in Mississippi, Georgia, Alabama and elsewhere. Given the economic impact of St. Petersburg's downtown museums, the Woodson could soon become an economic driver for revitalization in the South St. Petersburg CRA.
Big 4 – New Tenants Bill of Rights
On November 7th, St. Pete's City Council took a major step to erase the dubious distinction that St Pete ranks in the top 100 cities in the U.S. for evictions; Council voted unanimously to enact the new Tenants Bill of Rights to protect tenants from blind fees that cause too many to be evicted or severely burdened. African Americans are disproportionately vulnerable by the problem. About 45% of white renters in the City are "cost-burdened," i.e., pay more than 30% of their income on rent, compared to nearly two-thirds of all black renters who are cost-burdened.
The new law (spearheaded by Councilmember Amy Foster) could have a positive impact for hundreds of black residents in the decade ahead. Foster will pursue additional renter protections to enhance the Bill of Rights. To receive updates or learn how you can be involved, text DISTRICT8 TO 22828.
Councilmembers who voted on the New Bill of Rights
Big 5 – November Election Makes History, Restores City Council to 25% Black Representation
Deborah Figgs-Sanders on election night with Mayor Rick Kriseman who endorsed Deborah over competitor Trenia Cox
On November 5th, Deborah Figgs-Sanders was elected to St. Petersburg's City Council, becoming the first African American ever to represent District 5 (which encompasses portions of Lakewood Estates, the Skyway Marina District, Pinellas Point and the Pinellas Bayway).
The election was historic in other ways too. Deborah's election, combined with Lisa Wheeler-Bowman's reelection in District 7, makes for a) two black members simultaneously on the 8-person Council for the first time since 2007 (when Earnest Williams represented District 6 and Rene Flowers was completing her second term in District 7) and b) the first time that two African American women have served together. In the past when there were two African Americans serving at once, it was either two males or a female and male).
As icing on the cake, Deborah's race against Trenia Cox also generated what is believed to be the highest black voter turnout in any district in a non-Mayoral city election cycle. In the November 5th election, black turnout in District 5 was 25.3% (compared to 19.1% citywide).
To Nominate Successes: The Power Broker Media Group will publish this column weekly in December 2019. To nominate success notes for coverage, please email gypsy@powerbrokermagazine.com.
Amy Foster
Carter G. Woodson African American Museum
Charlie Gerdes
Deborah Figgs-Sanders
Ephraim Sykes
Nick Davis
Previous Previous post: POLL: St. Pete Black Voters Still Undecided, with Just 2 Weeks 'Til Election Day
Next Next post: 79 People Who Made Big Career Moves in 2019 (Pinellas County, Florida)
Has the Southside Ever "Won" in a Mayoral Election?
Why I endorse Eritha Akile Cainion for District 6 City Council and Jesse Nevel for Mayor


Why is the Drain Field Important in Snoqualmie Septic Systems?
For the septic systems in Snoqualmie, WA properties to function efficiently, it is very important that their drain fields are in excellent condition. Drain/leach fields are the areas that are installed to receive wastewater from the septic tanks.
The leach fields filter the wastewater and break down the pathogens in it. Thus, drain fields ensure that the water that finally seeps into the ground is clean and does not present any environmental hazard.
Here, at Lee's Sanitation Service, we help keep the septic systems in homes and businesses working optimally by providing expert services for drain field installation and septic drain field repair in Snoqualmie.
Call us to schedule septic drain field repair in your Snoqualmie home or business place the instant you observe rising water level in the septic tank and suspect poor leach field absorption. We respond with due urgency and dispatch our experts without any delay.
Why Choose Us for a New Drain Field Installation in Snoqualmie?
Proper drain field installation in any Snoqualmie property helps optimize the working of its septic system. It also spares the property owner frequent hassles from an inefficient or failed leach field.
Leave your drain field installation or repair needs in Snoqualmie to Lee's Sanitation Service. Call 253-245-1080 to schedule the job.