def initializeProteinMonomers(bulkMolCntr, sim_data, randomState, massCoeff):

    monomersView = bulkMolCntr.countsView(
        sim_data.process.translation.monomerData["id"])
    monomerMass = massCoeff * sim_data.mass.getFractionMass(
        sim_data.conditionToDoublingTime[sim_data.condition]
    )["proteinMass"] / sim_data.mass.avgCellToInitialCellConvFactor
    # TODO: unify this logic with the fitter so it doesn't fall out of step
    # again (look at the calcProteinCounts function)

    monomerExpression = normalize(
        sim_data.process.transcription.rnaExpression[sim_data.condition][
            sim_data.relation.rnaIndexToMonomerMapping] *
        sim_data.process.translation.translationEfficienciesByMonomer /
        (np.log(2) /
         sim_data.conditionToDoublingTime[sim_data.condition].asNumber(units.s)
         + sim_data.process.translation.monomerData["degRate"].asNumber(
             1 / units.s)))

    nMonomers = countsFromMassAndExpression(
        monomerMass.asNumber(units.g),
        sim_data.process.translation.monomerData["mw"].asNumber(
            units.g / units.mol), monomerExpression,
        sim_data.constants.nAvogadro.asNumber(1 / units.mol))

    monomersView.countsIs(randomState.multinomial(nMonomers,
                                                  monomerExpression))
	def initialize(self, sim, sim_data):
		super(PolypeptideInitiation, self).initialize(sim, sim_data)

		# Load parameters
		mrnaIds = sim_data.process.translation.monomerData["rnaId"]
		self.proteinLengths = sim_data.process.translation.monomerData["length"].asNumber()
		self.translationEfficiencies = normalize(sim_data.process.translation.translationEfficienciesByMonomer)
		self.fracActiveRibosomeDict = sim_data.process.translation.ribosomeFractionActiveDict
		self.ribosomeElongationRateDict = sim_data.process.translation.ribosomeElongationRateDict

		# Determine changes from parameter shuffling variant
		shuffleIdxs = None
		if hasattr(sim_data.process.translation, "translationEfficienciesShuffleIdxs") and sim_data.process.translation.translationEfficienciesShuffleIdxs is not None:
			shuffleIdxs = sim_data.process.translation.translationEfficienciesShuffleIdxs
			self.translationEfficiencies = self.translationEfficiencies[shuffleIdxs]

		# Create view on to active 70S ribosomes
		self.activeRibosomes = self.uniqueMoleculesView('activeRibosome')

		# Create views onto bulk 30S and 50S ribosomal subunits
		self.ribosome30S = self.bulkMoleculeView(sim_data.moleculeIds.s30_fullComplex)
		self.ribosome50S = self.bulkMoleculeView(sim_data.moleculeIds.s50_fullComplex)

		# Create view onto bulk mRNAs
		self.mRnas = self.bulkMoleculesView(mrnaIds)
	def evolveState(self):
		# Calculate number of ribosomes that could potentially be initalized based on
		# counts of free 30S and 50S subunits
		inactiveRibosomeCount = np.min([
			self.ribosome30S.count().sum(),
			self.ribosome50S.count().sum(),
			])

		# Calculate initiation probabilities for ribosomes based on mRNA counts and associated
		# mRNA translational efficiencies
		proteinInitProb = normalize(
			self.mRnas.counts() * self.translationEfficiencies
			)


		# Calculate actual number of ribosomes that should be activated based on probabilities
		self.activationProb = self._calculateActivationProb(self.fracActiveRibosome, self.proteinLengths, self.ribosomeElongationRate, proteinInitProb, self.timeStepSec())
		ribosomeToActivate = np.int64(self.activationProb * inactiveRibosomeCount)

		if ribosomeToActivate == 0:
			return

		# Sample multinomial distribution to determine which mRNAs have full 70S
		# ribosomes initalized on them
		nNewProteins = self.randomState.multinomial(
			ribosomeToActivate,
			proteinInitProb
			)

		# Each ribosome is assigned a protein index for the protein that corresponds to the
		# polypeptide it will polymerize. This is done in blocks of protein ids for efficiency.
		proteinIndexes = np.empty(ribosomeToActivate, np.int64)
		nonzeroCount = (nNewProteins > 0)
		startIndex = 0
		for proteinIndex, counts in itertools.izip(
				np.arange(nNewProteins.size)[nonzeroCount],
				nNewProteins[nonzeroCount],
				):

			proteinIndexes[startIndex:startIndex+counts] = proteinIndex
			startIndex += counts

		# Create active 70S ribosomes and assign their protein indexes calculated above
		activeRibosomes = self.activeRibosomes.moleculesNew(
			"activeRibosome",
			ribosomeToActivate
			)

		activeRibosomes.attrIs(
			proteinIndex = proteinIndexes
			)

		# Decrement free 30S and 70S ribosomal subunit counts
		self.ribosome30S.countDec(nNewProteins.sum())
		self.ribosome50S.countDec(nNewProteins.sum())

		# Write number of initalized ribosomes to listener
		self.writeToListener("RibosomeData", "didInitialize", nNewProteins.sum())
