private void doGenBackbonesHelper(String runName, int numMutable, int strandMut[][], double theta, double alpha, 
			int numSteps, Backbone bb, double initFi[], double initPsi[], PrintStream logPS, int curRes){
		
		if (curRes==numMutable){//we have a full backbone conformation, so output
			outputBB(logPS, numMutable, runName, strandMut, bb);
		}
		else { //we only have a partial backbone, so apply changes to the current residue
			
			if (curRes==0) 
				System.out.println("Starting..");
			
			//First, move the phi/psi angle to -theta, then apply the changes to +theta, at alpha steps
			
			int str = mutRes2Strand[curRes];
			int strResNum = strandMut[str][mutRes2StrandMutIndex[curRes]];
			
			//move phi to -(theta+alpha), so that the first move in the *for* statement below goes to -theta
			bb.applyFiPsi(m,str,strResNum,-(theta+alpha),0);
			
			//apply phi changes up to +theta
			for (int curStepFi=0; curStepFi<numSteps; curStepFi++){ //apply each alpha step up to a displacement of +theta from the initial phi
				
				if (curRes==0)
					System.out.print("*");
				
				bb.applyFiPsi(m,str,strResNum,alpha,0);
				
				//move psi to -(theta+alpha), so that the first move in the *for* statement below goes to -theta
				bb.applyFiPsi(m,str,strResNum,-(theta+alpha),1);
				
				for (int curStepPsi=0; curStepPsi<numSteps; curStepPsi++){ //apply each alpha step up to a displacement of +theta from the initial psi
				
					if (curRes==0)
						System.out.print(".");
					
					bb.applyFiPsi(m,str,strResNum,alpha,1);
					if (checkStericsBBonly(str,strResNum)) {//passed steric test, so move to the next residue
						doGenBackbonesHelper(runName,numMutable,strandMut,theta,alpha,numSteps,bb,initFi,initPsi,logPS,curRes+1);
					}
				}
				
				//restore initial psi
				bb.applyFiPsi(m,str,strResNum,-theta,1);
				
				if (curRes==0)
					System.out.println();
			}
			
			//restore initial phi
			bb.applyFiPsi(m,str,strResNum,-theta,0);
			
			if (curRes==0)
				System.out.println("done");
		}
	}