from iocbio.kinetics.handler.experiment_generic import ExperimentGeneric
from iocbio.kinetics.constants import database_table_experiment
from .analyzer_primary import AnalyzerRespirationCreator, AnalyzerRespirationTMPD, AnalyzerRespirationTMPDCorrected
### Module flag
IocbioKineticsModule = ['analyzer', 'database_schema']
### Implementation
[docs]class ExperimentStrathkelvin(ExperimentGeneric):
"""General description of experiment performed on Strathkelvin"""
database_table = "strathkelvin"
@staticmethod
def database_schema(db, gen_config_table=None):
db.query("CREATE TABLE IF NOT EXISTS " + db.table(ExperimentStrathkelvin.database_table) +
"(experiment_id text PRIMARY KEY, rawdata text, filename text, title text, channel integer, " +
"FOREIGN KEY (experiment_id) REFERENCES " + db.table(database_table_experiment) + "(experiment_id) ON DELETE CASCADE" +
")")
if gen_config_table is not None:
db.query("CREATE TABLE IF NOT EXISTS " + db.table(gen_config_table) +
"(experiment_id text not null, cells_in_mkL double precision, chamber_volume_in_ml double precision, " +
"temperature double precision"
", primary key(experiment_id), " +
"FOREIGN KEY (experiment_id) REFERENCES " + db.table(database_table_experiment) + "(experiment_id) ON DELETE CASCADE" +
")")
@staticmethod
def getvalue(data, key, protocol=True):
k = key
if k not in data.config:
if protocol:
k = data.config["protocol"] + "." + key
if k not in data.config:
for s in data.config:
if s.startswith(data.config["protocol"]) and s.endswith(" " + key):
k = s
if k not in data.config:
return None
v = data.config[k]
try:
vf = float(v)
return vf
except:
pass
return v
@staticmethod
def getcells(data):
cells = ExperimentStrathkelvin.getvalue(data, "cells")
if cells is None: return cells
if cells[-3:] != "mkL":
print("Unexpected unit for cells: %s" % cells)
this_is_an_ugly_crash
cells = float(cells[:-3])
return cells
@staticmethod
def store(database, data):
ExperimentGeneric.database_schema(database)
ExperimentStrathkelvin.database_schema(database)
experiment_id = data.experiment_id
ExperimentGeneric.store(database, experiment_id, time=data.time,
type_generic=data.type_generic,
type_specific=data.type, hardware="strathkelvin")
c = database
if not database.has_record(ExperimentStrathkelvin.database_table,
experiment_id = experiment_id):
c.query("INSERT INTO " + database.table(ExperimentStrathkelvin.database_table) +
"(experiment_id, rawdata, filename, title, channel) " +
"VALUES(:experiment_id,:ftxt,:fname,:exptitle,:channel)",
experiment_id=experiment_id,
ftxt=data.fulltext,
fname=data.config["this file"],
exptitle=data.config["experiment title"],
channel=int(data.config["channel index"]))
@staticmethod
def get_fulltxt(database, experiment_id):
if ExperimentGeneric.hardware(database, experiment_id) != 'strathkelvin':
return None
print('Loading raw data for experiment:', experiment_id)
for q in database.query("SELECT rawdata FROM " + database.table(ExperimentStrathkelvin.database_table) +
" WHERE experiment_id=:experiment_id",
experiment_id=experiment_id):
return q.rawdata
return None
def __init__(self, database, data, gen_config_table):
ExperimentGeneric.__init__(self,database)
ExperimentStrathkelvin.database_schema(database, gen_config_table)
experiment_id = data.experiment_id
self.name = data.config["this file"]
cells = ExperimentStrathkelvin.getcells(data)
volume_ml = ExperimentStrathkelvin.getvalue(data, "volume_ml")
temperature = ExperimentStrathkelvin.getvalue(data, "temperature")
if not database.has_record(gen_config_table, experiment_id=experiment_id):
database.query("INSERT INTO " + database.table(gen_config_table) +
"(experiment_id, cells_in_mkL, chamber_volume_in_ml, temperature) " +
"VALUES (:experiment_id,:cells,:volume,:temperature)",
experiment_id=experiment_id, cells=cells,
volume=volume_ml, temperature=temperature)
else:
database.query("UPDATE " + database.table(gen_config_table) +
" SET cells_in_mkL=:cells, chamber_volume_in_ml=:volume, temperature=:temperature WHERE experiment_id=:experiment_id",
experiment_id=experiment_id, cells=cells,
volume=volume_ml, temperature=temperature)
#############################################################################################
class ExperimentStrathkelvinADPTitration(ExperimentStrathkelvin):
def __init__(self, database, data):
ExperimentStrathkelvin.__init__(self, database, data, "VO2_ADP_config")
class ExperimentStrathkelvinATPTitration(ExperimentStrathkelvin):
def __init__(self, database, data):
ExperimentStrathkelvin.__init__(self, database, data, "VO2_ATP_config")
class ExperimentStrathkelvinMerviPK(ExperimentStrathkelvin):
def __init__(self, database, data):
ExperimentStrathkelvin.__init__(self, database, data, "VO2_MerviPK_config")
class ExperimentStrathkelvinRespiratoryComplexes(ExperimentStrathkelvin):
def __init__(self, database, data):
ExperimentStrathkelvin.__init__(self, database, data, "VO2_RespiratoryComplexes_config")
class ExperimentStrathkelvinGMPS(ExperimentStrathkelvin):
def __init__(self, database, data):
ExperimentStrathkelvin.__init__(self, database, data, "VO2_GMPS_config")
class ExperimentStrathkelvinSGMP(ExperimentStrathkelvin):
def __init__(self, database, data):
ExperimentStrathkelvin.__init__(self, database, data, "VO2_SGMP_config")
#############################################################################################
# allocation of experiment handler and analyzers for strathkelvin experiments
def allocate_handler_analyzer(database, data):
titration_types = {'Strathkelvin merviPK': 'MerviPK'}
for i in ['GMPS', 'SGMP', 'ATP_glucose_PEP_PK', 'ATP_AMP_PEP_PK', 'creatine_ATP_PEP_PK',
'ATP_glucose_ADP', 'ATP_AMP_ADP', 'creatine_ATP_ADP']:
titration_types['Strathkelvin ' + i] = i
if data.type in titration_types:
Analyzer = { 'default': AnalyzerRespirationCreator('VO2_' + titration_types[data.type] + '_raw') }
experiment_handler = ExperimentStrathkelvin(database, data, 'VO2_' + titration_types[data.type] + '_config')
elif data.type.find("Strathkelvin ADP titration") == 0:
Analyzer = { 'default': AnalyzerRespirationCreator("VO2_ADP_titration_raw") }
experiment_handler = ExperimentStrathkelvinADPTitration(database, data)
elif data.type.find("Strathkelvin Respiratory complexes") == 0:
Analyzer = {
'default': AnalyzerRespirationCreator('VO2_RespiratoryComplexes_raw'),
'TMPD oxydation': AnalyzerRespirationTMPD,
'TMPD corrected': AnalyzerRespirationTMPDCorrected,
}
experiment_handler = ExperimentStrathkelvinRespiratoryComplexes(database, data)
elif data.type == "Strathkelvin ATP titration":
Analyzer = { 'default': AnalyzerRespirationCreator("VO2_ATP_titration_raw") }
experiment_handler = ExperimentStrathkelvinATPTitration(database, data)
else:
return None, None
return Analyzer, experiment_handler
#####################
#### ModuleAPI ######
def database_schema(db):
ExperimentStrathkelvin.database_schema(db)
def analyzer(database, data):
A, _ = allocate_handler_analyzer(database, data)
return A, None, None