def generateDensMap(self, labelsInit = [], labelsLater = []): # run FFT job to generate density map self.printStepNumber() if self.densMapType in ('DIFF','SIMPLE'): tags = ['FP_', 'SIGFP_', 'FOM_'] labelsInit = [i+self.initPDB for i in tags] + ['PHIC_'+self.phaseDataset] labelsLater = [i+self.laterPDB for i in tags] + ['PHIC_'+self.phaseDataset] if self.densMapType == '2FOFC': labelsInit = ['']*4 labelsLater = ['FWT_{}'.format(self.laterPDB),'','','PHIC'] if self.densMapType != 'END': fft = FFTjob(mapType = self.densMapType, mapTag = self.mapTag, FOMweight = self.FOMweight, pdbFile = self.reorderedPDBFile, mtzFile = self.densMapMtz, outputDir = self.outputDir, axes = self.axes, gridSamps = self.gridSamps, labels1 = labelsLater, labels2 = labelsInit, runLog = self.runLog) success = fft.run() self.densityMap = fft.outputMapFile else: # run END job if required (may take time to run!!) endInputPDB = self.pdbcurPDBinputFile endInputMTZ = ''.join(endInputPDB.split('.')[:-1]+['.mtz']) endInputEFF = ''.join(endInputPDB.split('.')[:-1]+['.eff']) end = ENDjob(pdbFile = endInputPDB, mtzFile = endInputMTZ, effFile = endInputEFF, outputDir = self.outputDir, gridSamps = self.gridSamps, runLog = self.runLog) success = end.run() self.densityMap = end.outputMapFile return success
def generateFcalcMap(self): # generate FC map using FFT self.printStepNumber() fft_FC = FFTjob(mapType = 'FC', FOMweight = self.FOMweight, pdbFile = self.reorderedPDBFile, mtzFile = self.fcalcMtz, outputDir = self.outputDir, axes = self.axes, gridSamps = self.gridSamps, labels1 = ['FC_{}'.format(self.phaseDataset),'','','PHIC_'+self.phaseDataset], runLog = self.runLog) success = fft_FC.run() self.FcalcMap = fft_FC.outputMapFile return success
def generateFcalcMap(self, method=3): # generate FC map. Three methods have currently been proposed: # In 1, the Fcalc map is calculated using the FC and PHIC cols # in the supplied phase dataset.. due to the order of columns # in the input mtz file, the map will take the unit cell dims # of the later dataset. # In 2, the Fcalc map is also calculated from the phase dataset # mtz, however is forced to take the cell dims of dataset 1. # In 3, the Fcalc and PHIC cols are instead generated from a # pdb file, and so take the cell dims of that pdb file also. # The important thing here is that the Fcalc map dimensions # must match those of the atom-map at the same dose. If the PDB # file is varied between datasets, then only methods 1 and 3 # will allow this. It may be wise to use method 3 as default # since this does not depend on a separate mtz file for phases self.printStepNumber() fft_FC = FFTjob( FOMweight=self.FOMweight, pdbFile=self.reorderedPDBFile, outputDir=self.outputDir, axes=self.axes, gridSamps=self.gridSamps, runLog=self.runLog) if method == 1: fcLabels = ['FC_{}'.format(self.Mtz3LabelRename), '', '', 'PHIC_'+self.Mtz3LabelRename] fft_FC.inputMtzFile = self.fcalcMtz fft_FC.mapType = 'FC' fft_FC.labels1 = fcLabels success = fft_FC.run() self.FcalcMap = fft_FC.outputMapFile elif method == 2: tags = ['FP_', 'SIGFP_', 'FOM_'] labels1 = [i+self.Mtz2LabelRename for i in tags] +\ ['PHIC_'+self.Mtz3LabelRename] labels2 = ['FC_{}'.format(self.Mtz3LabelRename), '', '', 'PHIC_'+self.Mtz3LabelRename] fft_FC.mapType = 'DIFF' fft_FC.mapTag = 'FC' fft_FC.inputMtzFile = self.fcalcMtz fft_FC.F1Scale = 0.0 fft_FC.labels1 = labels1 fft_FC.labels2 = labels2 success = fft_FC.run() tmpMap = fft_FC.outputMapFile if success: m = self.multiplyMapByFactor(map=tmpMap) self.FcalcMap = m elif method == 3: sfall = SFALLjob(inputPDBfile=self.reorderedPDBFile, outputDir=self.outputDir, VDWR=self.sfall_VDWR, symmetrygroup=self.spaceGroup, runLog=self.runLog, gridDimensions=self.sfallGRIDdims, task='mtz from pdb') success = sfall.run() FcalcMtz = sfall.outputMtzFile fft_FC.inputMtzFile = FcalcMtz fft_FC.mapType = 'FC' fft_FC.labels1 = ['FCalc', '', '', 'PHICalc'] success = fft_FC.run() self.FcalcMap = fft_FC.outputMapFile if not success: error(text='Failure to successfully generate Fcalc map', log=self.runLog)
def generateCCP4DensMap(self, labelsInit=[], labelsLater=[]): # run FFT job to generate density map self.printStepNumber() densMap = '{}{}_FFT.map'.format(self.outputDir, self.densMapNaming) if self.densMapType in ('DIFF', 'HIGHONLY'): # note that the distinction in these options only comes # apparent in FFTjob.py. Even though HIGHONLY' # calculate maps using only the later dataset info, dummy # information for labelsInit is provided anyway for simplicity tags = ['FP_', 'SIGFP_', 'FOM_'] labelsInit = [i+self.Mtz1LabelRename for i in tags] +\ ['PHIC_'+self.Mtz3LabelRename] labelsLater = [i+self.Mtz2LabelRename for i in tags] +\ ['PHIC_'+self.Mtz3LabelRename] if self.densMapType == '2FOFC': if self.useLaterCellDims: labelsInit = ['']*4 labelsLater = ['FWT{}'.format(self.Mtz2LabelRename), '', '', 'PHIC'] else: labelsLater = ['']*4 labelsInit = ['FWT{}'.format(self.Mtz2LabelRename), '', '', 'PHIC'] if self.densMapType != 'END': fft = FFTjob( mapType=self.densMapType, mapTag=self.mapTag, FOMweight=self.FOMweight, runLog=self.runLog, pdbFile=self.reorderedPDBFile, outputMapFile=densMap, mtzFile=self.densMapMtz, useSigLabs=not self.ignoreSIGFs, outputDir=self.outputDir, axes=self.axes, gridSamps=self.gridSamps, labels1=labelsLater, labels2=labelsInit, lowResCutoff=self.mapResLimits.split(',')[1], highResCutoff=self.mapResLimits.split(',')[0]) if self.useLaterCellDims: fft.labels1 = labelsLater fft.labels2 = labelsInit else: fft.labels1 = labelsInit fft.labels2 = labelsLater success = fft.run() self.densityMap = fft.outputMapFile if success and not self.useLaterCellDims: m = self.multiplyMapByFactor(map=self.densityMap) self.densityMap = m else: # run END job if required (may take time to run!!) endInputPDB = self.inputPDBfile endInputMTZ = ''.join(endInputPDB.split('.')[:-1]+['.mtz']) endInputEFF = ''.join(endInputPDB.split('.')[:-1]+['.eff']) end = ENDjob(pdbFile=endInputPDB, mtzFile=endInputMTZ, effFile=endInputEFF, outputDir=self.outputDir, gridSamps=self.gridSamps, runLog=self.runLog) success = end.run() self.densityMap = end.outputMapFile if not success: error(text='Failure to successfully generate density map', log=self.runLog)
def runPipeline(self): # read input file first success = self.readInputFile() if success is False: return 1 # create log file self.runLog = logFile('{}/{}_runLog_2.txt'.format(self.outputDir,self.jobName)) # run pdbcur job pdbcur = PDBCURjob(self.pdbcurPDBinputFile,self.outputDir,self.runLog) success = pdbcur.run() if success is False: return 2 self.PDBCURoutputFile = pdbcur.outputPDBfile # reorder atoms in PDB file self.renumberPDBFile() # get space group from PDB file success = self.getSpaceGroup() if success is False: return 3 # run SFALL job sfall = SFALLjob(self.reorderedPDBFile,self.outputDir,self.sfall_VDWR, self.spaceGroup,self.sfall_GRID,'ATMMOD',self.runLog) success = sfall.run() if success is False: return 4 # run FFT job sfallMap = mapTools(sfall.outputMapFile) axes = [sfallMap.fastaxis,sfallMap.medaxis,sfallMap.slowaxis] gridSamps = [sfallMap.gridsamp1,sfallMap.gridsamp2,sfallMap.gridsamp3] labelsInit = ['FP_'+self.initPDB,'SIGFP_'+self.initPDB,'FOM_'+self.initPDB,'PHIC_'+self.initPDB] labelsLater = ['FP_'+self.laterPDB,'SIGFP_'+self.laterPDB,'FOM_'+self.laterPDB,'PHIC_'+self.laterPDB] if self.densMapType != 'END': fft = FFTjob(self.densMapType,self.FOMweight,self.reorderedPDBFile,self.inputMtzFile, self.outputDir,axes,gridSamps,labelsLater,labelsInit,self.runLog) success = fft.run() else: # run END job if required (may take time to run!!) endInputPDB = self.pdbcurPDBinputFile endInputMTZ = ''.join(endInputPDB.split('.')[:-1]+['.mtz']) endInputEFF = ''.join(endInputPDB.split('.')[:-1]+['.eff']) end = ENDjob(endInputPDB,endInputMTZ,endInputEFF,self.outputDir,gridSamps,self.runLog) success = end.run() if success is False: return 5 # crop fft and atom-tagged maps to asymmetric unit: mapmask1 = MAPMASKjob(sfall.outputMapFile,'',self.outputDir,self.runLog) success = mapmask1.crop2AsymUnit() if success is False: return 6 # choose correct density map to include in MAPMASK cropping below if self.densMapType != 'END': inputDensMap = fft.outputMapFile else: inputDensMap = end.outputMapFile # switch END map axes to match SFALL atom-tagged map if required if self.densMapType == 'END': mapmask_ENDmap = MAPMASKjob(inputDensMap,'',self.outputDir,self.runLog) success = mapmask_ENDmap.switchAxisOrder(axes,self.spaceGroup) if success is False: return 7.0 else: inputDensMap = mapmask_ENDmap.outputMapFile # run MAPMASK job to crop fft density map to asym unit mapmask2 = MAPMASKjob(inputDensMap,'',self.outputDir,self.runLog) success = mapmask2.crop2AsymUnit() if success is False: return 7.1 # run MAPMASK job to crop fft density map to same grid # sampling dimensions as SFALL atom map mapmask3 = MAPMASKjob(mapmask2.outputMapFile,mapmask1.outputMapFile,self.outputDir,self.runLog) success = mapmask3.cropMap2Map() if success is False: return 8 # perform map consistency check between cropped fft and sfall maps fftMap = mapTools(mapmask3.outputMapFile) fftMap.readHeader() sfallMap = mapTools(mapmask1.outputMapFile) sfallMap.readHeader() success = self.mapConsistencyCheck(sfallMap,fftMap) if success is False: return 9 else: return 0