Re-implemeting CLI options (in progress)
This commit is contained in:
283
src/main/java/CommandLineInterface.java
Normal file
283
src/main/java/CommandLineInterface.java
Normal file
@@ -0,0 +1,283 @@
|
||||
import org.apache.commons.cli.*;
|
||||
|
||||
//Class for parsing options passed to program from command line
|
||||
public class CommandLineInterface {
|
||||
|
||||
public static void startCLI(String[] args) {
|
||||
//These command line options are a big mess
|
||||
//Really, I don't think command line tools are expected to work in this many different modes
|
||||
//making cells, making plates, and matching are the sort of thing that UNIX philosophy would say
|
||||
//should be three separate programs.
|
||||
//There might be a way to do it with option parameters?
|
||||
|
||||
//main options set
|
||||
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 makeGraph = Option.builder("graoh")
|
||||
.longOpt("make-graph")
|
||||
.desc("Makes a graph and data 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();
|
||||
OptionGroup mainGroup = new OptionGroup();
|
||||
mainGroup.addOption(makeCells);
|
||||
mainGroup.addOption(makePlate);
|
||||
mainGroup.addOption(makeGraph);
|
||||
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("cell-file")
|
||||
.hasArg()
|
||||
.argName("file")
|
||||
.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")
|
||||
.build();
|
||||
mainOptions.addOption(lowThresh);
|
||||
Option highThresh = Option.builder("high")
|
||||
.longOpt("high-threshold")
|
||||
.hasArg()
|
||||
.argName("number")
|
||||
.desc("Sets the maximum occupancy overlap to attempt matching")
|
||||
.build();
|
||||
mainOptions.addOption(highThresh);
|
||||
Option occDiff = Option.builder("occdiff")
|
||||
.longOpt("occupancy-difference")
|
||||
.hasArg()
|
||||
.argName("Number")
|
||||
.desc("Maximum difference in alpha/beta occupancy to attempt matching")
|
||||
.build();
|
||||
mainOptions.addOption(occDiff);
|
||||
Option overlapPer = Option.builder("ovper")
|
||||
.longOpt("overlap-percent")
|
||||
.hasArg()
|
||||
.argName("Percent")
|
||||
.desc("Minimum overlap percent to attempt matching (0 -100)")
|
||||
.build();
|
||||
mainOptions.addOption(overlapPer);
|
||||
Option inputPlates = Option.builder("p")
|
||||
.longOpt("plate-files")
|
||||
.hasArgs()
|
||||
.desc("Plate files to match")
|
||||
.build();
|
||||
mainOptions.addOption(inputPlates);
|
||||
|
||||
|
||||
|
||||
CommandLineParser parser = new DefaultParser();
|
||||
try {
|
||||
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));
|
||||
Integer occupancyDifference = Integer.valueOf(line.getOptionValue(occDiff));
|
||||
Integer overlapPercent = Integer.valueOf(line.getOptionValue(overlapPer));
|
||||
for(String plate: line.getOptionValues("p")) {
|
||||
matchCDR3s(cellFile, plate, lowThreshold, highThreshold, occupancyDifference, overlapPercent);
|
||||
}
|
||||
}
|
||||
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 <numSections; i++){
|
||||
concentrationsToUse[i] = Integer.valueOf(concentrationsToUseString[i]);
|
||||
}
|
||||
Double dropOutRate = Double.valueOf(line.getOptionValue("err"));
|
||||
if(line.hasOption("exponential")){
|
||||
Double lambda = Double.valueOf(line.getOptionValue("lambda"));
|
||||
for(int i = 1; i <= numPlatesToMake; i++){
|
||||
makePlateExp(cellFile, filenamePrefix + i, lambda, numWellsOnPlate,
|
||||
concentrationsToUse,dropOutRate);
|
||||
}
|
||||
}
|
||||
else if(line.hasOption("gaussian")){
|
||||
Double stdDev = Double.valueOf(line.getOptionValue("std-dev"));
|
||||
for(int i = 1; i <= numPlatesToMake; i++){
|
||||
makePlate(cellFile, filenamePrefix + i, stdDev, numWellsOnPlate,
|
||||
concentrationsToUse,dropOutRate);
|
||||
}
|
||||
|
||||
}
|
||||
else if(line.hasOption("poisson")){
|
||||
for(int i = 1; i <= numPlatesToMake; i++){
|
||||
makePlatePoisson(cellFile, filenamePrefix + i, numWellsOnPlate,
|
||||
concentrationsToUse,dropOutRate);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (ParseException exp) {
|
||||
System.err.println("Parsing failed. Reason: " + exp.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
//for calling from command line
|
||||
public static void makeCells(String filename, Integer numCells, Integer cdr1Freq){
|
||||
CellSample sample = Simulator.generateCellSample(numCells, cdr1Freq);
|
||||
CellFileWriter writer = new CellFileWriter(filename, sample);
|
||||
writer.writeCellsToFile();
|
||||
}
|
||||
|
||||
public static void makePlateExp(String cellFile, String filename, Double lambda,
|
||||
Integer numWells, Integer[] concentrations, Double dropOutRate){
|
||||
CellFileReader cellReader = new CellFileReader(cellFile);
|
||||
Plate samplePlate = new Plate(numWells, dropOutRate, concentrations);
|
||||
samplePlate.fillWellsExponential(cellReader.getFilename(), cellReader.getCells(), lambda);
|
||||
PlateFileWriter writer = new PlateFileWriter(filename, samplePlate);
|
||||
writer.writePlateFile();
|
||||
}
|
||||
|
||||
private static void makePlatePoisson(String cellFile, String filename, Integer numWells,
|
||||
Integer[] concentrations, Double dropOutRate){
|
||||
CellFileReader cellReader = new CellFileReader(cellFile);
|
||||
Double stdDev = Math.sqrt(cellReader.getCellCount());
|
||||
Plate samplePlate = new Plate(numWells, dropOutRate, concentrations);
|
||||
samplePlate.fillWells(cellReader.getFilename(), cellReader.getCells(), stdDev);
|
||||
PlateFileWriter writer = new PlateFileWriter(filename, samplePlate);
|
||||
writer.writePlateFile();
|
||||
}
|
||||
|
||||
private static void makePlate(String cellFile, String filename, Double stdDev,
|
||||
Integer numWells, Integer[] concentrations, Double dropOutRate){
|
||||
CellFileReader cellReader = new CellFileReader(cellFile);
|
||||
Plate samplePlate = new Plate(numWells, dropOutRate, concentrations);
|
||||
samplePlate.fillWells(cellReader.getFilename(), cellReader.getCells(), stdDev);
|
||||
PlateFileWriter writer = new PlateFileWriter(filename, samplePlate);
|
||||
writer.writePlateFile();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user