Skip to content

Commit 4089d5d

Browse files
authored
enable subtomogram alignment on multiple gpus (#69)
correct shift when alignment is performed with binning
1 parent 3a89e44 commit 4089d5d

2 files changed

Lines changed: 8 additions & 5 deletions

File tree

pytom/alignment/GLocalSampling.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ def mainAlignmentLoop(alignmentJob, verbose=False):
317317
else:
318318
from pytom.gpu.gpuFunctions import applyFourierFilter
319319
from pytom.agnostic.io import read
320-
print(">>>>>>>>> Aligning Even ....")
320+
print(">>>>>>>>> Aligning Even {len(evenSplitList)} processes on {alignmentJob.gpu}....")
321321
resultsEven = mpi.parfor(alignParticleListGPU, list(zip(evenSplitList,
322322
[currentReferenceEven] * len(evenSplitList),
323323
[evenCompoundWedgeFile] * len(evenSplitList),
@@ -327,8 +327,8 @@ def mainAlignmentLoop(alignmentJob, verbose=False):
327327
[alignmentJob.scoringParameters.preprocessing] * len(evenSplitList),
328328
[progressBar] * neven,
329329
[alignmentJob.samplingParameters.binning] * len(evenSplitList),
330-
[verbose] * len(evenSplitList),alignmentJob.gpu)))
331-
print(">>>>>>>>> Aligning Odd ....")
330+
[verbose] * len(evenSplitList), [alignmentJob.gpu[p % len(alignmentJob.gpu)] for p in range(len(evenSplitList))])))
331+
print(">>>>>>>>> Aligning Odd {len(oddSplitList)} processes on {alignmentJob.gpu}....")
332332
resultsOdd = mpi.parfor(alignParticleListGPU, list(zip(oddSplitList,
333333
[currentReferenceOdd]*len(oddSplitList),
334334
[oddCompoundWedgeFile]*len(oddSplitList),
@@ -337,7 +337,7 @@ def mainAlignmentLoop(alignmentJob, verbose=False):
337337
[alignmentJob.destination+"/"+'CurrentMask.xml']*len(oddSplitList),
338338
[alignmentJob.scoringParameters.preprocessing]*len(oddSplitList),
339339
[progressBar]*nodd, [alignmentJob.samplingParameters.binning]*len(oddSplitList),
340-
[verbose]*len(oddSplitList), alignmentJob.gpu)))
340+
[verbose]*len(oddSplitList), [alignmentJob.gpu[p % len(alignmentJob.gpu)] for p in range(len(oddSplitList))])))
341341

342342
xp.cuda.Device(alignmentJob.gpu[0]).use()
343343
bestPeaksEvenSplit, plansEven = zip(*resultsEven)
@@ -829,10 +829,11 @@ def averageParallel(particleList,averageName, showProgressBar=False, verbose=Fal
829829

830830
#reference = average(particleList=plist, averageName=xxx, showProgressBar=True, verbose=False,
831831
# createInfoVolumes=False, weighting=weighting, norm=False)
832+
print(f"{splitFactor} averaging processes on {gpuIDs}")
832833

833834
averageList = mpi.parfor( average, list(zip(splitLists, avgNameList, [showProgressBar]*splitFactor,
834835
[verbose]*splitFactor, [createInfoVolumes]*splitFactor,
835-
[weighting]*splitFactor, [norm]*splitFactor, gpuIDs)))
836+
[weighting]*splitFactor, [norm]*splitFactor, [gpuIDs[p % len(gpuIDs)] for p in range(len(splitLists))])))
836837
if 'gpu' in device:
837838
xp.cuda.Device(gpuIDs[0]).use()
838839

pytom/gpu/gpuStructures.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,8 @@ def subPixelMaxSpline(self):
435435

436436
# get the shift
437437
peak_shift = [ip - s // 2 for ip, s in zip(interpolated_peak, self.ccc_map.shape)]
438+
# get the shift without binning
439+
peak_shift = [ip*self.binning for ip in peak_shift]
438440

439441
# compared to cpu there is always a shift of 2 here... likely goes wrong before this function
440442
# print([ip - s // 2 for ip, s in zip(peak, self.ccc_map.shape)])

0 commit comments

Comments
 (0)