#!/usr/bin/python

# IMPORTS ==========================================================================
# Python builtins
import sys
from os import mkdir
from os.path import abspath, exists

# FAHTools
sys.path.append( "/home/server_c/modules/fah_adaptive_sampling/FAHTools" )
from FAHdb import FAHdb
from FAHMisc import UniformlyDistributedInteger 
from FAHProject import FAHProject
from FAHServer import FAHServer

# mmtools - for xtc2gro and GromacsStructures
sys.path.append( "/home/server_c/modules/mmtools/gromacstools" )
from GromacsData import xtc2gro

# USER-DEFINED SETTINGS ============================================================
# Settings ... have fun with this!

server = FAHServer( server2dir = "/home/server_c/server2",
                                        serverBinary = "serverV3M_c",
                                        SVr = "SVr_c.sh" )
database = "project3191"
projectConfiguration = "/home/server_c/server2/densign/3191/project3191.conf"
workDirName = "."
logfile = "%s/LOG" % workDirName

def buildqlist( db ):
	qbase = "select run, clone, gen, snapshot from frames where %s=%d limit 10"
	defs = ("def1", "def2" )
	nums = (0, 1)
	for d in defs :
       		for num in nums :
                	db.addquery( qbase % ( d, num ) )
	return db

# SCRIPT-DERIVED OBJECTS AND FILES ================================================
# working directory -- for intermediate files
# things will be overwritten
try:
	mkdir( workDirName )
except:
	pass

# database connection and query list
db = FAHdb( database )
db = buildqlist( db )

# Folding@home project
project = FAHProject( conffile = projectConfiguration )
datadir = project.datapath

# MAIN SCRIPT =====================================================================
# The query loop
rcgsList = []
while True:
	data = db.query()
	if data:
		maxval = len( data ) - 1
		randomFrame = UniformlyDistributedInteger( min = 0, max = maxval )
		rcgs = data[ randomFrame ]
		rcgsList.append( rcgs )	
	else:
		break

# convert everyone to a gro file, store in workDirName directory
newGroList = []
for rcgs in rcgsList :
	( run, clone, gen, snapshot ) = rcgs

	rcdir = "RUN%d/CLONE%d" % ( run, clone )
	dir = "%s/%s" % ( datadir , rcdir )

	xtcFile = "%s/frame%d.xtc" % ( dir, gen )
	tprFile = "%s/frame0.tpr" %  dir

	gro = xtc2gro( xtcFile, tprFile, snapshot, "echo 0 0" )
	fname = "%d-%d-%d-%d.gro" % rcgs
	name = "%s/%s" % ( workDirName, fname )

	# don't bother with adding gro files that already exist
	s = "Trying %s ..." % name
	if exists( name ) :
		LOG = open( logfile, "a" )
		LOG.write( "existing file %s" % name )
		s += " exists"
	else:
		gro.write( name )
		newGroList.append( name )
		s += " OK, added"

	print s

# Now we have a list of new gro files. Add them to the FAH project
for gro in newGroList :
	gro = abspath( gro )
	project.addRun( gro )

project.writeConfig()
server.runSetupDataDirs()
# server.restartServer()
