// Path: src/edu/unc/genomics/CommandLineTool.java
// public abstract class CommandLineTool {
// 
//   /**
//    * The default bite-size to use for applications that process files in chunks
//    * TODO Read from a configuration file
//    */
//   public static final int DEFAULT_CHUNK_SIZE = 10_000_000;
// 
//   /**
//    * Do the main computation of this tool
//    * 
//    * @throws IOException
//    */
//   public abstract void run() throws IOException;
// 
//   /**
//    * Parse command-line arguments and run the tool Exit on parameter exceptions
//    * 
//    * @param args
//    */
//   public void instanceMain(String[] args) throws CommandLineToolException {
//     // Initialize the command-line options parser
//     JCommander jc = new JCommander(this);
// 
//     // Add factories for parsing Paths, Assemblies, IntervalFiles, and WigFiles
//     jc.addConverterFactory(new PathFactory());
//     jc.addConverterFactory(new AssemblyFactory());
// 
//     // Set the program name to be the class name
//     String[] nameParts = getClass().getName().split("\\.");
//     String shortName = StringUtils.join(Arrays.copyOfRange(nameParts, nameParts.length - 2, nameParts.length), '.');
//     jc.setProgramName(shortName);
// 
//     try {
//       jc.parse(args);
//     } catch (ParameterException e) {
//       System.err.println(e.getMessage());
//       jc.usage();
//       System.exit(-1);
//     }
// 
//     ValidationStringency stringency = SAMFileReader.getDefaultValidationStringency();
//     try {
//       SAMFileReader.setDefaultValidationStringency(SAMFileReader.ValidationStringency.LENIENT);
//       run();
//     } catch (IOException e) {
//       throw new CommandLineToolException("IO error while running", e);
//     } finally {
//       SAMFileReader.setDefaultValidationStringency(stringency);
//     }
//   }
// }
// 
// Path: src/edu/unc/genomics/CommandLineToolException.java
// public class CommandLineToolException extends RuntimeException {
// 
//   /**
// 	 * 
// 	 */
//   private static final long serialVersionUID = 4740440799806133636L;
// 
//   /**
// 	 * 
// 	 */
//   public CommandLineToolException() {
//     // TODO Auto-generated constructor stub
//   }
// 
//   /**
//    * @param message
//    */
//   public CommandLineToolException(String message) {
//     super(message);
//     // TODO Auto-generated constructor stub
//   }
// 
//   /**
//    * @param cause
//    */
//   public CommandLineToolException(Throwable cause) {
//     super(cause);
//     // TODO Auto-generated constructor stub
//   }
// 
//   /**
//    * @param message
//    * @param cause
//    */
//   public CommandLineToolException(String message, Throwable cause) {
//     super(message, cause);
//     // TODO Auto-generated constructor stub
//   }
// 
//   /**
//    * @param message
//    * @param cause
//    * @param enableSuppression
//    * @param writableStackTrace
//    */
//   public CommandLineToolException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
//     super(message, cause, enableSuppression, writableStackTrace);
//     // TODO Auto-generated constructor stub
//   }
// 
// }
// 
// Path: src/edu/unc/genomics/ReadablePathValidator.java
// public class ReadablePathValidator implements IParameterValidator {
// 
//   /*
//    * (non-Javadoc)
//    * 
//    * @see com.beust.jcommander.IParameterValidator#validate(java.lang.String,
//    * java.lang.String)
//    */
//   @Override
//   public void validate(String name, String value) throws ParameterException {
//     PathConverter converter = new PathConverter();
//     Path p = converter.convert(value);
//     if (!Files.isReadable(p)) {
//       throw new ParameterException("Parameter " + name + " should be a readable file");
//     }
//   }
// 
// }
// 
// Path: src/edu/unc/utils/WigStatistic.java
// public enum WigStatistic {
//   COVERAGE("coverage"), TOTAL("total"), MEAN("mean"), MIN("min"), MAX("max");
// 
//   private String name;
// 
//   WigStatistic(final String name) {
//     this.name = name;
//   }
// 
//   public static WigStatistic fromName(final String name) {
//     for (WigStatistic dsm : WigStatistic.values()) {
//       if (dsm.getName().equalsIgnoreCase(name)) {
//         return dsm;
//       }
//     }
// 
//     return null;
//   }
// 
//   /**
//    * @return the name
//    */
//   public String getName() {
//     return name;
//   }
// }


import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.math3.stat.descriptive.SummaryStatistics;
import org.apache.log4j.Logger;
import com.beust.jcommander.Parameter;
import edu.unc.genomics.CommandLineTool;
import edu.unc.genomics.CommandLineToolException;
import edu.unc.genomics.Interval;
import edu.unc.genomics.ReadablePathValidator;
import edu.unc.genomics.io.IntervalFileReader;
import edu.unc.genomics.io.WigFileReader;
import edu.unc.genomics.io.WigFileException;
import edu.unc.utils.WigStatistic;
package edu.unc.genomics.ngs;





/**
 * For each interval, compute the mean/min/max/total/coverage of data in a
 * (Big)Wig file over that interval.
 * 
 * @author timpalpant
 *
 */
public class IntervalStats extends CommandLineTool {

  private static final Logger log = Logger.getLogger(IntervalStats.class);

