public ParticleInfo(bool initData)
 {
     id = MelDB.GetRandomId(); if (initData)
     {
         data = new ParticleInfoData();
     }
 }
    // Caches find request.
    private ParticleInfo FindParticleCAS(string cas)
    {
        Debug.Log("FindParticleCAS " + cas);

        if (string.IsNullOrEmpty(cas))
        {
            return(null);
        }

        uint casNumber = MelDB.ParseCASNumber(cas);

        if (casNumber == 0)
        {
            return(null);
        }

        if ((_cachedParticle != null) && (_cachedParticle.CASes.Contains(casNumber)))
        {
            return(_cachedParticle);
        }

        _cachedParticle = MelDB.Particles.Find(p => p.CASes.Contains(casNumber));

        return(_cachedParticle);
    }
Example #3
0
    //[MenuItem("MELDB/Test", priority = 2000)]
    private static void Test()
    {
        var p = MelDB.FindParticle("1h-phosphirene 1-oxide");

        //var p = MelDB.GetParticle("Benzene");
        Test(p);
    }
Example #4
0
    private MelDB LoadIndexFromBytes(byte[] bytes)
    {
        var          stream         = new MemoryStream(bytes);
        BinaryReader br             = new BinaryReader(stream, encoding);
        var          result         = new MelDB();
        int          particlesCount = br.ReadInt32();
        var          particles      = new List <ParticleInfo>(particlesCount);

        result.particles = particles;

        for (int i = particlesCount - 1; i >= 0; i--)
        {
            var p = new ParticleInfo();
            particles.Add(p);

            p.atomsHash                  = br.ReadUInt32();
            p.structureHash              = br.ReadUInt32();
            p.structureHashExact         = br.ReadUInt32();
            p.binaryDataLocationInBucket = br.ReadUInt16();
            p.id   = br.ReadUInt64();
            p.name = br.ReadString();
            var flags = (ParticleInfo.ParticleFlags)br.ReadUInt16();
            p.flags = flags;
            if ((flags & ParticleInfo.ParticleFlags.HasChemicalFormula) > 0)
            {
                p.chemicalFormula = br.ReadString();
            }
            if ((flags & ParticleInfo.ParticleFlags.HasParticleCharge) > 0)
            {
                p.charge = br.ReadSByte();
            }
            int casesCount = br.ReadByte();
            p.CASes = new List <uint>(casesCount);
            for (int cas = 0; cas < casesCount; cas++)
            {
                p.CASes.Add(br.ReadUInt32());
            }
        }

        result.__sortedIds = new ushort[particlesCount];
        for (int i = 0; i < particlesCount; i++)
        {
            result.__sortedIds[i] = br.ReadUInt16();
        }
        //result.__sortedStructureHashes = new ushort[particlesCount];
        //for (int i = 0; i < particlesCount; i++)
        //    result.__sortedStructureHashes[i] = br.ReadUInt16();
        //result.__sortedStructureHashesExact = new ushort[particlesCount];
        //for (int i = 0; i < particlesCount; i++)
        //    result.__sortedStructureHashesExact[i] = br.ReadUInt16();
        result.__sortedAtomsHashes = new ushort[particlesCount];
        for (int i = 0; i < particlesCount; i++)
        {
            result.__sortedAtomsHashes[i] = br.ReadUInt16();
        }

        br.Close();
        stream.Dispose();
        return(result);
    }
Example #5
0
    public override void Serialize(MelDB db, bool indexOnly, bool removeUnusedFiles = true,
                                   Func <string, int, int, bool> progress           = null)
    {
        if (progress != null && progress("XML serialization: 1/3 sorting DB", 0, 1))
        {
            return;
        }
        db.Sort();
        XmlSerializer melDBSerializer = new XmlSerializer(typeof(MelDB));

        if (progress != null && progress("XML serialization: 2/3 serializing index", 0, 1))
        {
            return;
        }
        using (FileStream fDB = File.Create(GetIndexPath()))
        {
            melDBSerializer.Serialize(fDB, db);
        }

        if (!indexOnly)
        {
            XmlSerializer particleDataSerializer = new XmlSerializer(typeof(ParticleInfo.ParticleInfoData));
            int           partsCount             = db.particles.Count;

            for (int i = 0; i < partsCount; i++)
            {
                var p = db.particles[i];
                if (p.data == null)
                {
                    continue;
                }

                if (progress != null && progress("XML serialization: 3/3 serializing particles", i, partsCount))
                {
                    return;
                }

                string fullPath = GetParticlePath(p);
                p.data.metaInfo = p;

                // create directory
                string dirPath = Path.GetDirectoryName(fullPath);
                if (!Directory.Exists(dirPath))
                {
                    Directory.CreateDirectory(dirPath);
                }

                using (FileStream f = File.Create(fullPath))
                {
                    particleDataSerializer.Serialize(f, p.data);
                }
                p.data.metaInfo = null;
            }
        }

        if (removeUnusedFiles)
        {
            RemoveUnusedFiles();
        }
    }
