1
1
from ..snippets import check_folder
2
2
3
3
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 ):
5
5
"""
6
6
DESCRIPTION:
7
7
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):
10
10
- 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.
11
11
- bins: number of partitions of the trajectory to properly distibute the selection
12
12
- 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
13
16
14
17
OUTPUT:
15
18
- list of randomly selected frames
@@ -18,32 +21,53 @@ def frame_selector(frames_boolean, bins=10, frames_per_bin=1):
18
21
from random import choice
19
22
20
23
selected = []
21
- splits = int (round (len (frames_boolean ) / bins , 0 ))
22
24
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
31
31
32
- except IndexError :
33
- return False
34
32
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 )
35
43
36
44
for f in range (frames_per_bin ):
37
45
for b in range (bins ):
46
+ loopout = 0
38
47
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 )))
45
50
break
46
51
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
47
71
48
72
selected = sorted (selected )
49
73
0 commit comments