// 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/genomics/WigMathTool.java
// public abstract class WigMathTool extends WigAnalysisTool {
// 
//   private static final Logger log = Logger.getLogger(WigMathTool.class);
// 
//   @Parameter(names = { "-f", "--fixedstep" }, description = "Force fixedStep output")
//   public boolean fixedStep = false;
//   @Parameter(names = { "-v", "--variablestep" }, description = "Force variableStep output")
//   public boolean variableStep = false;
//   @Parameter(names = { "--step" }, description = "Step size for output Wig files")
//   public int step = 1;
//   @Parameter(names = { "-o", "--output" }, required = true, description = "Output Wig file")
//   public Path outputFile;
// 
//   private WigFileWriter writer;
// 
//   /**
//    * Setup the computation, and add all input Wig files
//    */
//   protected abstract void setup();
// 
//   /**
//    * Do the computation on a chunk and return the results. Must return
//    * chunk.length() values (one for every base pair in chunk)
//    * 
//    * @param chunk
//    *          the interval to process
//    * @return the results of the computation for this chunk
//    * @throws IOException
//    * @throws WigFileException
//    */
//   protected abstract float[] compute(Interval chunk) throws IOException, WigFileException;
// 
//   /**
//    * Setup the computation. Should add all input Wig files with addInputFile()
//    * during setup
//    * 
//    * @throws IOException
//    */
//   @Override
//   protected final void prepare() {
//     // Setup the input files
//     setup();
// 
//     // Setup the output file
//     try {
//       writer = new WigFileWriter(outputFile, TrackHeader.newWiggle());
//     } catch (IOException e) {
//       throw new CommandLineToolException("Error initializing output file " + outputFile, e);
//     }
//   }
// 
//   /**
//    * Shutdown the computation and do any cleanup / final processing
//    * 
//    * @throws IOException
//    */
//   @Override
//   protected final void shutdown() throws IOException {
//     writer.close();
//     super.shutdown();
//   }
// 
//   @Override
//   public final void process(Interval chunk) throws IOException, WigFileException {
//     float[] result = compute(chunk);
// 
//     // Verify that the computation returned the correct number of
//     // values for the chunk. It must either be 1 value per base pair,
//     // or one value per step (if the script already computed the reduction).
//     Contig outputContig = null;
//     if (result.length != chunk.length()) {
//       int nValues = (int) Math.ceil(((float) chunk.length()) / step);
//       if (result.length == nValues) { // already reduced
//         // assume values have already been condensed to a certain step
//         outputContig = new Contig(chunk, result, step);
//       } else {
//         log.error("Expected result length=" + chunk.length() + ", got=" + result.length);
//         throw new CommandLineToolException("Result of Wig computation is not the expected length!");
//       }
//     } else { // 1 value per base pair
//       outputContig = new Contig(chunk, result);
//       if (step != 1) {
//         outputContig.setSpan(step);
//       }
//     }
// 
//     // Write the result of the computation for this chunk to disk
//     if (fixedStep) {
//       writer.writeFixedStepContig(outputContig);
//     } else if (variableStep) {
//       writer.writeVariableStepContig(outputContig);
//     } else {
//       writer.write(outputContig);
//     }
//   }
// }


import java.io.IOException;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.Logger;
import com.beust.jcommander.Parameter;
import edu.unc.genomics.CommandLineToolException;
import edu.unc.genomics.Interval;
import edu.unc.genomics.ReadablePathValidator;
import edu.unc.genomics.WigMathTool;
import edu.unc.genomics.io.WigFileReader;
import edu.unc.genomics.io.WigFileException;
package edu.unc.genomics.wigmath;





/**
 * Shift a Wig file to have a specified mean
 * 
 * @author timpalpant
 *
 */
public class Shift extends WigMathTool {

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