def initializeRNA(bulkMolCntr, sim_data, randomState, massCoeff):

    rnaView = bulkMolCntr.countsView(
        sim_data.process.transcription.rnaData["id"])
    rnaMass = massCoeff * sim_data.mass.getFractionMass(
        sim_data.conditionToDoublingTime[sim_data.condition]
    )["rnaMass"] / sim_data.mass.avgCellToInitialCellConvFactor

    rnaExpression = normalize(
        sim_data.process.transcription.rnaExpression[sim_data.condition])

    nRnas = countsFromMassAndExpression(
        rnaMass.asNumber(units.g),
        sim_data.process.transcription.rnaData["mw"].asNumber(
            units.g / units.mol), rnaExpression,
        sim_data.constants.nAvogadro.asNumber(1 / units.mol))

    rnaView.countsIs(randomState.multinomial(nRnas, rnaExpression))
def initializeRibosomes(bulkMolCntr, uniqueMolCntr, sim_data, randomState):
    """
	Purpose: Activates ribosomes as unique molecules, and distributes them along length of RNA,
	decreases counts of unactivated ribosomal subunits (ribosome30S and ribosome50S).

	Normalizes ribosomes placement per length of protein
	"""

    # Load parameters
    nAvogadro = sim_data.constants.nAvogadro
    currentNutrients = sim_data.conditions[sim_data.condition]['nutrients']
    fracActiveRibosome = sim_data.process.translation.ribosomeFractionActiveDict[
        currentNutrients]
    mrnaIds = sim_data.process.translation.monomerData['rnaId']
    proteinLengths = sim_data.process.translation.monomerData[
        'length'].asNumber()
    proteinSequences = sim_data.process.translation.translationSequences
    translationEfficiencies = normalize(
        sim_data.process.translation.translationEfficienciesByMonomer)
    mRnas = bulkMolCntr.countsView(mrnaIds)
    aaWeightsIncorporated = sim_data.process.translation.translationMonomerWeights
    endWeight = sim_data.process.translation.translationEndWeight

    #find number of ribosomes to activate
    ribosome30S = bulkMolCntr.countsView(
        [sim_data.moleculeIds.s30_fullComplex]).counts()[0]
    ribosome50S = bulkMolCntr.countsView(
        [sim_data.moleculeIds.s50_fullComplex]).counts()[0]
    inactiveRibosomeCount = np.minimum(ribosome30S, ribosome50S)
    ribosomeToActivate = np.int64(fracActiveRibosome * inactiveRibosomeCount)

    # protein synthesis probabilities
    proteinInitProb = normalize(mRnas.counts() * translationEfficiencies)

    # normalize to protein length
    probLengthAdjusted = proteinInitProb * proteinLengths
    probNormalized = probLengthAdjusted / probLengthAdjusted.sum()

    # Sample a multinomial distribution of synthesis probabilities to determine what RNA are initialized
    nNewProteins = randomState.multinomial(ribosomeToActivate, probNormalized)

    # protein Indices
    proteinIndices = np.empty(ribosomeToActivate, np.int64)
    startIndex = 0
    nonzeroCount = (nNewProteins > 0)
    for proteinIndex, counts in izip(
            np.arange(nNewProteins.size)[nonzeroCount],
            nNewProteins[nonzeroCount]):
        proteinIndices[startIndex:startIndex + counts] = proteinIndex
        startIndex += counts

    # TODO (Eran) -- make sure there aren't any peptides at same location on same rna
    updatedLengths = np.array(randomState.rand(ribosomeToActivate) *
                              proteinLengths[proteinIndices],
                              dtype=np.int)

    # update mass
    sequences = proteinSequences[proteinIndices]
    massIncreaseProtein = computeMassIncrease(sequences, updatedLengths,
                                              aaWeightsIncorporated)
    massIncreaseProtein[
        updatedLengths != 0] += endWeight  # add endWeight to all new Rna

    # Create active 70S ribosomes and assign their protein Indices calculated above
    activeRibosomes = uniqueMolCntr.objectsNew('activeRibosome',
                                               ribosomeToActivate)
    activeRibosomes.attrIs(
        proteinIndex=proteinIndices,
        peptideLength=updatedLengths,
        massDiff_protein=massIncreaseProtein,
    )

    # decrease free 30S and 50S ribosomal subunit counts
    bulkMolCntr.countsIs(ribosome30S - ribosomeToActivate,
                         [sim_data.moleculeIds.s30_fullComplex])
    bulkMolCntr.countsIs(ribosome50S - ribosomeToActivate,
                         [sim_data.moleculeIds.s50_fullComplex])
