def execute_reconstruction(_mylog, _SelFileName, _iteration_number,
                           _DoParallel, _MyNumberOfMpiProcesses,
                           _MyNumberOfThreads, _MySystemFlavour, _MyMpiJobSize,
                           _FourierMaxFrequencyOfInterest, _SymmetryGroup,
                           _ReconstructedandfilteredVolume, _PaddingFactor):

    _mylog.debug("execute_reconstruction")

    import os, shutil, math
    import launch_job

    Outputvolume = _ReconstructedandfilteredVolume

    if (_MyNumberOfMpiProcesses == 1):
        _DoParallel = False
    program = 'xmipp_reconstruct_fourier'
    parameters=' -i '    + _SelFileName + \
            ' -o '    + Outputvolume + '.vol ' + \
            ' -sym '  + _SymmetryGroup + \
            ' -doc '  + "Iter_%d_current_angles.doc" % _iteration_number + \
            ' -thr '  + str(_MyNumberOfThreads) + \
            ' -max_resolution ' + str(_FourierMaxFrequencyOfInterest) +\
            ' -pad_proj ' + str(_PaddingFactor) +\
            ' -pad_vol ' + str(_PaddingFactor)
    if (_DoParallel):
        parameters = parameters + ' -mpi_job_size ' + str(_MyMpiJobSize)

    launch_job.launch_job(program, parameters, _mylog, _DoParallel,
                          _MyNumberOfMpiProcesses, _MyNumberOfThreads,
                          _MySystemFlavour)
def execute_mask(_DoMask, _mylog, _ProjectDir, _ReferenceFileName,
                 _MaskFileName, _DoSphericalMask, _MaskRadius,
                 _iteration_number, _ReferenceVolume):
    import os, shutil
    import launch_job
    _mylog.debug("execute_mask")
    if (_iteration_number == 1):
        InPutVolume = _ReferenceFileName
    else:
        InPutVolume = _ReferenceFileName + ".vol"
    if (_DoMask):
        MaskedVolume = _ReferenceVolume
        print '*********************************************************************'
        print '* Mask the reference volume'
        if (_DoSphericalMask):
            command=' -i '    + InPutVolume + \
                    ' -o '    + _ReferenceVolume + \
                    ' -mask circular -' + str(_MaskRadius)
        else:
            command=' -i '    + InPutVolume + \
                    ' -o '    + _ReferenceVolume + \
                    ' -mask ' + _MaskFileName
        launch_job.launch_job("xmipp_mask", command, _mylog, False, 1, 1, '')

    else:
        shutil.copy(InPutVolume, _ReferenceVolume)
        _mylog.info("Skipped Mask")
        _mylog.info("cp" + InPutVolume +\
                           " "  + _ReferenceVolume )
        print '*********************************************************************'
        print '* Skipped Mask'
def execute_reconstruction(_mylog,
                                                        _SelFileName,
                                                        _iteration_number,
                                                        _DoParallel,
                                                        _MyNumberOfMpiProcesses,
                                                        _MyNumberOfThreads,
                                                        _MySystemFlavour,
                                                        _MyMpiJobSize,
                                                        _FourierMaxFrequencyOfInterest,
                                                        _SymmetryGroup,
                                                        _ReconstructedandfilteredVolume,
                                                        _PaddingFactor):

        _mylog.debug("execute_reconstruction")

        import os,shutil,math
        import launch_job

        Outputvolume = _ReconstructedandfilteredVolume

        if ( _MyNumberOfMpiProcesses ==1):
                _DoParallel=False
        program = 'xmipp_reconstruct_fourier'
        parameters=' -i '    + _SelFileName + \
                ' -o '    + Outputvolume + '.vol ' + \
                ' -sym '  + _SymmetryGroup + \
                ' -doc '  + "Iter_%d_current_angles.doc" % _iteration_number + \
                ' -thr '  + str(_MyNumberOfThreads) + \
                ' -max_resolution ' + str(_FourierMaxFrequencyOfInterest) +\
                ' -pad_proj ' + str(_PaddingFactor) +\
                ' -pad_vol ' + str(_PaddingFactor)
        if (_DoParallel):
                parameters = parameters + ' -mpi_job_size ' + str(_MyMpiJobSize)

        launch_job.launch_job(program, parameters, _mylog, _DoParallel, _MyNumberOfMpiProcesses, _MyNumberOfThreads, _MySystemFlavour)
