diff --git a/bob/paper/nir_patch_pooling/config/mlfp.py b/bob/paper/nir_patch_pooling/config/mlfp.py
new file mode 100644
index 0000000000000000000000000000000000000000..2430f9451fd333c9eae880c3cb83a41df40f2a9a
--- /dev/null
+++ b/bob/paper/nir_patch_pooling/config/mlfp.py
@@ -0,0 +1,24 @@
+#!/usr/bin/env python
+
+"""
+Database configuration for NIR data from MLFP database for detection of
+mask-based presentation attacks
+"""
+
+from bob.paper.nir_patch_pooling.database import MLFPDatabase
+from bob.extension import rc
+
+PROTOCOL = "grandtest"
+
+database = MLFPDatabase(
+        protocol=PROTOCOL,
+        original_directory=rc["bob.db.mlfp.directory"],
+        original_extension=".hdf5",
+        annotation_directory=rc["bob.db.mlfp.annotation_directory"],
+        training_depends_on_protocol=True,
+        )
+
+groups = ["train", "dev"]
+protocol = PROTOCOL
+#------------------------------------------------------------------------------
+
diff --git a/bob/paper/nir_patch_pooling/config/patch_pooling_lr.py b/bob/paper/nir_patch_pooling/config/patch_pooling_lr.py
new file mode 100644
index 0000000000000000000000000000000000000000..17f63564bb7146e5955681c4f6e7f0edee53dcd8
--- /dev/null
+++ b/bob/paper/nir_patch_pooling/config/patch_pooling_lr.py
@@ -0,0 +1,78 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+Configuration file to run PatchPooling + LR classifier for Face PAD
+toward detection of mask attacks in NIR.
+
+"""
+#----------------------------------------------------------
+
+sub_directory = "pooling_lr"
+
+
+# define preprocessor:
+
+from bob.pad.face.preprocessor import FaceCropAlign
+from bob.bio.video.preprocessor import Wrapper
+from bob.bio.video.utils import FrameSelector
+
+# parameters and constants
+FACE_SIZE = 128
+RGB_OUTPUT_FLAG = False
+USE_FACE_ALIGNMENT = True
+ALIGNMENT_TYPE = "lightcnn"
+MAX_IMAGE_SIZE = None
+FACE_DETECTION_METHOD = None
+MIN_FACE_SIZE = 50
+
+_image_preprocessor = FaceCropAlign(face_size=FACE_SIZE,
+        rgb_output_flag=RGB_OUTPUT_FLAG,
+        use_face_alignment=USE_FACE_ALIGNMENT,
+        alignment_type=ALIGNMENT_TYPE,
+        max_image_size=MAX_IMAGE_SIZE,
+        face_detection_method=FACE_DETECTION_METHOD,
+        min_face_size=MIN_FACE_SIZE,
+        )
+
+_frame_selector = FrameSelector(selection_style = "all")
+
+preprocessor = Wrapper(preprocessor = _image_preprocessor, frame_selector = _frame_selector)
+
+#----------------------------------------------------------
+
+# define extractor:
+
+from bob.paper.nir_patch_pooling.extractor import PatchPoolingCNN
+from bob.bio.video.extractor import Wrapper
+from bob.extension import rc
+import os
+
+_model_dir = rc.get("LIGHTCNN9_MODEL_DIRECTORY")
+_model_name = "LightCNN_9Layers_checkpoint.pth.tar"
+_model_file = os.path.join(_model_dir, _model_name)
+if not os.path.exists(_model_file):
+    print("Error: Could not find the LightCNN-9 model at [{}].\nPlease follow the download instructions from README".format(_model_dir))
+    exit(0)
+
+extractor = Wrapper(PatchPoolingCNN(model_file=_model_file), frame_selector = _frame_selector)
+
+#----------------------------------------------------------
+
+# define algorithm
+
+from bob.pad.base.algorithm import LogRegr
+
+C = 1.0
+
+algorithm = LogRegr(C=C, frame_level_scores_flag=True)
+
+#----------------------------------------------------------
+
+
+
+
+
+
+
+
diff --git a/bob/paper/nir_patch_pooling/config/wmca_mask.py b/bob/paper/nir_patch_pooling/config/wmca_mask.py
new file mode 100644
index 0000000000000000000000000000000000000000..0fd95bf12afa023f3ea24ece4f85805c3ca13017
--- /dev/null
+++ b/bob/paper/nir_patch_pooling/config/wmca_mask.py
@@ -0,0 +1,26 @@
+
+"""
+Configuration for PAD experiments using NIR channel of WMCA.
+This specific protocol/database selects only *mask* attacks and bona-fide 
+presentations.
+"""
+
+from bob.paper.nir_patch_pooling.database import WMCAMask
+from bob.extension import rc
+
+
+PROTOCOL = "grandtest-nir-50"
+
+database = WMCAMask(
+    protocol = PROTOCOL,
+    original_directory = rc["bob.db.wmca_mask.directory"],
+    annotation_directory = rc["bob.db.wmca_mask.annotation_directory"],
+    landmark_detect_method = "mtcnn"
+    )
+
+
+groups = ["train", "dev", "eval"]
+protocol = PROTOCOL
+#---
+
+
diff --git a/bob/paper/nir_patch_pooling/database/lists/grandtest/dev/for_attack.lst b/bob/paper/nir_patch_pooling/database/lists/grandtest/dev/for_attack.lst
new file mode 100644
index 0000000000000000000000000000000000000000..0e1db045403435ef904b6ae4061d652dc3f7e785
--- /dev/null
+++ b/bob/paper/nir_patch_pooling/database/lists/grandtest/dev/for_attack.lst
@@ -0,0 +1,150 @@
+face-station/07.05.18/002_07_000_2_82 002 siliconemask
+face-station/21.02.18/002_03_020_2_13 002 custommask
+face-station/22.02.18/002_03_044_2_13 002 custommask
+face-station/21.02.18/002_03_000_2_82 002 siliconemask
+face-station/02.02.18/002_01_050_2_13 002 custommask
+face-station/02.05.18/002_05_003_2_82 002 siliconemask
+face-station/30.01.18/002_01_028_2_82 002 siliconemask
+face-station/29.01.18/002_01_020_2_13 002 custommask
+face-station/06.02.18/002_02_018_2_82 002 siliconemask
+face-station/01.05.18/002_06_064_2_13 002 custommask
+face-station/04.06.18/002_06_000_2_13 002 custommask
+face-station/07.05.18/002_06_000_2_82 002 siliconemask
+face-station/14.03.18/002_04_010_2_13 002 custommask
+face-station/14.03.18/002_04_010_2_82 002 siliconemask
+face-station/09.02.18/002_02_000_2_82 002 siliconemask
+face-station/07.02.18/002_02_044_2_82 002 siliconemask
+face-station/07.05.18/002_05_000_2_82 002 siliconemask
+face-station/15.05.18/002_05_019_2_13 002 custommask
+face-station/23.05.18/002_07_073_2_13 002 custommask
+face-station/04.06.18/002_05_000_2_13 002 custommask
+face-station/04.06.18/002_04_000_2_13 002 custommask
+face-station/07.05.18/002_04_000_2_82 002 siliconemask
+face-station/14.02.18/002_03_051_2_82 002 siliconemask
+face-station/06.02.18/002_02_055_2_13 002 custommask
+face-station/04.06.18/002_07_000_2_13 002 custommask
+face-station/27.02.18/002_01_000_2_82 002 siliconemask
+face-station/19.02.18/002_02_000_2_13 002 custommask
+face-station/02.02.18/002_01_056_2_82 002 siliconemask
+face-station/21.02.18/002_03_000_2_13 002 custommask
+face-station/04.05.18/002_06_004_2_82 002 siliconemask
+face-station/27.02.18/002_01_000_2_13 002 custommask
+face-station/03.05.18/002_07_064_2_82 002 siliconemask
+face-station/01.02.18/016_01_002_2_85 016 siliconemask
+face-station/12.02.18/016_03_056_2_85 016 siliconemask
+face-station/23.05.18/016_07_068_2_85 016 siliconemask
+face-station/04.05.18/016_06_004_2_85 016 siliconemask
+face-station/07.02.18/016_03_028_2_85 016 siliconemask
+face-station/31.01.18/016_01_033_2_85 016 siliconemask
+face-station/27.02.18/016_01_000_2_85 016 siliconemask
+face-station/19.02.18/016_02_000_2_85 016 siliconemask
+face-station/29.05.18/016_06_000_2_85 016 siliconemask
+face-station/29.05.18/016_04_000_2_85 016 siliconemask
+face-station/14.03.18/016_04_010_2_85 016 siliconemask
+face-station/07.02.18/016_02_045_2_85 016 siliconemask
+face-station/29.05.18/016_05_000_2_85 016 siliconemask
+face-station/06.02.18/016_02_017_2_85 016 siliconemask
+face-station/24.05.18/016_05_012_2_85 016 siliconemask
+face-station/22.02.18/016_03_000_2_85 016 siliconemask
+face-station/29.05.18/016_07_000_2_85 016 siliconemask
+face-station/14.02.18/018_03_018_2_16 018 custommask
+face-station/12.06.18/018_07_003_2_16 018 custommask
+face-station/29.01.18/018_01_022_2_16 018 custommask
+face-station/20.04.18/018_05_066_2_16 018 custommask
+face-station/14.03.18/018_04_010_2_16 018 custommask
+face-station/04.06.18/018_06_000_2_16 018 custommask
+face-station/04.06.18/018_07_000_2_16 018 custommask
+face-station/04.06.18/018_05_000_2_16 018 custommask
+face-station/24.05.18/018_06_014_2_16 018 custommask
+face-station/21.02.18/018_03_000_2_16 018 custommask
+face-station/15.02.18/018_03_045_2_16 018 custommask
+face-station/27.02.18/018_01_000_2_16 018 custommask
+face-station/04.06.18/018_04_000_2_16 018 custommask
+face-station/02.02.18/018_01_047_2_16 018 custommask
+face-station/09.02.18/018_02_051_2_16 018 custommask
+face-station/19.02.18/018_02_000_2_16 018 custommask
+face-station/14.02.18/018_03_008_2_16 018 custommask
+face-station/02.02.18/018_01_060_2_16 018 custommask
+face-station/07.02.18/018_02_056_2_16 018 custommask
+face-station/30.05.18/099_06_000_2_09 099 papermask
+face-station/29.01.18/099_01_022_2_09 099 papermask
+face-station/16.02.18/099_03_043_2_09 099 papermask
+face-station/21.02.18/099_03_000_2_09 099 papermask
+face-station/27.02.18/099_01_000_2_09 099 papermask
+face-station/30.05.18/099_05_000_2_09 099 papermask
+face-station/30.05.18/099_07_000_2_09 099 papermask
+face-station/02.02.18/099_01_047_2_09 099 papermask
+face-station/24.05.18/099_06_073_2_09 099 papermask
+face-station/15.02.18/099_03_004_2_09 099 papermask
+face-station/14.03.18/099_04_010_2_09 099 papermask
+face-station/06.02.18/099_02_018_2_09 099 papermask
+face-station/23.04.18/099_07_066_2_09 099 papermask
+face-station/19.02.18/099_02_000_2_09 099 papermask
+face-station/30.05.18/099_04_000_2_09 099 papermask
+face-station/15.05.18/099_05_069_2_09 099 papermask
+face-station/07.02.18/099_02_045_2_09 099 papermask
+face-station/29.05.18/102_06_000_2_91 102 siliconemask
+face-station/06.06.18/102_04_018_2_91 102 siliconemask
+face-station/25.06.18/102_05_004_2_91 102 siliconemask
+face-station/28.05.18/102_07_000_2_91 102 siliconemask
+face-station/23.04.18/102_07_066_2_91 102 siliconemask
+face-station/25.06.18/102_06_018_2_91 102 siliconemask
+face-station/22.05.18/102_05_068_2_91 102 siliconemask
+face-station/24.04.18/102_06_067_2_91 102 siliconemask
+face-station/29.05.18/102_04_000_2_91 102 siliconemask
+face-station/25.06.18/102_01_006_2_91 102 siliconemask
+face-station/25.06.18/102_07_019_2_91 102 siliconemask
+face-station/22.06.18/102_01_000_2_91 102 siliconemask
+face-station/29.05.18/102_05_000_2_91 102 siliconemask
+face-station/25.06.18/104_07_019_2_97 104 siliconemask
+face-station/01.05.18/104_05_065_2_97 104 siliconemask
+face-station/25.06.18/104_06_018_2_97 104 siliconemask
+face-station/25.06.18/104_01_006_2_97 104 siliconemask
+face-station/28.05.18/104_06_000_2_97 104 siliconemask
+face-station/28.05.18/104_05_000_2_97 104 siliconemask
+face-station/28.05.18/104_07_000_2_97 104 siliconemask
+face-station/28.05.18/104_04_000_2_97 104 siliconemask
+face-station/25.06.18/104_05_004_2_97 104 siliconemask
+face-station/04.05.18/104_06_038_2_97 104 siliconemask
+face-station/06.06.18/104_04_018_2_97 104 siliconemask
+face-station/04.05.18/104_07_003_2_97 104 siliconemask
+face-station/22.06.18/104_01_000_2_97 104 siliconemask
+face-station/29.05.18/105_05_000_2_94 105 siliconemask
+face-station/25.06.18/105_07_019_2_94 105 siliconemask
+face-station/25.06.18/105_05_004_2_94 105 siliconemask
+face-station/22.06.18/105_01_000_2_94 105 siliconemask
+face-station/30.04.18/105_05_064_2_94 105 siliconemask
+face-station/16.05.18/105_07_004_2_94 105 siliconemask
+face-station/07.05.18/105_06_002_2_94 105 siliconemask
+face-station/29.05.18/105_06_000_2_94 105 siliconemask
+face-station/25.06.18/105_06_018_2_94 105 siliconemask
+face-station/29.05.18/105_04_000_2_94 105 siliconemask
+face-station/25.06.18/105_01_006_2_94 105 siliconemask
+face-station/06.06.18/105_04_018_2_94 105 siliconemask
+face-station/28.05.18/105_07_000_2_94 105 siliconemask
+face-station/28.06.18/107_01_000_2_76 107 siliconemask
+face-station/28.06.18/107_06_003_2_76 107 siliconemask
+face-station/04.07.18/107_05_073_2_76 107 siliconemask
+face-station/28.06.18/107_04_000_2_76 107 siliconemask
+face-station/28.06.18/107_01_003_2_76 107 siliconemask
+face-station/02.07.18/107_07_007_2_76 107 siliconemask
+face-station/28.06.18/107_04_007_2_76 107 siliconemask
+face-station/28.06.18/107_06_000_2_76 107 siliconemask
+face-station/05.07.18/107_07_073_2_76 107 siliconemask
+face-station/02.07.18/107_05_064_2_76 107 siliconemask
+face-station/03.07.18/107_06_064_2_76 107 siliconemask
+face-station/28.06.18/107_07_000_2_76 107 siliconemask
+face-station/28.06.18/107_05_000_2_76 107 siliconemask
+face-station/02.07.18/110_05_064_2_79 110 siliconemask
+face-station/28.06.18/110_04_000_2_79 110 siliconemask
+face-station/28.06.18/110_05_000_2_79 110 siliconemask
+face-station/05.07.18/110_07_073_2_79 110 siliconemask
+face-station/28.06.18/110_07_000_2_79 110 siliconemask
+face-station/28.06.18/110_04_007_2_79 110 siliconemask
+face-station/04.07.18/110_05_073_2_79 110 siliconemask
+face-station/02.07.18/110_07_007_2_79 110 siliconemask
+face-station/03.07.18/110_06_064_2_79 110 siliconemask
+face-station/28.06.18/110_06_000_2_79 110 siliconemask
+face-station/28.06.18/110_06_003_2_79 110 siliconemask
+face-station/28.06.18/110_01_003_2_79 110 siliconemask
+face-station/28.06.18/110_01_000_2_79 110 siliconemask
\ No newline at end of file
diff --git a/bob/paper/nir_patch_pooling/database/lists/grandtest/dev/for_real.lst b/bob/paper/nir_patch_pooling/database/lists/grandtest/dev/for_real.lst
new file mode 100644
index 0000000000000000000000000000000000000000..75bdbc97e34c0cd424ba61b34b1f91f388e0ce39
--- /dev/null
+++ b/bob/paper/nir_patch_pooling/database/lists/grandtest/dev/for_real.lst
@@ -0,0 +1,80 @@
+face-station/08.02.18/006_02_000_0_00 006
+face-station/15.02.18/006_03_000_0_00 006
+face-station/22.01.18/006_01_000_0_00 006
+face-station/25.05.18/006_06_000_0_00 006
+face-station/23.05.18/006_07_000_0_00 006
+face-station/15.05.18/006_05_000_0_00 006
+face-station/16.02.18/013_03_000_0_00 013
+face-station/09.02.18/013_02_000_0_00 013
+face-station/24.01.18/013_01_000_0_00 013
+face-station/22.05.18/018_06_000_0_00 018
+face-station/23.05.18/018_07_000_0_00 018
+face-station/15.05.18/018_05_000_0_00 018
+face-station/06.02.18/018_02_000_0_00 018
+face-station/14.02.18/018_03_000_0_00 018
+face-station/18.01.18/018_01_000_0_00 018
+face-station/15.05.18/019_05_000_0_00 019
+face-station/31.01.18/019_01_000_0_00 019
+face-station/14.02.18/019_03_000_0_00 019
+face-station/08.02.18/019_02_000_0_00 019
+face-station/16.05.18/019_07_000_0_00 019
+face-station/23.05.18/019_06_000_0_00 019
+face-station/12.02.18/021_03_000_0_00 021
+face-station/06.02.18/021_02_000_0_00 021
+face-station/29.01.18/021_01_000_0_00 021
+face-station/29.01.18/024_01_000_0_00 024
+face-station/06.02.18/024_02_000_0_00 024
+face-station/21.02.18/024_03_000_0_00 024
+face-station/14.02.18/027_03_000_0_00 027
+face-station/07.02.18/027_02_000_0_00 027
+face-station/30.01.18/027_01_000_0_00 027
+face-station/30.01.18/031_01_000_0_00 031
+face-station/13.02.18/031_03_000_0_00 031
+face-station/13.02.18/031_02_000_0_00 031
+face-station/12.02.18/035_03_000_0_00 035
+face-station/07.02.18/035_02_000_0_00 035
+face-station/31.01.18/035_01_000_0_00 035
+face-station/31.01.18/036_01_000_0_00 036
+face-station/07.02.18/036_02_000_0_00 036
+face-station/13.02.18/036_03_000_0_00 036
+face-station/01.02.18/039_01_000_0_00 039
+face-station/01.02.18/044_01_000_0_00 044
+face-station/07.02.18/044_02_000_0_00 044
+face-station/22.02.18/044_03_000_0_00 044
+face-station/02.02.18/051_01_000_0_00 051
+face-station/14.02.18/051_03_000_0_00 051
+face-station/09.02.18/051_02_000_0_00 051
+face-station/14.02.18/053_03_000_0_00 053
+face-station/08.02.18/053_02_000_0_00 053
+face-station/02.02.18/053_01_000_0_00 053
+face-station/02.02.18/055_01_000_0_00 055
+face-station/13.02.18/055_03_000_0_00 055
+face-station/06.02.18/055_02_000_0_00 055
+face-station/02.02.18/057_01_000_0_00 057
+face-station/02.02.18/060_01_000_0_00 060
+face-station/09.02.18/060_02_000_0_00 060
+face-station/09.02.18/060_03_000_0_00 060
+face-station/27.02.18/063_01_000_0_00 063
+face-station/12.02.18/063_03_000_0_00 063
+face-station/07.02.18/063_02_000_0_00 063
+face-station/30.04.18/064_05_000_0_00 064
+face-station/01.05.18/064_06_000_0_00 064
+face-station/03.05.18/064_07_000_0_00 064
+face-station/24.01.18/011_01_000_0_00 011
+face-station/14.02.18/011_03_000_0_00 011
+face-station/16.02.18/011_02_000_0_00 011
+face-station/22.05.18/068_06_000_0_00 068
+face-station/23.05.18/068_07_000_0_00 068
+face-station/22.05.18/068_05_000_0_00 068
+face-station/17.01.18/003_01_000_0_00 003
+face-station/14.02.18/003_03_000_0_00 003
+face-station/06.02.18/003_02_000_0_00 003
+face-station/02.05.18/003_05_000_0_00 003
+face-station/04.05.18/003_07_000_0_00 003
+face-station/03.05.18/003_06_000_0_00 003
+face-station/29.01.18/020_01_000_0_00 020
+face-station/21.02.18/020_02_000_0_00 020
+face-station/21.02.18/020_03_000_0_00 020
+face-station/02.02.18/052_01_000_0_00 052
+face-station/08.02.18/052_02_000_0_00 052
+face-station/08.02.18/052_03_000_0_00 052
\ No newline at end of file
diff --git a/bob/paper/nir_patch_pooling/database/lists/grandtest/eval/for_attack.lst b/bob/paper/nir_patch_pooling/database/lists/grandtest/eval/for_attack.lst
new file mode 100644
index 0000000000000000000000000000000000000000..5337ee2376593524792695635efe213d08965efd
--- /dev/null
+++ b/bob/paper/nir_patch_pooling/database/lists/grandtest/eval/for_attack.lst
@@ -0,0 +1,155 @@
+face-station/02.02.18/001_01_051_2_80 001 siliconemask
+face-station/29.05.18/001_07_000_2_80 001 siliconemask
+face-station/04.05.18/001_05_071_2_80 001 siliconemask
+face-station/14.03.18/001_04_010_2_80 001 siliconemask
+face-station/27.02.18/001_01_000_2_80 001 siliconemask
+face-station/29.05.18/001_05_000_2_80 001 siliconemask
+face-station/23.05.18/001_07_073_2_80 001 siliconemask
+face-station/30.01.18/001_01_028_2_80 001 siliconemask
+face-station/19.02.18/001_02_000_2_80 001 siliconemask
+face-station/14.02.18/001_03_027_2_80 001 siliconemask
+face-station/22.02.18/001_03_000_2_80 001 siliconemask
+face-station/08.02.18/001_02_038_2_80 001 siliconemask
+face-station/08.02.18/001_03_054_2_80 001 siliconemask
+face-station/29.05.18/001_06_000_2_80 001 siliconemask
+face-station/07.02.18/001_02_008_2_80 001 siliconemask
+face-station/29.05.18/001_04_000_2_80 001 siliconemask
+face-station/23.05.18/001_06_072_2_80 001 siliconemask
+face-station/08.05.18/012_07_002_2_14 012 custommask
+face-station/14.03.18/012_04_010_2_14 012 custommask
+face-station/27.02.18/012_01_000_2_14 012 custommask
+face-station/04.06.18/012_06_000_2_14 012 custommask
+face-station/24.01.18/012_01_010_2_14 012 custommask
+face-station/29.05.18/012_07_000_2_83 012 siliconemask
+face-station/22.02.18/012_03_000_2_83 012 siliconemask
+face-station/16.05.18/012_07_070_2_83 012 siliconemask
+face-station/06.02.18/012_02_009_2_14 012 custommask
+face-station/15.02.18/012_03_001_2_14 012 custommask
+face-station/01.02.18/012_01_045_2_83 012 siliconemask
+face-station/16.02.18/012_03_013_2_14 012 custommask
+face-station/22.05.18/012_06_068_2_14 012 custommask
+face-station/26.01.18/012_01_017_2_83 012 siliconemask
+face-station/04.06.18/012_04_000_2_14 012 custommask
+face-station/14.02.18/012_03_011_2_83 012 siliconemask
+face-station/29.05.18/012_06_000_2_83 012 siliconemask
+face-station/19.02.18/012_02_000_2_14 012 custommask
+face-station/14.02.18/012_03_051_2_14 012 custommask
+face-station/20.04.18/012_05_066_2_83 012 siliconemask
+face-station/29.05.18/012_05_000_2_83 012 siliconemask
+face-station/14.03.18/012_04_010_2_83 012 siliconemask
+face-station/02.02.18/012_01_060_2_14 012 custommask
+face-station/04.06.18/012_07_000_2_14 012 custommask
+face-station/06.02.18/012_02_055_2_83 012 siliconemask
+face-station/22.05.18/012_06_018_2_83 012 siliconemask
+face-station/29.05.18/012_04_000_2_83 012 siliconemask
+face-station/27.02.18/012_01_000_2_83 012 siliconemask
+face-station/21.02.18/012_03_000_2_14 012 custommask
+face-station/22.05.18/012_05_008_2_14 012 custommask
+face-station/01.02.18/012_01_041_2_14 012 custommask
+face-station/13.02.18/012_03_031_2_14 012 custommask
+face-station/19.02.18/012_02_000_2_83 012 siliconemask
+face-station/13.02.18/012_03_042_2_83 012 siliconemask
+face-station/04.06.18/012_05_000_2_14 012 custommask
+face-station/07.02.18/012_02_035_2_14 012 custommask
+face-station/06.02.18/018_02_025_2_86 018 siliconemask
+face-station/29.05.18/018_07_000_2_86 018 siliconemask
+face-station/19.02.18/018_02_000_2_86 018 siliconemask
+face-station/16.05.18/018_07_069_2_86 018 siliconemask
+face-station/22.02.18/018_03_000_2_86 018 siliconemask
+face-station/29.05.18/018_05_000_2_86 018 siliconemask
+face-station/29.05.18/018_04_000_2_86 018 siliconemask
+face-station/15.05.18/018_05_007_2_86 018 siliconemask
+face-station/14.03.18/018_04_010_2_86 018 siliconemask
+face-station/23.01.18/018_01_009_2_86 018 siliconemask
+face-station/24.05.18/018_06_008_2_86 018 siliconemask
+face-station/29.05.18/018_06_000_2_86 018 siliconemask
+face-station/07.02.18/018_02_059_2_86 018 siliconemask
+face-station/01.02.18/018_01_041_2_86 018 siliconemask
+face-station/27.02.18/018_01_000_2_86 018 siliconemask
+face-station/14.02.18/018_03_038_2_86 018 siliconemask
+face-station/14.03.18/019_04_010_2_17 019 custommask
+face-station/27.02.18/019_01_000_2_17 019 custommask
+face-station/21.02.18/019_03_000_2_17 019 custommask
+face-station/18.01.18/019_01_005_2_17 019 custommask
+face-station/04.06.18/019_05_000_2_17 019 custommask
+face-station/04.06.18/019_07_000_2_17 019 custommask
+face-station/04.06.18/019_06_000_2_17 019 custommask
+face-station/19.02.18/019_02_000_2_17 019 custommask
+face-station/07.05.18/019_06_070_2_17 019 custommask
+face-station/04.06.18/019_04_000_2_17 019 custommask
+face-station/12.02.18/019_03_025_2_17 019 custommask
+face-station/02.05.18/019_05_003_2_17 019 custommask
+face-station/23.05.18/019_07_018_2_17 019 custommask
+face-station/02.02.18/019_01_061_2_17 019 custommask
+face-station/06.02.18/019_02_025_2_17 019 custommask
+face-station/31.01.18/019_01_036_2_17 019 custommask
+face-station/22.05.18/100_05_068_2_10 100 papermask
+face-station/30.05.18/100_04_000_2_10 100 papermask
+face-station/30.05.18/100_07_000_2_10 100 papermask
+face-station/09.02.18/100_03_060_2_10 100 papermask
+face-station/16.05.18/100_07_069_2_10 100 papermask
+face-station/21.02.18/100_03_000_2_10 100 papermask
+face-station/08.02.18/100_02_054_2_10 100 papermask
+face-station/30.05.18/100_06_000_2_10 100 papermask
+face-station/08.02.18/100_02_019_2_10 100 papermask
+face-station/30.05.18/100_05_000_2_10 100 papermask
+face-station/01.02.18/100_01_042_2_10 100 papermask
+face-station/19.02.18/100_02_000_2_10 100 papermask
+face-station/27.02.18/100_01_000_2_10 100 papermask
+face-station/14.03.18/100_04_010_2_10 100 papermask
+face-station/03.05.18/100_06_003_2_10 100 papermask
+face-station/14.02.18/100_03_061_2_10 100 papermask
+face-station/12.02.18/100_03_015_2_10 100 papermask
+face-station/30.01.18/100_01_027_2_10 100 papermask
+face-station/06.06.18/103_04_018_2_92 103 siliconemask
+face-station/22.06.18/103_01_000_2_92 103 siliconemask
+face-station/25.06.18/103_05_004_2_92 103 siliconemask
+face-station/29.05.18/103_06_000_2_92 103 siliconemask
+face-station/07.05.18/103_06_002_2_92 103 siliconemask
+face-station/25.06.18/103_07_019_2_92 103 siliconemask
+face-station/25.06.18/103_01_006_2_92 103 siliconemask
+face-station/16.05.18/103_07_004_2_92 103 siliconemask
+face-station/28.05.18/103_07_000_2_92 103 siliconemask
+face-station/25.06.18/103_06_018_2_92 103 siliconemask
+face-station/30.04.18/103_05_064_2_92 103 siliconemask
+face-station/29.05.18/103_04_000_2_92 103 siliconemask
+face-station/29.05.18/103_05_000_2_92 103 siliconemask
+face-station/25.06.18/105_07_019_2_98 105 siliconemask
+face-station/04.05.18/105_07_003_2_98 105 siliconemask
+face-station/06.06.18/105_04_018_2_98 105 siliconemask
+face-station/04.05.18/105_06_038_2_98 105 siliconemask
+face-station/25.06.18/105_05_004_2_98 105 siliconemask
+face-station/28.05.18/105_05_000_2_98 105 siliconemask
+face-station/28.05.18/105_04_000_2_98 105 siliconemask
+face-station/25.06.18/105_01_006_2_98 105 siliconemask
+face-station/01.05.18/105_05_065_2_98 105 siliconemask
+face-station/25.06.18/105_06_018_2_98 105 siliconemask
+face-station/22.06.18/105_01_000_2_98 105 siliconemask
+face-station/28.05.18/105_06_000_2_98 105 siliconemask
+face-station/28.05.18/105_07_000_2_98 105 siliconemask
+face-station/25.06.18/106_06_018_2_95 106 siliconemask
+face-station/16.05.18/106_07_004_2_95 106 siliconemask
+face-station/29.05.18/106_04_000_2_95 106 siliconemask
+face-station/29.05.18/106_05_000_2_95 106 siliconemask
+face-station/25.06.18/106_07_019_2_95 106 siliconemask
+face-station/07.05.18/106_06_002_2_95 106 siliconemask
+face-station/22.06.18/106_01_000_2_95 106 siliconemask
+face-station/25.06.18/106_01_006_2_95 106 siliconemask
+face-station/30.04.18/106_05_064_2_95 106 siliconemask
+face-station/06.06.18/106_04_018_2_95 106 siliconemask
+face-station/28.05.18/106_07_000_2_95 106 siliconemask
+face-station/25.06.18/106_05_004_2_95 106 siliconemask
+face-station/29.05.18/106_06_000_2_95 106 siliconemask
+face-station/28.06.18/108_07_000_2_77 108 siliconemask
+face-station/28.06.18/108_04_000_2_77 108 siliconemask
+face-station/28.06.18/108_01_003_2_77 108 siliconemask
+face-station/05.07.18/108_07_073_2_77 108 siliconemask
+face-station/04.07.18/108_05_073_2_77 108 siliconemask
+face-station/28.06.18/108_06_000_2_77 108 siliconemask
+face-station/28.06.18/108_05_000_2_77 108 siliconemask
+face-station/02.07.18/108_07_007_2_77 108 siliconemask
+face-station/28.06.18/108_06_003_2_77 108 siliconemask
+face-station/03.07.18/108_06_064_2_77 108 siliconemask
+face-station/28.06.18/108_04_007_2_77 108 siliconemask
+face-station/02.07.18/108_05_064_2_77 108 siliconemask
+face-station/28.06.18/108_01_000_2_77 108 siliconemask
\ No newline at end of file
diff --git a/bob/paper/nir_patch_pooling/database/lists/grandtest/eval/for_real.lst b/bob/paper/nir_patch_pooling/database/lists/grandtest/eval/for_real.lst
new file mode 100644
index 0000000000000000000000000000000000000000..12f162b32388a2677582d6ef6d423bf15eeda19e
--- /dev/null
+++ b/bob/paper/nir_patch_pooling/database/lists/grandtest/eval/for_real.lst
@@ -0,0 +1,74 @@
+face-station/15.02.18/001_03_000_0_00 001
+face-station/06.02.18/001_02_000_0_00 001
+face-station/24.01.18/001_01_000_0_00 001
+face-station/06.02.18/007_02_000_0_00 007
+face-station/22.01.18/007_01_000_0_00 007
+face-station/15.05.18/007_05_000_0_00 007
+face-station/16.05.18/007_07_000_0_00 007
+face-station/22.05.18/007_06_000_0_00 007
+face-station/13.02.18/007_03_000_0_00 007
+face-station/27.02.18/012_02_000_0_00 012
+face-station/27.02.18/012_03_000_0_00 012
+face-station/23.05.18/012_06_000_0_00 012
+face-station/24.05.18/012_05_000_0_00 012
+face-station/16.05.18/012_07_000_0_00 012
+face-station/25.01.18/012_01_000_0_00 012
+face-station/14.02.18/017_03_000_0_00 017
+face-station/06.02.18/017_02_000_0_00 017
+face-station/26.01.18/017_01_000_0_00 017
+face-station/29.01.18/022_01_000_0_00 022
+face-station/08.02.18/022_02_000_0_00 022
+face-station/08.02.18/022_03_000_0_00 022
+face-station/07.02.18/026_02_000_0_00 026
+face-station/12.02.18/026_03_000_0_00 026
+face-station/30.01.18/026_01_000_0_00 026
+face-station/15.02.18/029_03_000_0_00 029
+face-station/07.02.18/029_02_000_0_00 029
+face-station/30.01.18/029_01_000_0_00 029
+face-station/07.02.18/030_02_000_0_00 030
+face-station/13.02.18/030_03_000_0_00 030
+face-station/30.01.18/030_01_000_0_00 030
+face-station/14.02.18/033_03_000_0_00 033
+face-station/07.02.18/033_02_000_0_00 033
+face-station/31.01.18/033_01_000_0_00 033
+face-station/07.02.18/037_02_000_0_00 037
+face-station/01.02.18/037_01_000_0_00 037
+face-station/13.02.18/037_03_000_0_00 037
+face-station/06.02.18/043_02_000_0_00 043
+face-station/01.02.18/043_01_000_0_00 043
+face-station/16.02.18/043_03_000_0_00 043
+face-station/15.02.18/045_03_000_0_00 045
+face-station/07.02.18/045_02_000_0_00 045
+face-station/01.02.18/045_01_000_0_00 045
+face-station/02.02.18/047_01_000_0_00 047
+face-station/13.02.18/047_03_000_0_00 047
+face-station/08.02.18/047_02_000_0_00 047
+face-station/02.02.18/050_01_000_0_00 050
+face-station/08.02.18/054_02_000_0_00 054
+face-station/08.02.18/054_03_000_0_00 054
+face-station/02.02.18/054_01_000_0_00 054
+face-station/02.02.18/058_01_000_0_00 058
+face-station/06.02.18/058_02_000_0_00 058
+face-station/13.02.18/058_03_000_0_00 058
+face-station/06.02.18/010_02_000_0_00 010
+face-station/09.02.18/010_03_000_0_00 010
+face-station/24.01.18/010_01_000_0_00 010
+face-station/06.02.18/062_02_000_0_00 062
+face-station/28.02.18/062_01_000_0_00 062
+face-station/12.02.18/062_03_000_0_00 062
+face-station/07.05.18/070_06_000_0_00 070
+face-station/16.05.18/070_07_000_0_00 070
+face-station/04.05.18/070_05_000_0_00 070
+face-station/23.05.18/072_07_000_0_00 072
+face-station/23.05.18/072_05_000_0_00 072
+face-station/23.05.18/072_06_000_0_00 072
+face-station/29.01.18/023_01_000_0_00 023
+face-station/12.02.18/009_03_000_0_00 009
+face-station/06.02.18/009_02_000_0_00 009
+face-station/23.01.18/009_01_000_0_00 009
+face-station/14.02.18/061_03_000_0_00 061
+face-station/06.02.18/061_02_000_0_00 061
+face-station/02.02.18/061_01_000_0_00 061
+face-station/23.04.18/067_05_000_0_00 067
+face-station/24.04.18/067_07_000_0_00 067
+face-station/24.04.18/067_06_000_0_00 067
\ No newline at end of file
diff --git a/bob/paper/nir_patch_pooling/database/lists/grandtest/train/for_attack.lst b/bob/paper/nir_patch_pooling/database/lists/grandtest/train/for_attack.lst
new file mode 100644
index 0000000000000000000000000000000000000000..59eced249441eb1b406ac346fe05d224f1e710e0
--- /dev/null
+++ b/bob/paper/nir_patch_pooling/database/lists/grandtest/train/for_attack.lst
@@ -0,0 +1,182 @@
+face-station/30.05.18/001_06_000_2_08 001 papermask
+face-station/14.03.18/001_04_010_2_12 001 custommask
+face-station/27.02.18/001_01_000_2_08 001 papermask
+face-station/06.02.18/001_02_021_2_12 001 custommask
+face-station/13.02.18/001_03_036_2_08 001 papermask
+face-station/01.05.18/001_06_065_2_12 001 custommask
+face-station/01.02.18/001_01_002_2_08 001 papermask
+face-station/30.05.18/001_04_000_2_08 001 papermask
+face-station/24.05.18/001_06_008_2_08 001 papermask
+face-station/30.05.18/001_07_000_2_08 001 papermask
+face-station/30.05.18/001_05_000_2_08 001 papermask
+face-station/01.02.18/001_01_043_2_12 001 custommask
+face-station/27.02.18/001_03_012_2_08 001 papermask
+face-station/21.02.18/001_03_000_2_12 001 custommask
+face-station/08.05.18/001_07_002_2_12 001 custommask
+face-station/07.02.18/001_02_056_2_08 001 papermask
+face-station/13.02.18/001_03_047_2_12 001 custommask
+face-station/19.02.18/001_02_000_2_12 001 custommask
+face-station/14.03.18/001_04_010_2_08 001 papermask
+face-station/04.06.18/001_06_000_2_12 001 custommask
+face-station/15.02.18/001_03_014_2_12 001 custommask
+face-station/27.02.18/001_01_000_2_12 001 custommask
+face-station/04.06.18/001_04_000_2_12 001 custommask
+face-station/24.01.18/001_01_014_2_12 001 custommask
+face-station/04.06.18/001_05_000_2_12 001 custommask
+face-station/07.02.18/001_02_027_2_08 001 papermask
+face-station/04.06.18/001_07_000_2_12 001 custommask
+face-station/02.02.18/001_01_061_2_12 001 custommask
+face-station/02.05.18/001_05_003_2_08 001 papermask
+face-station/19.02.18/001_02_000_2_08 001 papermask
+face-station/12.02.18/001_03_005_2_08 001 papermask
+face-station/16.05.18/001_07_019_2_08 001 papermask
+face-station/21.02.18/001_03_000_2_08 001 papermask
+face-station/04.05.18/001_05_071_2_12 001 custommask
+face-station/31.01.18/001_01_033_2_08 001 papermask
+face-station/08.02.18/002_03_022_2_81 002 siliconemask
+face-station/27.02.18/002_01_000_2_81 002 siliconemask
+face-station/06.02.18/002_02_001_2_81 002 siliconemask
+face-station/29.05.18/002_04_000_2_81 002 siliconemask
+face-station/23.05.18/002_05_073_2_81 002 siliconemask
+face-station/22.05.18/002_06_018_2_81 002 siliconemask
+face-station/17.01.18/002_01_003_2_81 002 siliconemask
+face-station/31.01.18/002_01_034_2_81 002 siliconemask
+face-station/29.05.18/002_06_000_2_81 002 siliconemask
+face-station/13.02.18/002_03_047_2_81 002 siliconemask
+face-station/14.03.18/002_04_010_2_81 002 siliconemask
+face-station/19.02.18/002_02_000_2_81 002 siliconemask
+face-station/13.02.18/002_02_031_2_81 002 siliconemask
+face-station/29.05.18/002_05_000_2_81 002 siliconemask
+face-station/29.05.18/002_07_000_2_81 002 siliconemask
+face-station/23.05.18/002_07_073_2_81 002 siliconemask
+face-station/22.02.18/002_03_000_2_81 002 siliconemask
+face-station/08.02.18/012_02_054_2_11 012 papermask
+face-station/30.05.18/012_04_000_2_11 012 papermask
+face-station/14.03.18/012_04_010_2_11 012 papermask
+face-station/27.02.18/012_01_000_2_11 012 papermask
+face-station/07.02.18/012_02_027_2_11 012 papermask
+face-station/24.04.18/012_07_067_2_11 012 papermask
+face-station/30.05.18/012_05_000_2_11 012 papermask
+face-station/30.05.18/012_07_000_2_11 012 papermask
+face-station/14.02.18/012_03_003_2_11 012 papermask
+face-station/08.02.18/012_03_034_2_11 012 papermask
+face-station/02.02.18/012_01_057_2_11 012 papermask
+face-station/22.05.18/012_05_008_2_11 012 papermask
+face-station/24.05.18/012_06_005_2_11 012 papermask
+face-station/06.02.18/012_02_024_2_11 012 papermask
+face-station/21.02.18/012_03_000_2_11 012 papermask
+face-station/25.01.18/012_01_012_2_11 012 papermask
+face-station/19.02.18/012_02_000_2_11 012 papermask
+face-station/30.05.18/012_06_000_2_11 012 papermask
+face-station/07.02.18/016_02_030_2_15 016 custommask
+face-station/04.06.18/016_05_000_2_15 016 custommask
+face-station/16.05.18/016_07_070_2_15 016 custommask
+face-station/24.01.18/016_01_011_2_15 016 custommask
+face-station/04.06.18/016_07_000_2_15 016 custommask
+face-station/13.02.18/016_03_059_2_15 016 custommask
+face-station/24.05.18/016_06_005_2_15 016 custommask
+face-station/08.02.18/016_03_022_2_15 016 custommask
+face-station/21.02.18/016_03_000_2_15 016 custommask
+face-station/14.03.18/016_04_007_2_15 016 custommask
+face-station/24.05.18/016_05_012_2_15 016 custommask
+face-station/01.02.18/016_01_042_2_15 016 custommask
+face-station/09.02.18/016_02_060_2_15 016 custommask
+face-station/19.02.18/016_02_000_2_15 016 custommask
+face-station/04.06.18/016_04_000_2_15 016 custommask
+face-station/27.02.18/016_01_000_2_15 016 custommask
+face-station/04.06.18/016_06_000_2_15 016 custommask
+face-station/13.02.18/019_02_031_2_87 019 siliconemask
+face-station/23.05.18/019_07_005_2_87 019 siliconemask
+face-station/24.01.18/019_01_013_2_87 019 siliconemask
+face-station/13.02.18/019_03_042_2_87 019 siliconemask
+face-station/14.03.18/019_04_010_2_87 019 siliconemask
+face-station/27.02.18/019_01_000_2_87 019 siliconemask
+face-station/29.05.18/019_04_000_2_87 019 siliconemask
+face-station/29.05.18/019_05_000_2_87 019 siliconemask
+face-station/14.02.18/019_03_011_2_87 019 siliconemask
+face-station/29.05.18/019_06_000_2_87 019 siliconemask
+face-station/22.02.18/019_03_000_2_87 019 siliconemask
+face-station/19.02.18/019_02_000_2_87 019 siliconemask
+face-station/07.05.18/019_06_071_2_87 019 siliconemask
+face-station/29.05.18/019_07_000_2_87 019 siliconemask
+face-station/06.02.18/019_02_001_2_87 019 siliconemask
+face-station/23.05.18/019_05_072_2_87 019 siliconemask
+face-station/01.02.18/019_01_043_2_87 019 siliconemask
+face-station/28.06.18/064_06_003_2_75 064 siliconemask
+face-station/28.06.18/064_05_000_2_75 064 siliconemask
+face-station/04.07.18/064_05_073_2_75 064 siliconemask
+face-station/28.06.18/064_07_000_2_75 064 siliconemask
+face-station/28.06.18/064_04_007_2_75 064 siliconemask
+face-station/02.07.18/064_07_007_2_75 064 siliconemask
+face-station/28.06.18/064_01_000_2_75 064 siliconemask
+face-station/05.07.18/064_07_073_2_75 064 siliconemask
+face-station/02.07.18/064_05_064_2_75 064 siliconemask
+face-station/28.06.18/064_01_003_2_75 064 siliconemask
+face-station/28.06.18/064_06_000_2_75 064 siliconemask
+face-station/03.07.18/064_06_064_2_75 064 siliconemask
+face-station/28.06.18/064_04_000_2_75 064 siliconemask
+face-station/25.06.18/066_07_019_2_84 066 siliconemask
+face-station/25.06.18/066_06_018_2_84 066 siliconemask
+face-station/29.05.18/066_04_000_2_84 066 siliconemask
+face-station/28.05.18/066_07_000_2_84 066 siliconemask
+face-station/29.05.18/066_06_000_2_84 066 siliconemask
+face-station/20.04.18/066_05_066_2_84 066 siliconemask
+face-station/25.06.18/066_01_006_2_84 066 siliconemask
+face-station/29.05.18/066_05_000_2_84 066 siliconemask
+face-station/22.06.18/066_01_000_2_84 066 siliconemask
+face-station/06.06.18/066_04_018_2_84 066 siliconemask
+face-station/23.05.18/066_06_012_2_84 066 siliconemask
+face-station/08.05.18/066_07_071_2_84 066 siliconemask
+face-station/25.06.18/066_05_004_2_84 066 siliconemask
+face-station/22.06.18/103_01_000_2_96 103 siliconemask
+face-station/25.06.18/103_05_004_2_96 103 siliconemask
+face-station/28.05.18/103_05_000_2_96 103 siliconemask
+face-station/25.06.18/103_06_018_2_96 103 siliconemask
+face-station/28.05.18/103_06_000_2_96 103 siliconemask
+face-station/28.05.18/103_07_000_2_96 103 siliconemask
+face-station/01.05.18/103_05_065_2_96 103 siliconemask
+face-station/25.06.18/103_01_006_2_96 103 siliconemask
+face-station/04.05.18/103_07_003_2_96 103 siliconemask
+face-station/06.06.18/103_04_018_2_96 103 siliconemask
+face-station/25.06.18/103_07_019_2_96 103 siliconemask
+face-station/28.05.18/103_04_000_2_96 103 siliconemask
+face-station/04.05.18/103_06_038_2_96 103 siliconemask
+face-station/25.06.18/104_01_006_2_93 104 siliconemask
+face-station/25.06.18/104_05_004_2_93 104 siliconemask
+face-station/16.05.18/104_07_004_2_93 104 siliconemask
+face-station/29.05.18/104_06_000_2_93 104 siliconemask
+face-station/29.05.18/104_04_000_2_93 104 siliconemask
+face-station/25.06.18/104_06_018_2_93 104 siliconemask
+face-station/29.05.18/104_05_000_2_93 104 siliconemask
+face-station/25.06.18/104_07_019_2_93 104 siliconemask
+face-station/22.06.18/104_01_000_2_93 104 siliconemask
+face-station/30.04.18/104_05_064_2_93 104 siliconemask
+face-station/28.05.18/104_07_000_2_93 104 siliconemask
+face-station/07.05.18/104_06_002_2_93 104 siliconemask
+face-station/06.06.18/104_04_018_2_93 104 siliconemask
+face-station/01.05.18/106_05_065_2_99 106 siliconemask
+face-station/28.05.18/106_07_000_2_99 106 siliconemask
+face-station/25.06.18/106_01_006_2_99 106 siliconemask
+face-station/28.05.18/106_05_000_2_99 106 siliconemask
+face-station/28.05.18/106_06_000_2_99 106 siliconemask
+face-station/04.05.18/106_06_038_2_99 106 siliconemask
+face-station/25.06.18/106_07_019_2_99 106 siliconemask
+face-station/06.06.18/106_04_018_2_99 106 siliconemask
+face-station/25.06.18/106_05_004_2_99 106 siliconemask
+face-station/04.05.18/106_07_003_2_99 106 siliconemask
+face-station/25.06.18/106_06_018_2_99 106 siliconemask
+face-station/28.05.18/106_04_000_2_99 106 siliconemask
+face-station/22.06.18/106_01_000_2_99 106 siliconemask
+face-station/05.07.18/109_07_073_2_78 109 siliconemask
+face-station/28.06.18/109_01_003_2_78 109 siliconemask
+face-station/28.06.18/109_04_000_2_78 109 siliconemask
+face-station/03.07.18/109_06_064_2_78 109 siliconemask
+face-station/02.07.18/109_07_007_2_78 109 siliconemask
+face-station/04.07.18/109_05_073_2_78 109 siliconemask
+face-station/28.06.18/109_01_000_2_78 109 siliconemask
+face-station/28.06.18/109_06_000_2_78 109 siliconemask
+face-station/28.06.18/109_04_007_2_78 109 siliconemask
+face-station/28.06.18/109_06_003_2_78 109 siliconemask
+face-station/28.06.18/109_05_000_2_78 109 siliconemask
+face-station/02.07.18/109_05_064_2_78 109 siliconemask
+face-station/28.06.18/109_07_000_2_78 109 siliconemask
\ No newline at end of file
diff --git a/bob/paper/nir_patch_pooling/database/lists/grandtest/train/for_real.lst b/bob/paper/nir_patch_pooling/database/lists/grandtest/train/for_real.lst
new file mode 100644
index 0000000000000000000000000000000000000000..4e210ad31ca49771e4f2b52fb39006c51fdaacb6
--- /dev/null
+++ b/bob/paper/nir_patch_pooling/database/lists/grandtest/train/for_real.lst
@@ -0,0 +1,86 @@
+face-station/07.05.18/002_06_000_0_00 002
+face-station/08.05.18/002_07_000_0_00 002
+face-station/04.05.18/002_05_000_0_00 002
+face-station/08.02.18/002_02_000_0_00 002
+face-station/08.02.18/002_03_000_0_00 002
+face-station/01.02.18/002_01_000_0_00 002
+face-station/15.05.18/005_05_000_0_00 005
+face-station/23.05.18/005_07_000_0_00 005
+face-station/12.02.18/005_03_000_0_00 005
+face-station/08.02.18/005_02_000_0_00 005
+face-station/18.01.18/005_01_000_0_00 005
+face-station/24.05.18/005_06_000_0_00 005
+face-station/25.05.18/014_07_000_0_00 014
+face-station/07.02.18/014_02_000_0_00 014
+face-station/15.02.18/014_03_000_0_00 014
+face-station/24.01.18/014_01_000_0_00 014
+face-station/24.05.18/014_06_000_0_00 014
+face-station/24.05.18/014_05_000_0_00 014
+face-station/25.01.18/015_01_000_0_00 015
+face-station/12.02.18/015_03_000_0_00 015
+face-station/06.02.18/015_02_000_0_00 015
+face-station/12.02.18/025_03_000_0_00 025
+face-station/06.02.18/025_02_000_0_00 025
+face-station/29.01.18/025_01_000_0_00 025
+face-station/30.01.18/028_01_000_0_00 028
+face-station/07.02.18/028_02_000_0_00 028
+face-station/07.02.18/028_03_000_0_00 028
+face-station/31.01.18/032_01_000_0_00 032
+face-station/08.02.18/032_02_000_0_00 032
+face-station/14.02.18/032_03_000_0_00 032
+face-station/31.01.18/034_01_000_0_00 034
+face-station/08.02.18/034_02_000_0_00 034
+face-station/08.02.18/034_03_000_0_00 034
+face-station/04.05.18/038_06_000_0_00 038
+face-station/07.05.18/038_07_000_0_00 038
+face-station/01.05.18/038_05_000_0_00 038
+face-station/08.02.18/038_02_000_0_00 038
+face-station/14.02.18/038_03_000_0_00 038
+face-station/01.02.18/038_01_000_0_00 038
+face-station/01.02.18/040_01_000_0_00 040
+face-station/01.02.18/041_01_000_0_00 041
+face-station/07.02.18/042_02_000_0_00 042
+face-station/13.02.18/042_03_000_0_00 042
+face-station/01.02.18/042_01_000_0_00 042
+face-station/06.02.18/046_02_000_0_00 046
+face-station/13.02.18/046_03_000_0_00 046
+face-station/01.02.18/046_01_000_0_00 046
+face-station/09.02.18/048_03_000_0_00 048
+face-station/02.02.18/048_01_000_0_00 048
+face-station/09.02.18/048_02_000_0_00 048
+face-station/26.01.18/008_01_000_0_00 008
+face-station/07.02.18/008_02_000_0_00 008
+face-station/14.02.18/008_03_000_0_00 008
+face-station/22.05.18/008_05_000_0_00 008
+face-station/24.05.18/008_06_000_0_00 008
+face-station/25.05.18/008_07_000_0_00 008
+face-station/02.02.18/056_01_000_0_00 056
+face-station/07.02.18/056_02_000_0_00 056
+face-station/12.02.18/056_03_000_0_00 056
+face-station/02.02.18/059_01_000_0_00 059
+face-station/13.02.18/059_03_000_0_00 059
+face-station/07.02.18/059_02_000_0_00 059
+face-station/01.05.18/065_05_000_0_00 065
+face-station/01.05.18/065_07_000_0_00 065
+face-station/01.05.18/065_06_000_0_00 065
+face-station/23.04.18/066_06_000_0_00 066
+face-station/23.04.18/066_07_000_0_00 066
+face-station/23.04.18/066_05_000_0_00 066
+face-station/22.05.18/069_06_000_0_00 069
+face-station/15.05.18/069_05_000_0_00 069
+face-station/16.05.18/069_07_000_0_00 069
+face-station/04.05.18/071_05_000_0_00 071
+face-station/08.05.18/071_07_000_0_00 071
+face-station/07.05.18/071_06_000_0_00 071
+face-station/23.05.18/073_07_000_0_00 073
+face-station/24.05.18/073_06_000_0_00 073
+face-station/23.05.18/073_05_000_0_00 073
+face-station/15.05.18/004_05_000_0_00 004
+face-station/04.05.18/004_06_000_0_00 004
+face-station/16.05.18/004_07_000_0_00 004
+face-station/17.01.18/004_01_000_0_00 004
+face-station/07.02.18/004_02_000_0_00 004
+face-station/15.02.18/004_03_000_0_00 004
+face-station/09.02.18/049_03_000_0_00 049
+face-station/02.02.18/049_01_000_0_00 049
+face-station/09.02.18/049_02_000_0_00 049
\ No newline at end of file
diff --git a/bob/paper/nir_patch_pooling/database/lists/mlfp/cv1/dev/for_attack.lst b/bob/paper/nir_patch_pooling/database/lists/mlfp/cv1/dev/for_attack.lst
new file mode 100644
index 0000000000000000000000000000000000000000..f93078b211b115a296e4161afd4b28e21c284bcf
--- /dev/null
+++ b/bob/paper/nir_patch_pooling/database/lists/mlfp/cv1/dev/for_attack.lst
@@ -0,0 +1,280 @@
+Session1/Indoor/04/Mask1/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask10/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask2/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask3/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask4/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask5/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask6/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask7/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask8/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask9/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask1/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask10/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask2/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask3/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask4/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask5/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask6/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask7/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask8/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask9/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask1/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask10/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask2/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask3/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask4/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask5/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask6/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask7/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask8/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask9/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask1/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask10/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask2/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask3/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask4/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask5/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask6/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask7/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask8/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask9/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask1/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask10/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask2/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask3/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask4/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask5/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask6/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask7/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask8/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask9/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask1/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask10/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask2/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask3/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask4/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask5/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask6/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask7/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask8/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask9/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask1/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask10/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask2/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask3/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask4/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask5/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask6/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask7/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask8/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask9/Infrared/Infrared 111 attack
\ No newline at end of file
diff --git a/bob/paper/nir_patch_pooling/database/lists/mlfp/cv1/dev/for_real.lst b/bob/paper/nir_patch_pooling/database/lists/mlfp/cv1/dev/for_real.lst
new file mode 100644
index 0000000000000000000000000000000000000000..d495a6c715a25345275cb2ab7dd787da0d78584c
--- /dev/null
+++ b/bob/paper/nir_patch_pooling/database/lists/mlfp/cv1/dev/for_real.lst
@@ -0,0 +1,28 @@
+Session1/Indoor/04/Real/Infrared/Infrared 0
+Session1/Indoor/05/Real/Infrared/Infrared 0
+Session1/Indoor/06/Real/Infrared/Infrared 0
+Session1/Indoor/07/Real/Infrared/Infrared 0
+Session1/Indoor/08/Real/Infrared/Infrared 0
+Session1/Indoor/09/Real/Infrared/Infrared 0
+Session1/Indoor/10/Real/Infrared/Infrared 0
+Session1/Outdoor/04/Real/Infrared/Infrared 0
+Session1/Outdoor/05/Real/Infrared/Infrared 0
+Session1/Outdoor/06/Real/Infrared/Infrared 0
+Session1/Outdoor/07/Real/Infrared/Infrared 0
+Session1/Outdoor/08/Real/Infrared/Infrared 0
+Session1/Outdoor/09/Real/Infrared/Infrared 0
+Session1/Outdoor/10/Real/Infrared/Infrared 0
+Session2/Indoor/04/Real/Infrared/Infrared 0
+Session2/Indoor/05/Real/Infrared/Infrared 0
+Session2/Indoor/06/Real/Infrared/Infrared 0
+Session2/Indoor/07/Real/Infrared/Infrared 0
+Session2/Indoor/08/Real/Infrared/Infrared 0
+Session2/Indoor/09/Real/Infrared/Infrared 0
+Session2/Indoor/10/Real/Infrared/Infrared 0
+Session2/Outdoor/04/Real/Infrared/Infrared 0
+Session2/Outdoor/05/Real/Infrared/Infrared 0
+Session2/Outdoor/06/Real/Infrared/Infrared 0
+Session2/Outdoor/07/Real/Infrared/Infrared 0
+Session2/Outdoor/08/Real/Infrared/Infrared 0
+Session2/Outdoor/09/Real/Infrared/Infrared 0
+Session2/Outdoor/10/Real/Infrared/Infrared 0
\ No newline at end of file
diff --git a/bob/paper/nir_patch_pooling/database/lists/mlfp/cv1/train/for_attack.lst b/bob/paper/nir_patch_pooling/database/lists/mlfp/cv1/train/for_attack.lst
new file mode 100644
index 0000000000000000000000000000000000000000..0bfdd55b590604fd1e311cb1324edfc8632f9dfd
--- /dev/null
+++ b/bob/paper/nir_patch_pooling/database/lists/mlfp/cv1/train/for_attack.lst
@@ -0,0 +1,120 @@
+Session1/Indoor/01/M1/Infrared/Infrared 111 attack
+Session1/Indoor/01/M10/Infrared/Infrared 111 attack
+Session1/Indoor/01/M2/Infrared/Infrared 111 attack
+Session1/Indoor/01/M3/Infrared/Infrared 111 attack
+Session1/Indoor/01/M4/Infrared/Infrared 111 attack
+Session1/Indoor/01/M5/Infrared/Infrared 111 attack
+Session1/Indoor/01/M6/Infrared/Infrared 111 attack
+Session1/Indoor/01/M7/Infrared/Infrared 111 attack
+Session1/Indoor/01/M8/Infrared/Infrared 111 attack
+Session1/Indoor/01/M9/Infrared/Infrared 111 attack
+Session1/Indoor/02/M1/Infrared/Infrared 111 attack
+Session1/Indoor/02/M10/Infrared/Infrared 111 attack
+Session1/Indoor/02/M2/Infrared/Infrared 111 attack
+Session1/Indoor/02/M3/Infrared/Infrared 111 attack
+Session1/Indoor/02/M4/Infrared/Infrared 111 attack
+Session1/Indoor/02/M5/Infrared/Infrared 111 attack
+Session1/Indoor/02/M6/Infrared/Infrared 111 attack
+Session1/Indoor/02/M7/Infrared/Infrared 111 attack
+Session1/Indoor/02/M8/Infrared/Infrared 111 attack
+Session1/Indoor/02/M9/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask1/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask10/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask2/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask3/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask4/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask5/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask6/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask7/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask8/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask9/Infrared/Infrared 111 attack
\ No newline at end of file
diff --git a/bob/paper/nir_patch_pooling/database/lists/mlfp/cv1/train/for_real.lst b/bob/paper/nir_patch_pooling/database/lists/mlfp/cv1/train/for_real.lst
new file mode 100644
index 0000000000000000000000000000000000000000..61b23f9a93656948a939d8052c1b5d546acfd00b
--- /dev/null
+++ b/bob/paper/nir_patch_pooling/database/lists/mlfp/cv1/train/for_real.lst
@@ -0,0 +1,12 @@
+Session1/Indoor/01/R/Infrared/Infrared 0
+Session1/Indoor/02/Real/Infrared/Infrared 0
+Session1/Indoor/03/Real/Infrared/Infrared 0
+Session1/Outdoor/01/Real/Infrared/Infrared 0
+Session1/Outdoor/02/Real/Infrared/Infrared 0
+Session1/Outdoor/03/Real/Infrared/Infrared 0
+Session2/Indoor/01/Real/Infrared/Infrared 0
+Session2/Indoor/02/Real/Infrared/Infrared 0
+Session2/Indoor/03/Real/Infrared/Infrared 0
+Session2/Outdoor/01/Real/Infrared/Infrared 0
+Session2/Outdoor/02/Real/Infrared/Infrared 0
+Session2/Outdoor/03/Real/Infrared/Infrared 0
\ No newline at end of file
diff --git a/bob/paper/nir_patch_pooling/database/lists/mlfp/cv2/dev/for_attack.lst b/bob/paper/nir_patch_pooling/database/lists/mlfp/cv2/dev/for_attack.lst
new file mode 100644
index 0000000000000000000000000000000000000000..5586f93889b6236ce3df3400559ccdfb2435ba29
--- /dev/null
+++ b/bob/paper/nir_patch_pooling/database/lists/mlfp/cv2/dev/for_attack.lst
@@ -0,0 +1,280 @@
+Session1/Indoor/01/M1/Infrared/Infrared 111 attack
+Session1/Indoor/01/M10/Infrared/Infrared 111 attack
+Session1/Indoor/01/M2/Infrared/Infrared 111 attack
+Session1/Indoor/01/M3/Infrared/Infrared 111 attack
+Session1/Indoor/01/M4/Infrared/Infrared 111 attack
+Session1/Indoor/01/M5/Infrared/Infrared 111 attack
+Session1/Indoor/01/M6/Infrared/Infrared 111 attack
+Session1/Indoor/01/M7/Infrared/Infrared 111 attack
+Session1/Indoor/01/M8/Infrared/Infrared 111 attack
+Session1/Indoor/01/M9/Infrared/Infrared 111 attack
+Session1/Indoor/02/M1/Infrared/Infrared 111 attack
+Session1/Indoor/02/M10/Infrared/Infrared 111 attack
+Session1/Indoor/02/M2/Infrared/Infrared 111 attack
+Session1/Indoor/02/M3/Infrared/Infrared 111 attack
+Session1/Indoor/02/M4/Infrared/Infrared 111 attack
+Session1/Indoor/02/M5/Infrared/Infrared 111 attack
+Session1/Indoor/02/M6/Infrared/Infrared 111 attack
+Session1/Indoor/02/M7/Infrared/Infrared 111 attack
+Session1/Indoor/02/M8/Infrared/Infrared 111 attack
+Session1/Indoor/02/M9/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask1/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask10/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask2/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask3/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask4/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask5/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask6/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask7/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask8/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask9/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask1/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask10/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask2/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask3/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask4/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask5/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask6/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask7/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask8/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask9/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask1/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask10/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask2/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask3/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask4/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask5/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask6/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask7/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask8/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask9/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask1/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask10/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask2/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask3/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask4/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask5/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask6/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask7/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask8/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask9/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask1/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask10/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask2/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask3/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask4/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask5/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask6/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask7/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask8/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask9/Infrared/Infrared 111 attack
\ No newline at end of file
diff --git a/bob/paper/nir_patch_pooling/database/lists/mlfp/cv2/dev/for_real.lst b/bob/paper/nir_patch_pooling/database/lists/mlfp/cv2/dev/for_real.lst
new file mode 100644
index 0000000000000000000000000000000000000000..6e381014660d5120c72b564113183520f5791b75
--- /dev/null
+++ b/bob/paper/nir_patch_pooling/database/lists/mlfp/cv2/dev/for_real.lst
@@ -0,0 +1,28 @@
+Session1/Indoor/01/R/Infrared/Infrared 0
+Session1/Indoor/02/Real/Infrared/Infrared 0
+Session1/Indoor/03/Real/Infrared/Infrared 0
+Session1/Indoor/07/Real/Infrared/Infrared 0
+Session1/Indoor/08/Real/Infrared/Infrared 0
+Session1/Indoor/09/Real/Infrared/Infrared 0
+Session1/Indoor/10/Real/Infrared/Infrared 0
+Session1/Outdoor/01/Real/Infrared/Infrared 0
+Session1/Outdoor/02/Real/Infrared/Infrared 0
+Session1/Outdoor/03/Real/Infrared/Infrared 0
+Session1/Outdoor/07/Real/Infrared/Infrared 0
+Session1/Outdoor/08/Real/Infrared/Infrared 0
+Session1/Outdoor/09/Real/Infrared/Infrared 0
+Session1/Outdoor/10/Real/Infrared/Infrared 0
+Session2/Indoor/01/Real/Infrared/Infrared 0
+Session2/Indoor/02/Real/Infrared/Infrared 0
+Session2/Indoor/03/Real/Infrared/Infrared 0
+Session2/Indoor/07/Real/Infrared/Infrared 0
+Session2/Indoor/08/Real/Infrared/Infrared 0
+Session2/Indoor/09/Real/Infrared/Infrared 0
+Session2/Indoor/10/Real/Infrared/Infrared 0
+Session2/Outdoor/01/Real/Infrared/Infrared 0
+Session2/Outdoor/02/Real/Infrared/Infrared 0
+Session2/Outdoor/03/Real/Infrared/Infrared 0
+Session2/Outdoor/07/Real/Infrared/Infrared 0
+Session2/Outdoor/08/Real/Infrared/Infrared 0
+Session2/Outdoor/09/Real/Infrared/Infrared 0
+Session2/Outdoor/10/Real/Infrared/Infrared 0
\ No newline at end of file
diff --git a/bob/paper/nir_patch_pooling/database/lists/mlfp/cv2/train/for_attack.lst b/bob/paper/nir_patch_pooling/database/lists/mlfp/cv2/train/for_attack.lst
new file mode 100644
index 0000000000000000000000000000000000000000..bcda4ec47eee61f6ecac70c561c9cc5e03b6fe48
--- /dev/null
+++ b/bob/paper/nir_patch_pooling/database/lists/mlfp/cv2/train/for_attack.lst
@@ -0,0 +1,120 @@
+Session1/Indoor/04/Mask1/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask10/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask2/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask3/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask4/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask5/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask6/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask7/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask8/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask9/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask1/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask10/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask2/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask3/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask4/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask5/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask6/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask7/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask8/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask9/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask1/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask10/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask2/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask3/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask4/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask5/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask6/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask7/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask8/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask9/Infrared/Infrared 111 attack
\ No newline at end of file
diff --git a/bob/paper/nir_patch_pooling/database/lists/mlfp/cv2/train/for_real.lst b/bob/paper/nir_patch_pooling/database/lists/mlfp/cv2/train/for_real.lst
new file mode 100644
index 0000000000000000000000000000000000000000..1535fb4fac57b162f1c5c7306294081f35351a3a
--- /dev/null
+++ b/bob/paper/nir_patch_pooling/database/lists/mlfp/cv2/train/for_real.lst
@@ -0,0 +1,12 @@
+Session1/Indoor/04/Real/Infrared/Infrared 0
+Session1/Indoor/05/Real/Infrared/Infrared 0
+Session1/Indoor/06/Real/Infrared/Infrared 0
+Session1/Outdoor/04/Real/Infrared/Infrared 0
+Session1/Outdoor/05/Real/Infrared/Infrared 0
+Session1/Outdoor/06/Real/Infrared/Infrared 0
+Session2/Indoor/04/Real/Infrared/Infrared 0
+Session2/Indoor/05/Real/Infrared/Infrared 0
+Session2/Indoor/06/Real/Infrared/Infrared 0
+Session2/Outdoor/04/Real/Infrared/Infrared 0
+Session2/Outdoor/05/Real/Infrared/Infrared 0
+Session2/Outdoor/06/Real/Infrared/Infrared 0
\ No newline at end of file
diff --git a/bob/paper/nir_patch_pooling/database/lists/mlfp/cv3/dev/for_attack.lst b/bob/paper/nir_patch_pooling/database/lists/mlfp/cv3/dev/for_attack.lst
new file mode 100644
index 0000000000000000000000000000000000000000..4b8c4c6b5da7588be6d7e3985c6799f964950489
--- /dev/null
+++ b/bob/paper/nir_patch_pooling/database/lists/mlfp/cv3/dev/for_attack.lst
@@ -0,0 +1,240 @@
+Session1/Indoor/01/M1/Infrared/Infrared 111 attack
+Session1/Indoor/01/M10/Infrared/Infrared 111 attack
+Session1/Indoor/01/M2/Infrared/Infrared 111 attack
+Session1/Indoor/01/M3/Infrared/Infrared 111 attack
+Session1/Indoor/01/M4/Infrared/Infrared 111 attack
+Session1/Indoor/01/M5/Infrared/Infrared 111 attack
+Session1/Indoor/01/M6/Infrared/Infrared 111 attack
+Session1/Indoor/01/M7/Infrared/Infrared 111 attack
+Session1/Indoor/01/M8/Infrared/Infrared 111 attack
+Session1/Indoor/01/M9/Infrared/Infrared 111 attack
+Session1/Indoor/02/M1/Infrared/Infrared 111 attack
+Session1/Indoor/02/M10/Infrared/Infrared 111 attack
+Session1/Indoor/02/M2/Infrared/Infrared 111 attack
+Session1/Indoor/02/M3/Infrared/Infrared 111 attack
+Session1/Indoor/02/M4/Infrared/Infrared 111 attack
+Session1/Indoor/02/M5/Infrared/Infrared 111 attack
+Session1/Indoor/02/M6/Infrared/Infrared 111 attack
+Session1/Indoor/02/M7/Infrared/Infrared 111 attack
+Session1/Indoor/02/M8/Infrared/Infrared 111 attack
+Session1/Indoor/02/M9/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask1/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask10/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask2/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask3/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask4/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask5/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask6/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask7/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask8/Infrared/Infrared 111 attack
+Session1/Indoor/03/Mask9/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask1/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask10/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask2/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask3/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask4/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask5/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask6/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask7/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask8/Infrared/Infrared 111 attack
+Session1/Indoor/04/Mask9/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask1/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask10/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask2/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask3/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask4/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask5/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask6/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask7/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask8/Infrared/Infrared 111 attack
+Session1/Indoor/05/Mask9/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask1/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask10/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask2/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask3/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask4/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask5/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask6/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask7/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask8/Infrared/Infrared 111 attack
+Session1/Indoor/06/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/01/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/02/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/03/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/04/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/05/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/06/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/01/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/02/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/03/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/04/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/05/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/06/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/01/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/02/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/03/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/04/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/05/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/06/Mask9/Infrared/Infrared 111 attack
\ No newline at end of file
diff --git a/bob/paper/nir_patch_pooling/database/lists/mlfp/cv3/dev/for_real.lst b/bob/paper/nir_patch_pooling/database/lists/mlfp/cv3/dev/for_real.lst
new file mode 100644
index 0000000000000000000000000000000000000000..b4e9d2c37b4c4b74023c8c8565fe269a3ae6cdcb
--- /dev/null
+++ b/bob/paper/nir_patch_pooling/database/lists/mlfp/cv3/dev/for_real.lst
@@ -0,0 +1,24 @@
+Session1/Indoor/01/R/Infrared/Infrared 0
+Session1/Indoor/02/Real/Infrared/Infrared 0
+Session1/Indoor/03/Real/Infrared/Infrared 0
+Session1/Indoor/04/Real/Infrared/Infrared 0
+Session1/Indoor/05/Real/Infrared/Infrared 0
+Session1/Indoor/06/Real/Infrared/Infrared 0
+Session1/Outdoor/01/Real/Infrared/Infrared 0
+Session1/Outdoor/02/Real/Infrared/Infrared 0
+Session1/Outdoor/03/Real/Infrared/Infrared 0
+Session1/Outdoor/04/Real/Infrared/Infrared 0
+Session1/Outdoor/05/Real/Infrared/Infrared 0
+Session1/Outdoor/06/Real/Infrared/Infrared 0
+Session2/Indoor/01/Real/Infrared/Infrared 0
+Session2/Indoor/02/Real/Infrared/Infrared 0
+Session2/Indoor/03/Real/Infrared/Infrared 0
+Session2/Indoor/04/Real/Infrared/Infrared 0
+Session2/Indoor/05/Real/Infrared/Infrared 0
+Session2/Indoor/06/Real/Infrared/Infrared 0
+Session2/Outdoor/01/Real/Infrared/Infrared 0
+Session2/Outdoor/02/Real/Infrared/Infrared 0
+Session2/Outdoor/03/Real/Infrared/Infrared 0
+Session2/Outdoor/04/Real/Infrared/Infrared 0
+Session2/Outdoor/05/Real/Infrared/Infrared 0
+Session2/Outdoor/06/Real/Infrared/Infrared 0
\ No newline at end of file
diff --git a/bob/paper/nir_patch_pooling/database/lists/mlfp/cv3/train/for_attack.lst b/bob/paper/nir_patch_pooling/database/lists/mlfp/cv3/train/for_attack.lst
new file mode 100644
index 0000000000000000000000000000000000000000..62fc69f3438354960ef0f855c3ee16385f4f408e
--- /dev/null
+++ b/bob/paper/nir_patch_pooling/database/lists/mlfp/cv3/train/for_attack.lst
@@ -0,0 +1,160 @@
+Session1/Indoor/07/Mask1/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask10/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask2/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask3/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask4/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask5/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask6/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask7/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask8/Infrared/Infrared 111 attack
+Session1/Indoor/07/Mask9/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask1/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask10/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask2/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask3/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask4/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask5/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask6/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask7/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask8/Infrared/Infrared 111 attack
+Session1/Indoor/08/Mask9/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask1/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask10/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask2/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask3/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask4/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask5/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask6/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask7/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask8/Infrared/Infrared 111 attack
+Session1/Indoor/09/Mask9/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask1/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask10/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask2/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask3/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask4/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask5/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask6/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask7/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask8/Infrared/Infrared 111 attack
+Session1/Indoor/10/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/07/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/08/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/09/Mask9/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask1/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask10/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask2/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask3/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask4/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask5/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask6/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask7/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask8/Infrared/Infrared 111 attack
+Session1/Outdoor/10/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/07/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/08/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/09/Mask9/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask1/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask10/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask2/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask3/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask4/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask5/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask6/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask7/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask8/Infrared/Infrared 111 attack
+Session2/Indoor/10/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/07/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/08/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/09/Mask9/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask1/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask10/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask2/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask3/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask4/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask5/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask6/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask7/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask8/Infrared/Infrared 111 attack
+Session2/Outdoor/10/Mask9/Infrared/Infrared 111 attack
\ No newline at end of file
diff --git a/bob/paper/nir_patch_pooling/database/lists/mlfp/cv3/train/for_real.lst b/bob/paper/nir_patch_pooling/database/lists/mlfp/cv3/train/for_real.lst
new file mode 100644
index 0000000000000000000000000000000000000000..761c6fd3b3e3bdc311ef663d8edef4b545551f9b
--- /dev/null
+++ b/bob/paper/nir_patch_pooling/database/lists/mlfp/cv3/train/for_real.lst
@@ -0,0 +1,16 @@
+Session1/Indoor/07/Real/Infrared/Infrared 0
+Session1/Indoor/08/Real/Infrared/Infrared 0
+Session1/Indoor/09/Real/Infrared/Infrared 0
+Session1/Indoor/10/Real/Infrared/Infrared 0
+Session1/Outdoor/07/Real/Infrared/Infrared 0
+Session1/Outdoor/08/Real/Infrared/Infrared 0
+Session1/Outdoor/09/Real/Infrared/Infrared 0
+Session1/Outdoor/10/Real/Infrared/Infrared 0
+Session2/Indoor/07/Real/Infrared/Infrared 0
+Session2/Indoor/08/Real/Infrared/Infrared 0
+Session2/Indoor/09/Real/Infrared/Infrared 0
+Session2/Indoor/10/Real/Infrared/Infrared 0
+Session2/Outdoor/07/Real/Infrared/Infrared 0
+Session2/Outdoor/08/Real/Infrared/Infrared 0
+Session2/Outdoor/09/Real/Infrared/Infrared 0
+Session2/Outdoor/10/Real/Infrared/Infrared 0
\ No newline at end of file
diff --git a/bob/paper/nir_patch_pooling/database/mlfp.py b/bob/paper/nir_patch_pooling/database/mlfp.py
new file mode 100644
index 0000000000000000000000000000000000000000..a5b971161e38c4007ef628aed482fc9d451abab0
--- /dev/null
+++ b/bob/paper/nir_patch_pooling/database/mlfp.py
@@ -0,0 +1,134 @@
+#!/usr/bin/env python2
+# -*- coding: utf-8 -*-
+
+"""
+Implementation of dataset interface of MLFP for PAD. 
+@author: Ketan Kotwal
+
+"""
+
+# Imports
+from bob.pad.base.database import FileListPadDatabase
+from bob.pad.base.database import PadFile
+from bob.pad.face.database import VideoPadFile
+from bob.bio.video import FrameSelector, FrameContainer
+import bob.io.base
+
+import json
+import numpy as np
+import os, h5py
+import pkg_resources
+
+import logging
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.INFO)
+
+class RGBPadFile(VideoPadFile):
+    """
+    A high level implementation of the File class for the RGB images database.
+    """
+
+    def __init__(self, attack_type, client_id, path, file_id=None):
+
+        super(RGBPadFile, self).__init__(attack_type, client_id, path, file_id)
+
+#----------------------------------------------------------
+
+    def load(self, directory=None, extension=None, frame_selector=FrameSelector(selection_style='all')):
+        """
+        Overridden version of the load method defined in the ``VideoPadFile``.
+
+        **Parameters:**
+
+        ``directory`` : :py:class:`str`
+            String containing the path to the MIFS database.
+            Default: None
+
+        ``extension`` : :py:class:`str`
+            Extension of the video files in the MIFS database.
+            Default: None
+
+        ``frame_selector`` : ``FrameSelector``
+            The frame selector to use.
+
+        **Returns:**
+
+        ``video_data`` : FrameContainer
+            Video data stored in the FrameContainer, see ``bob.bio.video.utils.FrameContainer``
+            for further details.
+        """
+
+
+        path = self.make_path(directory=directory, extension=extension)  
+
+        fc = FrameContainer()
+        data = h5py.File(path)
+        for i, data1 in enumerate(data.keys()):
+            frame = data[data1]["array"].value
+            fc.add(i, frame, None)
+
+        data.close()
+        #data = np.expand_dims(data, axis=0)  # upgrade to 4D (video)
+        #video_data = frame_selector(data)  # video data
+
+        return fc
+
+#----------------------------------------------------------
+
+#----------------------------------------------------------
+class MLFPDatabase(FileListPadDatabase):
+    """
+    A high level implementation of the Database class for the MLFP
+    dataset.
+    """
+
+    def __init__(
+            self,
+            name = "MLFP",
+            original_directory = None,
+            original_extension = ".hdf5",
+            protocol = "grandtest",
+            annotation_directory = None,
+            pad_file_class = RGBPadFile,
+            **kwargs):
+
+        self.annotation_directory = annotation_directory
+        filelists_directory = pkg_resources.resource_filename( __name__, "/lists/mlfp/")
+
+        super(MLFPDatabase, self).__init__(
+            filelists_directory=filelists_directory,
+            name=name,
+            protocol=protocol,
+            original_directory=original_directory,
+            original_extension=original_extension,
+            pad_file_class=pad_file_class,
+            annotation_directory=annotation_directory,
+            **kwargs)
+
+        logger.info("Dataset: {}".format(self.name))
+        logger.info("Original directory: {}; Annotation directory: {}".format(self.original_directory, self.annotation_directory))
+
+#----------------------------------------------------------
+ 
+    def annotations(self, f):
+
+        file_path = os.path.join(self.annotation_directory, f.path + ".json")
+
+        # if file exists, load the annotations
+        if os.path.isfile(file_path): 
+
+            with open(file_path, "r") as json_file:
+                annotations = json.load(json_file)
+               
+            if not annotations:  # if dictionary is empty
+                logger.warning("Empty annotations for %s", f.path)
+                return None
+            return annotations
+
+        else: 
+            logger.warning("Annotation file for %s does not exist. (Overall path: %s)", f.path, file_path)
+            return None
+
+#----------------------------------------------------------
+
+
diff --git a/bob/paper/nir_patch_pooling/database/wmca_mask.py b/bob/paper/nir_patch_pooling/database/wmca_mask.py
new file mode 100644
index 0000000000000000000000000000000000000000..e8c5e0b274768b453b76f717962fceb55e14c2e8
--- /dev/null
+++ b/bob/paper/nir_patch_pooling/database/wmca_mask.py
@@ -0,0 +1,260 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+Implementation of dataset interface of WMCA Masks for PAD. 
+@author: Ketan Kotwal
+
+"""
+
+# Imports
+from bob.pad.base.database import FileListPadDatabase, PadFile
+from bob.pad.face.database.batl import BatlPadFile
+from bob.db.batl.models import VideoFile
+from bob.extension import rc
+from bob.bio.video.utils import FrameSelector, FrameContainer
+from bob.pad.face.preprocessor.FaceCropAlign import detect_face_landmarks_in_image
+
+import json
+import os
+import bob.io.base
+import pkg_resources
+#---
+
+# Constants
+valid_protocols = ["grandtest", "cv"]
+stream_batl_convention = {"nir" : "infrared", "nirhq" : "infrared_high_def"}
+
+#--------
+
+class File(VideoFile):
+    def __init__(self, path, client_id, session_id, presenter_id, type_id, pai_id):
+
+        super(File, self).__init__(
+            path = path,
+            client_id = client_id,
+            session_id = session_id,
+            presenter_id = presenter_id,
+            type_id = type_id,
+            pai_id = pai_id)
+
+        self.id = path
+ 
+    def load(self, directory=None, extension=None,
+            frame_selector=FrameSelector()):
+
+        path = self.make_path(directory, extension)
+        print(path)
+        
+        if path.endswith('hdf5'):
+            with bob.io.base.HDF5File(path) as f:
+                return FrameContainer(hdf5=f)
+        else:
+            raise NotImplementedError    
+
+
+#---------
+
+class MaskDatabase(FileListPadDatabase):
+    """
+    A high level implementation of the Database class for the WMCA Mask PAD
+    database. 
+    """
+
+    def __init__(
+            self,
+            name="Mask Database",
+            original_directory=None,
+            original_extension=".h5",
+            protocol="grandtest",
+            annotation_directory=None,
+            pad_file_class = BatlPadFile,
+            low_level_pad_file_class = File,
+            landmark_detect_method = "mtcnn",
+            **kwargs
+            ):
+
+
+        """
+        **Parameters:**
+
+        ``original_directory`` : str or None
+            original directory refers to the location of XCSMAD parent directory 
+
+        ``original_extension`` : str or None
+            extension of original data
+
+        ``groups`` : str or [str]
+            The groups for which the clients should be returned.
+            Usually, groups are one or more elements of ['train', 'dev', 'eval'].
+            Default: ['train', 'dev', 'eval'].
+
+        ``protocol`` : str
+            The protocol for which the clients should be retrieved.
+            Default: 'grandtest'.
+
+        """
+
+        filelists_directory = pkg_resources.resource_filename( __name__, "lists/")
+        self.filelists_directory = filelists_directory
+
+        # init the parent class using super.
+        super(MaskDatabase, self).__init__(
+            filelists_directory = filelists_directory,
+            name = name,
+            protocol=protocol,
+            original_directory = original_directory, 
+            original_extension = original_extension,
+            pad_file_class = low_level_pad_file_class,
+            annotation_directory = annotation_directory,
+            **kwargs)
+
+        self.low_level_pad_file_class = low_level_pad_file_class
+        self.pad_file_class = pad_file_class
+        self.annotation_directory = annotation_directory
+        self.landmark_detect_method = landmark_detect_method
+        self.protocol = protocol
+
+#----
+
+    def _split_protocol(self, protocol):
+
+        split_protocol = protocol.split("-") + [None, None]
+
+        protocol = split_protocol[0]
+
+        stream_type = split_protocol[1]
+        if(stream_type in stream_batl_convention):
+            stream_type = stream_batl_convention[stream_type]
+        else:
+            stream_type = "color"
+
+        num_frames = split_protocol[2]
+        if(num_frames is not None):
+            num_frames = int(num_frames)
+        else:
+            num_frames = 50
+
+        return protocol, stream_type, num_frames
+#----
+
+    # override the _make_pad function in bob.pad.base since we want the PAD 
+    # files to be of BatlPad class
+
+    def _make_pad(self, files):
+
+        low_level_files = []
+        for f in files:
+            path = f.path
+            client_id = f.client_id
+            info = path.split("/")[-1]
+            session_id = int(info.split("_")[1])
+            presenter_id = int(info.split("_")[2])
+            type_id = int(info.split("_")[3])
+            pai_id = int(info.split("_")[4])
+            v_file = self.low_level_pad_file_class(path=path,
+                    client_id=client_id,
+                    session_id=session_id, 
+                    presenter_id=presenter_id,
+                    type_id=type_id,
+                    pai_id=pai_id)
+            
+            low_level_files.append(v_file)
+
+        return low_level_files
+#----
+
+    def objects(self, groups=None, protocol=None, purposes=None, model_ids=None, **kwargs):
+
+        # default the parameters if the values are not provided
+        if protocol is None:
+            protocol = self.protocol        
+
+        if groups is None:
+            groups = ["train", "dev", "eval"]
+
+        # parse the protocol to extract necessary information
+        protocol, stream_type, num_frames = self._split_protocol(protocol)
+
+        # obtain the file list using the parent class's functionality
+        files = super(MaskDatabase, self).objects(groups=groups, protocol=protocol, purposes=purposes, model_ids=model_ids, **kwargs)
+
+        # create objects for each file where the class is BATLPadFile
+        files = [self.pad_file_class(f=f, stream_type=stream_type, max_frames=num_frames) for f in files]
+
+        return files      
+#----
+
+
+
+    def annotations(self, f):
+        """
+        Computes annotations for a given file object ``f``, which
+        is an instance of the ``BatlPadFile`` class.
+
+        NOTE: you can pre-compute annotation in your first experiment
+        and then reuse them in other experiments setting
+        ``self.annotations_temp_dir`` path of this class, where
+        precomputed annotations will be saved.
+
+        **Parameters:**
+
+        ``f`` : :py:class:`object`
+            An instance of ``BatlPadFile`` defined above.
+
+        **Returns:**
+
+        ``annotations`` : :py:class:`dict`
+            A dictionary containing annotations for
+            each frame in the video.
+            Dictionary structure:
+            ``annotations = {'1': frame1_dict, '2': frame1_dict, ...}``.
+            Where
+            ``frameN_dict`` contains coordinates of the
+            face bounding box and landmarks in frame N.
+        """
+
+        file_path = os.path.join(self.annotation_directory, f.f.path + ".json")
+
+
+        # if annotations do not exist, then generate.
+        if not os.path.isfile(file_path): 
+
+            f.stream_type = "color"
+            f.reference_stream_type = "color"
+            f.warp_to_reference = False
+            f.convert_to_rgb = False
+            f.crop = None
+            f.video_data_only = True
+
+            video = f.load(directory=self.original_directory, extension=self.original_extension)
+
+            annotations = {}
+
+            for idx, image in enumerate(video.as_array()):
+                frame_annotations = detect_face_landmarks_in_image(image, method=self.landmark_detect_method)
+                if frame_annotations:
+                    annotations[str(idx)] = frame_annotations
+
+            if self.annotation_directory:  # if directory is not an empty string
+                bob.io.base.create_directories_safe(directory=os.path.split(file_path)[0], dryrun=False)
+                with open(file_path, 'w+') as json_file:
+                    json_file.write(json.dumps(annotations))
+
+        # if annotations exist, then load.
+        else:  
+
+            with open(file_path, 'r') as json_file:
+                annotations = json.load(json_file)
+
+        # if dictionary is empty
+        if not annotations:  
+            return None
+
+        return annotations
+#-----
+
+
+
+
+
diff --git a/bob/paper/nir_patch_pooling/extractor/patch_pooling_cnn.py b/bob/paper/nir_patch_pooling/extractor/patch_pooling_cnn.py
new file mode 100644
index 0000000000000000000000000000000000000000..5941c877c73d2fba8b661d8e241f5bfefb925b72
--- /dev/null
+++ b/bob/paper/nir_patch_pooling/extractor/patch_pooling_cnn.py
@@ -0,0 +1,160 @@
+#!/usr/bin/env python2
+# -*- coding: utf-8 -*-
+
+"""
+Implementation of PCNN feature extractor for LightCNN-9. 
+@author: Ketan Kotwal
+
+"""
+
+# Imports
+import numpy as np
+import torch
+from PIL import Image
+import torch.nn.functional as F
+from torch.autograd import Variable
+import torchvision.transforms as transforms
+from bob.learn.pytorch.architectures import LightCNN9
+from bob.bio.base.extractor import Extractor
+
+import logging
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.INFO)
+
+#----------------------------------------------------------
+
+class PatchPoolingCNN(Extractor):
+
+    """
+    The class implements the feature extraction of LightCNN9 embeddings.
+    It has some implementation differences from a similar extractor from
+    bob.learn.pytorch.
+    """
+  
+    def __init__(self, model_file=None, num_classes=79077):
+        
+        Extractor.__init__(self, skip_extractor_training=True)
+        self.network = LightCNN9Patch()
+   
+        # load the model into network. 
+        cp = torch.load(model_file, map_location="cpu")
+      
+        # checked if pre-trained model was saved using nn.DataParallel ...
+        saved_with_nnDataParallel = False
+        for k, v in cp["state_dict"].items():
+            if("module" in k):
+                saved_with_nnDataParallel = True
+                break
+ 
+        # if DataParallel format, remove module term
+        if(saved_with_nnDataParallel):
+            if("state_dict" in cp):
+                from collections import OrderedDict
+                new_state_dict = OrderedDict()
+                for k, v in cp["state_dict"].items():
+                    name = k[7:]
+                    new_state_dict[name] = v
+                self.network.load_state_dict(new_state_dict)
+        else:
+            self.network.load_state_dict(cp["state_dict"])
+        self.network.eval()
+
+        # image pre-processing
+        self.data_transform = transforms.Compose([transforms.Resize(size=128), transforms.ToTensor()])
+
+#----------------------------------------------------------
+
+    def __call__(self, image):
+
+        """ Extract features from an image
+
+        Parameters
+        ----------
+        image : 2D :py:class:`numpy.ndarray` (floats)
+        The grayscale image to extract the features from. Its size must be 128x128
+
+        Returns
+        -------
+        feature : :py:class:`numpy.ndarray` (floats)
+        The extracted features as a 1d array of size 320 
+    
+        """
+  
+        # torchvision.transforms expect a numpy array of size HxWxC
+        pil_image = Image.fromarray(image.astype(np.uint8))
+        input_image = self.data_transform(pil_image)
+        input_image = input_image.unsqueeze(0)
+    
+        # to be compliant with the loaded model, where weight and biases are torch.FloatTensor
+        input_image = input_image.float()
+
+        _ , features = self.network.forward(Variable(input_image))
+        features = self.conv_to_patch(features)
+        features = features.data.numpy().flatten()
+        return features.astype(np.float64)
+
+#----------------------------------------------------------
+
+    def conv_to_patch(self, features):
+
+        logger.debug("Shape of input features: {} {}".format(features.shape, features.squeeze().shape))
+
+        # parameters for the patch conversion
+        stride = 4 # orig:4 #feat.shape[2]/4  
+        idx = 0 # purely for debugging
+        num_patch = features.shape[2]/stride
+        feat_patch = torch.zeros(1, stride*stride*features.shape[1])
+
+        # obtain patches by tesselation of feature maps
+        for i in range(0, features.shape[2], stride):
+            for j in range(0, features.shape[3], stride):
+                feat_tmp = features[:, :, i:i+stride, j:j+stride]
+                feat_tmp = feat_tmp.contiguous().view(feat_tmp.size(0), -1)
+                feat_patch += feat_tmp
+                idx += 1
+
+        # normalize the patch vector
+        feat_patch = feat_patch/stride/stride
+        logger.debug("Feat patch shape: {}".format(feat_patch.shape))
+
+        return feat_patch
+
+#----------------------------------------------------------
+
+# class LightCNN9Patch: it inherits the LightCNN-9 class, and returns the last
+# conv layer features; instead of embeddings.
+
+class LightCNN9Patch(LightCNN9):
+
+    def __init__(self):
+    
+        # do not change the init
+        super(LightCNN9Patch, self).__init__()    
+
+#----------------------------------------------------------
+
+    def forward(self, x):
+
+        """
+        Propagate data through the network, and return the output of final
+        conv layer.
+        """ 
+
+        conv_out = self.features(x)
+        x = conv_out.view(conv_out.size(0), -1)
+        x = self.fc1(x)
+        x = F.dropout(x, training=self.training)
+        out = self.fc2(x)
+        return out, conv_out
+
+#----------------------------------------------------------
+
+
+
+
+
+
+
+
+
+
diff --git a/bob/paper/nir_patch_pooling/script/annotate_database.py b/bob/paper/nir_patch_pooling/script/annotate_database.py
new file mode 100755
index 0000000000000000000000000000000000000000..4e4db2abbdfafc1a9775c683f3eddd36edf2e5d7
--- /dev/null
+++ b/bob/paper/nir_patch_pooling/script/annotate_database.py
@@ -0,0 +1,248 @@
+#
+# script to generate face annotations for NMAD directly over NIR data
+# @ Ketan Kotwal
+#
+#----------------------------------------------------------
+
+
+# imports
+from bob.pad.face.preprocessor.FaceCropAlign import detect_face_landmarks_in_image
+from bob.ip.color import rgb_to_gray
+from bob.ip.facelandmarks import detect_landmarks
+import bob.bio.video
+import bob.io.base
+import numpy as np
+import json, h5py
+import os, sys
+
+from bob.paper.makeup_aim.database import MLFPDatabase
+
+ORIGINAL_DIRECTORY = "/idiap/temp/kkotwal/nmad_experiments/mlfp_int/"
+
+#----------------------------------------------------------
+
+class AnnotationGenerator:
+
+    def __init__(self, input_directory, annotation_directory):
+
+        self.input_directory = input_directory.rstrip("/")
+        self.annotation_directory = annotation_directory.rstrip("/")
+        if not os.path.exists(self.annotation_directory):
+            os.makedirs(self.annotation_directory)
+
+        self.file_objects = self._load_db(self)
+
+        print("Input directory: {}".format(self.input_directory))
+        print("Annotation directory: {}".format(self.annotation_directory))
+
+#--------------------------------------
+
+    def _load_db(self, protocol):
+
+        database = MLFPDatabase(original_directory = ORIGINAL_DIRECTORY,
+            protocol = "grandtest", annotation_directory = None) 
+
+        return database.objects(protocol="grandtest")
+
+#----------------------------------------------------------
+
+    def find_annotations(self, image):
+
+        if len(image.shape) == 2:
+            image = np.repeat(image[:, :, np.newaxis], 3, axis=2)
+            image = np.transpose(image, (2,0,1))
+        else:
+            print("\t\tNot altering dimensions")
+
+        # find annotations using MTCNN
+        frame_annotations = detect_face_landmarks_in_image(image, method="mtcnn")
+        if frame_annotations:
+            print(" --> Found using MTCNN")
+            return frame_annotations
+
+        # else, find annotations using dlib
+        frame_annotations = detect_face_landmarks_in_image(image, method="dlib")
+        if frame_annotations:
+            print(" --> Found using dlib")
+            return frame_annotations
+
+        # else, find annotations using landmark detection routines from bob
+        frame_annotations = self.bob_annotate(image.astype(np.uint8))
+        if frame_annotations:
+            print(" --> Found using bob routine")
+            return frame_annotations
+
+        # else, return empty dictionary with warning
+        print(" --> Could not find annotations")
+        return {}
+
+#----------------------------------------------------------
+
+    def _get_eye_pos(self, lm):
+        """
+        This function returns the locations of left and right eyes
+        """
+
+        left_eye_t = (lm[36, :] + lm[39, :]) / 2.0
+        right_eye_t = (lm[42, :] + lm[45, :]) / 2.0
+
+        right_eye = (int(left_eye_t[1]), int(left_eye_t[0]))
+        left_eye = (int(right_eye_t[1]), int(right_eye_t[0]))
+
+        return right_eye, left_eye
+
+#--------------------------------------
+
+    def bob_annotate(self, image):
+
+        image = rgb_to_gray(image) 
+        lm1 = detect_landmarks(image, 1) 
+        lm = lm1[0].landmarks
+        bounding_box = lm1[0].bounding_box
+        annotations = {}
+
+        if lm is not None:
+            lm = np.array(lm)
+            lm = np.vstack((lm[:, 1], lm[:, 0])).T
+            right_eye, left_eye = self._get_eye_pos(lm)
+
+            points = []
+            for i in range(lm.shape[0]):
+                points.append((int(lm[i, 0]), int(lm[i, 1])))
+
+            annotations['topleft'] = bounding_box.topleft
+            annotations['bottomright'] = bounding_box.bottomright
+            annotations['landmarks'] = points
+            annotations['leye'] = left_eye
+            annotations['reye'] = right_eye
+
+        return annotations
+
+#--------------------------------------
+
+    def normalize_image(self, image, n_sigma=4.0, norm_method="MAD"):
+
+        face = image[image.shape[0]>>2:3*image.shape[0]>>2, \
+            image.shape[1]>>2:3*image.shape[1]>>2]
+
+        face = face.astype(np.float64)
+        image = image.astype(np.float64)
+
+        assert(len(image.shape)==2)
+
+        if norm_method=='STD':
+  
+            mu = np.mean(face)
+            std = np.std(face)
+            image_n=((image-mu+n_sigma*std)/(2.0*n_sigma*std))*255.0
+
+        if norm_method=='MAD':
+
+            med = np.median(face)
+            mad = np.median(np.abs(face - med))
+            image_n = ((image-med+n_sigma*mad)/(2.0*n_sigma*mad))*255.0
+
+        if norm_method=='MINMAX':
+    
+            t_min = np.min(face)
+            t_max = np.max(face)
+            image_n = ((image-t_min)/(t_max-t_min))*255.0
+
+        # Clamping to 0-255
+        image_n=np.maximum(image_n, 0)
+        image_n=np.minimum(image_n, 255)
+
+        image_n = image_n.astype(np.uint8)
+
+        return image_n
+
+#----------------------------------------------------------
+
+    def process_image(self, filename):
+
+        # load the image    
+        fc = h5py.File(os.path.join(ORIGINAL_DIRECTORY, filename.path + ".hdf5"))
+        
+        annotations = {}       
+        for i, frame in enumerate(fc.keys()):
+            print("    Frame {:02d}".format(i))
+            image = fc[frame]["array"].value
+
+            try:
+                tmp_annotations = self.find_annotations(image)
+
+            except Exception as e:
+                print("    Exception: {}".format(e))
+
+                if (i > 0) and (bool(annotations[str(i-1)])):
+                    tmp_annotations = annotations[str(i-1)]
+                    print("    Copying annotations of previous frame")
+                else:
+                    tmp_annotations = {}
+                    print("    Annotations for previous frame do not exist. Setting empty annotations")
+
+            annotations[str(i)] = tmp_annotations
+
+        json_filepath = os.path.join(self.annotation_directory, filename.path + ".json")
+        bob.io.base.create_directories_safe(directory=os.path.split(json_filepath)[0], dryrun=False)
+        with open(json_filepath, "w+") as json_file:
+            json_file.write(json.dumps(annotations))
+
+        fc.close()
+
+        return
+
+#--------------------------------------
+   
+    def run(self, job_index):
+
+        total = len(self.file_objects)
+        print("Found {} files to be annotated".format(total))
+
+        if(job_index != -1):
+            num_jobs = 32 
+            file_range = np.linspace(0, total, num_jobs+1, dtype=np.int)
+
+            start_id = file_range[job_index]
+            end_id = file_range[job_index+1]
+        else:
+            start_id = 0
+            end_id = total          
+        
+        print("Processing Job Index: {} (Files: {} to {})".format(job_index, start_id, end_id))
+
+        for i, f in enumerate(self.file_objects[start_id:end_id]):
+
+            print("[{:03d}/{:03d}] Sample: {}".format(i+1, total, f.path))
+
+            json_filepath = os.path.join(self.annotation_directory, f.path + ".json")
+            if not os.path.exists(json_filepath):
+                self.process_image(f)
+            else:
+                print("Annotations exist for {}. Skipping".format(f.path))
+
+#----------------------------------------------------------
+
+def main():
+
+    job_index = int(float(sys.argv[1]))
+    print("# Job Index: {}".format(job_index))
+
+    input_directory = ORIGINAL_DIRECTORY #sys.argv[1]            
+    annotation_directory =  "/idiap/temp/kkotwal/nmad_experiments/annotations/mlfp"
+
+    ag = AnnotationGenerator(input_directory, annotation_directory) 
+    ag.run(job_index)
+    
+#----------------------------------------------------------
+
+if __name__ == "__main__":
+
+    main()
+
+#----------------------------------------------------------
+
+
+
+
+
diff --git a/bob/paper/nir_patch_pooling/script/convert_mlfp_database.py b/bob/paper/nir_patch_pooling/script/convert_mlfp_database.py
new file mode 100755
index 0000000000000000000000000000000000000000..75d495f1f5923b48f87bf45441b839636cbd3a38
--- /dev/null
+++ b/bob/paper/nir_patch_pooling/script/convert_mlfp_database.py
@@ -0,0 +1,150 @@
+#
+# script to generate face annotations for NMAD directly over NIR data
+# @ Ketan Kotwal
+#
+#----------------------------------------------------------
+
+
+# imports
+from bob.pad.face.preprocessor.FaceCropAlign import detect_face_landmarks_in_image
+from bob.ip.color import rgb_to_gray
+from bob.ip.facelandmarks import detect_landmarks
+from bob.bio.video import FrameContainer
+import bob.io.base
+import numpy as np
+import scipy.io as spio
+import os, sys
+
+
+#import logging
+#logger = logging.getLogger(__name__)
+#logger.setLevel(logging.INFO)
+
+#----------------------------------------------------------
+
+class MLFPConvertor:
+
+    def __init__(self, input_directory, output_directory):
+
+        self.input_directory = input_directory.rstrip("/")
+        self.output_directory = output_directory.rstrip("/")
+        if not os.path.exists(self.output_directory):
+            os.makedirs(self.output_directory)
+
+        self.file_objects = self._load_db(self.input_directory)
+
+        print("Input directory: {}".format(self.input_directory))
+        print("output directory: {}".format(self.output_directory))
+
+#--------------------------------------
+
+    def _load_db(self, _):
+        
+        file_list = []
+        for dirpath, dirs, files in os.walk(self.input_directory):
+            for name in files:
+                file_path = os.path.join(dirpath, name)
+                file_path = file_path[43:]
+                if ("Infrared.mat" in file_path):
+                    file_list.append(file_path[:-4])
+
+        print("Found {} feature files to be fused".format(len(file_list)))        	       
+
+        print(file_list[:10])
+        return file_list
+
+#----------------------------------------------------------
+ 
+    def process_file(self, filename):
+
+        # load the file    
+        fc = spio.loadmat(os.path.join(self.input_directory, filename + ".mat"))
+        fc = fc["IR"]
+
+        fc_bob = FrameContainer()
+        for i, frame in enumerate(fc[:20]):
+            #print("    Frame {:02d}".format(i))
+            frame = frame[0]/256.0
+            fc_bob.add(i, frame.astype(np.uint8), None)
+
+        out_filepath = os.path.join(self.output_directory, filename + ".hdf5")
+        bob.io.base.create_directories_safe(directory=os.path.split(out_filepath)[0], dryrun=False)
+
+        print(len(fc_bob), type(fc_bob))	
+        f_out = bob.io.base.HDF5File(out_filepath, 'w')
+        fc_bob.save(f_out)
+        del f_out
+
+        return
+
+#--------------------------------------
+   
+    def run(self):
+
+        total = len(self.file_objects)
+        print("Found {} files to be converted".format(total))
+        
+        for i, f in enumerate(self.file_objects[:]):
+
+            print("[{:03d}/{:03d}] Sample: {}".format(i+1, total, f))
+
+            json_filepath = os.path.join(self.output_directory, f + ".hdf5")
+            if not os.path.exists(json_filepath):
+                self.process_file(f)
+            else:
+                print("File exist for {}. Skipping".format(f))
+
+#----------------------------------------------------------
+
+    def get_protocol(self):
+
+        real = []
+        attack = []
+
+        for i, path in enumerate(self.file_objects[:]):
+            print(path)
+            if("/R" in path):
+                line = "{} {}".format(path, str(000))
+                real.append(line)
+            elif("/M" in path):
+                line = "{} {} {}".format(path, str(111), "attack")
+                attack.append(line)
+            else:
+                print("dont know: ", path)
+        
+        print("BF: {}. PA: {}".format(len(real), len(attack)))
+
+        with open("for_real.lst", "w") as f:
+            f.write("\n".join(real) + "\n")
+
+        with open("for_attack.lst", "w") as f:
+            f.write("\n".join(attack) + "\n")
+
+
+        return
+
+
+#----------------------------------------------------------
+
+
+def main():
+
+    input_directory = "/idiap/resource/database/MLFP/NIR_Protocol"          
+    output_directory = "/idiap/temp/kkotwal/nmad_experiments/mlfp_int2/"
+
+    ag = MLFPConvertor(input_directory, output_directory) 
+    #ag.get_protocol()
+    ag.run()
+    
+#----------------------------------------------------------
+
+if __name__ == "__main__":
+
+    main()
+
+#----------------------------------------------------------
+
+
+
+
+