def inst_Neta2_rule49_Nv500_hetero_inv():
    #####################
    inputbasename='FHV.out.lmax10pmax5.Neta2.rule49.Nv500.h**o.inv'
    outputbasename='FHV.out.lmax10pmax5.Neta2.rule49.Nv500.hetero.inv'
    print 'inst_Neta2_rule49_Nv500_hetero_inv: outputbasename '+outputbasename
    #####################
    NaNb=[91,91] # image dimensions in pixels
    deltachi=[4.7,4.7] # image sampling intervals in Angstroms
    Neta=2
    #####################
    # Operators are executed in the order in which they appear in cmd, using the arguments that also appear in cmd.  To do nothing, specify cmd=[];.  To indicate a 'no-op', set that element of the cell array to an empty matrix, e.g., cmd{1}=[], which is the initialization set by the 'cell' function.
    cmd=[] # Preallocate for 50 operators.
    #####################
    cmd.append({'operator':'misc_diary', 'fn_diary':outputbasename+'.diary'})
    #####################
    cmd.append({'operator':'box_readpixelnoisevar', 'fn_pixelnoisevar':'step3/'+inputbasename+'.pixelnoisevar.txt'})
    #####################
    cmd_dict={}
    cmd_dict['operator']='box_readImagestack'
    cmd_dict['Imagestackformat']='mat'
    cmd_dict['fn_Imagestack']='FHV.out.lmax10pmax5.Neta2.rule49.Nv500.pre4hetero.inv.Imagestack.mat'
    #cmd_dict['startSlice']=1
    #cmd_dict['numSlices']=500 # this is number of complex reciprocal-space images
    cmd.append(cmd_dict)
    #####################
    cmd.append({'operator':'basic_setsizeof2DreciprocalspaceImagesfromImagestack'})
    #####################
    cmd.append({'operator':'basic_set2Drealspacesamplingintervals','samplingintervals':deltachi})
    #####################
    cmd.append({'operator':'basic_compute2Dreciprocalspaceproperties'})
    #####################
    cmd_dict={}
    cmd_dict['operator']='vobj_read_virusobj'
    cmd_dict['fn_clnp']=np.zeros((Neta,1),dtype=np.object)
    cmd_dict['fn_clnp'][0]='step3/'+inputbasename+'.eta1.clnp.txt'
    cmd_dict['fn_clnp'][1]='step3/'+inputbasename+'.eta2.clnp.txt'
    cmd_dict['fn_nu']=np.zeros((Neta,1),dtype=np.object)
    cmd_dict['fn_nu'][0]='step3/'+inputbasename+'.eta1.nu.txt'
    cmd_dict['fn_nu'][1]='step3/'+inputbasename+'.eta2.nu.txt'
    cmd_dict['fn_q']=np.zeros((Neta,1),dtype=np.object)
    cmd_dict['fn_q'][0]='step3/'+inputbasename+'.eta1.q.txt'
    cmd_dict['fn_q'][1]='step3/'+inputbasename+'.eta2.q.txt'
    cmd.append(cmd_dict)
    #####################
    cmd_dict={}
    cmd_dict['operator']='vobj_change_homo2hetero_in_virusobj'
    cmd_dict['homo2hetero']=[]
    homo_dict={}
    cmd_dict['homo2hetero'].append(homo_dict)
    homo_dict['action']=1 # make this class heterogeneous
    homo_dict['FractionOfMeanForMinimum']=0.0025 # only required when .action=1
    homo_dict['FractionOfMean']=0.02 # only required when .action=1
    homo_dict={}
    cmd_dict['homo2hetero'].append(homo_dict)
    homo_dict['action']=1 # make this class heterogeneous
    homo_dict['FractionOfMeanForMinimum']=0.0025 # only required when .action=1
    homo_dict['FractionOfMean']=0.02 # only required when .action=1
    cmd.append(cmd_dict)
    #####################
    cmd.append({'operator':'vobj_print_virusobj'})
    #####################
    cmd.append({'operator':'misc_diary','fn_diary':'off'})
    #####################
    cmd.append({'operator':'misc_changedirectory','dn':'hetero.step7'})
    #####################
    cmd.append({'operator':'misc_diary','fn_diary':outputbasename+'.diary.txt'})
    #####################
    cmd.append({'operator':'EM_read_tilde_b','fn_tilde_b':'/Users/mengyuan/Downloads/Python/callti.out.read_by_C'})
    #####################
    cmd_dict={}
    cmd_dict['operator']='EM_extractdatasubset'
    kbiggest=(set_kbiggest(NaNb[0],deltachi[0])**2 + set_kbiggest(NaNb[1],deltachi[1])**2)**0.5
    cmd_dict['kmax']=kbiggest*0.5/(2**0.5)
    cmd.append(cmd_dict)
    #####################
    cmd.append({'operator':'EM_set_2Dreciprocal_in_virusobj','use_vkminimalset_rather_than_vk':False})
    #####################
    cmd.append({'operator':'quad_read_integration_rule','fn_rule':'/Users/mengyuan/Downloads/Python/rule_small_3_rulechopper'})
    #####################
    cmd_dict={}
    cmd_dict['operator']='EM_expectationmaximization'
    cmd_dict['MC_Nrandic']=1
    cmd_dict['MC_FractionOfMeanForMinimum']=0.005 # unused because MC_Nrandic=1 but still must be defined.
    cmd_dict['MC_FractionOfMean']=0.2 # unused because MC_Nrandic=1 but still must be defined.
    cmd_dict['maxiter']=200
    cmd_dict['maxiter4pixelnoisevarupdate']=0
    cmd_dict['cbarftol']=-1.0; # unused.
    cmd_dict['cbarrtol']=1.0e-4
    cmd_dict['cbarftol_dividebyNc']=False;
    cmd_dict['loglikeftol']=-1.0 # unused.
    cmd_dict['loglikertol']=-1.0 # unused.
    cmd_dict['nu_ic_FractionOfcbarForMinimum']=0.15
    cmd_dict['nu_ic_FractionOfcbar']=0.1
    cmd_dict['estimate_noise_var_in_homogeneous_problem']=False
    cmd_dict['pixelnoisevar_initialcondition']='from_pixelnoisevar'
    cmd_dict['nu_ic_always_proportional2cbar']=[]
    cmd_dict['V_TolX']=1e-10
    cmd_dict['V_MaxIter']=8
    cmd_dict['fn_savehistory']=outputbasename+'.history.mat'
    cmd_dict['verbosity']=1
    cmd_dict['MultiplierForPixelnoisevarIC']=1.0
    cmd_dict['MinimumClassProb']=10e-3/Neta
    cmd.append(cmd_dict)
    #####################
    cmd.append({'operator':'box_writepixelnoisevar','fn_pixelnoisevar':outputbasename+'.pixelnoisevar.txt'})
    #####################
    cmd.append({'operator':'vobj_print_virusobj'})
    #####################
    """
    %ii=ii+1;
    %cmd{ii}.operator='vobj_save_virusobj';
    %cmd{ii}.fn_virusobj=[outputbasename '.vobj.mat'];
    """
    #####################
    cmd_dict={}
    cmd_dict['operator']='vobj_write_virusobj'
    cmd_dict['fn_clnp']=np.array((Neta,1),dtype=np.object)
    cmd_dict['fn_clnp'][0]=outputbasename+'.eta1.clnp.txt'
    cmd_dict['fn_clnp'][1]=outputbasename+'.eta2.clnp.txt'
    cmd_dict['fn_nu']=np.array((Neta,1),dtype=np.object)
    cmd_dict['fn_nu'][0]=outputbasename+'.eta1.nu.txt'
    cmd_dict['fn_nu'][1]=outputbasename+'.eta2.nu.txt'
    cmd_dict['fn_q']=np.array((Neta,1),dtype=np.object)
    cmd_dict['fn_q'][0]=outputbasename+'.eta1.q.txt'
    cmd_dict['fn_q'][1]=outputbasename+'.eta2.q.txt'
    cmd.append(cmd_dict)
    #####################
    cmd.append({'operator':'misc_diary','fn_diary':'off'})
    #####################
    cmd.append({'operator':'misc_changedirectory','dn':'..'})
    #####################
    # ii=ii+1;
    # cmd{ii}.operator='misc_save_workspace';
    # cmd{ii}.fn_workspace=[outputbasename '.workspace.mat'];
    #####################
    # Execute the operations in the cmd cell array.
    sio.savemat('inst_Neta2_rule49_Nv500_hetero_inv.mat',{'cmd':cmd},long_field_names=True)