Example #6
0
    def do_plot(self, simOutDir, plotOutDir, plotOutFileName, simDataFile,
                validationDataFile, metadata):
        if not os.path.isdir(simOutDir):
            raise Exception, "simOutDir does not currently exist as a directory"

        if not os.path.exists(plotOutDir):
            os.mkdir(plotOutDir)

        # Get the names of proteins from the KB

        sim_data = cPickle.load(open(simDataFile, "rb"))

        ids_complexation = sim_data.process.complexation.moleculeNames
        ids_complexation_complexes = sim_data.process.complexation.ids_complexes
        ids_equilibrium = sim_data.process.equilibrium.moleculeNames
        ids_equilibrium_complexes = sim_data.process.equilibrium.ids_complexes
        ids_translation = sim_data.process.translation.monomerData[
            "id"].tolist()
        ids_protein = sorted(
            set(ids_complexation + ids_equilibrium + ids_translation))
        bulkContainer = BulkObjectsContainer(ids_protein, dtype=np.float64)
        view_complexation = bulkContainer.countsView(ids_complexation)
        view_complexation_complexes = bulkContainer.countsView(
            ids_complexation_complexes)
        view_equilibrium = bulkContainer.countsView(ids_equilibrium)
        view_equilibrium_complexes = bulkContainer.countsView(
            ids_equilibrium_complexes)
        view_translation = bulkContainer.countsView(ids_translation)

        bulkMolecules = TableReader(os.path.join(simOutDir, "BulkMolecules"))
        moleculeIds = bulkMolecules.readAttribute("objectNames")
        proteinIndexes = np.array(
            [moleculeIds.index(moleculeId) for moleculeId in ids_protein],
            np.int)
        proteinCountsBulk = bulkMolecules.readColumn("counts")[:,
                                                               proteinIndexes]
        bulkMolecules.close()

        # Account for monomers
        bulkContainer.countsIs(proteinCountsBulk.mean(axis=0))

        # Account for unique molecules
        uniqueMoleculeCounts = TableReader(
            os.path.join(simOutDir, "UniqueMoleculeCounts"))
        ribosomeIndex = uniqueMoleculeCounts.readAttribute(
            "uniqueMoleculeIds").index("activeRibosome")
        rnaPolyIndex = uniqueMoleculeCounts.readAttribute(
            "uniqueMoleculeIds").index("activeRnaPoly")
        nActiveRibosome = uniqueMoleculeCounts.readColumn(
            "uniqueMoleculeCounts")[:, ribosomeIndex]
        nActiveRnaPoly = uniqueMoleculeCounts.readColumn(
            "uniqueMoleculeCounts")[:, rnaPolyIndex]
        uniqueMoleculeCounts.close()
        bulkContainer.countsInc(nActiveRibosome.mean(), [
            sim_data.moleculeIds.s30_fullComplex,
            sim_data.moleculeIds.s50_fullComplex
        ])
        bulkContainer.countsInc(nActiveRnaPoly.mean(),
                                [sim_data.moleculeIds.rnapFull])

        # Account for small-molecule bound complexes
        view_equilibrium.countsInc(
            np.dot(sim_data.process.equilibrium.stoichMatrixMonomers(),
                   view_equilibrium_complexes.counts() * -1))

        # Account for monomers in complexed form
        view_complexation.countsInc(
            np.dot(sim_data.process.complexation.stoichMatrixMonomers(),
                   view_complexation_complexes.counts() * -1))

        avgCounts = view_translation.counts()

        relativeCounts = avgCounts / avgCounts.sum()

        expectedCountsArbitrary = normalize(
            sim_data.process.transcription.rnaExpression[sim_data.condition][
                sim_data.relation.rnaIndexToMonomerMapping] *
            sim_data.process.translation.translationEfficienciesByMonomer /
            (np.log(2) / sim_data.doubling_time.asNumber(units.s) +
             sim_data.process.translation.monomerData["degRate"].asNumber(
                 1 / units.s)))

        expectedCountsRelative = expectedCountsArbitrary / expectedCountsArbitrary.sum(
        )

        plt.figure(figsize=(8.5, 11))

        maxLine = 1.1 * max(np.log10(expectedCountsRelative.max() + 1),
                            np.log10(relativeCounts.max() + 1))
        plt.plot([0, maxLine], [0, maxLine], '--r')
        plt.plot(np.log10(expectedCountsRelative + 1),
                 np.log10(relativeCounts + 1),
                 'o',
                 markeredgecolor='k',
                 markerfacecolor='none')

        plt.xlabel("log10(Expected protein distribution (from fitting))")
        plt.ylabel(
            "log10(Actual protein distribution (average over life cycle))")
        plt.title("PCC (of log values): %0.2f" %
                  pearsonr(np.log10(expectedCountsRelative + 1),
                           np.log10(relativeCounts + 1))[0])

        exportFigure(plt, plotOutDir, plotOutFileName, metadata)
        plt.close("all")