def get_statements(self): for u_data, v_data, k, d in self.graph.edges(keys=True, data=True): # We only interpret causal relations, not correlations if d[pc.RELATION] not in pc.CAUSAL_RELATIONS: self.unhandled.append((u_data, v_data, k, d)) continue # If the left or right-hand sides involve complex abundances, # add them as statements for node_ix, node in enumerate((u_data, v_data)): if isinstance(node, dsl.ComplexAbundance): self._get_enum_complex(u_data, v_data, k, d, node_ix) subj_activity = _get_activity_condition(d.get(pc.SUBJECT)) obj_activity = _get_activity_condition(d.get(pc.OBJECT)) obj_to_loc = _get_translocation_target(d.get(pc.OBJECT)) # If the object is a translocation, this represents a controlled # translocation, which we currently do not represent if obj_to_loc: self.unhandled.append((u_data, v_data, k, d)) logger.info( "Controlled translocations are currently not " "handled: %s)", edge_to_bel(u_data, v_data, d)) continue # Modification, e.g. # x(Foo) -> p(Bar, pmod(Ph)) # act(x(Foo)) -> p(Bar, pmod(Ph)) if isinstance(v_data, dsl.Protein) and \ has_protein_modification(v_data): if obj_activity: logger.info( "Ignoring object activity modifier in " "modification statement: %s, %s, %s, %s", u_data, v_data, k, d) else: self._get_modification(u_data, v_data, k, d) elif obj_activity: # If the agents on the left and right hand sides are the same, # then get an active form: # ActiveForm # p(Foo, {variants}) ->/-| act(p(Foo)) # Also Composite active forms: # compositeAbundance(p(Foo, pmod('Ph', 'T')), # p(Foo, pmod('Ph', 'Y'))) ->/-| # act(p(Foo)) if not subj_activity and _proteins_match(u_data, v_data): self._get_active_form(u_data, v_data, k, d) # Gef # act(p(Foo)) => gtp(p(Foo)) # Gap # act(p(Foo)) =| gtp(p(Foo)) elif subj_activity and _rel_is_direct(d) and \ obj_activity.activity_type == 'gtpbound': self._get_gef_gap(u_data, v_data, k, d) # Activation/Inhibition # x(Foo) -> act(x(Foo)) # act(x(Foo)) -> act(x(Foo)) # GtpActivation # gtp(p(Foo)) => act(p(Foo)) else: self._get_regulate_activity(u_data, v_data, k, d) # Activations involving biological processes or pathologies # x(Foo) -> bp(Bar) elif isinstance(v_data, (dsl.BiologicalProcess, dsl.Pathology)): self._get_regulate_activity(u_data, v_data, k, d) # Regulate amount # x(Foo) -> p(Bar) # x(Foo) -> r(Bar) # act(x(Foo)) -> p(Bar): # x(Foo) -> deg(p(Bar)) # act(x(Foo)) ->/-| deg(p(Bar)) elif (isinstance(v_data, ( dsl.Protein, dsl.Rna, dsl.Abundance, dsl.MicroRna, dsl.NamedComplexAbundance, )) and not obj_activity): self._get_regulate_amount(u_data, v_data, k, d) # Controlled conversions # x(Foo) -> rxn(reactants(r1,...,rn), products(p1,...pn)) # act(x(Foo)) -> rxn(reactants(r1,...,rn), products(p1,...pn)) # Note that we can't really handle statements where the relation # is decreases, as inhibition of a reaction match the semantics # of a controlled conversion elif (isinstance(v_data, dsl.Reaction) and d[pc.RELATION] in pc.CAUSAL_INCREASE_RELATIONS): self._get_conversion(u_data, v_data, k, d) # UNHANDLED # rxn(reactants(r1,...,rn), products(p1,...pn)) # Complex(a,b) # p(A, pmod('ph')) -> Complex(A, B) # Complex(A-Ph, B) # Complexes # complex(x(Foo), x(Bar), ...) else: self.unhandled.append((u_data, v_data, k, d))
def get_statements(self): for u_data, v_data, k, d in self.graph.edges(keys=True, data=True): # We only interpret causal relations, not correlations if d[pc.RELATION] not in pc.CAUSAL_RELATIONS: self.unhandled.append((u_data, v_data, k, d)) continue # If the left or right-hand sides involve complex abundances, # add them as statements for node_ix, node_data in enumerate((u_data, v_data)): if node_data[pc.FUNCTION] == pc.COMPLEX: self._get_complex(u_data, v_data, k, d, node_ix) subj_activity = _get_activity_condition(d.get(pc.SUBJECT)) obj_activity = _get_activity_condition(d.get(pc.OBJECT)) obj_to_loc = _get_translocation_target(d.get(pc.OBJECT)) # If the object is a translocation, this represents a controlled # translocation, which we currently do not represent if obj_to_loc: self.unhandled.append((u_data, v_data, k, d)) logger.info("Controlled translocations are currently not " "handled: %s)", edge_to_bel(u_data, v_data, d)) continue v_func = v_data[pc.FUNCTION] # Modification, e.g. # x(Foo) -> p(Bar, pmod(Ph)) # act(x(Foo)) -> p(Bar, pmod(Ph)) if v_func == pc.PROTEIN and \ has_protein_modification(v_data): if obj_activity: logger.info("Ignoring object activity modifier in " "modification statement: %s, %s, %s, %s", u_data, v_data, k, d) else: self._get_modification(u_data, v_data, k, d) elif obj_activity: # If the agents on the left and right hand sides are the same, # then get an active form: # ActiveForm # p(Foo, {variants}) ->/-| act(p(Foo)) # Also Composite active forms: # compositeAbundance(p(Foo, pmod('Ph', 'T')), # p(Foo, pmod('Ph', 'Y'))) ->/-| # act(p(Foo)) if not subj_activity and _proteins_match(u_data, v_data): self._get_active_form(u_data, v_data, k, d) # Gef # act(p(Foo)) => gtp(p(Foo)) # Gap # act(p(Foo)) =| gtp(p(Foo)) elif subj_activity and _rel_is_direct(d) and \ obj_activity.activity_type == 'gtpbound': self._get_gef_gap(u_data, v_data, k, d) # Activation/Inhibition # x(Foo) -> act(x(Foo)) # act(x(Foo)) -> act(x(Foo)) # GtpActivation # gtp(p(Foo)) => act(p(Foo)) else: self._get_regulate_activity(u_data, v_data, k, d) # Activations involving biological processes or pathologies # x(Foo) -> bp(Bar) elif v_func in (pc.BIOPROCESS, pc.PATHOLOGY): self._get_regulate_activity(u_data, v_data, k, d) # Regulate amount # x(Foo) -> p(Bar) # x(Foo) -> r(Bar) # act(x(Foo)) -> p(Bar): # x(Foo) -> deg(p(Bar)) # act(x(Foo)) ->/-| deg(p(Bar)) elif v_data.function in (pc.PROTEIN, pc.RNA, pc.ABUNDANCE, pc.COMPLEX, pc.MIRNA) and not obj_activity: self._get_regulate_amount(u_data, v_data, k, d) # Controlled conversions # x(Foo) -> rxn(reactants(r1,...,rn), products(p1,...pn)) # act(x(Foo)) -> rxn(reactants(r1,...,rn), products(p1,...pn)) # Note that we can't really handle statements where the relation # is decreases, as inhibition of a reaction match the semantics # of a controlled conversion elif v_data.function == pc.REACTION and \ d[pc.RELATION] in pc.CAUSAL_INCREASE_RELATIONS: self._get_conversion(u_data, v_data, k, d) # UNHANDLED # rxn(reactants(r1,...,rn), products(p1,...pn)) # Complex(a,b) # p(A, pmod('ph')) -> Complex(A, B) # Complex(A-Ph, B) # Complexes # complex(x(Foo), x(Bar), ...) else: self.unhandled.append((u_data, v_data, k, d))