def execute_mask(_DoMask,
                 _mylog,
                 _ProjectDir,
                 _ReferenceFileName,
                 _MaskFileName,
                 _DoSphericalMask,
                 _MaskRadius,
                 _iteration_number,
                 _ReferenceVolume):
        import os,shutil
        import launch_job
        _mylog.debug("execute_mask")
        if(_iteration_number==1):
                InPutVolume=_ReferenceFileName
        else:   
                InPutVolume=_ReferenceFileName+".vol"
        if (_DoMask):
                MaskedVolume=_ReferenceVolume
                print '*********************************************************************'
                print '* Mask the reference volume'
                if (_DoSphericalMask):
                        command=' -i '    + InPutVolume + \
                                ' -o '    + _ReferenceVolume + \
                                ' -mask circular -' + str(_MaskRadius)
                else:
                        command=' -i '    + InPutVolume + \
                                ' -o '    + _ReferenceVolume + \
                                ' -mask ' + _MaskFileName
                launch_job.launch_job("xmipp_mask",
                                        command,
                                        _mylog,
                                        False,1,1,'')

        else:
                shutil.copy(InPutVolume,_ReferenceVolume)
                _mylog.info("Skipped Mask")
                _mylog.info("cp" + InPutVolume +\
                                   " "  + _ReferenceVolume )
                print '*********************************************************************'
                print '* Skipped Mask'
def execute_projection_matching(
        _mylog, _ProjectDir, _ReferenceVolume, _MaskFileName,
        _InputDocFileName, _OutputDocFileName, _AngSamplingRateDeg, _Ri, _Ro,
        _Search5DShift, _Search5DStep, _MaxChangeOffset, _MaxChangeInAngles,
        _MinimumCrossCorrelation, _DiscardPercentage, _DoParallel,
        _MyNumberOfMpiProcesses, _MyNumberOfThreads, _MySystemFlavour,
        _MyMpiJobSize, _WorkingDir, _SymmetryGroup, _AvailableMemory,
        _iteration_number, _ProjectLibraryRootName, _ProjMatchRootName):

    _mylog.debug("execute_projection_matching")
    import os, shutil, string, glob, math
    import launch_job, selfile, docfiles, utils_xmipp

    # Project all references
    print '*********************************************************************'
    print '* Create projection library'
    parameters=' -i '                   + _ReferenceVolume + \
                            ' -experimental_images ' +  _InputDocFileName + \
                            ' -o '                   + _ProjectLibraryRootName + \
                            ' -sampling_rate '       + _AngSamplingRateDeg  + \
                            ' -sym '                 + _SymmetryGroup + 'h' + \
                            ' -compute_neighbors '

    if (string.atof(_MaxChangeInAngles) < 181.):
        parameters+= \
                ' -near_exp_data -angular_distance '    + str(_MaxChangeInAngles)
    else:
        parameters+= \
                ' -angular_distance -1'

    if (_DoParallel):
        parameters = parameters + ' -mpi_job_size ' + str(_MyMpiJobSize)

    launch_job.launch_job('xmipp_angular_project_library', parameters, _mylog,
                          _DoParallel,
                          _MyNumberOfMpiProcesses * _MyNumberOfThreads, 1,
                          _MySystemFlavour)

    outputname = _ProjMatchRootName
    inputdocfile = _InputDocFileName

    print '*********************************************************************'
    print '* Perform projection matching'

    parameters= ' -i '              + inputdocfile + \
                            ' -o '              + outputname + \
                            ' -ref '            + _ProjectLibraryRootName + \
                            ' -Ri '             + str(_Ri)           + \
                            ' -Ro '             + str(_Ro)           + \
                            ' -max_shift '      + str(_MaxChangeOffset) + \
                            ' -search5d_shift ' + str(_Search5DShift) + \
                            ' -search5d_step  ' + str(_Search5DStep) + \
                            ' -mem '            + str(_AvailableMemory * _MyNumberOfThreads) + \
                            ' -thr '            + str(_MyNumberOfThreads) + \
                            ' -sym '            + _SymmetryGroup + 'h'

    if (_DoParallel):
        parameters = parameters + ' -mpi_job_size ' + str(_MyMpiJobSize)

    launch_job.launch_job('xmipp_angular_projection_matching', parameters,
                          _mylog, _DoParallel, _MyNumberOfMpiProcesses,
                          _MyNumberOfThreads, _MySystemFlavour)
    outputdocfile = _ProjMatchRootName + '.doc'

    # Move outputdocfile to standard name
    shutil.move(outputdocfile, _OutputDocFileName)
