package de.uni_luebeck.inb.krabbenhoeft.eQTL.server.processors;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
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 ConvertCMorganToBPProcessor_MMus extends BaseProcessorImplementation {
@Override
public void addNewColumns(List<ColumnForDataSetLayer> columns) {
columns.add(new ColumnForDataSetLayer("positionMinBP", ColumType.Location));
final ColumnForDataSetLayer peakBpColumn = new ColumnForDataSetLayer("positionPeakBP", ColumType.Location);
peakBpColumn.setIndexme(true);
peakBpColumn.setIndexChromosomeField("chromosome");
columns.add(peakBpColumn);
columns.add(new ColumnForDataSetLayer("positionMaxBP", ColumType.Location));
}
@Override
public int doWork(CreateAndModifyEntities modifier, Iterator<HajoEntity> iter) {
int count = 0;
while (iter.hasNext()) {
final HajoEntity target = iter.next();
final String chr = target.getCategory("chromosome").getCategory();
target.setLocation("positionMinBP", cM2bp(chr, target.getNumerical("positionMin")));
target.setLocation("positionPeakBP", cM2bp(chr, target.getNumerical("positionPeak")));
target.setLocation("positionMaxBP", cM2bp(chr, target.getNumerical("positionMax")));
modifier.put(target);
count++;
}
return count;
}
Map<String, Map<Double, Integer>> map = new HashMap<String, Map<Double, Integer>>();
public ConvertCMorganToBPProcessor_MMus() {
Map<Double, Integer> tmp;
INSERT YOUR MARKER DATA HERE
}
public long cM2bp(String chromosome, double cm) {
Map<Double, Integer> chrConv = map.get(chromosome);
Map.Entry<Double, Integer> less = null, more = null;
for (Map.Entry<Double, Integer> cur : chrConv.entrySet()) {
if (cur.getKey() <= cm && (less == null || less.getKey() < cur.getKey()))
less = cur;
if (cur.getKey() >= cm && (more == null || more.getKey() > cur.getKey()))
more = cur;
}
if (more == null) {
more = less;
less = null;
for (Map.Entry<Double, Integer> cur : chrConv.entrySet()) {
if (cur.getKey() < more.getKey() && (less == null || less.getKey() < cur.getKey()))
less = cur;
}
} else if (less == null) {
less = more;
more = null;
for (Map.Entry<Double, Integer> cur : chrConv.entrySet()) {
if (cur.getKey() > less.getKey() && (more == null || more.getKey() > cur.getKey()))
more = cur;
}
}
if (more == less)
return more.getValue();
double lerp = (cm - less.getKey()) / (more.getKey() - less.getKey());
return Math.round(more.getValue() * lerp + less.getValue() * (1 - lerp));
}
}