  @Parameter(names = { "-i", "--input" }, description = "Input file", required = true, validateWith = ReadablePathValidator.class)
// 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/genomics/WigMathTool.java
// public abstract class WigMathTool extends WigAnalysisTool {
// 
//   private static final Logger log = Logger.getLogger(WigMathTool.class);
// 
//   @Parameter(names = { "-f", "--fixedstep" }, description = "Force fixedStep output")
//   public boolean fixedStep = false;
//   @Parameter(names = { "-v", "--variablestep" }, description = "Force variableStep output")
//   public boolean variableStep = false;
//   @Parameter(names = { "--step" }, description = "Step size for output Wig files")
//   public int step = 1;
//   @Parameter(names = { "-o", "--output" }, required = true, description = "Output Wig file")
//   public Path outputFile;
// 
//   private WigFileWriter writer;
// 
//   /**
//    * Setup the computation, and add all input Wig files
//    */
//   protected abstract void setup();
// 
//   /**
//    * Do the computation on a chunk and return the results. Must return
//    * chunk.length() values (one for every base pair in chunk)
//    * 
//    * @param chunk
//    *          the interval to process
//    * @return the results of the computation for this chunk
//    * @throws IOException
//    * @throws WigFileException
//    */
//   protected abstract float[] compute(Interval chunk) throws IOException, WigFileException;
// 
//   /**
//    * Setup the computation. Should add all input Wig files with addInputFile()
//    * during setup
//    * 
//    * @throws IOException
//    */
//   @Override
//   protected final void prepare() {
//     // Setup the input files
//     setup();
// 
//     // Setup the output file
//     try {
//       writer = new WigFileWriter(outputFile, TrackHeader.newWiggle());
//     } catch (IOException e) {
//       throw new CommandLineToolException("Error initializing output file " + outputFile, e);
//     }
//   }
// 
//   /**
//    * Shutdown the computation and do any cleanup / final processing
//    * 
//    * @throws IOException
//    */
//   @Override
//   protected final void shutdown() throws IOException {
//     writer.close();
//     super.shutdown();
//   }
// 
//   @Override
//   public final void process(Interval chunk) throws IOException, WigFileException {
//     float[] result = compute(chunk);
// 
//     // Verify that the computation returned the correct number of
//     // values for the chunk. It must either be 1 value per base pair,
//     // or one value per step (if the script already computed the reduction).
//     Contig outputContig = null;
//     if (result.length != chunk.length()) {
//       int nValues = (int) Math.ceil(((float) chunk.length()) / step);
//       if (result.length == nValues) { // already reduced
//         // assume values have already been condensed to a certain step
//         outputContig = new Contig(chunk, result, step);
//       } else {
//         log.error("Expected result length=" + chunk.length() + ", got=" + result.length);
//         throw new CommandLineToolException("Result of Wig computation is not the expected length!");
//       }
//     } else { // 1 value per base pair
//       outputContig = new Contig(chunk, result);
//       if (step != 1) {
//         outputContig.setSpan(step);
//       }
//     }
// 
//     // Write the result of the computation for this chunk to disk
//     if (fixedStep) {
//       writer.writeFixedStepContig(outputContig);
//     } else if (variableStep) {
//       writer.writeVariableStepContig(outputContig);
//     } else {
//       writer.write(outputContig);
//     }
//   }
// }


// Path: src/edu/unc/genomics/wigmath/Shift.java
import java.io.IOException;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.Logger;
import com.beust.jcommander.Parameter;
import edu.unc.genomics.CommandLineToolException;
import edu.unc.genomics.Interval;
import edu.unc.genomics.ReadablePathValidator;
import edu.unc.genomics.WigMathTool;
import edu.unc.genomics.io.WigFileReader;
import edu.unc.genomics.io.WigFileException;

package edu.unc.genomics.wigmath;





/**
 * Shift a Wig file to have a specified mean
 * 
 * @author timpalpant
 *
 */
public class Shift extends WigMathTool {

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

  @Parameter(names = { "-i", "--input" }, description = "Input file", required = true, validateWith = ReadablePathValidator.class)
  public Path inputFile;