⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mdlv2000reader.java

📁 化学图形处理软件
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
            }                        logger.info("Reading rest of file");            line = input.readLine(); linecount++;            logger.debug("Line " + linecount + ": " + line);            atoms = Integer.valueOf(line.substring(0,3).trim()).intValue();            logger.debug("Atomcount: " + atoms);            bonds = Integer.valueOf(line.substring(3,6).trim()).intValue();            logger.debug("Bondcount: " + bonds);                        // read ATOM block            logger.info("Reading atom block");            for (int f = 0; f < atoms; f++) {                line = input.readLine(); linecount++;                x = new Double(line.substring( 0,10).trim()).doubleValue();                y = new Double(line.substring(10,20).trim()).doubleValue();                z = new Double(line.substring(20,30).trim()).doubleValue();                totalZ += Math.abs(z); // *all* values should be zero, not just the sum                logger.debug("Coordinates: " + x + "; " + y + "; " + z);                String element = line.substring(31,34).trim();                logger.debug("Atom type: ", element);                if (IsotopeFactory.getInstance(molecule.getBuilder()).isElement(element)) {                    atom = IsotopeFactory.getInstance(molecule.getBuilder()).configure(molecule.getBuilder().newAtom(element));                } else {                    logger.debug("Atom ", element, " is not an regular element. Creating a PseudoAtom.");                    //check if the element is R                    rGroup=element.split("^R");                    if (rGroup.length >1){                    	try{                    		Rnumber=new Integer(rGroup[(rGroup.length-1)]).intValue();                    		RGroupCounter=Rnumber;                    	}catch(Exception ex){                    		Rnumber=RGroupCounter;                    		RGroupCounter++;                    	}                    	element="R"+Rnumber;                    }                    atom = molecule.getBuilder().newPseudoAtom(element);                }                // store as 3D for now, convert to 2D (if totalZ == 0.0) later                atom.setPoint3d(new Point3d(x, y, z));                                // parse further fields                String massDiffString = line.substring(34,36).trim();                logger.debug("Mass difference: ", massDiffString);                if (!(atom instanceof IPseudoAtom)) {                    try {                        int massDiff = Integer.parseInt(massDiffString);                        if (massDiff != 0) {                            IIsotope major = IsotopeFactory.getInstance(molecule.getBuilder()).getMajorIsotope(element);                            atom.setAtomicNumber(major.getAtomicNumber() + massDiff);                        }                    } catch (Exception exception) {                        logger.error("Could not parse mass difference field");                    }                } else {                    logger.error("Cannot set mass difference for a non-element!");                }                                                String chargeCodeString = line.substring(36,39).trim();                logger.debug("Atom charge code: ", chargeCodeString);                int chargeCode = Integer.parseInt(chargeCodeString);                if (chargeCode == 0) {                    // uncharged species                } else if (chargeCode == 1) {                    atom.setFormalCharge(+3);                } else if (chargeCode == 2) {                        atom.setFormalCharge(+2);                } else if (chargeCode == 3) {                        atom.setFormalCharge(+1);                } else if (chargeCode == 4) {                } else if (chargeCode == 5) {                        atom.setFormalCharge(-1);                } else if (chargeCode == 6) {                        atom.setFormalCharge(-2);                } else if (chargeCode == 7) {                        atom.setFormalCharge(-3);                }                                try {                    // read the mmm field as position 61-63                    String reactionAtomIDString = line.substring(60,63).trim();                    logger.debug("Parsing mapping id: ", reactionAtomIDString);                    try {                        int reactionAtomID = Integer.parseInt(reactionAtomIDString);                        if (reactionAtomID != 0) {                            atom.setID(reactionAtomIDString);                        }                    } catch (Exception exception) {                        logger.error("Mapping number ", reactionAtomIDString, " is not an integer.");                        logger.debug(exception);                    }                } catch (Exception exception) {                    // older mol files don't have all these fields...                    logger.warn("A few fields are missing. Older MDL MOL file?");                }                                //shk3: This reads shifts from after the molecule. I don't think this is an official format, but I saw it frequently 80=>78 for alk                if(line.length()>=78){                	double shift=Double.parseDouble(line.substring(69,80).trim());                	atom.setProperty("first shift",new Double(shift));                }                if(line.length()>=87){                	double shift=Double.parseDouble(line.substring(79,87).trim());                	atom.setProperty("second shift",new Double(shift));                }                                molecule.addAtom(atom);            }                        // convert to 2D, if totalZ == 0            if (totalZ == 0.0 && !forceReadAs3DCoords.isSet()) {                logger.info("Total 3D Z is 0.0, interpreting it as a 2D structure");                java.util.Iterator atomsToUpdate = molecule.atoms();                while (atomsToUpdate.hasNext()) {                    IAtom atomToUpdate = (IAtom)atomsToUpdate.next();                    Point3d p3d = atomToUpdate.getPoint3d();                    atomToUpdate.setPoint2d(new Point2d(p3d.x, p3d.y));                    atomToUpdate.setPoint3d(null);                }            }                        // read BOND block            logger.info("Reading bond block");            for (int f = 0; f < bonds; f++) {                line = input.readLine(); linecount++;                atom1 = java.lang.Integer.valueOf(line.substring(0,3).trim()).intValue();                atom2 = java.lang.Integer.valueOf(line.substring(3,6).trim()).intValue();                order = java.lang.Integer.valueOf(line.substring(6,9).trim()).intValue();                if (line.length() >= 12) {                	if (line.length() > 12) {                		stereo = java.lang.Integer.valueOf(line.substring(9,12).trim()).intValue();                	} else {                		stereo = java.lang.Integer.valueOf(line.substring(9).trim()).intValue();                	}                } else {                	logger.warn("Missing expected stereo field at line: " + line);                }                if (logger.isDebugEnabled()) {                    logger.debug("Bond: " + atom1 + " - " + atom2 + "; order " + order);                }                if (stereo == 1) {                    // MDL up bond                    stereo = CDKConstants.STEREO_BOND_UP;                } else if (stereo == 6) {                    // MDL down bond                    stereo = CDKConstants.STEREO_BOND_DOWN;                } else if (stereo == 4) {                    //MDL bond undefined                    stereo = CDKConstants.STEREO_BOND_UNDEFINED;                }                // interpret CTfile's special bond orders                IAtom a1 = molecule.getAtom(atom1 - 1);                IAtom a2 = molecule.getAtom(atom2 - 1);                if (order == 4) {                    // aromatic bond                    bond = molecule.getBuilder().newBond(a1, a2, CDKConstants.BONDORDER_AROMATIC, stereo);                    // mark both atoms and the bond as aromatic                    bond.setFlag(CDKConstants.ISAROMATIC, true);                    a1.setFlag(CDKConstants.ISAROMATIC, true);                    a2.setFlag(CDKConstants.ISAROMATIC, true);                    molecule.addBond(bond);                } else {                    bond = molecule.getBuilder().newBond(a1, a2, (double) order, stereo);                    molecule.addBond(bond);                }            }                        // read PROPERTY block            logger.info("Reading property block");            while (true) {                line = input.readLine(); linecount++;                if (line == null) {                    throw new CDKException("The expected property block is missing!");                }		if (line.startsWith("M  END")) break;                                boolean lineRead = false;                if (line.startsWith("M  CHG")) {                    // FIXME: if this is encountered for the first time, all                    // atom charges should be set to zero first!                    int infoCount = Integer.parseInt(line.substring(6,9).trim());                    StringTokenizer st = new StringTokenizer(line.substring(9));                    for (int i=1; i <= infoCount; i++) {                        String token = st.nextToken();                        int atomNumber = Integer.parseInt(token.trim());                        token = st.nextToken();                        int charge = Integer.parseInt(token.trim());                        molecule.getAtom(atomNumber - 1).setFormalCharge(charge);                    }                }  else if (line.matches("^A    \\d+")) {            		// Reads the pseudo atom property from the mol file                	                	// The atom number of the to replaced atom            		int aliasAtomNumber = Integer.parseInt(line.replaceFirst("^A    ", "")) - RGroupCounter;            		line = input.readLine(); linecount++;					String[] aliasArray = line.split("\\\\");					// name of the alias atom like R1 odr R2 etc. 					String alias = "";					for (int i = 0; i < aliasArray.length; i++) {						alias += aliasArray[i];					}					IAtom aliasAtom = molecule.getAtom(aliasAtomNumber);					IAtom newPseudoAtom = molecule.getBuilder().newPseudoAtom(alias);					if(aliasAtom.getPoint2d() != null) {						newPseudoAtom.setPoint2d(aliasAtom.getPoint2d());					}					if(aliasAtom.getPoint3d() != null) {						newPseudoAtom.setPoint3d(aliasAtom.getPoint3d());					}					molecule.addAtom(newPseudoAtom);					java.util.List bondsOfAliasAtom = molecule.getConnectedBondsList(aliasAtom);										for (int i = 0; i < bondsOfAliasAtom.size(); i++) {						IBond bondOfAliasAtom = (IBond) bondsOfAliasAtom.get(i);						IAtom connectedToAliasAtom = bondOfAliasAtom.getConnectedAtom(aliasAtom);						IBond newBond = bondOfAliasAtom.getBuilder().newBond(); 						newBond.setAtoms(new IAtom[] {connectedToAliasAtom, newPseudoAtom});						newBond.setOrder(bondOfAliasAtom.getOrder());						molecule.addBond(newBond);						molecule.removeBond(aliasAtom, connectedToAliasAtom);					}					molecule.removeAtom(aliasAtom);					RGroupCounter++;                } else if (line.startsWith("M  ISO")) {                    try {                        String countString = line.substring(6,9).trim();                        int infoCount = Integer.parseInt(countString);                        StringTokenizer st = new StringTokenizer(line.substring(9));                        for (int i=1; i <= infoCount; i++) {                            int atomNumber = Integer.parseInt(st.nextToken().trim());                            int absMass = Integer.parseInt(st.nextToken().trim());                            if (absMass != 0) {                                 IAtom isotope = molecule.getAtom(atomNumber - 1);                                isotope.setMassNumber(absMass);                            }                        }                    } catch (NumberFormatException exception) {                        String error = "Error (" + exception.getMessage() + ") while parsing line "                                       + linecount + ": " + line + " in property block.";                        logger.error(error);                        throw new CDKException("NumberFormatException in isotope information on line: " + line, exception);                    }                } else if (line.startsWith("M  RAD")) {                    try {                        String countString = line.substring(6,9).trim();                        int infoCount = Integer.parseInt(countString);                        StringTokenizer st = new StringTokenizer(line.substring(9));                        for (int i=1; i <= infoCount; i++) {                            int atomNumber = Integer.parseInt(st.nextToken().trim());                            int spinMultiplicity = Integer.parseInt(st.nextToken().trim());                            if (spinMultiplicity > 1) {                                IAtom radical = molecule.getAtom(atomNumber - 1);                                for (int j=2; j <= spinMultiplicity; j++) {                                    // 2 means doublet -> one unpaired electron                                    // 3 means triplet -> two unpaired electron                                    molecule.addSingleElectron(molecule.getBuilder().newSingleElectron(radical));                                }                            }                        }                    } catch (NumberFormatException exception) {                        String error = "Error (" + exception.getMessage() + ") while parsing line "                                       + linecount + ": " + line + " in property block.";                        logger.error(error);                        throw new CDKException("NumberFormatException in radical information on line: " + line, exception);                    }                } else if (line.startsWith("G  ")) {                    try {                        String atomNumberString = line.substring(3,6).trim();                        int atomNumber = Integer.parseInt(atomNumberString);                        //String whatIsThisString = line.substring(6,9).trim();                                            String atomName = input.readLine();                                                // convert Atom into a PseudoAtom                        IAtom prevAtom = molecule.getAtom(atomNumber - 1);                        IPseudoAtom pseudoAtom = molecule.getBuilder().newPseudoAtom(atomName);                        if (prevAtom.getPoint2d() != null) {                            pseudoAtom.setPoint2d(prevAtom.getPoint2d());                        }                        if (prevAtom.getPoint3d() != null) {                            pseudoAtom.setPoint3d(prevAtom.getPoint3d());                        }                        AtomContainerManipulator.replaceAtomByAtom(molecule, prevAtom, pseudoAtom);                    } catch (NumberFormatException exception) {                        String error = "Error (" + exception.toString() + ") while parsing line "                        + linecount + ": " + line + " in property block.";                        logger.error(error);                        throw new CDKException("NumberFormatException in group information on line: " + line, exception);                    }                }                if (!lineRead) {                    logger.warn("Skipping line in property block: ", line);                }            }		} catch (CDKException exception) {            String error = "Error while parsing line " + linecount + ": " + line + " -> " + exception.getMessage();            logger.error(error);            logger.debug(exception);            throw exception;		} catch (Exception exception) {			exception.printStackTrace();            String error = "Error while parsing line " + linecount + ": " + line + " -> " + exception.getMessage();            logger.error(error);            logger.debug(exception);            throw new CDKException(error, exception);		}		return molecule;	}        public void close() throws IOException {        input.close();    }        private void initIOSettings() {        forceReadAs3DCoords = new BooleanIOSetting("ForceReadAs3DCoordinates", IOSetting.LOW,          "Should coordinates always be read as 3D?",           "false");    }        public void customizeJob() {        fireIOSettingQuestion(forceReadAs3DCoords);    }    public IOSetting[] getIOSettings() {        IOSetting[] settings = new IOSetting[1];        settings[0] = forceReadAs3DCoords;        return settings;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -