package org.nextprot.api.core.service;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.List;
import org.junit.Ignore;
import org.junit.Test;
import org.nextprot.api.commons.constants.AnnotationCategory;
import org.nextprot.api.core.domain.BioObject;
import org.nextprot.api.core.domain.Interaction;
import org.nextprot.api.core.domain.Isoform;
import org.nextprot.api.core.domain.annotation.Annotation;
import org.nextprot.api.core.domain.annotation.AnnotationEvidence;
import org.nextprot.api.core.domain.annotation.AnnotationIsoformSpecificity;
import org.nextprot.api.core.test.base.CoreUnitBaseTest;
import org.nextprot.api.core.utils.BinaryInteraction2Annotation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ActiveProfiles;
@ActiveProfiles({ "dev" })
public class InteractionServiceIntegrationTest extends CoreUnitBaseTest {
@Autowired private InteractionService interactionService;
@Autowired private IsoformService isoformService;
@Autowired private MainNamesService mainNamesService;
@Ignore
@Test
public void shouldWork() {
String entryName = "NX_P38398";
List<Annotation> annots = new ArrayList<>();
List<Isoform> isoforms = this.isoformService.findIsoformsByEntryName(entryName);
List<Interaction> interactions = this.interactionService.findInteractionsByEntry(entryName);
System.out.println("Interaction count:" + interactions.size());
for (Interaction inter : interactions) {
Annotation annot = BinaryInteraction2Annotation.transform(inter, entryName, isoforms, mainNamesService);
annots.add(annot);
BioObject bo = annot.getBioObject();
if (bo!=null && (bo.getAccession().equals("NX_Q92560") || bo.getAccession().equals("Q99PU7")) ) {
System.out.print(inter.getEvidenceXrefAC() + ": ");
System.out.print (inter.getInteractants().get(0).getAccession());
if (inter.getInteractants().size()==2) System.out.print( " <==> " + inter.getInteractants().get(1));
System.out.println("");
System.out.println(bo);
}
}
System.out.println("Annot count:" + annots.size());
}
/*
* This queries retrieves entries with their
* - count of xeno interactions
* - count of self interactions
* - count of interactions with another protein entry defined in nextprot
* - count of interactions whih another protein isoform defined in nextprot
* - count of isoform specific interactions
*
* and can be used to find test examples
*
select entry_ac, sum(is_iso_spec) as iso_spec_interactions, sum(has_xeno) as with_xeno, sum(has_self) as with_self, sum(has_iso) as with_isos,
sum(has_entry) as entries, sum(has_xeno)+ sum(has_self)+ sum(has_iso)+ sum(has_entry) as interaction_count from (
select xr1.accession,
(regexp_split_to_array(xr1.accession,'-'))[1] as entry_ac,
case when xr1.accession like '%-%' then 1 else 0 end as is_iso_spec,
case when inter.is_xeno then 1 else 0 end as has_xeno,
case when interactant1.is_self_interaction then 1 else 0 end as has_self,
case when inter.is_xeno is false and interactant1.is_self_interaction is false and xr2.accession ilike '%-%' then 1 else 0 end as has_iso,
case when inter.is_xeno is false and interactant1.is_self_interaction is false and xr2.accession not ilike '%-%' then 1 else 0 end as has_entry
from partnerships inter
inner join partnership_partner_assoc interactant1 on (inter.partnership_id=interactant1.partnership_id)
inner join db_xrefs xr1 on (interactant1.db_xref_id=xr1.resource_id)
left outer join partnership_partner_assoc interactant2 on (inter.partnership_id=interactant2.partnership_id and interactant1.assoc_id != interactant2.assoc_id or interactant2.assoc_id is null)
left outer join db_xrefs xr2 on (interactant2.db_xref_id=xr2.resource_id)
) a
group by entry_ac
having sum(has_xeno)>0 and sum(has_self)>0 and sum(has_iso)>0 and sum(has_entry)>0
order by sum(has_xeno)+ sum(has_self)+ sum(has_iso)+ sum(has_entry)
*/
/*
* NX_Q9UNQ0 should contain at least 1 interactions of each type:
* - self interaction
* - xeno interaction (interaction with a protein not defined in nextprot, see resourceinternalrefs
* - interaction with another nextprot entry
* - interaction with another nextprot specific isoform
* and there should at least 1 interaction declared as isoform specific
*
* see query above to find other examples if necessary in future releases
*
*/
@Test
public void shouldDealWithAnyInteractionSpecialInteraction() {
String entry_ac="NX_Q9UNQ0";
List<Annotation> annots = this.interactionService.findInteractionsAsAnnotationsByEntry(entry_ac);
int numberOfExperiments = 0;
int withNxEntries = 0;
int withNxIsos = 0;
int withSelf = 0;
int withXrefs = 0;
int isoSpecs = 0;
for (Annotation annot: annots) {
/*
System.out.println("partner " + annot.getBioObject().getAccession() +
" " + annot.getBioObject().getBioType() + " / " + annot.getBioObject().getResourceType());
*/
// basic checks
assertTrue(annot.getCategory().equals("BinaryInteraction"));
assertTrue(annot.getAPICategory() == AnnotationCategory.BINARY_INTERACTION);
// partners
if (isAnnotationASelfInteraction(annot, entry_ac)) withSelf ++;
if (isAnnotationAnInteractionWithAnExternalXrefAsPartner(annot)) withXrefs++;
if (isAnnotationAnInteractionWithaNextprotEntryAsPartner(annot, entry_ac)) withNxEntries++;
if (isAnnotationAnInteractionWithANextprotIsoformAsPartner(annot)) withNxIsos++;
// specificity of annotation subject
if (isAnnotationAnInteractionWithANextprotIsoformAsSubject(annot)) isoSpecs++;
// evidences
assertTrue(annot.getEvidences().size()==1);
AnnotationEvidence evi = annot.getEvidences().get(0);
assertTrue(evi.getQualityQualifier().equals("GOLD") || evi.getQualityQualifier().equals("SILVER"));
assertTrue(evi.getResourceDb().equals("IntAct"));
if (annot.getEvidences().get(0).getPropertyValue("numberOfExperiments") != null) numberOfExperiments++;
}
/*
System.out.println("numberOfExperiments:" + numberOfExperiments);
System.out.println("withNxEntries:" + withNxEntries);
System.out.println("withNxIsos:" + withNxIsos);
System.out.println("withSelf:" + withSelf );
System.out.println("withXrefs:" + withXrefs );
System.out.println("isoSpecs:" + isoSpecs );
*/
assertTrue(numberOfExperiments==annots.size()); // should exist for each interaction
assertTrue(withNxEntries >= 1); // 8 cases
assertTrue(withNxIsos >= 1); // 1 case
assertTrue(withXrefs >= 1); // 10 cases
assertTrue(withSelf == 1); // 1 case
assertTrue(isoSpecs > 1); // 16 cases
}
private boolean isAnnotationASelfInteraction(Annotation annot, String entry_ac) {
return annot.getBioObject().getAccession().equals(entry_ac);
}
private boolean isAnnotationAnInteractionWithAnExternalXrefAsPartner(Annotation annot) {
return annot.getBioObject().getResourceType().equals(BioObject.ResourceType.EXTERNAL);
}
private boolean isAnnotationAnInteractionWithaNextprotEntryAsPartner(Annotation annot, String entry_ac) {
return annot.getBioObject().getResourceType().equals(BioObject.ResourceType.INTERNAL) &&
annot.getBioObject().getBioType().equals(BioObject.BioType.PROTEIN) &&
! annot.getBioObject().getAccession().equals(entry_ac);
}
private boolean isAnnotationAnInteractionWithANextprotIsoformAsPartner(Annotation annot) {
return annot.getBioObject().getBioType().equals(BioObject.BioType.PROTEIN_ISOFORM);
}
private boolean isAnnotationAnInteractionWithANextprotIsoformAsSubject(Annotation annot) {
for (AnnotationIsoformSpecificity spec : annot.getTargetingIsoformsMap().values()) {
if (spec.getSpecificity().equals("SPECIFIC")) return true;
}
return false;
}
/*
* This query retrieves isoforms that are annotated as having as specific interaction with
* another nextprot entry or isoform
* isoformWithSpecificInteraction: use the entry of this isoform to get an example of isoform specific interaction
* interactingEntity: the interaction partner of isoformWithSpecificInteraction
*
select xr1.accession as isoformWithSpecificInteraction, xr2.accession as interactingEntity
from partnerships inter
inner join partnership_partner_assoc interactant1 on (inter.partnership_id=interactant1.partnership_id)
inner join db_xrefs xr1 on (interactant1.db_xref_id=xr1.resource_id)
inner join partnership_partner_assoc interactant2 on (inter.partnership_id=interactant2.partnership_id and interactant1.assoc_id != interactant2.assoc_id or interactant2.assoc_id is null)
inner join db_xrefs xr2 on (interactant2.db_xref_id=xr2.resource_id)
where xr1.accession ilike '%-%'
limit 10
*
*/
/*
* NX_Q6ZMQ8 should contain an interaction with P61810 having the specificity SPECIFIC
* Note that other isoform SPECIFIC interactions (as annotations) exist for this entry.
*/
}