def projection_matching_protocol_basic(_SelFileName,
                                       _ReferenceFileName,
                                       _WorkingDir,
                                       _ProjectDir,
                                       _MaskRadius,
                                       _InnerRadius,
                                       _OuterRadius,
                                       _AvailableMemory,
                                       _ResolSam,
                                       _NumberOfMpiProcesses,
                                       _NumberofIterations=30,
                                       _ContinueAtIteration=1,
                                       _CleanUpFiles=True,
                                       _LogDir="Logs",
                                       _DoMask=True,
                                       _DoSphericalMask=True,
                                       _MaskFileName='',
                                       _AngSamplingRateDeg='20x10 5x5 5x3',
                                       _MaxChangeInAngles='20x1000 5x20 5x9',
                                       _MaxChangeOffset='20x1000 10x10',
                                       _Search5DShift='20x5 1',
                                       _Search5DStep='20x2 1',
                                       _DocFileName='',
                                       _SymmetryGroup='c1',
                                       _MinimumCrossCorrelation='-1',
                                       _DiscardPercentage='0',
                                       _DoReconstruction=True,
                                       _PaddingFactor=1.0,
                                       _FourierMaxFrequencyOfInterest='0.35',
                                       _ConstantToAddToFiltration='0.35',
                                       _NumberOfThreads=1,
                                       _DoParallel=True,
                                       _MpiJobSize='10',
                                       _SystemFlavour=''):

    # Import libraries and add Xmipp libs to default search path
    import os, sys, shutil
    scriptdir = os.path.split(
        os.path.dirname(os.popen('which xmipp_protocols',
                                 'r').read()))[0] + '/protocols'
    sys.path.append(scriptdir)
    import arg, log, logging, selfile
    import launch_job

    # global variables
    _ReferenceVolumeName = 'reference_volume.vol'
    _LibraryDir = "ReferenceLibrary"
    _ProjectLibraryRootName = _LibraryDir + "/ref"
    _ProjMatchDir = "ProjMatchClasses"
    _ProjMatchName = 'proj_match'
    _ProjMatchRootName = _ProjMatchDir + "/" + _ProjMatchName
    _DocFileWithOriginalAngles = 'original_angles.doc'
    _docfile_with_current_angles = 'current_angles.doc'
    _ReconstructedVolumeBase = "reconstruction"
    _FilteredReconstruction = "filtered_reconstruction"
    _WorkingDir = os.getcwd() + '/' + os.path.basename(_WorkingDir)
    _ReferenceFileName = os.path.abspath(_ReferenceFileName)
    _user_suplied_ReferenceVolume = _ReferenceFileName
    selfile_without_ext = (os.path.splitext(str(
        os.path.basename(_SelFileName))))[0]
    globalFourierMaxFrequencyOfInterest = float(_FourierMaxFrequencyOfInterest)
    _MySystemFlavour = _SystemFlavour
    _MyNumberOfMpiProcesses = _NumberOfMpiProcesses
    _MyMpiJobSize = _MpiJobSize
    _MyNumberOfThreads = _NumberOfThreads

    # Set up logging
    _mylog = log.init_log_system(_ProjectDir, _LogDir, sys.argv[0],
                                 _WorkingDir)
    # Uncomment next line to get Debug level logging
    _mylog.setLevel(logging.DEBUG)
    _mylog.debug("Debug level logging enabled")
    #input files should exists
    check_file_exists(_ReferenceFileName, _mylog)

    _NumberofIterations += 1
    create_working_directory(_mylog, _WorkingDir, _ProjMatchDir, _LibraryDir)

    # Create a selfile with absolute pathname in the WorkingDir
    mysel = selfile.selfile()
    mysel.read(os.path.basename(_SelFileName))
    newsel = mysel.make_abspath()
    _SelFileName = os.path.abspath(_WorkingDir + '/' +
                                   os.path.basename(_SelFileName))
    newsel.write(_SelFileName)

    # Set _OuterRadius
    if (_OuterRadius < 0):
        xdim, ydim = newsel.imgSize()
        _OuterRadius = (xdim / 2) - 1
        comment = " Outer radius set to: " + str(_OuterRadius)
        print '* ' + comment
        _mylog.info(comment)
    else:
        _OuterRadius = _OuterRadius

    # Create a docfile with the current angles in the WorkingDir
    if (_DocFileName == ''):
        params=' -i ' + _SelFileName + \
                ' -o ' + _WorkingDir + '/' + \
                _DocFileWithOriginalAngles
        launch_job.launch_job("xmipp_header_extract", params, _mylog, False, 1,
                              1, '')

    # Change to working dir
    os.chdir(_WorkingDir)
    _SelFileName = _WorkingDir + '/' + str(os.path.basename(_SelFileName))

    ##
    ##LOOP
    ##
    #output of reconstruction cycle
    #first value given by user
    #these names are the input of the mask program
    #in general is the output of the reconstruction plus filtration
    _ReconstructedVolume = []
    fill_name_vector("", _ReconstructedVolume, _NumberofIterations,
                     _ReconstructedVolumeBase)

    _ReconstructedandfilteredVolume = []
    fill_name_vector(_user_suplied_ReferenceVolume,
                     _ReconstructedandfilteredVolume, _NumberofIterations,
                     _FilteredReconstruction)

    # Optimal angles from previous iteration or user-provided at the beginning
    _DocFileInputAngles = []
    fill_name_vector('../' + _DocFileWithOriginalAngles, _DocFileInputAngles,
                     _NumberofIterations + 1, _docfile_with_current_angles)

    # Reconstructed and filtered volume of n-1 after masking called reference volume
    _ReferenceVolume = []
    fill_name_vector("", _ReferenceVolume, _NumberofIterations,
                     _ReferenceVolumeName)

    for _iteration_number in range(_ContinueAtIteration, _NumberofIterations):
        debug_string = "ITERATION: " + str(_iteration_number)
        print "*", debug_string
        _mylog.info(debug_string)

        # Create working dir for this iteration and go there
        Iteration_Working_Directory = _WorkingDir + '/Iter_' + str(
            _iteration_number)
        create_working_directory(_mylog, Iteration_Working_Directory,
                                 _ProjMatchDir, _LibraryDir)
        os.chdir(Iteration_Working_Directory)

        #### changed here for this stack -- Dmitry
        # Mask reference volume
        if _iteration_number == 1:
            execute_mask(
                _DoMask,
                _mylog,
                _ProjectDir,
                _ReconstructedandfilteredVolume[_iteration_number],  #in
                _MaskFileName,
                _DoSphericalMask,
                _MaskRadius,
                _iteration_number,
                _ReferenceVolume[_iteration_number])  #out
        elif _DoReconstruction is True:
            execute_mask(
                _DoMask, _mylog, _ProjectDir,
                os.path.join(
                    "../Iter_%d" % (_iteration_number - 1),
                    "Iter_%d_reconstruction" % (_iteration_number - 1)),
                _MaskFileName, _DoSphericalMask, _MaskRadius,
                _iteration_number,
                os.path.join(
                    "../Iter_%d" % (_iteration_number),
                    "Iter_%d_reference_volume.vol" % (_iteration_number)))
        else:
            print "skipped masking, no reconstructed volume"

        if _DoReconstruction is False and (_iteration_number > 1):
            shutil.move(os.path.join("../Iter_%d" % (_iteration_number-1), "Iter_%d_reference_volume.vol" % (_iteration_number-1)), \
            os.path.join("../Iter_%d" % (_iteration_number), "Iter_%d_reference_volume.vol" % (_iteration_number)))

        # Parameters for projection matching
        _AngSamplingRateDeg = arg.getComponentFromVector(
            _AngSamplingRateDeg, _iteration_number - 1)
        _MaxChangeOffset = arg.getComponentFromVector(_MaxChangeOffset,
                                                      _iteration_number - 1)
        _MaxChangeInAngles = arg.getComponentFromVector(
            _MaxChangeInAngles, _iteration_number - 1)
        _Search5DShift = arg.getComponentFromVector(_Search5DShift,
                                                    _iteration_number - 1)
        _Search5DStep = arg.getComponentFromVector(_Search5DStep,
                                                   _iteration_number - 1)
        _MinimumCrossCorrelation = arg.getComponentFromVector(
            _MinimumCrossCorrelation, _iteration_number - 1)
        _DiscardPercentage = arg.getComponentFromVector(
            _DiscardPercentage, _iteration_number - 1)

        execute_projection_matching(
            _mylog, _ProjectDir, _ReferenceVolume[_iteration_number],
            _MaskFileName, _DocFileInputAngles[_iteration_number],
            _DocFileInputAngles[_iteration_number + 1], _AngSamplingRateDeg,
            _InnerRadius, _OuterRadius, _Search5DShift, _Search5DStep,
            _MaxChangeOffset, _MaxChangeInAngles, _MinimumCrossCorrelation,
            _DiscardPercentage, _DoParallel, _MyNumberOfMpiProcesses,
            _MyNumberOfThreads, _MySystemFlavour, _MyMpiJobSize, _WorkingDir,
            _SymmetryGroup, _AvailableMemory, _iteration_number,
            _ProjectLibraryRootName, _ProjMatchRootName)

        if _DoReconstruction is True:
            execute_reconstruction(
                _mylog, _SelFileName, _iteration_number, _DoParallel,
                _MyNumberOfMpiProcesses, _MyNumberOfThreads, _MySystemFlavour,
                _MyMpiJobSize, globalFourierMaxFrequencyOfInterest,
                _SymmetryGroup, _ReconstructedVolume[_iteration_number],
                _PaddingFactor)
        else:
            print "skipped reconstruction"

        _ConstantToAddToFiltration = arg.getComponentFromVector(
            _ConstantToAddToFiltration, _iteration_number - 1)

        # Remove all class averages and reference projections
        if (_CleanUpFiles):
            execute_cleanup(_mylog, True, True, _ProjMatchDir, _LibraryDir)