Example #6
0
    public void RemoveUnusedFiles()
    {
        string path  = Directory.GetParent(GetIndexPath()).FullName;
        var    files = Directory.GetFiles(path, "*.xml", SearchOption.AllDirectories);

        MelDB.Instance.Sort();
        for (int i = 0; i < files.Length; i++)
        {
            var   name = Path.GetFileNameWithoutExtension(files[i]);
            ulong id;
            if (ulong.TryParse(name, out id) && MelDB.FindParticleById(id) != null)
            {
                continue;
            }
            if (name.Equals(IndexFile, StringComparison.OrdinalIgnoreCase))
            {
                continue;
            }
            try
            {
                File.Delete(files[i]);
            }
            catch (Exception e)
            {
                Debug.LogErrorFormat("Failed to remove file: {0}\n{1}", e.Message, files[i]);
            }
        }
    }
    // Use this for initialization
    void Start()
    {
        MelDB.Init();

        StartCoroutine(CameraFov_Coroutine());

        JSImports.LoadComplete_Callback();
    }
Example #8
0
 public static void Init()
 {
     if (_instance != null)
     {
         return;
     }
     _instance = MelDBSerializer.Instance.LoadIndex();
     Debug.Log("MelDB index loaded: " + _instance.particles.Count + " particles");
 }
Example #9
0
    public static IEnumerator InitAsync(MonoBehaviour coroutineHolder)
    {
        if (_instance != null)
        {
            yield break;
        }
        MelDBSerializer.coroutineHolder = coroutineHolder;
        var request = MelDBSerializer.Instance.LoadIndexAsync();

        yield return(request);

        if (_instance == null)
        {
            _instance = request.result;
            Debug.Log("MelDB index async-loaded: " + _instance.particles.Count + " particles");
        }
    }
Example #10
0
 public CompoundInfo()
 {
     id = MelDB.GetRandomId();
 }
Example #11
0
 public static void Clear()
 {
     _instance = null;
 }
Example #12
0
 public abstract void Serialize(MelDB db, bool indexOnly, bool removeUnusedFiles = true,
                                Func <string, int, int, bool> progress           = null);
Example #13
0
    public override void Serialize(MelDB db, bool indexOnly, bool removeUnusedFiles = true,
                                   Func <string, int, int, bool> progress           = null)
    {
        if (indexOnly)
        {
            throw new Exception("Trying to binary serialize DB with index only");
        }

        var bucketPrefix = Application.dataPath + DBPath + BucketFilename;
        var dir          = Path.GetDirectoryName(bucketPrefix);

        if (!Directory.Exists(dir))
        {
            Directory.CreateDirectory(dir);
        }

        if (progress != null && progress("Binary Serialization: 1/4 preparing buckets", 0, 1))
        {
            return;
        }
        var streams = new BinaryWriter[BUCKETS];

        for (int i = 0; i < BUCKETS; i++)
        {
            var s = File.Create(bucketPrefix + i.ToString("000") + ".bytes");
            streams[i] = new BinaryWriter(s, encoding);
        }
        var particles      = db.particles;
        int particlesCount = particles.Count;

        // first serialize all particles into buckets to get buckets location indexes
        for (int i = particlesCount - 1; i >= 0; i--)
        {
            if (progress != null && progress("Binary Serialization: 2/4 cleaning and serializing particles", particlesCount - i, particlesCount))
            {
                return;
            }
            var p = particles[i];
            p.Init();
            if (p.data == null | !IncludeInBuild(p))
            {
                particles.RemoveAt(i);
                continue;
            }

            var buck   = GetParticleBuckedIndex(p);
            var writer = streams[buck];
            WriteParticleData(writer, p);
        }
        for (int i = 0; i < BUCKETS; i++)
        {
            streams[i].Close();
        }
        particlesCount = particles.Count;
        if (progress != null && progress("Binary Serialization: 3/4 sorting DB", 0, 1))
        {
            return;
        }
        db.Sort();

        dir = Path.GetDirectoryName(GetIndexPath());
        if (!Directory.Exists(dir))
        {
            Directory.CreateDirectory(dir);
        }

        // now we can serialize index with bucked indexes
        using (FileStream fDB = File.Create(GetIndexPath()))
        {
            var bw = new BinaryWriter(fDB, encoding);
            bw.Write(particlesCount);
            for (int i = 0; i < particlesCount; i++)
            {
                if (progress != null && progress("Binary Serialization: 4/4 serializing index", i, particlesCount))
                {
                    return;
                }
                var p     = particles[i];
                var flags = p.flags;
                bw.Write(p.atomsHash);
                bw.Write(p.structureHash);
                bw.Write(p.structureHashExact);
                bw.Write((ushort)p.binaryDataLocationInBucket);
                bw.Write(p.id);
                bw.Write(p.name);
                bw.Write((ushort)p.flags);
                if ((flags & ParticleInfo.ParticleFlags.HasChemicalFormula) > 0)
                {
                    bw.Write(p.chemicalFormula);
                }
                if ((flags & ParticleInfo.ParticleFlags.HasParticleCharge) > 0)
                {
                    bw.Write((sbyte)p.charge);
                }
                bw.Write((byte)p.CASes.Count);
                for (int cas = 0; cas < p.CASes.Count; cas++)
                {
                    bw.Write(p.CASes[cas]);
                }
            }

            for (int i = 0; i < particlesCount; i++)
            {
                bw.Write(db.__sortedIds[i]);
            }
            //for (int i = 0; i < particlesCount; i++)
            //    bw.Write(db.__sortedStructureHashes[i]);
            //for (int i = 0; i < particlesCount; i++)
            //    bw.Write(db.__sortedStructureHashesExact[i]);
            for (int i = 0; i < particlesCount; i++)
            {
                bw.Write(db.__sortedAtomsHashes[i]);
            }
            bw.Close();
        }

        Debug.LogFormat("MelDB serialized with {0} particles into {1} buckets\nFlags: {2}",
                        particlesCount, BUCKETS, _include);
    }