import os
try:
	execfile("get_energy_bins.py")
	execfile("get_type_thresholds.py")
except:
	path=os.path.dirname(inspect.getfile(inspect.currentframe()))
	execfile("%s/get_energy_bins.py"%path)
	execfile("%s/get_type_thresholds.py"%path)


def get_master_ch_response_dict(type):
	# uses get_master_ch_dict to create an dictionary, however:
	# energies will be replaced by actual responded energy (correcting for energy loss in foils)
	# the keywords "response_ringon", "response_ringoff" are added (lists of response factors for the master channels)

	response_path="../30_counts_and_responses/41_response_factors_in_masterch/master_ch_output_same_energies/%s/"%type
	if not os.path.exists(response_path): response_path="../"+response_path
	response_file_ringon=response_path+"%smasterresponses.txt"%type
	response_file_ringoff=response_path+"ringoff_%smasterresponses.txt"%type
	response_ringon_IDX,response_ringon_E,response_ringon_dE, response_ringon_E_min, response_ringon_E_max, response_ringon_RESP=np.loadtxt(response_file_ringon,usecols=(0,1,2,3,4,5),unpack=True)
	response_ringoff_IDX,response_ringoff_E,response_ringoff_dE, response_ringoff_E_min, response_ringoff_E_max, response_ringoff_RESP=np.loadtxt(response_file_ringoff,usecols=(0,1,2,3,4,5),unpack=True)
	
	if type not in ["proton","helium"]:
		print "ERROR, response is only defined for proton and helium master channels yet!"
	else:
		master_ch_response_dict=get_master_ch_dict(type)
		master_ch_response_dict["response_ringon"]=[]
		master_ch_response_dict["response_ringoff"]=[]
		for masteridx in master_ch_response_dict["masterch_id"]:
			# add response factors
			master_ch_response_dict["response_ringon"].append( response_ringon_RESP[np.where(response_ringon_IDX==masteridx)[0]][0] )
			master_ch_response_dict["response_ringoff"].append( response_ringoff_RESP[np.where(response_ringoff_IDX==masteridx)[0]][0] )
			# change energies to actual responded energies
			master_ch_response_dict["emin"][masteridx]= response_ringon_E_min[np.where(response_ringon_IDX==masteridx)[0]][0] 
			master_ch_response_dict["emax"][masteridx]= response_ringon_E_max[np.where(response_ringon_IDX==masteridx)[0]][0] 
			master_ch_response_dict["ewidth"][masteridx]= response_ringon_dE[np.where(response_ringon_IDX==masteridx)[0]][0] 
			master_ch_response_dict["ecenter"][masteridx]= response_ringon_E[np.where(response_ringon_IDX==masteridx)[0]][0] 
			if type=="proton":	prefix,suffix= "H", "MeV"
			if type=="helium":	prefix,suffix= "He", "MeV/nuc"
			master_ch_response_dict["masterch_name"][masteridx]=("%s: %2.2f-%2.2f %s"%(prefix,response_ringon_E_min[np.where(response_ringon_IDX==masteridx)[0]][0] ,response_ringon_E_max[np.where(response_ringon_IDX==masteridx)[0]][0],suffix ))
		return master_ch_response_dict




def get_master_ch_dict(type):
	# type can be background, proton, helium or overflow (electrons has changin energy bin widhts in its histo
	if type not in ["proton","helium","background","overflow"]:
		print "type can be background, proton, helium or overflow (electrons has changin energy bin widhts in its histo"
	else:
		master_ch_dict={
		"masterch_type":type,
		"masterch_id":[],
		"masterch_name":[],
		"coinces":[],
		"ch_in_coinces":[],
		"emax":[],
		"emin":[],
		"ewidth":[],
		"ecenter":[]
		}
		thresholds_dict=get_type_thresholds()
		masterch_counter=0
		for coinc in ["AB","ABC","ABCD","ABCDE"]:
			thresholds=thresholds_dict[coinc][type[0]]
			energybins=get_energy_bins(coinc)
			for subchidx in range(len(energybins["ecenter"])):
				if energybins["emin"][subchidx]>=thresholds[0] and energybins["emax"][subchidx]<=thresholds[1]:
					if float(format(energybins["emin"][subchidx],".2f")) not in master_ch_dict["emin"]:
						master_ch_dict["masterch_id"].append(masterch_counter)
						masterch_counter+=1
						master_ch_dict["masterch_name"].append("%s: %2.2f-%2.2f MeV"%(type[0],energybins["emin"][subchidx],energybins["emax"][subchidx]))
						master_ch_dict["coinces"].append([coinc])
						master_ch_dict["ch_in_coinces"].append([subchidx])
						for energystuff in ["emin","emax","ewidth","ecenter"]:
							master_ch_dict[energystuff].append( float(format( energybins[energystuff][subchidx] , ".2f" )) )
					else:	
						existing_index= master_ch_dict["emin"].index(float(format(energybins["emin"][subchidx], ".2f")))
						master_ch_dict["coinces"][existing_index].append(coinc)
						master_ch_dict["ch_in_coinces"][existing_index].append(subchidx)
		
		return master_ch_dict


"""
master_ch_response_dict=get_master_ch_response_dict("proton")
print master_ch_response_dict

for type in ["proton","helium","background","overflow"]:
		print "\n"+type+"\n"
		master_ch_dict=get_master_ch_dict(type)
		print master_ch_dict["emin"]
		print master_ch_dict["emax"]
"""