def execute_projection_matching(_mylog,
                                _ProjectDir,
                                _ReferenceVolume,
                                _MaskFileName,
                                _InputDocFileName,
                                _OutputDocFileName,
                                _AngSamplingRateDeg,
                                _Ri,
                                _Ro,
                                _Search5DShift,
                                _Search5DStep,
                                _MaxChangeOffset,
                                _MaxChangeInAngles,
                                _MinimumCrossCorrelation,
                                _DiscardPercentage,
                                _DoParallel,
                                _MyNumberOfMpiProcesses,
                                _MyNumberOfThreads,
                                _MySystemFlavour,
                                _MyMpiJobSize,
                                _WorkingDir,
                                _SymmetryGroup,
                                _AvailableMemory,
                                _iteration_number, 
                                                                _ProjectLibraryRootName,
                                                                _ProjMatchRootName 
                                                                ):
                                           
        _mylog.debug("execute_projection_matching")
        import os, shutil, string, glob, math
        import launch_job, selfile, docfiles, utils_xmipp
          
        # Project all references
        print '*********************************************************************'
        print '* Create projection library'
        parameters=' -i '                   + _ReferenceVolume + \
                                ' -experimental_images ' +  _InputDocFileName + \
                                ' -o '                   + _ProjectLibraryRootName + \
                                ' -sampling_rate '       + _AngSamplingRateDeg  + \
                                ' -sym '                 + _SymmetryGroup + 'h' + \
                                ' -compute_neighbors '

        if ( string.atof(_MaxChangeInAngles) < 181.):
                parameters+= \
                        ' -near_exp_data -angular_distance '    + str(_MaxChangeInAngles)
        else:
                parameters+= \
                        ' -angular_distance -1'

        if (_DoParallel):
                parameters = parameters + ' -mpi_job_size ' + str(_MyMpiJobSize)

        launch_job.launch_job('xmipp_angular_project_library',
                                        parameters,
                                        _mylog,
                                        _DoParallel,
                                        _MyNumberOfMpiProcesses*_MyNumberOfThreads,
                                        1,
                                        _MySystemFlavour)

        outputname   = _ProjMatchRootName
        inputdocfile = _InputDocFileName

        print '*********************************************************************'
        print '* Perform projection matching'
        
        parameters= ' -i '              + inputdocfile + \
                                ' -o '              + outputname + \
                                ' -ref '            + _ProjectLibraryRootName + \
                                ' -Ri '             + str(_Ri)           + \
                                ' -Ro '             + str(_Ro)           + \
                                ' -max_shift '      + str(_MaxChangeOffset) + \
                                ' -search5d_shift ' + str(_Search5DShift) + \
                                ' -search5d_step  ' + str(_Search5DStep) + \
                                ' -mem '            + str(_AvailableMemory * _MyNumberOfThreads) + \
                                ' -thr '            + str(_MyNumberOfThreads) + \
                                ' -sym '            + _SymmetryGroup + 'h'

        if (_DoParallel):
                parameters = parameters + ' -mpi_job_size ' + str(_MyMpiJobSize)

        launch_job.launch_job('xmipp_angular_projection_matching',
                                        parameters,
                                        _mylog,
                                        _DoParallel,
                                        _MyNumberOfMpiProcesses,
                                        _MyNumberOfThreads,
                                        _MySystemFlavour)
        outputdocfile =  _ProjMatchRootName + '.doc'

        # Move outputdocfile to standard name
        shutil.move(outputdocfile, _OutputDocFileName)
