def reconstruction(_log , ARTReconstructionExtraCommand , WBPReconstructionExtraCommand , FourierReconstructionExtraCommand , Iteration_number , DoParallel , maskedFileNamesIter , MpiJobSize , NumberOfMpi , NumberOfThreads , ReconstructionMethod , FourierMaxFrequencyOfInterest , ARTLambda , SymmetryGroup , ReconstructionXmd , ReconstructedVolume , ResolSam , ResolutionXmdPrevIterMax , PaddingFactor , ConstantToAddToFiltration ): #if inout metadata is empty create a Blanck image if emptyMd(ReconstructionXmd): from protlib_utils import printLog img = Image() img.read(maskedFileNamesIter, DATA) #(x,y,z,n) = img.getDimensions() printLog("Metadata %s is empty. Creating a Black file named %s" % (ReconstructionXmd, ReconstructedVolume)) #createEmptyFile(ReconstructedVolume,x,y,z,n) img.initRandom() img.write(ReconstructedVolume) return print '*********************************************************************' print '* Reconstruct volume using ' if ReconstructionMethod == 'wbp': program = 'xmipp_reconstruct_wbp' parameters = ' -i ' + ReconstructionXmd + \ ' --doc ' + ReconstructionXmd + \ ' -o ' + ReconstructedVolume + \ ' --sym ' + SymmetryGroup + \ ' --weight --use_each_image ' parameters = parameters + WBPReconstructionExtraCommand elif ReconstructionMethod == 'art': program = 'xmipp_reconstruct_art' parameters = ' -i ' + ReconstructionXmd + \ ' -o ' + ReconstructedVolume + ' ' + \ ' --sym ' + SymmetryGroup + \ ' --thr ' + str(NumberOfThreads) + \ ' --WLS ' if len(ARTLambda) > 1: parameters = parameters + ' -l ' + ARTLambda + ' ' parameters = parameters + ARTReconstructionExtraCommand NumberOfMpi = 1 NumberOfThreads = 1 DoParallel = False elif ReconstructionMethod == 'fourier': if FourierMaxFrequencyOfInterest == -1: md = MetaData(ResolutionXmdPrevIterMax) id = md.firstObject() FourierMaxFrequencyOfInterest = md.getValue(MDL_RESOLUTION_FREQREAL, id) FourierMaxFrequencyOfInterest = ResolSam / FourierMaxFrequencyOfInterest + float(ConstantToAddToFiltration) if FourierMaxFrequencyOfInterest > 0.5: FourierMaxFrequencyOfInterest = 0.5 elif FourierMaxFrequencyOfInterest < 0.: FourierMaxFrequencyOfInterest = 0.001 program = 'xmipp_reconstruct_fourier' parameters = ' -i ' + ReconstructionXmd + \ ' -o ' + ReconstructedVolume + \ ' --sym ' + SymmetryGroup + \ ' --thr ' + str(NumberOfThreads) + \ ' --weight ' + \ ' --max_resolution ' + str(FourierMaxFrequencyOfInterest) + \ ' --padding ' + str(PaddingFactor) + ' ' + str(PaddingFactor) if (DoParallel): parameters = parameters + ' --mpi_job_size ' + str(MpiJobSize) runJob(_log , program , parameters , NumberOfMpi , NumberOfThreads )
def angular_class_average(_log , Align2DIterNr , Align2dMaxChangeOffset , Align2dMaxChangeRot , CtfGroupDirectory , CtfGroupRootName , DiscardImages , DiscardPercentage , DiscardPercentagePerClass , DoAlign2D , DoComputeResolution , DoCtfCorrection , DocFileInputAngles , DoParallel , DoSaveImagesAssignedToClasses , DoSplitReferenceImages , InnerRadius , MaxChangeOffset , MinimumCrossCorrelation , MpiJobSize , NumberOfMpi , NumberOfThreads , OutClasses , PaddingFactor , ProjectLibraryRootName ): CtfGroupName = CtfGroupDirectory + '/' + CtfGroupRootName refname = str(ProjectLibraryRootName) baseTxtFile = refname[:-len('.stk')] neighbFile = baseTxtFile + '.xmd' if emptyMd(DocFileInputAngles): print "Empty metadata file: %s" % DocFileInputAngles return parameters = ' -i ctfGroup[0-9][0-9][0-9][0-9][0-9][0-9]\$@' + DocFileInputAngles + \ ' --lib ' + refname.replace(".stk", ".doc") + \ ' -o ' + OutClasses if(DoSaveImagesAssignedToClasses): parameters += ' --save_images_assigned_to_classes' if(DiscardImages == 'maxCC'): parameters += ' --limit0 ' + MinimumCrossCorrelation elif(DiscardImages == 'percentage'): parameters += ' --limitRper ' + DiscardPercentage elif(DiscardImages == 'classPercentage'): parameters += ' --limitRclass ' + DiscardPercentagePerClass #else 'none' # On-the fly apply Wiener-filter correction and add all CTF groups together if (DoCtfCorrection): parameters += \ ' --wien ' + CtfGroupName + '_wien.stk' + \ ' --pad ' + str(PaddingFactor) if (DoAlign2D == '1'): parameters += \ ' --iter ' + Align2DIterNr + \ ' --Ri ' + str(InnerRadius) + \ ' --Ro ' + str(OuterRadius) if (DoComputeResolution and DoSplitReferenceImages): parameters += ' --split ' if (DoParallel): parameters = parameters + ' --mpi_job_size ' + str(MpiJobSize) runJob(_log, 'xmipp_angular_class_average', parameters, NumberOfMpi * NumberOfThreads )