import random def find_rwgt_pt(wc_lims_dict,factor): rwgt_pt_dict = {} for wc_name, lims in wc_lims_dict.iteritems(): low = lims[0]*factor high = lims[1]*factor r_pt = random.uniform(low,high) rwgt_pt_dict[wc_name] = r_pt return rwgt_pt_dict; def find_start_pt(wc_lims_dict,factor): start_pt_dict = {} max_tries = 100 for wc_name, lims in wc_lims_dict.iteritems(): counter = 0 low = lims[0]*factor high = lims[1]*factor while True: r_pt = random.uniform(low,high) if r_pt < 0: #print low, r_pt if abs(r_pt) > 0.5*abs(low): #print "pt chosen:" , r_pt break else: #print high, r_pt if abs(r_pt) > 0.5*abs(high): #print "pt chosen:" , r_pt break counter = counter +1 if counter == max_tries: print "Could not find a valid start pt for",wc_name,"in",max_tries,"tries!" break start_pt_dict[wc_name] = r_pt return start_pt_dict def make_scanpts_file(start_pt_type, wc_names_list, wc_lims_dict, scanfile_name): sfile = open(scanfile_name,"w") # Find the start point dictionary if start_pt_type == "calculate": start_pt_dict = find_start_pt(wc_lims_dict,1.5) elif start_pt_type == "ref": ref_pt_vals = ["-8.303849","64.337172","45.883907","24.328689","24.43011","23.757944","-6.093077","23.951426","21.540499","-3.609446","21.809598","49.595354","-51.106621","136.133729","-43.552406","-20.005026"] #from ttll_16DOldLimitsAxisScan_run1_scanpoints.txt ref_pt_dict = {} for i,wc_name in enumerate(wc_names_list): ref_pt_dict[wc_name] = ref_pt_vals[i] start_pt_dict = ref_pt_dict # Write the WC names line sfile.write(" "*20) for wc_name in wc_names_list: sfile.write(wc_name + " "*(20-len(wc_name))) # Write the start point line sfile.write("\nMGStart" + " "*(20-len("MGStart"))) for wc_name in wc_names_list: #print start_pt_dict[wc_name] buffer_str = " "*(20 - len(str(start_pt_dict[wc_name]))) sfile.write(str(start_pt_dict[wc_name])+buffer_str) # Write each rwgt pt line n_wc = len(wc_names_list) n_rwgt_pts = int(1.2*(1 + 2*n_wc + n_wc*(n_wc-1)/2)) #print n_rwgt_pts for i in range((n_rwgt_pts)+1): sfile.write("\nrwgt" + str(i) + " "*(20-len("rwgt"+str(i)))) rwgt_pt_dict = find_rwgt_pt(wc_lims_dict,1.5) for wc_name in wc_names_list: if i == n_rwgt_pts: sfile.write(str("0.0") + " "*(20-len(str("0.0")))) else: buffer_str = " "*(20 - len(str(rwgt_pt_dict[wc_name]))) sfile.write(str(rwgt_pt_dict[wc_name])+buffer_str) sfile.close() def main(): # wc_names_list is in the order for the scanpoints file wc_names_list = ["ctW" , "ctp" , "cpQM" , "ctei" , "ctli","cQei" , "ctZ" , "cQlMi" , "cQl3i" , "ctG" , "ctlTi" , "cbW" , "cpQ3" , "cptb" , "cpt" , "ctlSi"] # Limits from AN (approx) wc_lims_dict = { "ctW" : [-4,4], "ctZ" : [-4,4], "ctp" : [-11,41], "cpQM" : [-8,28], "ctG" : [-2,2], "cbW" : [-5,5], "cpQ3" : [-10,4], "cptb" : [-18,18], "cpt" : [-24,13], "cQl3i" : [-8,7], "cQlMi" : [-6,7], "cQei" : [-6,6], "ctli" : [-6,7], "ctei" : [-6,7], "ctlSi" : [-9,8], "ctlTi" : [-2,2], } #make_scanpts_file("ref",wc_names_list, wc_lims_dict, "plusJetCheck_refPt.txt") #make_scanpts_file("calculate",wc_names_list, wc_lims_dict, "plusJetCheck_startPt3.txt") make_scanpts_file("calculate",wc_names_list, wc_lims_dict, "test.txt") main()