def projection_matching_protocol_basic(
                        _SelFileName,
                        _ReferenceFileName,
                        _WorkingDir,
                        _ProjectDir,
                        _MaskRadius,
                        _InnerRadius,
                        _OuterRadius,
                        _AvailableMemory,
                        _ResolSam,
                        _NumberOfMpiProcesses,
                        _NumberofIterations=30,
                        _ContinueAtIteration=1,
                        _CleanUpFiles=True,
                        _LogDir="Logs",
                        _DoMask=True,
                        _DoSphericalMask=True,
                        _MaskFileName='',
                        _AngSamplingRateDeg='20x10 5x5 5x3',
                        _MaxChangeInAngles='20x1000 5x20 5x9',
                        _MaxChangeOffset='20x1000 10x10',
                        _Search5DShift='20x5 1',
                        _Search5DStep='20x2 1',
                        _DocFileName='',
                        _SymmetryGroup='c1',  
                        _MinimumCrossCorrelation='-1',
                        _DiscardPercentage='0',
                        _DoReconstruction=True,
                        _PaddingFactor=1.0,
                        _FourierMaxFrequencyOfInterest='0.35',
                        _ConstantToAddToFiltration='0.35',
                        _NumberOfThreads=1,
                        _DoParallel=True,
                        _MpiJobSize='10',
                        _SystemFlavour=''
                        ):
                        
        # Import libraries and add Xmipp libs to default search path
        import os,sys,shutil
        scriptdir=os.path.split(os.path.dirname(os.popen('which xmipp_protocols','r').read()))[0]+'/protocols'
        sys.path.append(scriptdir)
        import arg,log,logging,selfile
        import launch_job

        # global variables
        _ReferenceVolumeName='reference_volume.vol'
        _LibraryDir = "ReferenceLibrary"
        _ProjectLibraryRootName= _LibraryDir + "/ref"
        _ProjMatchDir = "ProjMatchClasses"
        _ProjMatchName = 'proj_match'
        _ProjMatchRootName= _ProjMatchDir + "/" + _ProjMatchName
        _DocFileWithOriginalAngles='original_angles.doc'
        _docfile_with_current_angles='current_angles.doc'
        _ReconstructedVolumeBase="reconstruction"
        _FilteredReconstruction="filtered_reconstruction"
        _WorkingDir=os.getcwd()+'/'+os.path.basename(_WorkingDir)
        _ReferenceFileName=os.path.abspath(_ReferenceFileName)
        _user_suplied_ReferenceVolume=_ReferenceFileName
        selfile_without_ext=(os.path.splitext(str(os.path.basename(_SelFileName))))[0]
        globalFourierMaxFrequencyOfInterest=float(_FourierMaxFrequencyOfInterest)
        _MySystemFlavour=_SystemFlavour
        _MyNumberOfMpiProcesses=_NumberOfMpiProcesses
        _MyMpiJobSize =_MpiJobSize
        _MyNumberOfThreads =_NumberOfThreads

        # Set up logging
        _mylog=log.init_log_system(_ProjectDir, _LogDir, sys.argv[0], _WorkingDir)
        # Uncomment next line to get Debug level logging
        _mylog.setLevel(logging.DEBUG)
        _mylog.debug("Debug level logging enabled")
        #input files should exists
        check_file_exists(_ReferenceFileName,_mylog)
                                                                  
        _NumberofIterations +=1;
        create_working_directory(_mylog, _WorkingDir, _ProjMatchDir, _LibraryDir)

        # Create a selfile with absolute pathname in the WorkingDir
        mysel=selfile.selfile()
        mysel.read(os.path.basename(_SelFileName))
        newsel=mysel.make_abspath()
        _SelFileName=os.path.abspath(_WorkingDir + '/' + os.path.basename(_SelFileName))
        newsel.write(_SelFileName)

        # Set _OuterRadius
        if (_OuterRadius < 0):
                xdim,ydim=newsel.imgSize()
                _OuterRadius = (xdim/2) - 1 
                comment = " Outer radius set to: " + str(_OuterRadius)
                print '* ' + comment
                _mylog.info(comment)
        else:   
                _OuterRadius=_OuterRadius

        # Create a docfile with the current angles in the WorkingDir
        if (_DocFileName==''):
                params=' -i ' + _SelFileName + \
                        ' -o ' + _WorkingDir + '/' + \
                        _DocFileWithOriginalAngles
                launch_job.launch_job("xmipp_header_extract", params, _mylog, False,1,1,'')

        # Change to working dir
        os.chdir(_WorkingDir)
        _SelFileName=_WorkingDir+'/' + str(os.path.basename(_SelFileName))

        ##
        ##LOOP
        ##
        #output of reconstruction cycle
        #first value given by user
        #these names are the input of the mask program
        #in general is the output of the reconstruction plus filtration
        _ReconstructedVolume=[]
        fill_name_vector("",
                _ReconstructedVolume,
                _NumberofIterations,
                _ReconstructedVolumeBase)
                                        
        _ReconstructedandfilteredVolume=[]
        fill_name_vector(_user_suplied_ReferenceVolume,
                _ReconstructedandfilteredVolume,
                _NumberofIterations,
                _FilteredReconstruction)

        # Optimal angles from previous iteration or user-provided at the beginning
        _DocFileInputAngles=[]
        fill_name_vector('../'+_DocFileWithOriginalAngles,
                _DocFileInputAngles,
                _NumberofIterations+1,
                _docfile_with_current_angles)

        # Reconstructed and filtered volume of n-1 after masking called reference volume
        _ReferenceVolume=[]
        fill_name_vector("",
                _ReferenceVolume,
                _NumberofIterations,
                _ReferenceVolumeName)

        for _iteration_number in range(_ContinueAtIteration, _NumberofIterations):
                debug_string =  "ITERATION: " +  str(_iteration_number)
                print "*", debug_string
                _mylog.info(debug_string)

                # Create working dir for this iteration and go there
                Iteration_Working_Directory=_WorkingDir+'/Iter_' + str(_iteration_number)
                create_working_directory(_mylog, Iteration_Working_Directory, _ProjMatchDir, _LibraryDir)
                os.chdir(Iteration_Working_Directory)

                #### changed here for this stack -- Dmitry
                # Mask reference volume
                if _iteration_number == 1:
                        execute_mask(_DoMask,
                                _mylog,
                                _ProjectDir,
                                _ReconstructedandfilteredVolume[_iteration_number],#in
                                _MaskFileName,
                                _DoSphericalMask,
                                _MaskRadius,
                                _iteration_number,
                                _ReferenceVolume[_iteration_number])#out
                elif _DoReconstruction is True:
                        execute_mask(_DoMask,
                                _mylog,
                                _ProjectDir,
                                os.path.join("../Iter_%d" % (_iteration_number-1), "Iter_%d_reconstruction" % (_iteration_number-1)),
                                _MaskFileName,
                                _DoSphericalMask,
                                _MaskRadius,
                                _iteration_number,
                                os.path.join("../Iter_%d" % (_iteration_number), "Iter_%d_reference_volume.vol" % (_iteration_number)))
                else: 
                        print "skipped masking, no reconstructed volume"

                if _DoReconstruction is False and (_iteration_number > 1):
                        shutil.move(os.path.join("../Iter_%d" % (_iteration_number-1), "Iter_%d_reference_volume.vol" % (_iteration_number-1)), \
                        os.path.join("../Iter_%d" % (_iteration_number), "Iter_%d_reference_volume.vol" % (_iteration_number))) 

                # Parameters for projection matching
                _AngSamplingRateDeg=arg.getComponentFromVector(_AngSamplingRateDeg, _iteration_number-1)
                _MaxChangeOffset=arg.getComponentFromVector(_MaxChangeOffset, _iteration_number-1)
                _MaxChangeInAngles=arg.getComponentFromVector(_MaxChangeInAngles, _iteration_number-1)
                _Search5DShift=arg.getComponentFromVector(_Search5DShift, _iteration_number-1)
                _Search5DStep=arg.getComponentFromVector(_Search5DStep, _iteration_number-1)
                _MinimumCrossCorrelation=arg.getComponentFromVector(_MinimumCrossCorrelation, _iteration_number-1)
                _DiscardPercentage=arg.getComponentFromVector(_DiscardPercentage, _iteration_number-1)

                execute_projection_matching(_mylog,
                                                                 _ProjectDir,
                                                                 _ReferenceVolume[_iteration_number],
                                                                 _MaskFileName,
                                                                 _DocFileInputAngles[_iteration_number],
                                                                 _DocFileInputAngles[_iteration_number+1],
                                                                 _AngSamplingRateDeg,
                                                                 _InnerRadius,
                                                                 _OuterRadius,
                                                                 _Search5DShift,
                                                                 _Search5DStep,
                                                                 _MaxChangeOffset, 
                                                                 _MaxChangeInAngles,
                                                                 _MinimumCrossCorrelation,
                                                                 _DiscardPercentage,
                                                                 _DoParallel,
                                                                 _MyNumberOfMpiProcesses,
                                                                 _MyNumberOfThreads,
                                                                 _MySystemFlavour,
                                                                 _MyMpiJobSize,
                                                                 _WorkingDir,
                                                                 _SymmetryGroup,
                                                                 _AvailableMemory,
                                                                 _iteration_number,
                                                                 _ProjectLibraryRootName,
                                                                 _ProjMatchRootName
                                                                 )

                if _DoReconstruction is True:
                        execute_reconstruction(_mylog, 
                                                                _SelFileName,
                                                                _iteration_number,
                                                                _DoParallel,
                                                                _MyNumberOfMpiProcesses,
                                                                _MyNumberOfThreads,
                                                                _MySystemFlavour,
                                                                _MyMpiJobSize,
                                                                globalFourierMaxFrequencyOfInterest,
                                                                _SymmetryGroup,
                                                                _ReconstructedVolume[_iteration_number],
                                                                _PaddingFactor
                                                                )
                else: 
                        print "skipped reconstruction"  

                _ConstantToAddToFiltration=arg.getComponentFromVector(_ConstantToAddToFiltration, _iteration_number-1)

                # Remove all class averages and reference projections
                if (_CleanUpFiles):
                        execute_cleanup(_mylog, True, True, _ProjMatchDir, _LibraryDir)