package de.uni_luebeck.inb.krabbenhoeft.eQTL.server.processors;
import java.util.Iterator;
import java.util.List;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.entities.Category;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.entities.ColumnForDataSetLayer;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.entities.HajoEntity;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.entities.ColumnForDataSetLayer.ColumType;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.server.helpers.persistence.CreateAndModifyEntities;
public class CalculateCisDistanceProcessor extends BaseProcessorImplementation {
@Override
public void addNewColumns(List<ColumnForDataSetLayer> columns) {
columns.add(new ColumnForDataSetLayer("cisOrTrans", ColumType.Category));
columns.add(new ColumnForDataSetLayer("cisDistance", ColumType.Numerical));
}
@Override
public int doWork(CreateAndModifyEntities modifier, Iterator<HajoEntity> iter) {
int count = 0;
while (iter.hasNext()) {
final HajoEntity target = iter.next();
boolean isCis = target.getCategory("chromosome").equals(target.getCategory("geneChromosome"));
target.setCategory("cisOrTrans", Category.wrap(isCis ? "cis" : "trans"));
double distance = Double.POSITIVE_INFINITY;
if (isCis) {
double peak = target.getNumerical("positionPeakBP");
double min = target.getNumerical("geneStartBP");
double max = target.getNumerical("geneEndBP");
if (peak < min)
distance = min - peak;
else if (peak > max)
distance = peak - max;
else
distance = 0;
}
target.setNumerical("cisDistance", distance);
modifier.put(target);
count++;
}
return count;
}
}