Database Operations

## 10.4 Database Operations

As `NanoCap` uses an sqlite database, the database can be browsed from the command line:

### Saving structures to the local database

`nanocap_add_structure_to_db.py` is an example script to save a fullerene structure to disk. The code is shown below.

    '''
    -=-=-=-=-=-=-=-=-=-=-=-=-=NanoCap=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    Copyright Marc Robinson  2014
    -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

    A script to construct and add a fullerene to the local database

    Input:
        N_carbon = Number of carbon atoms
        dual_lattice_force_field = force field
                                   for dual lattice
        carbon_force_field = force field
                            for carbon lattice
        dual_lattice_mintol= energy tolerance for
                             dual lattice optimisation
        dual_lattice_minsteps= steps for dual lattice
                                optimisation
        carbon_lattice_mintol=as above for carbon lattice
        carbon_lattice_minsteps=as above for carbon lattice
        optimiser=optimsation algorithm
        seed = seed for initial cap generation

    Output:
        structure is added to local database

    -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    '''

    import sys,os,random,numpy
    from nanocap.core.minimisation import DualLatticeMinimiser, \
                                          CarbonLatticeMinimiser
    from nanocap.structures.fullerene import Fullerene
    from nanocap.db.database import Database
    from nanocap.core.output import write_xyz

    N_carbon = 200

    dual_force_field = "Thomson"
    carbon_force_field = "EDIP"
    dual_lattice_mintol=1e-10
    dual_lattice_minsteps=100
    carbon_lattice_mintol=1e-10
    carbon_lattice_minsteps=100
    optimiser="LBFGS"
    seed = 12345

    my_fullerene = Fullerene()
    my_fullerene.construct_dual_lattice(N_carbon=N_carbon,seed=seed)
    my_fullerene.set_fix_pole(False)
    my_fullerene.set_nfixed_to_equator(0)

    Dminimiser = DualLatticeMinimiser(FFID=dual_force_field,
                                      structure = my_fullerene)
    Dminimiser.minimise(my_fullerene.dual_lattice,
                        min_type=optimiser,
                        ftol=dual_lattice_mintol,
                        min_steps=dual_lattice_minsteps)

    outfilename = "C{}_dual_lattice.xyz".format(N_carbon)
    write_xyz(outfilename,my_fullerene.dual_lattice)

    my_fullerene.construct_carbon_lattice()

    Cminimiser = CarbonLatticeMinimiser(FFID=carbon_force_field,
                                        structure = my_fullerene)

    Cminimiser.minimise_scale(my_fullerene.carbon_lattice)
    Cminimiser.minimise(my_fullerene.carbon_lattice,
                        min_type=optimiser,
                        ftol=carbon_lattice_mintol,
                        min_steps=carbon_lattice_minsteps)

    my_db = Database()
    my_db.init()
    my_db.add_structure(my_fullerene,
                        add_dual_lattice=True,
                        add_carbon_lattice=True)

### Loading structures from the local database

`nanocap_load_from_db.py` is an example script to load a set of fullerene dual lattices and save to disk. The code is shown below.

    '''
    -=-=-=-=-=-=-=-=-=-=-=-=-=NanoCap=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    Created: May 23, 2014
    Copyright Marc Robinson  2014
    -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

    Example script showing how to load from a database.
    Simple example showing how to load fullerene dual lattice

    Input:
        type - the type of structure to return the dual
               for = "Fullerene","Capped Nanotube","Nanotube"

    Output:
        folders for each structure containing xyz files and
        info files.

    -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    '''
    import sys,os
    sys.path.append(os.path.abspath(os.path.dirname(__file__)+"/../"))
    from nanocap.db.database import Database
    from nanocap.core.output import write_xyz

    type = "Fullerene"

    my_db = Database()
    my_db.init()

    #let's query for all fullerene dual lattices

    tables = ["dual_lattices"]
    selects = ["id",]
    checks  = { "dual_lattices" : ['type',] }
    data = {"dual_lattices" : {"type" : type}}

    sql,data = my_db.construct_query(data,tables,selects,checks)
    results  = my_db.query(sql,data)
    #out now contains dual lattice IDs of fullerenes
    print results

    for result in results:
        id = result[0]
        structure = my_db.construct_structure(id)
        Nd = structure.dual_lattice.npoints
        folder = "Fullerene_dual_lattice_id_{}_N_{}".format(id,Nd)
        structure.export(  folder=".",
                           save_info=True,
                           save_image=False,
                           save_video=False,
                           save_carbon_lattice=False,
                           save_con_carbon_lattice=False,
                           info_file='structure_info.txt',
                           save_dual_lattice=True,
                           formats=['xyz',])