From acff88475b399b368961095cd475e8a28c67e1f2 Mon Sep 17 00:00:00 2001 From: efischer Date: Tue, 23 Nov 2021 12:24:48 -0600 Subject: [PATCH] Command line arguments working, need better documentation and error handling --- out/artifacts/TCellSim_jar/TCellSim.jar | Bin 1570359 -> 1573566 bytes src/main/java/Equations.java | 4 + src/main/java/Plate.java | 53 ++++- src/main/java/PlateFileWriter.java | 17 +- src/main/java/Simulator.java | 53 ++++- src/main/java/UserInterface.java | 269 +++++++++++++++++++++--- 6 files changed, 358 insertions(+), 38 deletions(-) diff --git a/out/artifacts/TCellSim_jar/TCellSim.jar b/out/artifacts/TCellSim_jar/TCellSim.jar index b16781ff68b55ae7ab5a5ec11802a282d749aa9a..a397aa9172022fe051f8daba32ca6e328c9460e8 100644 GIT binary patch delta 46782 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 delta 43536 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 V!qiicfSM{5Vya2QQ9VYT{{b=UcbEVG diff --git a/src/main/java/Equations.java b/src/main/java/Equations.java index 471656d..45652b2 100644 --- a/src/main/java/Equations.java +++ b/src/main/java/Equations.java @@ -4,6 +4,10 @@ import java.math.MathContext; public abstract class Equations { + public static int getRandomNumber(int min, int max) { + return (int) ((Math.random() * (max - min)) + min); + } + public static double pValue(Integer w, Integer w_a, Integer w_b, double w_ab_d) { int w_ab = (int) w_ab_d; double pv = 0.0; diff --git a/src/main/java/Plate.java b/src/main/java/Plate.java index c989c25..32d6ceb 100644 --- a/src/main/java/Plate.java +++ b/src/main/java/Plate.java @@ -1,6 +1,7 @@ import java.util.*; /* +TODO: Implement exponential distribution using inversion method - DONE TODO: Implement discrete frequency distributions using Vose's Alias Method */ @@ -12,13 +13,15 @@ public class Plate { private double error; private Integer[] concentrations; private double stdDev; + private double lambda; + boolean exponential = false; - public Plate (int size, double error, Integer[] concentrations, double stdDev) { + public Plate (int size, double error, Integer[] concentrations) { this.size = size; this.error = error; this.concentrations = concentrations; - this.stdDev = stdDev; + //this.stdDev = stdDev; wells = new ArrayList<>(); } @@ -28,7 +31,47 @@ public class Plate { this.size = wells.size(); } - public void fillWells(String sourceFileName, List cells) { + public void fillWellsExponential(String sourceFileName, List cells, double lambda){ + this.lambda = lambda; + exponential = true; + sourceFile = sourceFileName; + int numSections = concentrations.length; + int section = 0; + double m; + int n; + int test=0; + while (section < numSections){ + for (int i = 0; i < (size / numSections); i++) { + List well = new ArrayList<>(); + for (int j = 0; j < concentrations[section]; j++) { + do { + m = (Math.log10((1 - rand.nextDouble()))/(-lambda)) * Math.sqrt(cells.size()); + } while (m >= cells.size() || m < 0); + n = (int) Math.floor(m); + //n = Equations.getRandomNumber(0, cells.size()); + // was testing generating the cell sample file with exponential dist, then sampling flat here + //that would be more realistic + //But would mess up my + if(n > test){ + test = n; + } + Integer[] cellToAdd = cells.get(n).clone(); + for(int k = 0; k < cellToAdd.length; k++){ + if(Math.abs(rand.nextDouble()) < error){//error applied to each peptide + cellToAdd[k] = -1; + } + } + well.add(cellToAdd); + } + wells.add(well); + } + section++; + } + System.out.println("Highest index: " +test); + } + + public void fillWells(String sourceFileName, List cells, double stdDev) { + this.stdDev = stdDev; sourceFile = sourceFileName; int numSections = concentrations.length; int section = 0; @@ -68,6 +111,10 @@ public class Plate { return stdDev; } + public boolean isExponential(){return exponential;} + + public double getLambda(){return lambda;} + public double getError() { return error; } diff --git a/src/main/java/PlateFileWriter.java b/src/main/java/PlateFileWriter.java index f96c07c..e02bd51 100644 --- a/src/main/java/PlateFileWriter.java +++ b/src/main/java/PlateFileWriter.java @@ -13,11 +13,13 @@ public class PlateFileWriter { private int size; private List> wells; private double stdDev; + private double lambda; private Double error; private String filename; private String sourceFileName; private String[] headers; private List concentrations; + private boolean isExponential = false; public PlateFileWriter(String filename, Plate plate) { if(!filename.matches(".*\\.csv")){ @@ -26,7 +28,13 @@ public class PlateFileWriter { this.filename = filename; this.sourceFileName = plate.getSourceFileName(); this.size = plate.getSize(); - this.stdDev = plate.getStdDev(); + this.isExponential = plate.isExponential(); + if(isExponential) { + this.lambda = plate.getLambda(); + } + else{ + this.stdDev = plate.getStdDev(); + } this.error = plate.getError(); this.wells = plate.getWells(); this.concentrations = Arrays.asList(plate.getConcentrations()); @@ -82,7 +90,12 @@ public class PlateFileWriter { printer.printComment("Plate size: " + size); printer.printComment("Error rate: " + error); printer.printComment("Concentrations: " + concenString); - printer.printComment("Std. dev.: " + stdDev); + if(isExponential){ + printer.printComment("Lambda: " + lambda); + } + else { + printer.printComment("Std. dev.: " + stdDev); + } printer.printRecords(wellsAsStrings); } catch(IOException ex){ System.out.println("Could not make new file named "+filename); diff --git a/src/main/java/Simulator.java b/src/main/java/Simulator.java index 877d3b7..e645252 100644 --- a/src/main/java/Simulator.java +++ b/src/main/java/Simulator.java @@ -20,8 +20,57 @@ public class Simulator { private static int cdr1BetaIndex = 3; - - + //Tested generating the cell sample file itself with a set distribution, but it wasn't working well + //realized I'd have to change matching algos as well, so abandoned it. +// public static CellSample generateCellSampleExp(Integer numDistinctCells, Integer cdr1Freq){ +// //was told I=in real T cells, CDR1s have about one third the diversity of CDR3s +// //this could be wrong, though. could be less diversity than that. +// //previous sim was only CDR3s +// //Integer numDistinctCells = 1000000; +// //int cdr1Freq = 3; +// +// List numbersCDR3 = new ArrayList<>(); +// List numbersCDR1 = new ArrayList<>(); +// Integer numDistCDR3s = 2 * numDistinctCells + 1; +// IntStream.range(1, numDistCDR3s + 1).forEach(i -> numbersCDR3.add(i)); +// IntStream.range(numDistCDR3s + 1, numDistCDR3s + 1 + (numDistCDR3s / cdr1Freq) + 1).forEach(i -> numbersCDR1.add(i)); +// Collections.shuffle(numbersCDR3); +// Collections.shuffle(numbersCDR1); +// +// //Each cell represented by 4 values +// //two CDR3s, and two CDR1s. First two values are CDR3s, second two are CDR1s +// List distinctCells = new ArrayList<>(); +// for(int i = 0; i < numbersCDR3.size() - 1; i = i + 2){ +// Integer tmpCDR3a = numbersCDR3.get(i); +// Integer tmpCDR3b = numbersCDR3.get(i+1); +// Integer tmpCDR1a = numbersCDR1.get(i % numbersCDR1.size()); +// Integer tmpCDR1b = numbersCDR1.get((i+1) % numbersCDR1.size()); +// Integer[] tmp = {tmpCDR3a, tmpCDR3b, tmpCDR1a, tmpCDR1b}; +// distinctCells.add(tmp); +// } +// ListsampleCells = new ArrayList<>(); +// int count; +// int lastFactor = 0; +// int factor = 10; +// int index = 0; +// while(numDistinctCells / factor >= 1){ +// int i = index; +// while(i < index + factor - lastFactor){ +// count = 0; +// while(count < (numDistinctCells/(factor * 10))){ +// sampleCells.add(distinctCells.get(i)); +// count++; +// } +// i++; +// } +// index = i; +// lastFactor = factor; +// factor *=10; +// } +// System.out.println("Total cells in sample: " + sampleCells.size()); +// System.out.println("Distinct cells in sample: " + index); +// return new CellSample(sampleCells, cdr1Freq); +// } public static CellSample generateCellSample(Integer numDistinctCells, Integer cdr1Freq) { //In real T cells, CDR1s have about one third the diversity of CDR3s //previous sim was only CDR3s diff --git a/src/main/java/UserInterface.java b/src/main/java/UserInterface.java index 2224c0a..9c559c5 100644 --- a/src/main/java/UserInterface.java +++ b/src/main/java/UserInterface.java @@ -16,42 +16,164 @@ public class UserInterface { public static void main(String[] args) { if(args.length != 0){ - Options options = new Options(); - Option matchCDR3 = Option.builder("m") - .longOpt("match") + Options mainOptions = new Options(); + Option makeCells = Option.builder("cells") + .longOpt("make-cells") + .desc("Makes a file of distinct cells") + .build(); + Option makePlate = Option.builder("plates") + .longOpt("make-plates") + .desc("Makes a sample plate file") + .build(); + Option matchCDR3 = Option.builder("match") + .longOpt("match-cdr3") .desc("Match CDR3s. Requires a cell sample file and any number of plate files.") .build(); - options.addOption(matchCDR3); + OptionGroup mainGroup = new OptionGroup(); + mainGroup.addOption(makeCells); + mainGroup.addOption(makePlate); + mainGroup.addOption(matchCDR3); + mainGroup.setRequired(true); + mainOptions.addOptionGroup(mainGroup); + + //Reuse clones of this for other options groups, rather than making it lots of times + Option outputFile = Option.builder("o") + .longOpt("output-file") + .hasArg() + .argName("filename") + .desc("Name of output file") + .build(); + mainOptions.addOption(outputFile); + + //Options cellOptions = new Options(); + Option numCells = Option.builder("nc") + .longOpt("num-cells") + .desc("The number of distinct cells to generate") + .hasArg() + .argName("number") + .build(); + mainOptions.addOption(numCells); + Option cdr1Freq = Option.builder("d") + .longOpt("peptide-diversity-factor") + .hasArg() + .argName("number") + .desc("Number of distinct CDR3s for every CDR1") + .build(); + mainOptions.addOption(cdr1Freq); + //Option cellOutput = (Option) outputFile.clone(); + //cellOutput.setRequired(true); + //mainOptions.addOption(cellOutput); + + //Options plateOptions = new Options(); Option inputCells = Option.builder("c") - .longOpt("cellfile") + .longOpt("cell-file") .hasArg() .argName("file") - .desc("The cell sample file used for matching") - .required().build(); - options.addOption(inputCells); + .desc("The cell sample file used for filling wells") + .build(); + mainOptions.addOption(inputCells); + Option numWells = Option.builder("w") + .longOpt("num-wells") + .hasArg() + .argName("number") + .desc("The number of wells on each plate") + .build(); + mainOptions.addOption(numWells); + Option numPlates = Option.builder("np") + .longOpt("num-plates") + .hasArg() + .argName("number") + .desc("The number of plate files to output") + .build(); + mainOptions.addOption(numPlates); + //Option plateOutput = (Option) outputFile.clone(); + //plateOutput.setRequired(true); + //plateOutput.setDescription("Prefix for plate output filenames"); + //mainOptions.addOption(plateOutput); + Option plateErr = Option.builder("err") + .longOpt("drop-out-rate") + .hasArg() + .argName("number") + .desc("Well drop-out rate. (Probability between 0 and 1)") + .build(); + mainOptions.addOption(plateErr); + Option plateConcentrations = Option.builder("t") + .longOpt("t-cells-per-well") + .hasArgs() + .argName("number 1, number 2, ...") + .desc("Number of T cells per well for each plate section") + .build(); + mainOptions.addOption(plateConcentrations); + +//different distributions, mutually exclusive + OptionGroup plateDistributions = new OptionGroup(); + Option plateExp = Option.builder("exponential") + .desc("Sample from distinct cells with exponential frequency distribution") + .build(); + plateDistributions.addOption(plateExp); + Option plateGaussian = Option.builder("gaussian") + .desc("Sample from distinct cells with gaussain frequency distribution") + .build(); + plateDistributions.addOption(plateGaussian); + Option platePoisson = Option.builder("poisson") + .desc("Sample from distinct cells with poisson frequency distribution") + .build(); + plateDistributions.addOption(platePoisson); + mainOptions.addOptionGroup(plateDistributions); + + Option plateStdDev = Option.builder("stddev") + .desc("Standard deviation for gaussian distribution") + .hasArg() + .argName("number") + .build(); + mainOptions.addOption(plateStdDev); + + Option plateLambda = Option.builder("lambda") + .desc("Lambda for exponential distribution") + .hasArg() + .argName("number") + .build(); + mainOptions.addOption(plateLambda); + + + +// +// String cellFile, String filename, Double stdDev, +// Integer numWells, Integer numSections, +// Integer[] concentrations, Double dropOutRate +// + + //Options matchOptions = new Options(); + inputCells.setDescription("The cell sample file to be used for matching."); + mainOptions.addOption(inputCells); Option lowThresh = Option.builder("low") + .longOpt("low-threshold") .hasArg() .argName("number") .desc("Sets the minimum occupancy overlap to attempt matching") - .required().build(); - options.addOption(lowThresh); + .build(); + mainOptions.addOption(lowThresh); Option highThresh = Option.builder("high") + .longOpt("high-threshold") .hasArg() .argName("number") .desc("Sets the maximum occupancy overlap to attempt matching") - .required().build(); - options.addOption(highThresh); + .build(); + mainOptions.addOption(highThresh); Option inputPlates = Option.builder("p") - .longOpt("platefiles") + .longOpt("plate-files") .hasArgs() .desc("Plate files to match") - .required().build(); - options.addOption(inputPlates); + .build(); + mainOptions.addOption(inputPlates); + + CommandLineParser parser = new DefaultParser(); try { - CommandLine line = parser.parse(options, args); - if(line.hasOption("m")){ + CommandLine line = parser.parse(mainOptions, args); + if(line.hasOption("match")){ + //line = parser.parse(mainOptions, args); String cellFile = line.getOptionValue("c"); Integer lowThreshold = Integer.valueOf(line.getOptionValue(lowThresh)); Integer highThreshold = Integer.valueOf(line.getOptionValue(highThresh)); @@ -59,6 +181,49 @@ public class UserInterface { matchCDR3s(cellFile, plate, lowThreshold, highThreshold); } } + else if(line.hasOption("cells")){ + //line = parser.parse(mainOptions, args); + String filename = line.getOptionValue("o"); + Integer numDistCells = Integer.valueOf(line.getOptionValue("nc")); + Integer freq = Integer.valueOf(line.getOptionValue("d")); + makeCells(filename, numDistCells, freq); + } + else if(line.hasOption("plates")){ + //line = parser.parse(mainOptions, args); + String cellFile = line.getOptionValue("c"); + String filenamePrefix = line.getOptionValue("o"); + Integer numWellsOnPlate = Integer.valueOf(line.getOptionValue("w")); + Integer numPlatesToMake = Integer.valueOf(line.getOptionValue("np")); + String[] concentrationsToUseString = line.getOptionValues("t"); + Integer numSections = concentrationsToUseString.length; + + Integer[] concentrationsToUse = new Integer[numSections]; + for(int i = 0; i