gt: 		for(int i=0; i<sum.length; i++){
context: package driver;
  
  import java.util.ArrayList;
  import java.util.List;
  
  import dna.ChromosomeArray;
  import dna.Data;
  import shared.Shared;
  import structures.CoverageArray2;
  import var.VarLine;
  import var.Variation;
  
  public class GenerateNoCallsFromCoverage {
  	
  //	@Deprecated
  //	public static ArrayList<VarLine> generateOld(byte chrom, CoverageArray ca, int build, char gender){
  //
  //		ArrayList<VarLine> lines=new ArrayList<VarLine>(256);
  //
  //		assert(Data.GENOME_BUILD==build);
  //		ChromosomeArray chra=Data.getChromosome(chrom);
  //
  //		int start=-1;
  //		int stop=-1;
  //
  //		for(int i=chra.minIndex; i<chra.maxIndex; i++){
  //			boolean nc=(ca.get(i)<minCovered);
  //
  //			if(nc && start==-1){
  //				start=i;
  //			}
  //
  //			if(!nc && start>-1){
  //				stop=i-1;
  //
  //				VarLine v1=new VarLine();
  //				v1.ploidy=(chrom<=22 ? 2 : chrom>=24 ? 1 : (Byte)Variation.ploidyMap.get("?"));
  //
  //				v1.haplotype=1;
  //				v1.chromosome=chrom;
  //				v1.beginLoc=start;
  //				v1.endLoc=stop;
  //
  //				v1.ref="=";
  //				v1.call=null;
  //
  //				v1.totalScore=-1;
  //				v1.xRef=-2;
  //				v1.xRefArray=null;
  //				v1.hapLink=-1;
  //				v1.varType=Variation.NOCALL;
  //
  //				VarLine v2;
  //				if((chrom==23 && gender=='M') || chrom==24 || chrom==25){
  //					v2=null;
  //				}else{
  //					v2=new VarLine();
  //					v2.ploidy=(chrom<=22 ? 2 : chrom>=24 ? 1 : (Byte)Variation.ploidyMap.get("?"));
  //
  //					v2.haplotype=2;
  //					v2.chromosome=chrom;
  //					v2.beginLoc=start;
  //					v2.endLoc=stop;
  //
  //					v2.ref="=";
  //					v2.call=null;
  //
  //					v2.totalScore=-1;
  //					v2.xRef=-2;
  //					v2.xRefArray=null;
  //					v2.hapLink=-1;
  //					v2.varType=Variation.NOCALL;
  //				}
  //
  //
  //				start=-1;
  //				stop=-1;
  //				lines.add(v1);
  //				if(v2!=null){lines.add(v2);}
  //			}
  //
  //
  //		}
  //
  //		return lines;
  //	}
  	
  	
  	
  	public static ArrayList<VarLine> generate(byte chrom, CoverageArray2 ca, int build, char gender){
  		
  		assert(minCovered>=1);
  		assert(minHalfCovered>=1);
  		assert(minCovered>=minHalfCovered);
  		
  		
  		ArrayList<VarLine> lines=new ArrayList<VarLine>(256);
  		
  		assert(Data.GENOME_BUILD==build);
  		ChromosomeArray chra=Data.getChromosome(chrom);
  		
  		int start=-1;
  		int stop=-1;
  		
  		
  		byte level=-1;
  		
  		boolean haploid=(chrom==23 && gender=='M') || chrom==24 || chrom==25;
  		
  		for(int i=chra.minIndex; i<chra.maxIndex; i++){
  			
  			final byte newLevel;
  			final int cov=ca.get(i);
  			
  			if(haploid){
  				if(cov<minHalfCovered){
  					newLevel=0;
  				}else{
  					newLevel=2;
  				}
  			}else{
  				if(cov<minHalfCovered){
  					newLevel=0;
  				}else if(cov<minCovered){
  					newLevel=1;
  				}else{
  					newLevel=2;
  				}
  			}
  			
  			
  			if(level==-1){
  				level=newLevel;
  				start=i;
  			}else if(level!=newLevel){ //The level changed; make VarLines
  				
  				stop=i-1;
  				
  				if(level==0){
  
  					VarLine v1=new VarLine();
  					v1.ploidy=(chrom<=22 ? 2 : chrom>=24 ? 1 : gender=='M' ? 1 : gender=='F' ? 2 : (Byte)Variation.ploidyMap.get("?"));
  					v1.haplotype=1;
  					v1.chromosome=chrom;
  					v1.beginLoc=start;
  					v1.endLoc=stop;
  
  					v1.ref="=";
  					v1.call=null;
  
  					v1.totalScore=-1;
  					v1.hapLink=-1;
  					v1.varType=Variation.NOCALL;
  
  					lines.add(v1);
  				}
  				
  				if(level==0 || (level==1 && !haploid)){
  
  					VarLine v2=new VarLine();
  					v2.ploidy=(chrom<=22 ? 2 : chrom>=24 ? 1 : gender=='M' ? 1 : gender=='F' ? 2 : (Byte)Variation.ploidyMap.get("?"));
  
  					v2.haplotype=2;
  					v2.chromosome=chrom;
  					v2.beginLoc=start;
  					v2.endLoc=stop;
  
  					v2.ref="=";
  					v2.call=null;
  
  					v2.totalScore=-1;
  					v2.hapLink=-1;
  					v2.varType=Variation.NOCALL;
  					
  					lines.add(v2);
  				}
  
  
  //				start=-1;
  				stop=-1;
  				level=newLevel;
  				start=i;
  			}
  		}
  		
  		return lines;
  	}
  	
  	
  	public static ArrayList<VarLine> removeDuplicateNocalls(List<VarLine> input, int copies){
  		ArrayList<VarLine>[] haplo=splitHaplotypes(input, copies);
  
  		ArrayList<VarLine> output=new ArrayList<VarLine>(256);
  //		System.err.println("A: copies="+copies+"; input.size="+input.size()+"; haplo="+haplo[0].size()+", "+haplo[1].size());
  		for(ArrayList<VarLine> alv : haplo){
  			VarLine temp=alv.size()==0 ? null : alv.get(0);
  			for(VarLine vl : alv){assert(vl.haplotype==temp.haplotype);}
  			ArrayList<VarLine> alv2=removeDuplicateNocallsHaplotyped(alv);
  //			assert(checkCopyCountHaplotyped(alv2)); //Very slow
  			
  //			output.addAll(removeDuplicateNocallsHaplotyped(alv2)); //This MUST be incorrect.
  			
  			output.addAll(alv2);
  		}
  		
  		Shared.sort(output);
  		
  		return output;
  	}
  	
  	public static boolean checkCopyCountHaplotyped(List<VarLine> list){
  		
  		int max=0;
  		for(VarLine vl : list){
  			if(vl.endLoc>max){max=vl.endLoc;}
  		}
  
  		byte[] sum=new byte[max+1];
  //		byte[] vars=new byte[max+1];
  		byte[] nocalls=new byte[max+1];
  		
  		for(VarLine vl : list){
  			for(int i=vl.beginLoc; i<=vl.endLoc; i++){
  				sum[i]++;
  				if(vl.isNoCall()){nocalls[i]++;}
  //				else{vars[i]++;}
  			}
  		}
  		
  