# functions for taking subsets of the data
import numpy as np
import om_code.omgenutils as gu
import om_code.omerrors as errors
[docs]def getsubset(
inst,
type,
set="all",
includes=False,
excludes=False,
nonull=False,
nomedia=False,
):
"""
Returns a subset of either the conditions or strains.
Parameters
--
inst: instance of platereader
type: string
Either 'c' (conditions) or 's' (strains).
set: list of strings
List of items to include (default is 'all').
includes: string
Select only items with this string in their name.
excludes: string
Ignore any items with this string in their name.
nonull: boolean
If True, ignore Null strain.
nomedia: boolean
If True, ignores 'media' condition.
Returns
-------
sset: list of strings
"""
if set == "all" or includes or excludes:
if type == "c":
sset = list(
np.unique(
[
con
for e in inst.allconditions
for con in inst.allconditions[e]
]
)
)
if nomedia and "media" in sset:
sset.pop(sset.index("media"))
elif type == "s":
sset = list(
np.unique(
[
str
for e in inst.allstrains
for str in inst.allstrains[e]
]
)
)
if nonull and "Null" in sset:
sset.pop(sset.index("Null"))
else:
sset = inst.allexperiments
# find those items containing keywords given in 'includes'
if includes:
includes = gu.makelist(includes)
newset = []
for s in sset:
gotone = 0
for item in includes:
if item in s:
gotone += 1
if gotone == len(includes):
newset.append(s)
sset = newset
# remove any items containing keywords given in 'excludes'
if excludes:
excludes = gu.makelist(excludes)
exs = []
for s in sset:
for item in excludes:
if item in s:
exs.append(s)
break
for ex in exs:
sset.pop(sset.index(ex))
else:
sset = gu.makelist(set)
if sset:
# sort by numeric values in list entries
return sorted(sset, key=gu.natural_keys)
else:
if includes:
raise errors.getsubset(
"Nothing found for " + " and ".join(includes)
)
else:
raise errors.getsubset("Nothing found")
###
[docs]def getexps(inst, experiments, experimentincludes, experimentexcludes):
"""
Returns list of experiments
"""
if experimentincludes or experimentexcludes:
exps = getsubset(
inst,
"e",
includes=experimentincludes,
excludes=experimentexcludes,
)
elif experiments == "all":
exps = inst.allexperiments
else:
exps = gu.makelist(experiments)
return exps
###
[docs]def getcons(inst, conditions, conditionincludes, conditionexcludes, nomedia):
"""
Returns list of conditions
"""
if conditionincludes or conditionexcludes:
cons = getsubset(
inst,
"c",
includes=conditionincludes,
excludes=conditionexcludes,
nomedia=nomedia,
)
elif conditions == "all":
cons = list(
np.unique(
[
con
for e in inst.allconditions
for con in inst.allconditions[e]
]
)
)
if nomedia and "media" in cons:
cons.pop(cons.index("media"))
else:
cons = gu.makelist(conditions)
return sorted(cons, key=gu.natural_keys)
###
[docs]def getstrs(inst, strains, strainincludes, strainexcludes, nonull):
"""
Returns list of strains
"""
if strainincludes or strainexcludes:
strs = getsubset(
inst,
"s",
includes=strainincludes,
excludes=strainexcludes,
nonull=nonull,
)
elif strains == "all":
strs = list(
np.unique(
[str for e in inst.allstrains for str in inst.allstrains[e]]
)
)
if nonull and "Null" in strs:
strs.pop(strs.index("Null"))
else:
strs = gu.makelist(strains)
if nonull and "Null" in strs:
strs.pop(strs.index("Null"))
return sorted(strs, key=gu.natural_keys)
###
[docs]def getall(
inst,
experiments,
experimentincludes,
experimentexcludes,
conditions,
conditionincludes,
conditionexcludes,
strains,
strainincludes,
strainexcludes,
nonull=True,
nomedia=True,
):
"""
Returns experiments, conditions, and strains
"""
exps = getexps(inst, experiments, experimentincludes, experimentexcludes)
cons = getcons(
inst, conditions, conditionincludes, conditionexcludes, nomedia
)
strs = getstrs(inst, strains, strainincludes, strainexcludes, nonull)
return exps, cons, strs
###