def inst_Neta2_rule49_Nv500_homo_inv():
    #####################
    outputbasename='FHV.out.lmax10pmax5.Neta2.rule49.Nv500.h**o.inv'
    print 'inst_Neta2_rule49_Nv500_homo_inv: outputbasename ' + outputbasename
    #####################
    Neta=2
    deltachi=[4.7, 4.7] # image sampling intervals in Angstroms
    R2=197.4 # outer radius R2
    """
    Operators are executed in the order in which they appear in cmd,
    using the arguments that also appear in cmd.  To do nothing, specify cmd=[];.
    To indicate a 'no-op', set that element of the cell array to an empty matrix,
    .g., cmd{1}=[], which is the initialization set by the 'cell' function.
    """
    #####################
    cmd=[] #Preallocate for 100 operators.
    #####################
    cmd.append({'operator':'misc_diary', 'fn_diary':outputbasename+'.diary'})
    #####################
    cmd.append({'operator':'misc_setpseudorandomnumberseed', 'pseudorandomnumberseed':29831})
    #####################
    cmd_dict = {}
    Neta=2;
    cmd_dict['operator']='box_readimagestack'
    cmd_dict['imagestackformat']='mat'
    cmd_dict['fn_imagestack']='FHV.out.lmax10pmax5.Neta2.rule49.Nv500.fw.imagestack.py.mat'
    cmd.append(cmd_dict)
    #####################NOT IN pre4hetero_inv
    cmd.append({'operator':'basic_setsizeof2Drealspaceimagesfromimagestack'})
    #####################
    cmd.append({'operator':'basic_set2Drealspacesamplingintervals', 'samplingintervals':deltachi})
    #####################
    cmd.append({'operator':'box_annulusstatistics', 'radius01':[R2+deltachi[0], R2+10*deltachi[0]]})
    #####################NOT IN pre4hetero_inv
    cmd.append({'operator':'basic_compute2Dreciprocalspaceproperties'})
    #####################
    #ii=8
    cmd.append({'operator':'realrecip_2DFFT'})
    #####################
    cmd_dict = {}
    cmd_dict['operator']='vobj_read_virusobj'
    cmd_dict['fn_clnp']=np.zeros((2,1), dtype=np.object)
    cmd_dict['fn_clnp'][0]='FHV.ic.lmax0pmax1.clnp.c001iszero.txt'
    cmd_dict['fn_clnp'][1]='FHV.ic.lmax0pmax1.clnp.perturbed.c001iszero.txt'
    cmd_dict['fn_nu']=np.zeros((2,1), dtype=np.object)
    cmd_dict['fn_nu'][0]='FHV.ic.lmax0pmax1.nu.homogeneous.txt'
    cmd_dict['fn_nu'][1]='FHV.ic.lmax0pmax1.nu.homogeneous.txt'
    cmd_dict['fn_q']=np.zeros((2,1), dtype=np.object)
    cmd_dict['fn_q'][0]='FHV.ic.lmax0pmax1.q.equalclassprobs.txt'
    cmd_dict['fn_q'][1]='FHV.ic.lmax0pmax1.q.equalclassprobs.txt'
    cmd.append(cmd_dict)
    #####################
    cmd.append({'operator':'vobj_print_virusobj'})
    ##################################################
    #Increase the number of coefficients.
    ##################################################
    #####################
    cmd_dict = {}
    cmd_dict['operator']='vobj_change_size_of_virusobj'
    cmd_dict['vlmax']=[10,10] # vector of new lmax values, one for each class
    cmd_dict['vpmax']=[5,5] # vector of new pmax values, one for each class
    cmd.append(cmd_dict)
    #####################
    cmd.append({'operator':'vobj_print_virusobj'})
    #####################
    cmd.append({'operator':'EM_read_tilde_b', 'fn_tilde_b':'callti.out.read_by_C'})
    #####################
    cmd_dict = {}
    cmd_dict['operator']='vobj_change_size_of_virusobj'
    cmd_dict['vlmax']=[0,0] # vector of new lmax values, one for each class
    cmd_dict['vpmax']=[4,4] # vector of new pmax values, one for each class
    cmd.append(cmd_dict)
    #####################
    cmd.append({'operator':'EM_extractdatasubset', 'kmax':-1})
    #####################
    cmd.append({'operator':'EM_set_2Dreciprocal_in_virusobj','use_vkminimalset_rather_than_vk':False})
    #####################
    cmd.append({'operator':'misc_diary', 'fn_diary':'off'})
    ##################################################
    #####################
    #*******************Solve the linear least squares problem for a one-class spherically-symmetric homogeneous-problem.
    cmd.append({'operator':'misc_changedirectory', 'dn':'step0'})
    #####################
    cmd.append({'operator':'misc_diary', 'fn_diary':outputbasename+'.diary.txt'})
    #####################
    cmd.append({'operator':'EM_sphericalsymmetry_homogeneous'})
    #####################
    cmd.append({'operator':'vobj_print_virusobj'})
    #####################
    # cmd.append({'operator':'vobj_save_virusobj','fn_virusobj':outputbasename+'.vobj.mat'})
    #####################
    cmd_dict = {}
    cmd_dict['operator']='vobj_write_virusobj'
    cmd_dict['fn_clnp']=np.zeros((2,1), dtype=np.object)
    cmd_dict['fn_clnp'][0]=outputbasename+'.eta1.clnp.txt'
    cmd_dict['fn_clnp'][1]=outputbasename+'.eta2.clnp.txt'
    cmd_dict['fn_nu']=np.zeros((2,1), dtype=np.object)
    cmd_dict['fn_nu'][0]=outputbasename+'.eta1.nu.txt'
    cmd_dict['fn_nu'][1]=outputbasename+'.eta2.nu.txt'
    cmd_dict['fn_q']=np.zeros((2,1), dtype=np.object)
    cmd_dict['fn_q'][0]=outputbasename+'eta1.q.txt'
    cmd_dict['fn_q'][1]=outputbasename+'eta2.q.txt'
    cmd.append(cmd_dict)
    #####################
    cmd.append({'operator':'misc_diary', 'fn_diary':'off'})
    #####################
    cmd.append({'operator':'misc_changedirectory', 'dn':'..'})
    #*******************Done solving the linear least squares problem
    #####################
    cmd.append({'operator':'misc_diary', 'fn_diary':outputbasename+'.diary2.txt'})
    #####################
    """
    Define the resolution steps used in YinZhengDoerschukNatarajanJohnson JSB 2003 Table 1.
    In the sh/C code used in YinZhengDoerschukNatarajanJohnson JSB 2003, the spatial frequency vector with largest magnitude was computed by directly finding the vector in vkminimalset with maximum magnitude.  vkminimalset was computedd by vk_indexset.m which contains the function index2k.
    """
    ZhyeYinresolutionsteps={'lmax':np.array([10,15,21,25,31,36,45]),
                            'pmax':np.array([6,8,8,10,10,15,20]),
                            'Nic':np.array([100,10,10,1,1,1,1]),
                            'kmaxpow':np.array([3,3,3,2,1,1,1]),
                            'kmax':np.zeros((1,7))}
    deltachi=[4.7,4.7]; # YinZhengDoerschukNatarajanJohnson JSB 2003 FHV example
    NaNb=[91,91] # YinZhengDoerschukNatarajanJohnson JSB 2003 FHV example
    kbiggest=math.sqrt(set_kbiggest(NaNb[0],deltachi[0])**2 + set_kbiggest(NaNb[1],deltachi[1])**2)
    ZhyeYinresolutionsteps['kmax']=kbiggest*np.exp((-ZhyeYinresolutionsteps['kmaxpow']/2.)*math.log(2.))
    #####################
    """
    Scale back the size of the computing for this synthetic problem.
    Do the lmax=0 case because this is a 2 class problem while the initial linear estimator is 1 class.
    """
    ZhyeYinresolutionsteps['lmax']=np.array([0,6,10])
    ZhyeYinresolutionsteps['pmax']=np.array([4,5,5])
    # ZhyeYinresolutionsteps['Nic']=np.array([100,100,10]) # This is for inv.m
    ZhyeYinresolutionsteps['Nic']=np.array([1,10,10]) # This is for inv.RUN1.m
    ZhyeYinresolutionsteps['kmaxpow']=ZhyeYinresolutionsteps['kmaxpow'][0:3]
    ZhyeYinresolutionsteps['kmax']=ZhyeYinresolutionsteps['kmax'][0:3]
    #####################
    # MultiplierForPixelnoisevarIC_eachstep=np.array([10.0,1.0,1.0]) # This is for inv.m
    MultiplierForPixelnoisevarIC_eachstep=np.array([10.0,1.0,1.0])
    #####################
    cmd.append({'operator':'misc_diary','fn_diary':'off'})
    #####################









    #*******************Begin computing homogeneous reconstructions at increasing resolutions.
    #for step in range(ZhyeYinresolutionsteps['lmax'].size):
    for step in range(ZhyeYinresolutionsteps['lmax'].size):
        #####################
        cmd.append({'operator':'misc_changedirectory', 'dn':'step'+str(step+1)})
        #####################
        cmd.append({'operator':'misc_diary','fn_diary':outputbasename+'.diary.txt'})
        #####################
        cmd_dict = {}
        cmd_dict['operator']='vobj_change_size_of_virusobj'
        cmd_dict['vlmax']=[ZhyeYinresolutionsteps['lmax'][step], ZhyeYinresolutionsteps['lmax'][step]] # vector of new lmax values, one for each class
        cmd_dict['vpmax']=[ZhyeYinresolutionsteps['pmax'][step], ZhyeYinresolutionsteps['pmax'][step]] #vector of new pmax values, one for each class
        cmd.append(cmd_dict)
        #####################  
        cmd.append({'operator':'vobj_print_virusobj'}) 
        #####################
         #cmd.append({'operator':'EM_read_tilde_b','fn_tilde_b':'callti.out.read_by_C'})
        #cmd.append({'operator':'EM_read_tilde_b', 'fn_tilde_b':'callti.out.read_by_C'})
        #####################
        cmd.append({'operator':'EM_extractdatasubset','kmax':ZhyeYinresolutionsteps['kmax'][step]})
        #####################
        cmd.append({'operator':'EM_set_2Dreciprocal_in_virusobj','use_vkminimalset_rather_than_vk':False})
        #####################
        cmd.append({'operator':'quad_read_integration_rule','fn_rule':'/Users/mengyuan/Downloads/Python/rule_small_3_rulechopper'})
        #####################
        cmd_dict = {}
        cmd_dict['operator']='EM_expectationmaximization'
        cmd_dict['MC_Nrandic']=ZhyeYinresolutionsteps['Nic'][step]
        cmd_dict['MC_FractionOfMeanForMinimum']=0.005
        cmd_dict['MC_FractionOfMean']=0.2
        cmd_dict['maxiter']=200
        cmd_dict['maxiter4pixelnoisevarupdate']=0
        cmd_dict['cbarftol']=-1.0 # unused.
        cmd_dict['cbarrtol']=1.0e-4
        cmd_dict['cbarftol_dividebyNc']=False
        cmd_dict['loglikeftol']=-1.0 # unused.
        cmd_dict['loglikertol']=-1.0 # unused.
        cmd_dict['nu_ic_FractionOfcbarForMinimum']=0.005
        cmd_dict['nu_ic_FractionOfcbar']=0.1
        cmd_dict['estimate_noise_var_in_homogeneous_problem']=False
        cmd_dict['pixelnoisevar_initialcondition']='from_image_statistics'
        cmd_dict['nu_ic_always_proportional2cbar']=[]
        cmd_dict['V_TolX']=np.NaN
        cmd_dict['V_MaxIter']=np.NaN
        cmd_dict['fn_savehistory']=outputbasename+'.history.mat'
        cmd_dict['verbosity']=1
        cmd_dict['MultiplierForPixelnoisevarIC']=MultiplierForPixelnoisevarIC_eachstep[step]
        cmd_dict['MinimumClassProb']=1.0e-3/Neta
        cmd.append(cmd_dict)
        #####################
        cmd.append({'operator':'box_writepixelnoisevar','fn_pixelnoisevar':outputbasename+'.pixelnoisevar.txt'})
        #####################
        cmd.append({'operator':'vobj_print_virusobj'})
        #####################
        # cmd.append({'operator':'vobj_save_virusobj','fn_virusobj':outputbasename+'.vobj.mat'})
        #####################
        cmd_dict = {}
        cmd_dict['operator']='vobj_write_virusobj'
        cmd_dict['fn_clnp']=np.zeros((2,1), dtype=np.object)
        cmd_dict['fn_clnp'][0]=outputbasename+'.eta1.clnp.txt'
        cmd_dict['fn_clnp'][1]=outputbasename+'.eta2.clnp.txt'
        cmd_dict['fn_nu']=np.zeros((2,1), dtype=np.object)
        cmd_dict['fn_nu'][0]=outputbasename+'.eta1.nu.txt'
        cmd_dict['fn_nu'][1]=outputbasename+'.eta2.nu.txt'
        cmd_dict['fn_q']=np.zeros((2,1), dtype=np.object)
        cmd_dict['fn_q'][0]=outputbasename+'.eta1.q.txt'
        cmd_dict['fn_q'][1]=outputbasename+'.eta2.q.txt'
        cmd.append(cmd_dict)
        #####################
        cmd.append({'operator':'misc_diary','fn_diary':'off'})
        #####################
        cmd.append({'operator':'misc_changedirectory','dn':'..'})
        #####################
    #*******************End computing homogeneous reconstructions at increasing resolutions.
    #####################


    sio.savemat('inst_Neta2_rule49_Nv500_homo_inv.mat',{'cmd':cmd},long_field_names=True)