Bugfix, can now do plates with <96 wells
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import org.jgrapht.Graph;
|
||||
//import org.jgrapht.Graph;
|
||||
import org.jgrapht.alg.interfaces.MatchingAlgorithm;
|
||||
import org.jgrapht.alg.matching.MaximumWeightBipartiteMatching;
|
||||
import org.jgrapht.generate.SimpleWeightedBipartiteGraphMatrixGenerator;
|
||||
@@ -8,15 +8,18 @@ import org.jgrapht.graph.SimpleWeightedGraph;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.MathContext;
|
||||
import java.text.NumberFormat;
|
||||
import java.time.Duration;
|
||||
import java.time.Instant;
|
||||
//import java.time.Duration;
|
||||
//import java.time.Instant;
|
||||
import java.util.*;
|
||||
import java.util.stream.IntStream;
|
||||
|
||||
public class Simulator {
|
||||
/*
|
||||
* Old instance fields from before object-oriented refactor
|
||||
*
|
||||
private static Integer numDistinctCells = 2_000_000;
|
||||
private static double stdDeviation = 200; //square root of numDistCells would approximate poisson dist
|
||||
private static int numWells = 96;
|
||||
private static int numWells;
|
||||
private static int numConcentrations = 1;
|
||||
private static double errorRate = 0.1;
|
||||
private static Integer[] concentrations = {500};
|
||||
@@ -24,7 +27,7 @@ public class Simulator {
|
||||
private static int highThreshold = numWells - 3; //max number of shared wells to attempt pairing
|
||||
private static boolean use2DArrayForGraph = true; //Doing this is much faster for larger graphs
|
||||
private static boolean useJGraphTGraphMatrixGenerator = true; //fastest option
|
||||
|
||||
*/
|
||||
|
||||
public static CellSample generateCellSample(Integer numDistinctCells) {
|
||||
List<Integer> numbers = new ArrayList<>();
|
||||
@@ -45,7 +48,7 @@ public class Simulator {
|
||||
|
||||
public static void matchCells(String filename, List<Integer[]> distinctCells, Plate samplePlate, Integer lowThreshold, Integer highThreshold){
|
||||
System.out.println("Cells: " + distinctCells.size());
|
||||
|
||||
int numWells = samplePlate.getSize();
|
||||
System.out.println("Making cell maps");
|
||||
//HashMap keyed to Alphas, values Betas
|
||||
Map<Integer, Integer> distCellsMapAlphaKey = new HashMap<>();
|
||||
@@ -82,10 +85,8 @@ public class Simulator {
|
||||
Map<Integer, Integer> plateVtoBMap = getVertexToPeptideMap(allBetas, vertexStartValue);
|
||||
//keys are alphas, values are sequential integer vertices from previous map
|
||||
Map<Integer, Integer> plateAtoVMap = invertVertexMap(plateVtoAMap);
|
||||
System.out.println(plateAtoVMap.size());
|
||||
//keys are betas, values are sequential integer vertices from previous map
|
||||
Map<Integer, Integer> plateBtoVMap = invertVertexMap(plateVtoBMap);
|
||||
System.out.println(plateAtoVMap.size());
|
||||
System.out.println("Vertex maps made");
|
||||
|
||||
System.out.println("Creating Graph");
|
||||
@@ -145,7 +146,8 @@ public class Simulator {
|
||||
|
||||
//Results for csv file
|
||||
List<List<String>> allResults = new ArrayList<>();
|
||||
int size = samplePlate.getSize();
|
||||
NumberFormat nf = NumberFormat.getInstance(Locale.US);
|
||||
MathContext mc = new MathContext(3);
|
||||
Iterator<DefaultWeightedEdge> weightIter = graphMatching.iterator();
|
||||
DefaultWeightedEdge e = null;
|
||||
int trueCount = 0;
|
||||
@@ -175,23 +177,27 @@ public class Simulator {
|
||||
//overlap count
|
||||
result.add(Double.toString(graph.getEdgeWeight(e)));
|
||||
result.add(Boolean.toString(check));
|
||||
result.add(Double.toString(Equations.pValue(size, alphaWellCounts.get(plateVtoAMap.get(source)),
|
||||
betaWellCounts.get(plateVtoBMap.get(target)), graph.getEdgeWeight(e))));
|
||||
double pValue = Equations.pValue(numWells, alphaWellCounts.get(plateVtoAMap.get(source)),
|
||||
betaWellCounts.get(plateVtoBMap.get(target)), graph.getEdgeWeight(e));
|
||||
BigDecimal pValueTrunc = new BigDecimal(pValue, mc);
|
||||
result.add(pValueTrunc.toString());
|
||||
allResults.add(result);
|
||||
}
|
||||
|
||||
//Metadate comments for CSV file
|
||||
int min = alphaCount > betaCount ? betaCount : alphaCount;
|
||||
double attemptRate = (double) (trueCount + falseCount) / min;
|
||||
BigDecimal attemptRateTrunc = new BigDecimal(attemptRate, mc);
|
||||
double pairingErrorRate = (double) falseCount / (trueCount + falseCount);
|
||||
BigDecimal pairingErrorRateTrunc = new BigDecimal(pairingErrorRate, mc);
|
||||
|
||||
List<String> comments = new ArrayList<>();
|
||||
comments.add("Total alphas found: " + alphaCount);
|
||||
comments.add("Total betas found: " + betaCount);
|
||||
comments.add("Pairing attempt rate: " + attemptRate);
|
||||
comments.add("Pairing attempt rate: " + attemptRateTrunc);
|
||||
comments.add("Correct pairings: " + trueCount);
|
||||
comments.add("Incorrect pairings: " + falseCount);
|
||||
comments.add("Pairing error rate: " + pairingErrorRate);
|
||||
comments.add("Pairing error rate: " + pairingErrorRateTrunc);
|
||||
|
||||
//result writer
|
||||
MatchingFileWriter writer = new MatchingFileWriter(filename, comments, header, allResults);
|
||||
@@ -200,7 +206,9 @@ public class Simulator {
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
** Old main method before object-oriented refactor
|
||||
*
|
||||
public static void Simulate() {
|
||||
Instant start = Instant.now();
|
||||
//Four things to try to improve this
|
||||
@@ -440,6 +448,7 @@ public class Simulator {
|
||||
|
||||
|
||||
}
|
||||
*/
|
||||
|
||||
private static Map<Integer, Integer> getVertexToPeptideMap(Map<Integer, Integer> peptides, Integer startValue) {
|
||||
Map<Integer, Integer> map = new LinkedHashMap<>(); //LinkedHashMap to preserve order of entry
|
||||
@@ -459,6 +468,9 @@ public class Simulator {
|
||||
return inverse;
|
||||
}
|
||||
|
||||
/*
|
||||
* Old methods for graph generation algorithms less efficient than built in matrix generator
|
||||
*
|
||||
private static void addEdgeWithWeight(Graph g, Integer v1, Integer v2, double weight) {
|
||||
g.addEdge(v1, v2);
|
||||
g.setEdgeWeight(v1, v2, weight);
|
||||
@@ -472,7 +484,12 @@ public class Simulator {
|
||||
g.addEdge(v1, v2);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Old output method before object-oriented refactor
|
||||
*
|
||||
private static boolean printData (Double edgeWeight, Integer source, Integer sourceCount, Integer target,
|
||||
Integer targetCount, Map<Integer,Integer> AtoBMap, Map<Integer,Integer> VtoAMap,
|
||||
Map<Integer, Integer> VtoBMap) {
|
||||
@@ -490,5 +507,5 @@ public class Simulator {
|
||||
System.out.println("The real pair is " + source + " and " + AtoBMap.get(VtoAMap.get(source)));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
@@ -182,8 +182,8 @@ public class UserInterface {
|
||||
|
||||
}
|
||||
else{
|
||||
if(highThreshold > plate.getSize()){
|
||||
highThreshold = plate.getSize();
|
||||
if(highThreshold >= plate.getSize()){
|
||||
highThreshold = plate.getSize() - 1;
|
||||
}
|
||||
List<Integer[]> cells = cellReader.getCells();
|
||||
Simulator.matchCells(filename, cells, plate, lowThreshold, highThreshold);
|
||||
|
||||
Reference in New Issue
Block a user