  @Parameter(description = "Input files", required = true)
  public List<String> inputFiles = new ArrayList<>();
  @Parameter(names = { "-l", "--loci" }, description = "Loci file (Bed)", required = true, validateWith = ReadablePathValidator.class)
  public Path lociFile;
  @Parameter(names = { "-s", "--stat" }, description = "Statistic to compute (mean/min/max/total/coverage)")
// Path: src/edu/unc/genomics/CommandLineTool.java
// public abstract class CommandLineTool {
// 
//   /**
//    * The default bite-size to use for applications that process files in chunks
//    * TODO Read from a configuration file
//    */
//   public static final int DEFAULT_CHUNK_SIZE = 10_000_000;
// 
//   /**
//    * Do the main computation of this tool
//    * 
//    * @throws IOException
//    */
//   public abstract void run() throws IOException;
// 
//   /**
//    * Parse command-line arguments and run the tool Exit on parameter exceptions
//    * 
//    * @param args
//    */
//   public void instanceMain(String[] args) throws CommandLineToolException {
//     // Initialize the command-line options parser
//     JCommander jc = new JCommander(this);
// 
//     // Add factories for parsing Paths, Assemblies, IntervalFiles, and WigFiles
//     jc.addConverterFactory(new PathFactory());
//     jc.addConverterFactory(new AssemblyFactory());
// 
//     // Set the program name to be the class name
//     String[] nameParts = getClass().getName().split("\\.");
//     String shortName = StringUtils.join(Arrays.copyOfRange(nameParts, nameParts.length - 2, nameParts.length), '.');
//     jc.setProgramName(shortName);
// 
//     try {
//       jc.parse(args);
//     } catch (ParameterException e) {
//       System.err.println(e.getMessage());
//       jc.usage();
//       System.exit(-1);
//     }
// 
//     ValidationStringency stringency = SAMFileReader.getDefaultValidationStringency();
//     try {
//       SAMFileReader.setDefaultValidationStringency(SAMFileReader.ValidationStringency.LENIENT);
//       run();
//     } catch (IOException e) {
//       throw new CommandLineToolException("IO error while running", e);
//     } finally {
//       SAMFileReader.setDefaultValidationStringency(stringency);
//     }
//   }
// }
// 
// Path: src/edu/unc/genomics/CommandLineToolException.java
// public class CommandLineToolException extends RuntimeException {
// 
//   /**
// 	 * 
// 	 */
//   private static final long serialVersionUID = 4740440799806133636L;
// 
//   /**
// 	 * 
// 	 */
//   public CommandLineToolException() {
//     // TODO Auto-generated constructor stub
//   }
// 
//   /**
//    * @param message
//    */
//   public CommandLineToolException(String message) {
//     super(message);
//     // TODO Auto-generated constructor stub
//   }
// 
//   /**
//    * @param cause
//    */
//   public CommandLineToolException(Throwable cause) {
//     super(cause);
//     // TODO Auto-generated constructor stub
//   }
// 
//   /**
//    * @param message
//    * @param cause
//    */
//   public CommandLineToolException(String message, Throwable cause) {
//     super(message, cause);
//     // TODO Auto-generated constructor stub
//   }
// 
//   /**
//    * @param message
//    * @param cause
//    * @param enableSuppression
//    * @param writableStackTrace
//    */
//   public CommandLineToolException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
//     super(message, cause, enableSuppression, writableStackTrace);
//     // TODO Auto-generated constructor stub
//   }
// 
// }
// 
// Path: src/edu/unc/genomics/ReadablePathValidator.java
// public class ReadablePathValidator implements IParameterValidator {
// 
//   /*
//    * (non-Javadoc)
//    * 
//    * @see com.beust.jcommander.IParameterValidator#validate(java.lang.String,
//    * java.lang.String)
//    */
//   @Override
//   public void validate(String name, String value) throws ParameterException {
//     PathConverter converter = new PathConverter();
//     Path p = converter.convert(value);
//     if (!Files.isReadable(p)) {
//       throw new ParameterException("Parameter " + name + " should be a readable file");
//     }
//   }
// 
// }
// 
// Path: src/edu/unc/utils/WigStatistic.java
// public enum WigStatistic {
//   COVERAGE("coverage"), TOTAL("total"), MEAN("mean"), MIN("min"), MAX("max");
// 
//   private String name;
// 
//   WigStatistic(final String name) {
//     this.name = name;
//   }
// 
//   public static WigStatistic fromName(final String name) {
//     for (WigStatistic dsm : WigStatistic.values()) {
//       if (dsm.getName().equalsIgnoreCase(name)) {
//         return dsm;
//       }
//     }
// 
//     return null;
//   }
// 
//   /**
//    * @return the name
//    */
//   public String getName() {
//     return name;
//   }
// }


// Path: src/edu/unc/genomics/ngs/IntervalStats.java
import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.math3.stat.descriptive.SummaryStatistics;
import org.apache.log4j.Logger;
import com.beust.jcommander.Parameter;
import edu.unc.genomics.CommandLineTool;
import edu.unc.genomics.CommandLineToolException;
import edu.unc.genomics.Interval;
import edu.unc.genomics.ReadablePathValidator;
import edu.unc.genomics.io.IntervalFileReader;
import edu.unc.genomics.io.WigFileReader;
import edu.unc.genomics.io.WigFileException;
import edu.unc.utils.WigStatistic;

package edu.unc.genomics.ngs;





/**
 * For each interval, compute the mean/min/max/total/coverage of data in a
 * (Big)Wig file over that interval.
 * 
 * @author timpalpant
 *
 */
public class IntervalStats extends CommandLineTool {

  private static final Logger log = Logger.getLogger(IntervalStats.class);

  @Parameter(description = "Input files", required = true)
  public List<String> inputFiles = new ArrayList<>();
  @Parameter(names = { "-l", "--loci" }, description = "Loci file (Bed)", required = true, validateWith = ReadablePathValidator.class)
  public Path lociFile;
  @Parameter(names = { "-s", "--stat" }, description = "Statistic to compute (mean/min/max/total/coverage)")
  public String stat = "mean";