def do_simulation(i):
    print 'Starting loop ' + str(i)
    
    if lind_args.get('specify_errors'): initial_states = calculate_initial_states_from_bitflips(bitflips[i])
    elif lind_args.get('random_errors'): 
        initial_states = calculate_initial_states_from_bitflips(error_list[randint(0,3)])
    else: initial_states = calculate_initial_states_from_bitflips(bitflips)
    

    
    sim = Simulation(hamiltonian,initial_states,mesolve_args)
    if displacement_bool == True:
        sim.generate_data_qubit_offsets(disp_radius,disp_halfheight)
    sim.loop = i
    #sim.set_data_qubit_offsets(displacements)
    sim.choose_twirl(lind_args.get('twirl'))
    sim.run(time,steps)    #adjust for full circle!
    result_states = sim.last_run_all
    qsave(result_states, os.path.join(lind_args.get('folder'),lind_args.get('subfolder'),'data','run'+str(i+1)))
    #step_data = sim.last_run_quarter_cycle
    sim.reset_system_state()
    # return tuple of iteration and result, because jobs are started async = return whenever finished
    return (i, sim.last_run_all[-1], sim.qubit_offsets_list) 
final_states = []

"""Adding Lindblad operators"""
if lind_args.get('dephasing'):
    sim.lind.dephasing(lind_args.get('dephasing_param'))
if lind_args.get('excitation'):
    sim.lind.excitation(lind_args.get('excitation_param'))
if lind_args.get('relaxation'):
    sim.lind.relaxation(lind_args.get('relaxation_param'))

""" Set up and generate qubit displacements """
if lind_args.get('qubit_displacement_error'):
    disp_radius = float(lind_args.get('qubit_displacement_radius'))
    disp_halfheight = float(lind_args.get('qubit_displacement_halfheight'))

    sim.generate_data_qubit_offsets(disp_radius,disp_halfheight)


""" Run simulation """
for i in range(0,no_of_runs):
    print 'Starting loop ' + str(i)
    sim.regenerate_data_qubit_offsets() # Necessary for each run to have different displacement errors
    sim.run(time,steps)
    result_states = sim.last_run_all
    # Set time-stamp and save files
    st = datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d-%H.%M.%S')
    qsave(result_states, os.path.join(lind_args['folder'],"iteration"+str(i) + st))
    step_data = sim.last_run_quarter_cycle
    final_states.append(sim.last_run_all[-1])
    sim.reset_system_state()