package com.ppfold.algo;
/**
* Generates the sector structure on the submitter machine.
*
* @author Z.Sukosd
* @see Sector
*/
public class SectorGenerator {
public static Sector GenerateSectors(int sectorNumber, int distance,
int divisions, int seqlength, boolean diffbp) {
Sector sector[];
sector = new Sector[sectorNumber];
int rownumber = 0; // refers to job place in triangle
int columnnumber = 1; // refers to job place in triangle
int dependencies = 0; // since dependency is always on two adjacent
// jobs, specify only the first
int firstSectorInRow = 0; // the ID of the first job in the current row
// of job
int lastSectorInRow = divisions; // the ID of the last job in current
// row of job
for (int i = 0; i <= sectorNumber - 1; i++) {
sector[i] = new Sector();
}
for (int i = 0; i <= sectorNumber - 1; i++) {
sector[i].sectorid = i;
sector[i].dim = distance;
sector[i].diffbp = diffbp;
sector[i].initializeBasepairs();
if(diffbp){
sector[i].initializeBasepairs2();
}
sector[i].fullseqlength = seqlength;
if (i < sectorNumber - 1) {
sector[i].next = sector[i + 1];
} else {
sector[i].next = null;
}
// set dependency
// we make the triangle "complete"; check later if points are inside
}
for (int i = 0; i <= sectorNumber - 1; i++) {
if (columnnumber > lastSectorInRow) { // if last job in row
rownumber++;
columnnumber = 1;
dependencies = firstSectorInRow;
firstSectorInRow = i;
lastSectorInRow = divisions - rownumber;
}
if (firstSectorInRow == 0) { // we're in first row
sector[i].setDependency(null, null);
int above = i + divisions;
int jobtoside = i - 1;
int diagabove = -1;
if (lastSectorInRow == columnnumber) {
above = -1;
}
if (jobtoside < firstSectorInRow) {
diagabove = -1;
} else {
diagabove = jobtoside + divisions;
}
if (above == -1 && diagabove != -1) {
sector[i].setNextJobs(null, sector[diagabove]);
} else if (above != -1 && diagabove == -1) {
sector[i].setNextJobs(sector[above], null);
} else if (above == -1 && diagabove == -1) {
sector[i].setNextJobs(null, null);
} else {
sector[i].setNextJobs(sector[above], sector[diagabove]);
}
} else {
sector[i].setDependency(sector[dependencies],
sector[dependencies + 1]);
dependencies++;
int above = i + lastSectorInRow;
int jobtoside = i - 1;
int diagabove = -1;
if (columnnumber == lastSectorInRow) {
above = -1;
}
if (jobtoside < firstSectorInRow) {
diagabove = -1;
} else {
diagabove = jobtoside + lastSectorInRow;
}
if (above == -1 && diagabove != -1) {
sector[i].setNextJobs(null, sector[diagabove]);
} else if (above != -1 && diagabove == -1) {
sector[i].setNextJobs(sector[above], null);
} else if (above == -1 && diagabove == -1) {
sector[i].setNextJobs(null, null);
} else {
sector[i].setNextJobs(sector[above], sector[diagabove]);
}
}
// set sector ranges, also preparation for sequence ranges
int mini = (columnnumber - 1) * distance;
int minj = rownumber * distance - 1;
sector[i].setPos(mini, minj);
if (mini > seqlength - 1) {
sector[i].seqlength = 0; // set sequence of corresponding job
} else {
int seqend = mini + minj + distance;
if (seqend > seqlength) {
seqend = seqlength;
}
sector[i].seqlength = seqend - mini; // set sequence of
// corresponding job
}
columnnumber++; // take next job in row.
}
return sector[sectorNumber - 1];
}
}