package org.nextprot.api.tasks.solr.indexer.entry.impl;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import org.nextprot.api.core.domain.Entry;
import org.nextprot.api.core.domain.CvTerm;
import org.nextprot.api.core.domain.annotation.Annotation;
import org.nextprot.api.core.domain.annotation.AnnotationEvidence;
import org.nextprot.api.core.utils.TerminologyUtils;
import org.nextprot.api.solr.index.EntryIndex.Fields;
import org.nextprot.api.tasks.solr.indexer.entry.EntryFieldBuilder;
import org.nextprot.api.tasks.solr.indexer.entry.FieldBuilder;
@EntryFieldBuilder
public class ExpressionFieldBuilder extends FieldBuilder {
@Override
protected void init(Entry entry) {
//Extract the tissues where there is expression ....
Set <String> cv_tissues = new HashSet<String>();
for (Annotation currannot : entry.getAnnotations()) {
if (currannot.getCategory().equals("tissue specificity")) {
// Check there is a detected expression
boolean allnegative = true;
for(AnnotationEvidence ev : currannot.getEvidences())
if(!ev.isNegativeEvidence() && (!this.isGold() || ev.getQualityQualifier().equals("GOLD")))
// Only a GOLD positive evidence can invalidate allnegative in the GOLD index
{allnegative = false; break;}
if(!allnegative) {
// No duplicates this is a Set
if(!this.isGold() || currannot.getQualityQualifier().equals("GOLD")) {
cv_tissues.add(currannot.getCvTermAccessionCode());
cv_tissues.add(currannot.getCvTermName());
}
} //else System.err.println("No expression: " + currannot.getCvTermAccessionCode());
}
}
// Expression (without stages and expression_levels)
SortedSet <String> cv_tissues_final = new TreeSet<String>();
for (String cv : cv_tissues) {
//cv_tissues_final.add(cv); // No duplicate: this is a Set
if(cv.startsWith("TS-")) {
CvTerm term = terminologyservice.findCvTermByAccession(cv);
cv_tissues_final.add(cv); // No duplicate: this is a Set
//List<String> ancestors = term.getAncestorAccession();
List<String> ancestors = TerminologyUtils.getAllAncestorsAccession(term.getAccession(), terminologyservice);
if(ancestors != null)
for (String ancestorac : ancestors) {
//if(cv.equals("TS-0079")) System.err.println("blood ancestor: " + ancestorac);
cv_tissues_final.add(ancestorac); // No duplicate: this is a Set
cv_tissues_final.add(terminologyservice.findCvTermByAccession(ancestorac).getName()); // No duplicate: this is a Set
}
List<String> synonyms = term.getSynonyms();
if(synonyms != null) for (String synonym : synonyms) cv_tissues_final.add(synonym);
}
else cv_tissues_final.add(cv); // No duplicate: this is a Set
}
for (String cv : cv_tissues_final) {
addField(Fields.EXPRESSION, cv.trim());
}
}
@Override
public Collection<Fields> getSupportedFields() {
return Arrays.asList(Fields.EXPRESSION);
}
}