예제 #1
0
    // Create in/out function
    void LoadMoleculeFrame(int frame)
    {
        var fs         = new FileStream(Application.dataPath + AtomDataFilePath, FileMode.Open);
        var offset     = (long)frame * _molFrameSize;
        var frameBytes = new byte[_molFrameSize];
        var frameData  = new float[_molFrameSize / sizeof(float)];

        fs.Seek(offset, SeekOrigin.Begin);
        fs.Read(frameBytes, 0, _molFrameSize);
        fs.Close();

        Buffer.BlockCopy(frameBytes, 0, frameData, 0, _molFrameSize);

        // ...
        for (var i = 0; i < NumAtoms; i++)
        {
            _atomPositions[i].Set(frameData[i * NumFieldsPerAtom + 3], frameData[i * NumFieldsPerAtom + 4], frameData[i * NumFieldsPerAtom + 5], 1);

            if (_init)
            {
                continue;
            }

            _atomTypes[i]           = (int)frameData[i * NumFieldsPerAtom];
            _atomAminoAcidIds[i]    = (int)frameData[i * NumFieldsPerAtom + 1];
            _atomAminoAcidsTypes[i] = (int)frameData[i * NumFieldsPerAtom + 2];
        }

        _atomPositionsBuffer.SetData(_atomPositions);

        if (!_init)
        {
            // Set buffer data
            _atomTypesBuffer.SetData(_atomTypes);
            _atomAminoAcidIdBuffer.SetData(_atomAminoAcidIds);
            _atomAminoAcidTypesBuffer.SetData(_atomAminoAcidsTypes);

            // Find bonds
            _atomBonds   = PdbReader.GetAtomBonds(_atomPositions, _atomTypes, NumAtoms);
            NumAtomBonds = _atomBonds.Length / 2;

            _atomBondsBuffer = new ComputeBuffer(NumAtomBonds, 8);
            _atomBondsBuffer.SetData(_atomBonds);

            // Find focused atoms
            var aaa = new List <int>();
            for (var i = 0; i < NumAtoms; i++)
            {
                var ap = _atomPositions[i];

                if (aaa.Count > 0 && aaa.Last() == _atomAminoAcidIds[i])
                {
                    continue;
                }

                for (var j = 0; j < NumTunnelSpheres; j++)
                {
                    var tsp = _tunnelPositions[j];

                    if (!(Vector3.Distance(ap, tsp) < 5))
                    {
                        continue;
                    }
                    aaa.Add(_atomAminoAcidIds[i]);
                    break;
                }
            }

            var aaaa = new int[NumAtoms];
            for (var i = 0; i < NumAtoms; i++)
            {
                aaaa[i] = Convert.ToInt32(aaa.Contains(_atomAminoAcidIds[i]));
            }
            _focusedAtomBuffer.SetData(aaaa);

            _init = true;
        }
    }