Skip to content

Commit 4bdfe36

Browse files
committed
Fixed the frame_selector function. It used to get stucked if few or none True statements where found in a bin
1 parent b30e362 commit 4bdfe36

File tree

1 file changed

+42
-18
lines changed

1 file changed

+42
-18
lines changed

RCBS/md_analyser/frame_extractor.py

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from ..snippets import check_folder
22

33

4-
def frame_selector(frames_boolean, bins=10, frames_per_bin=1):
4+
def frame_selector(frames_boolean, bins=10, frames_per_bin=1, bin_type='total_length', verbose=False, loop_tolerance=0.1):
55
"""
66
DESCRIPTION:
77
Function for randomly select frames from a boolean list (being the index the number of the frame).
@@ -10,6 +10,9 @@ def frame_selector(frames_boolean, bins=10, frames_per_bin=1):
1010
- frames_boolean: list of boolean variables that indicate if the criteria is satisfied or not. The index of the list is the number of the frame.
1111
- bins: number of partitions of the trajectory to properly distibute the selection
1212
- frames_per_bin: number of frames to select per bin
13+
- bin_type: total_length | true_lenght --> total_length takes the whole set of frames to calculate the bins,
14+
while true_length takes only the frames with True statements for calculating the bins
15+
- verbose: True prints the frame number every time it is selected
1316
1417
OUTPUT:
1518
- list of randomly selected frames
@@ -18,32 +21,53 @@ def frame_selector(frames_boolean, bins=10, frames_per_bin=1):
1821
from random import choice
1922

2023
selected = []
21-
splits = int(round(len(frames_boolean) / bins, 0))
2224

23-
def choose_frame(frames_boolean, splits, b):
24-
frame = choice(range(splits*b, splits*(b+1)))
25-
print(frame)
26-
try :
27-
if frames_boolean[frame] == True:
28-
return frame
29-
elif frames_boolean[frame] == False:
30-
return False
25+
frames = []
26+
for f in range(len(frames_boolean)):
27+
if frames_boolean[f] == True:
28+
frames.append(f+1)
29+
elif frames_boolean[f] == False:
30+
pass
3131

32-
except IndexError:
33-
return False
3432

33+
if bin_type.lower() == 'total_length':
34+
print('total_length')
35+
splits = int(round(len(frames_boolean) / bins, 0))
36+
37+
elif bin_type.lower() == 'true_length':
38+
print('true_length')
39+
splits = int(round(len(frames) / bins, 0))
40+
41+
else :
42+
print(bin_type)
3543

3644
for f in range(frames_per_bin):
3745
for b in range(bins):
46+
loopout = 0
3847
while True:
39-
frame = int(choose_frame(frames_boolean, splits, b))
40-
print(frame)
41-
if frame == False:
42-
continue
43-
else :
44-
selected.append(int(frame) + 1)
48+
if loopout+1 == int(loop_tolerance*splits):
49+
print('A frame between %s and %s has not been found. No frame will be saved for this bin.' % (splits*b, splits*(b+1)))
4550
break
4651

52+
else :
53+
try :
54+
frame = choice(range(splits*b, splits*(b+1)))
55+
if bin_type == 'total_length':
56+
if frame in frames:
57+
selected.append(frame)
58+
if verbose == True:
59+
print('The selected frame is:', frame)
60+
break
61+
else :
62+
loopout += 1
63+
continue
64+
65+
elif bin_type == 'true_length':
66+
selected.append(frames[frame])
67+
break
68+
69+
except IndexError:
70+
continue
4771

4872
selected = sorted(selected)
4973

0 commit comments

Comments
 (0)