Loop assistance

Hello! I am finalizing my code and noticed an issue. I am using BinarySearch to find an ending for my curve. When the value is out of the bounds, BinarySearch returns a -2. I want to make a loop that prompts the use for a new ending point. If the value makes BinarySearch return a -2, then I want the loop to start over. If the value makes BinarySearch return anything over 0, then I want the program to print the result and end the loop. Unfortunately, I have tried many methods to get this to work but to no avail. 

Any assistance would be appreciated.

variable index_value = BinarySearch(selection_fit, y_half)

if (index_value >= 0)		// if index_value is greater than or equal to 0, then break loop 
					print "	index value = ", index_value
				else
					if (index_value == -2)	
						do
							if (index_value > 2)
								break
							endif
							
							DoAlert /T="ERROR: STOP POINT OUT OF RANGE", 0, "The stop point entered is out of range for the half-life. Click 'OK' and select a stop point within the range"

							Prompt stop_point, "Enter desired stop point"		//	prompt user to give new stop value	
							DoPrompt "Enter_Stop_Point", stop_point
							CurveFit/M=2/W=0 dblexp_XOffset, selection [50,stop_point]/X=Time__seconds_[50,stop_point]/D
							
							while (index_value > 0)		// continue from break #1
								print "	index value = ", index_value
							break
					endif

An issue I keep encountering is that after the error, the new index_value is not saved and only the -2 is registered. I think if this issue was resolved, the rest of the code would work

1. check your while() condition. If you want always to exit the loop via the break at the start, you can use while(1), otherwise while(index_value<=0)

2. your code does not assign a new value to index_value after the curvefit. Perhaps you need another BinarySearch to prevent the loop from running forever.

3. enable the debugger, set a breakpoint and step through your code to see what is happening.

In reply to by tony

	variable index_value	
	do
		CurveFit/M=2/W=0 dblexp_XOffset, selection [50,stop_point]/X=Time__seconds_[50,stop_point]/D
		index_value = BinarySearch(selection_fit, y_half)
		if (index_value > 0)
			break
		endif
		DoAlert 1 /T="ERROR: STOP POINT OUT OF RANGE", 0, "The stop point entered is out of range for the half-life. Do you want to select a stop point within the range?"
		if (v_flag == 2)
			break
		endif
		Prompt stop_point, "Enter desired stop point"       //  prompt user to give new stop value
		DoPrompt "Enter_Stop_Point", stop_point		
	while (1)

you might also want to consider what happens if curvefit fails, or if the user enters a problematic value for stop_point. programming to catch fitting errors is a bit more tricky.

In reply to by tony

Thank you for such a quick response! I tried using the code you sent but it was affecting the values for my other variables. I'm not sure why. I took elements of your code and tried it in my program to see if that could resolve the issue. However, when I did, I encountered the same issue of index_value being read as -2. Using debugger, I discovered that the values for the new graph were really the old wave values from the first curve-fitting. I corrected this by using KillWaves to get rid of the values from the first wave, allowing the new wave with the curve-fitting values to be used. The old curve wave and the new curve wave have the same name. That's why I was having so many issues. Thanks for your help!

do
					wave /z	w_coef						// reference w_coef wave
					wave /z w_fitconstants				// reference w_fit_constants wave
		
					variable y0 = W_coef[0]						// define variables from w_coef wave
					variable A1 = W_coef[1]
					variable tau1 = W_coef[2]
					variable A2 = W_coef[3]
					variable tau2 = W_coef[4]
		
					variable x0 =  W_fitConstants[0]		// constant 
		
					variable y_half = ( ( y0 - ( y0 + A1 + A2 ) ) / 2 ) + ( y0 + A1 +A2 )		// y-half calculation is rough estimate, not exact y-half value
				
					variable index_value		// index value is number point on curve fit graph		
					index_value = BinarySearch(selection_fit, y_half)
				
				if (index_value > 0)		
					break
				endif
					KillWaves /Z w_coef 					// kill previous waves to avoid 'cross-talk' between old wave and new wave
					KillWaves /Z w_fit_constants
					DoAlert /T="ERROR: STOP POINT OUT OF RANGE", 0, "The stop point entered is out of range for the half-life. Click 'OK' and select a stop point within the range"		// alert user their selection is out of range
	
					Prompt stop_point, "Enter desired stop point"		//	prompt user to give new stop value	
					DoPrompt "Enter_Stop_Point", stop_point
   					Hideinfo
					CurveFit/M=2/W=0 dblexp_XOffset, selection [50,stop_point]/X=Time__seconds_[50,stop_point]/D
					AutoPositionWindow/E/M=1
	
				while (1)		// continue from break #1
					print "	index value = ", index_value