예제 #1
0
 private void finalizeBuild()
 {
     currentModel = null;
     currentChain = null;
     htAtomMap.Clear();
 }
예제 #2
0
        public /*Chem*/Frame(Org.OpenScience.CDK.Interfaces.IChemFile chemFile, Device graphicsDevice)
        {
            shapes = new Shape[JmolConstants.SHAPE_MAX];
            this.g3d = new NuGraphics3D(graphicsDevice);
            this.frameRenderer = new FrameRenderer();

            for (int i = MAX_BONDS_LENGTH_TO_CACHE; --i > 0; ) // .GT. 0
                freeBonds[i] = new Bond[MAX_NUM_TO_CACHE][];

            // convert to jmol native
            mmset = new Mmset(this);

            // set properties
            mmset.ModelSetProperties = new System.Collections.Specialized.NameValueCollection();

            // init build
            currentModelIndex = -1;
            currentModel = null;
            currentChainID = '\uFFFF';
            currentChain = null;
            currentGroupSequenceNumber = -1;
            currentGroupInsertionCode = '\uFFFF';

            int atomCountEstimate = 0;
            for (int seq = 0; seq < chemFile.ChemSequenceCount; seq++)
            {
                for (int model = 0; model < chemFile.ChemSequences[seq].ChemModelCount; model++)
                {
                    Org.OpenScience.CDK.Interfaces.IChemModel chemModel = chemFile.ChemSequences[seq].ChemModels[model];
                    for (int atomC = 0; atomC < chemModel.SetOfMolecules.AtomContainerCount; atomC++)
                    {
                        atomCountEstimate += chemModel.SetOfMolecules.AtomContainers[atomC].AtomCount;
                    }
                }
            }

            if (atomCountEstimate <= 0)
                atomCountEstimate = ATOM_GROWTH_INCREMENT;
            atoms = new Atom[atomCountEstimate];
            bonds = new Bond[2 * atomCountEstimate];
            htAtomMap.Clear();

            // translate IChemSequence[] into Model[]
            mmset.ModelCount = chemFile.ChemSequenceCount;
            for (int seq = 0; seq < chemFile.ChemSequenceCount; ++seq)
            {
                int modelNumber = seq + 1;
                string modelName = modelNumber.ToString();
                NameValueCollection modelProperties = new NameValueCollection();    // FIXME: Loading property values
                mmset.setModelNameNumberProperties(seq, modelName, modelNumber, modelProperties);
            }

            // translate Atoms
            Dictionary<Org.OpenScience.CDK.Interfaces.IAtom, Atom> atomsList = new Dictionary<Org.OpenScience.CDK.Interfaces.IAtom, Atom>();
            //try
            //{
                for (int seq = 0; seq < chemFile.ChemSequenceCount; seq++)
                {
                    for (int model = 0; model < chemFile.ChemSequences[seq].ChemModelCount; model++)
                    {
                        Org.OpenScience.CDK.Interfaces.IChemModel chemModel = chemFile.ChemSequences[seq].ChemModels[model];
                        for (int atomC = 0; atomC < chemModel.SetOfMolecules.AtomContainerCount; atomC++)
                        {
                            for (int atomIdx = 0; atomIdx < chemModel.SetOfMolecules.AtomContainers[atomC].AtomCount; atomIdx++)
                            {
                                Org.OpenScience.CDK.Interfaces.IAtom atom = chemModel.SetOfMolecules.AtomContainers[atomC].Atoms[atomIdx];

                                sbyte elementNumber = (sbyte)atom.AtomicNumber;
                                if (elementNumber <= 0)
                                    elementNumber = JmolConstants.elementNumberFromSymbol(atom.Symbol);
                                char alternateLocation = '\0';

                                int sequenceNumber = int.MinValue;
                                char groupInsertionCode = '\0';

                                string atomName = null;
                                string group3Name = null;
                                char chainID = '\0';
                                if (atom is PDBAtom)
                                {
                                    PDBAtom pdbAtom = (PDBAtom)atom;
                                    if (pdbAtom.ResSeq != null && pdbAtom.ResSeq.Length > 0)
                                        sequenceNumber = int.Parse(pdbAtom.ResSeq);
                                    if (pdbAtom.ICode != null && pdbAtom.ICode.Length > 0)
                                        groupInsertionCode = pdbAtom.ICode[0];

                                    atomName = pdbAtom.Name;
                                    group3Name = pdbAtom.ResName;
                                    if (pdbAtom.ChainID != null && pdbAtom.ChainID.Length >= 1)
                                        chainID = pdbAtom.ChainID[0];
                                }
                                else
                                    atomName = atom.AtomTypeName;
                                
                                atomsList[atom] = AddAtom(model, atom, elementNumber, atomName, atom.getFormalCharge(),
                                                          (float)atom.getCharge(), 100, float.NaN, (float)atom.X3d, (float)atom.Y3d,
                                                          (float)atom.Z3d, false, int.MinValue, chainID, group3Name, sequenceNumber,
                                                          groupInsertionCode, float.NaN, float.NaN, float.NaN, alternateLocation, null);
                            }
                        }
                    }
                }
            //}
            //catch (Exception e)
            //{
            //    throw new ApplicationException("Problem translating atoms", e);
            //}

            fileHasHbonds = false;

            // translate bonds
            try
            {
                for (int seq = 0; seq < chemFile.ChemSequenceCount; seq++)
                {
                    for (int model = 0; model < chemFile.ChemSequences[seq].ChemModelCount; model++)
                    {
                        Org.OpenScience.CDK.Interfaces.IChemModel chemModel = chemFile.ChemSequences[seq].ChemModels[model];

                        for (int atomC = 0; atomC < chemModel.SetOfMolecules.AtomContainerCount; atomC++)
                        {
                            for (int bondIdx = 0; bondIdx < chemModel.SetOfMolecules.AtomContainers[atomC].Bonds.Length; bondIdx++)
                            {
                                Org.OpenScience.CDK.Interfaces.IBond bond = chemModel.SetOfMolecules.AtomContainers[atomC].Bonds[bondIdx];
                                Org.OpenScience.CDK.Interfaces.IAtom[] cdkAtoms = bond.getAtoms();
                                // locate translated atoms
                                Atom atom1, atom2;
                                atomsList.TryGetValue(cdkAtoms[0], out atom1);
                                atomsList.TryGetValue(cdkAtoms[1], out atom2);
                                bondAtoms(atom1, atom2, (int)bond.Order);
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                throw new ApplicationException("Problem translating bonds", e);
            }
            atomsList.Clear();

            // translate structures of PDBPolymer only
            for (int seq = 0; seq < chemFile.ChemSequenceCount; seq++)
            {
                for (int model = 0; model < chemFile.ChemSequences[seq].ChemModelCount; model++)
                {
                    Org.OpenScience.CDK.Interfaces.IChemModel chemModel = chemFile.ChemSequences[seq].ChemModels[model];

                    foreach (Org.OpenScience.CDK.Interfaces.IMolecule molecule in chemModel.SetOfMolecules.Molecules)
                    {
                        if (molecule is PDBPolymer)
                        {
                            PDBPolymer pdbPolymer = (PDBPolymer)molecule;
                            if (pdbPolymer.Structures != null && pdbPolymer.Structures.Count > 0)
                            {
                                structuresDefined = true;
                                foreach (PDBStructure pdbStruct in pdbPolymer.Structures)
                                {
                                    structuresDefined = true;
                                    mmset.defineStructure(pdbStruct.StructureType, pdbStruct.StartChainID,
                                                          pdbStruct.StartSequenceNumber, pdbStruct.StartInsertionCode,
                                                          pdbStruct.EndChainID, pdbStruct.EndSequenceNumber, pdbStruct.EndInsertionCode);
                                }
                            }
                        }
                    }
                }
            }
            autoBond(null, null);

            // build groups
            FinalizeGroupBuild();
            BuildPolymers();
            Freeze();

            finalizeBuild();

            // create ribbon shapes
            try
            {
                setShapeSize(JmolConstants.SHAPE_RIBBONS, -1, new BitArray(0));
                setShapeSize(JmolConstants.SHAPE_CARTOON, -1, new BitArray(0));
            }
            catch (Exception) { }
        }
예제 #3
0
        private Atom AddAtom(int modelIndex, object atomUid, sbyte atomicNumber, string atomName,
                             int formalCharge, float partialCharge, int occupancy, float bfactor,
                             float x, float y, float z, bool isHetero, int atomSerial, char chainID,
                             string group3, int groupSequenceNumber, char groupInsertionCode,
                             float vectorX, float vectorY, float vectorZ, char alternateLocationID,
                             object clientAtomReference)
        {
            if (modelIndex != currentModelIndex)
            {
                currentModel = mmset.getModel(modelIndex);
                currentModelIndex = modelIndex;
                currentChainID = '\uFFFF';
            }
            if (chainID != currentChainID)
            {
                currentChainID = chainID;
                currentChain = currentModel.getOrAllocateChain(chainID);
                currentGroupInsertionCode = '\uFFFF';
            }
            if (groupSequenceNumber != currentGroupSequenceNumber ||
                groupInsertionCode != currentGroupInsertionCode)
            {
                currentGroupSequenceNumber = groupSequenceNumber;
                currentGroupInsertionCode = groupInsertionCode;
                startGroup(currentChain, group3, groupSequenceNumber, groupInsertionCode, atomCount);
            }

            if (atomCount == atoms.Length)
                growAtomArrays();

            Atom atom = new Atom(this,
                                 currentModelIndex,
                                 atomCount,
                                 atomicNumber,
                                 atomName,
                                 formalCharge, partialCharge,
                                 occupancy,
                                 bfactor,
                                 x, y, z,
                                 isHetero, atomSerial, chainID,
                                 vectorX, vectorY, vectorZ,
                                 alternateLocationID,
                                 clientAtomReference);

            atoms[atomCount] = atom;
            ++atomCount;
            htAtomMap[atomUid] = atom;

            return atom;
        }
예제 #4
0
		public void setModelNameNumberProperties(int modelIndex, string modelName, int modelNumber, NameValueCollection modelProperties)
		{
			modelNames[modelIndex] = modelName;
			modelNumbers[modelIndex] = modelNumber;
			this.modelProperties[modelIndex] = modelProperties;
			models[modelIndex] = new Model(this, modelIndex, modelName);
		}
예제 #5
0
        public void initializeBuild(int atomCountEstimate)
		{
			currentModel = null;
			currentChainID = '\uFFFF';
			currentChain = null;
			currentGroupInsertionCode = '\uFFFF';
			
			if (atomCountEstimate <= 0)
				atomCountEstimate = ATOM_GROWTH_INCREMENT;
			atoms = new Atom[atomCountEstimate];
			bonds = new Bond[2 * atomCountEstimate];
			htAtomMap.Clear();
			initializeGroupBuild();
		}
예제 #6
0
            public Mpsmodel(Mps enclosingInstance, Model model)
			{
				InitBlock(enclosingInstance);
				mpspolymers = new Mpspolymer[model.PolymerCount];
				this.modelIndex = model.modelIndex;
				for (int i = mpspolymers.Length; --i >= 0; )
					mpspolymers[i] = Enclosing_Instance.allocateMpspolymer(model.getPolymer(i));
			}
예제 #7
0
		public Polymer(Monomer[] monomers)
		{
			this.monomers = monomers;
			this.monomerCount = monomers.Length;
			for (int i = monomerCount; --i >= 0; )
				monomers[i].Polymer = this;
			model = monomers[0].chain.model;
			model.addPolymer(this);
		}
예제 #8
0
		//  private Group[] mainchain;

        public Chain(Frame frame, Model model, char chainID)
		{
            this.frame = frame;
			this.model = model;
			this.chainID = chainID;
		}