def test_hp_task_creation(): "test fit to hp dataframe" task = FitToHairpinTask( sequence = utpath("hairpins.fasta"), oligos = "ctgc", fit = ChiSquareFit(), ) assert isinstance(task.fit.pop(None), ChiSquareFit) assert set(task.fit) == {'015', *(f"GF{i}" for i in range(1, 5))} assert all(isinstance(i, ChiSquareFit) for i in task.fit.values()) assert_equal(task.fit['GF4'].peaks, [153, 205, 407, 496, 715, 845]) assert all(isinstance(i, ChiSquareFit) for i in task.fit.values()) task = FitToHairpinTask( sequence = utpath("hairpins.fasta"), oligos = "ctgc", fit = PeakGridFit(), ) assert isinstance(task.fit.pop(None), PeakGridFit) assert set(task.fit) == {'015', *(f"GF{i}" for i in range(1, 5))} assert all(isinstance(i, PeakGridFit) for i in task.fit.values()) for i in PeakGridFit(), ChiSquareFit(): task = FitToHairpinTask( sequence = "doesnotexist.fasta", oligos = "ctgc", fit = i ) assert isinstance(task.fit.pop(None), type(i)) assert not task.fit
def test_rescale(): "test rescale" rng = Range(1, 1, 1) obj = rng.rescale("bias", 5) assert rng is not obj assert all(abs(5.-i) < 1e-5 for i in obj) obj = rng.rescale("stretch", .2) assert rng is not obj assert all(abs(5.-i) < 1e-5 for i in obj) rng = Range(None, 1, 1) obj = rng.rescale("bias", 5) assert rng is not obj assert obj[0] is None assert all(abs(5.-i) < 1e-5 for i in obj[1:]) obj = rng.rescale("stretch", .2) assert rng is not obj assert obj[0] is None assert all(abs(5.-i) < 1e-5 for i in obj[1:]) dist = DistanceConstraint("hp", {"stretch": Range(1, 1, 1), "bias": Range(1, 1, 1)}) obj = dist.rescale(5.) assert dist is not obj assert obj[0] == "hp" assert all(abs(5.-i) < 1e-5 for i in obj[1]['bias']) assert all(abs(.2-i) < 1e-5 for i in obj[1]['stretch']) task = FitToHairpinTask() assert task.rescale(5.) is not task
def readconstraints(idtask: FitToHairpinTask, idpath: Union[Path, str, None], useparams: bool = True, constraints: Dict[str, Range] = None) -> FitToHairpinTask: "adds constraints to an identification task" cstrs: Constraints = {} idtask.constraints = cstrs if idpath is None or not Path(idpath).exists(): return idtask deflt = dict(FitToHairpinTask.DEFAULT_CONSTRAINTS) deflt.update(constraints if constraints else {}) for item in readparams(cast(str, idpath)): cstrs[item[0]] = DistanceConstraint(item[1], {}) if len(item) == 2 or not useparams: continue if item[2] is not None: cstrs[item[0]].constraints['stretch'] = Range( item[2], *deflt['stretch'][1:3]) if item[3] is not None: cstrs[item[0]].constraints['bias'] = Range(item[3], *deflt['bias'][1:3]) return idtask
def test_beadsplot_info_simple(diskcaching): "test the view" # pylint: disable=protected-access beads, mdl = _Fig.create() # testing for when there is nothing to plot for cls in _PeaksPlot, _HairpinPlot: assert ( dict(cls(beads, mdl.tasks.processors)._reset())['x_range']['factors'] == [('track1', '0')] ) def _change(tpe, **kwa): mdl.theme.__dict__.update(**kwa) cls = _PeaksPlot if tpe else _HairpinPlot return dict(cls(beads, mdl.tasks.processors)._reset()) mdl.tasks.jobs.launch(list(mdl.tasks.processors.values())) cache = _change(True) assert cache['x_range']['factors'] == list(zip( repeat(''), repeat(''), [ '0', '1', '2', '3', '4', '7', '8', '12', '13', '14', '17', '18', '23', '24', '25', '27', '33', '34', '35', '37' ] )) next(iter(mdl.tasks.tasks.tasks.tasks.values())).add( FitToHairpinTask( sequence = utpath("hairpins.fasta"), oligos = "4mer", ), mdl.tasks.tasks.state.processors[FitToHairpinTask] ) mdl.tasks.jobs.launch(list(mdl.tasks.processors.values())) cache = _change(False) assert cache['x_range']['factors'] == [ ('GF1', '', '14'), ('GF1', '', '33'), ('GF1', '', '1'), ('GF1', '', '7'), ('GF1', '', '25'), ('GF1', '', '35'), ('GF1', '', '12'), ('GF3', '', '27'), ('GF3', '', '13'), ('GF3', '', '3'), ('GF3', '', '17'), ('GF3', '', '37'), ('GF3', '', '23'), ('GF3', '', '18'), ('GF4', '', '34'), ('GF4', '', '0'), ('GF4', '', '4'), ('GF4', '', '24'), ('GF2', '', '2') ] mdl.display.hairpins = {'015', 'GF2', 'GF3', 'GF4'} cache = _change(False) assert cache['x_range']['factors'] == [ ('GF1', '', '14'), ('GF1', '', '33'), ('GF1', '', '1'), ('GF1', '', '7'), ('GF1', '', '25'), ('GF1', '', '35'), ('GF1', '', '12') ] mdl.theme.sorting = {} cache = _change(False) assert cache['x_range']['factors'] == [ ('GF1', '', '1'), ('GF1', '', '7'), ('GF1', '', '12'), ('GF1', '', '14'), ('GF1', '', '25'), ('GF1', '', '33'), ('GF1', '', '35') ]
def test_hp_dataframe(record): "test fit to hp dataframe" pair = next(iter(create( TrackReaderTask(path = utpath("big_legacy")), EventDetectionTask(), PeakSelectorTask(), FitToHairpinTask( sequence = utpath("hairpins.fasta"), oligos = "4mer", fit = ChiSquareFit() ), DataFrameTask(merge = True, measures = dict( peaks = dict(missing = True, peakhfsigma = True) )), ).run())) assert pair.shape == (102, 29) assert 'falseneg' in pair.peaks[1].status.unique() assert pair.index.names == ['hpin', 'track', 'bead'] assert isinstance(pair.peaks.values[0], pd.DataFrame) assert 'modification' in pair.columns assert hasattr(pair, 'tasklist') assert record["withmissing"].approx( pair.drop(columns = ['peaks', 'cost', 'modification']).iloc[:5], atol = 5e-4 ) assert record["peakswithmissing"].approx( pair.peaks[1].iloc[:5], atol = 5e-4 ) pair = next(iter(create( TrackReaderTask(path = utpath("big_legacy")), EventDetectionTask(), PeakSelectorTask(), FitToHairpinTask( sequence = utpath("hairpins.fasta"), oligos = "4mer", fit = ChiSquareFit() ), DataFrameTask(merge = True), ).run())) assert pair.shape == (102, 26) assert pair.index.names == ['hpin', 'track', 'bead'] assert 'modification' in pair.columns assert hasattr(pair, 'tasklist')
def fittohairpintask(seqpath: Union[Path, str], oligos: Union[Sequence[str], str], idpath: Union[None, Path, str] = None, useparams: bool = True, constraints: Dict[str, Range] = None, **kwa) -> FitToHairpinTask: "creates and identification task from paths" task = FitToHairpinTask.read(seqpath, oligos, **kwa) if len(task.fit) == 0: raise IOError("Could not find any sequence in " + str(seqpath)) return readconstraints(task, idpath, useparams, constraints)
def addhp(server, rendered = _EVT, **kwa): "add the hairpin" from peakcalling.processor import FitToHairpinTask kwa.setdefault('sequences', utpath("hairpins.fasta")) kwa.setdefault('oligos', "kmer") server.cmd( lambda: server.ctrl.tasks.addtask( next(next(server.ctrl.tasks.tasklist(...))), FitToHairpinTask(**kwa) ), rendered = rendered )
def test_beadsplot_info_filter(diskcaching): "test the view" # pylint: disable=protected-access beads, mdl = _Fig.create() next(iter(mdl.tasks.tasks.tasks.tasks.values())).add( FitToHairpinTask( sequence = utpath("hairpins.fasta"), oligos = "4mer", ), mdl.tasks.tasks.state.processors[FitToHairpinTask] ) mdl.tasks.jobs.launch(list(mdl.tasks.processors.values())) cache = dict(_HairpinPlot(beads, mdl.tasks.processors)._reset()) arr = cache['_expdata']['data']['closest'] arr = np.unique(arr[np.isfinite(arr)]) assert_equal( arr, [ 38., 46., 151., 157., 222., 258., 274., 294., 347., 357., 379., 393., 503., 540., 569., 576., 631., 659., 704., 738., 754., 784., 791., 795., 800. ] ) arr = np.unique( next(j for i,j in cache.items() if isinstance(i, _Fig._CData)) ['data']['bindingposition'] ) assert_equal( arr, [ 38., 46., 151., 157., 222., 258., 274., 294., 347., 357., 379., 393., 503., 540., 569., 576., 631., 659., 704., 738., 754., 784., 791., 795., 800. ] ) mdl.display.ranges[('peaks', 'baseposition')] = Slice(100, 400) cache = dict(_HairpinPlot(beads, mdl.tasks.processors)._reset()) arr = cache['_expdata']['data']['closest'] arr = np.unique(arr[np.isfinite(arr)]) assert_equal(arr, [151., 157., 222., 258., 274., 294., 347., 357., 379., 393.]) arr = np.unique( next(j for i,j in cache.items() if isinstance(i, _Fig._CData)) ['data']['bindingposition'] ) assert_equal(arr, [151., 157., 222., 258., 274., 294., 347., 357., 379., 393.])