def test_dtype_float32(self): """A BulkObjectsContainer with dtype=np.float32 should support fractional counts and deltas. """ container = BulkObjectsContainer(OBJECT_NAMES, dtype=np.float32) initialCounts = [10, 10.5, 20] container.countsIs(initialCounts) npt.assert_equal(container.counts(), initialCounts) incCounts = [10, 20.5, 30.5] newCounts = [20, 31, 50.5] container.countsInc(incCounts) npt.assert_equal(container.counts(), newCounts) decCounts = [1.5, 2, 3.5] newCounts = [18.5, 29, 47] container.countsDec(decCounts) npt.assert_equal(container.counts(), newCounts) countsView = container.countsView() newCounts = [28.5, 49.5, 77.5] countsView.countsInc(incCounts) npt.assert_equal(countsView.counts(), newCounts) newCounts = [27, 47.5, 74] countsView.countsDec(decCounts) npt.assert_equal(countsView.counts(), newCounts)
def fitSimData_2(kb, simOutDir): subMass = kb.mass.subMass proteinMass = subMass["proteinMass"].asUnit(units.g) rnaMass = subMass["rnaMass"].asUnit(units.g) # Construct bulk container # We want to know something about the distribution of the copy numbers of # macromolecules in the cell. While RNA and protein expression can be # approximated using well-described statistical distributions, we need # absolute copy numbers to form complexes. To get a distribution, we must # instantiate many cells, form complexes, and finally compute the # statistics we will use in the fitting operations. bulkContainer = BulkObjectsContainer(kb.state.bulkMolecules.bulkData['id']) rnaView = bulkContainer.countsView(kb.process.transcription.rnaData["id"]) proteinView = bulkContainer.countsView(kb.process.translation.monomerData["id"]) complexationMoleculesView = bulkContainer.countsView(kb.process.complexation.moleculeNames) allMoleculesIDs = list( set(kb.process.transcription.rnaData["id"]) | set(kb.process.translation.monomerData["id"]) | set(kb.process.complexation.moleculeNames) ) allMoleculesView = bulkContainer.countsView(allMoleculesIDs) allMoleculeCounts = np.empty((N_SEEDS, allMoleculesView.counts().size), np.int64) complexationStoichMatrix = kb.process.complexation.stoichMatrix().astype(np.int64, order = "F") complexationPrebuiltMatrices = mccBuildMatrices( complexationStoichMatrix ) rnaDistribution = kb.process.transcription.rnaData["expression"] rnaTotalCounts = countsFromMassAndExpression( rnaMass.asNumber(units.g), kb.process.transcription.rnaData["mw"].asNumber(units.g / units.mol), rnaDistribution, kb.constants.nAvogadro.asNumber(1 / units.mol) ) proteinDistribution = calcProteinDistribution(kb) proteinTotalCounts = calcProteinTotalCounts(kb, proteinMass, proteinDistribution) for seed in xrange(N_SEEDS): randomState = np.random.RandomState(seed) allMoleculesView.countsIs(0) rnaView.countsIs(randomState.multinomial( rnaTotalCounts, rnaDistribution )) proteinView.countsIs(randomState.multinomial( proteinTotalCounts, proteinDistribution )) complexationMoleculeCounts = complexationMoleculesView.counts() updatedCompMoleculeCounts = mccFormComplexesWithPrebuiltMatrices( complexationMoleculeCounts, seed, complexationStoichMatrix, *complexationPrebuiltMatrices ) complexationMoleculesView.countsIs(updatedCompMoleculeCounts) allMoleculeCounts[seed, :] = allMoleculesView.counts() bulkAverageContainer = BulkObjectsContainer(kb.state.bulkMolecules.bulkData['id'], np.float64) bulkDeviationContainer = BulkObjectsContainer(kb.state.bulkMolecules.bulkData['id'], np.float64) bulkAverageContainer.countsIs(allMoleculeCounts.mean(0), allMoleculesIDs) bulkDeviationContainer.countsIs(allMoleculeCounts.std(0), allMoleculesIDs) # Free up memory # TODO: make this more functional; one function for returning average & distribution del allMoleculeCounts del bulkContainer # ----- Calculate ppGpp concentration ----- # aminoAcidsInProtein = (bulkAverageContainer.counts(kb.process.translation.monomerData['id']) * kb.process.translation.monomerData['length'].asNumber()).sum() aminoAcidsInComplex = 0. for cplx in list(kb.process.complexation.complexNames): cplx_data = kb.process.complexation.getMonomers(cplx) cplx_subunit = cplx_data['subunitIds'] cplx_stoich = cplx_data['subunitStoich'] subunit_idxs = [] subunit_idxs_to_delete = [] for idx, subunit in enumerate(cplx_subunit): try: subunit_idxs.append(np.where(kb.process.translation.monomerData['id'] == subunit)[0][0]) except IndexError: subunit_idxs_to_delete.append(idx) cplx_stoich = np.delete(cplx_stoich, subunit_idxs_to_delete) subunit_length = kb.process.translation.monomerData['length'][subunit_idxs].asNumber() aminoAcidsInComplex += (bulkAverageContainer.count(cplx) * subunit_length * cplx_stoich).sum() totalAminoAcidsInMacromolecules = (aminoAcidsInComplex + aminoAcidsInProtein) totalAAInSolublePool = totalAminoAcidsInMacromolecules * 0.08 # Approximatly correct for one time calculature. # TODO: Calculate soluble pools here too! totalAminoAcidsInCell = totalAminoAcidsInMacromolecules + totalAAInSolublePool ppGpp_per_cell = (totalAminoAcidsInCell * kb.constants.ppGpp_base_concentration).asUnit(units.count) cellVolume = kb.mass.avgCellDryMassInit / kb.constants.cellDensity ppGpp_concentration = (ppGpp_per_cell.asUnit(units.mol) / cellVolume).asUnit(units.mol / units.L) # Finally set ppGpp concentration to maintain kb.process.metabolism.metabolitePoolConcentrations[kb.process.metabolism.metabolitePoolIDs.index('PPGPP[c]')] = ppGpp_concentration # ----- tRNA synthetase turnover rates ------ # Fit tRNA synthetase kcat values based on expected rates of translation # compute values at initial time point ## Compute rate of AA incorperation proteinComposition = kb.process.translation.monomerData["aaCounts"] initialProteinMass = kb.mass.subMass['proteinMass'] initialProteinCounts = calcProteinCounts(kb, initialProteinMass) initialProteinTranslationRate = ( (np.log(2) / kb.doubling_time + kb.process.translation.monomerData["degRate"]) * initialProteinCounts ).asUnit(1 / units.s) initialAAPolymerizationRate = units.dot( units.transpose(proteinComposition), initialProteinTranslationRate ).asUnit(units.aa / units.s) ## Compute expression of tRNA synthetases ## Assuming independence in variance synthetase_counts_by_group = np.zeros(len(kb.process.translation.AA_SYNTHETASE_GROUPS), dtype = np.float64) synthetase_variance_by_group = np.zeros(len(kb.process.translation.AA_SYNTHETASE_GROUPS), dtype = np.float) for idx, synthetase_group in enumerate(kb.process.translation.AA_SYNTHETASE_GROUPS.itervalues()): group_count = 0. group_variance = 0. for synthetase in synthetase_group: counts = bulkAverageContainer.countsView([synthetase]).counts() variance = bulkDeviationContainer.countsView([synthetase]).counts() group_count += counts group_variance += variance synthetase_counts_by_group[idx] = group_count synthetase_variance_by_group[idx] = group_variance ## Saved for plotting kb.synthetase_counts = synthetase_counts_by_group kb.synthetase_variance = synthetase_variance_by_group kb.initial_aa_polymerization_rate = initialAAPolymerizationRate kb.minimum_trna_synthetase_rates = initialAAPolymerizationRate / synthetase_counts_by_group # TODO: Reimplement this with better fit taking into account the variance in aa # utilization. ## Scaling synthetase counts by -2*variance so that rates will be high enough ## to accomodate stochastic behavior in the model without translation stalling. # scaled_synthetase_counts = synthetase_counts_by_group - (2 * synthetase_variance_by_group) scaled_synthetase_counts = synthetase_counts_by_group assert all(scaled_synthetase_counts > 0) predicted_trna_synthetase_rates = initialAAPolymerizationRate / scaled_synthetase_counts kb.trna_synthetase_rates = 2 * predicted_trna_synthetase_rates