Rachel Sparks

60 papers A* 2B 3Journal 32Unranked 23
YearRankTypeTitle / Venue / Authors
2025 A* conf
AAAI
Jiayu Huo, Xi Ouyang, Sébastien Ourselin, Rachel Sparks
2025 conf
MICCAI (9)
Yang Liu, Peiran Wu, Jiayu Huo, Gongyu Zhang, Zhen Yuan, Christos Bergeles, Rachel Sparks, Prokar Dasgupta, Alejandro Granados, Sébastien Ourselin
2025 J jnl
Comput. Biol. Medicine
Gongyu Zhang, Ze Chen, Jiayu Huo, Joan M. Nunez Do Rio, Charalampos Komninos, Yang Liu, Rachel Sparks, Sébastien Ourselin, Christos Bergeles, Timothy Jackson
2025 conf
ISBI
Jiayu Huo, Sébastien Ourselin, Rachel Sparks
2025 J jnl
Neural Networks
Jiayu Huo, Sébastien Ourselin, Rachel Sparks
2024 J jnl
CoRR
Ezequiel de la Rosa, Mauricio Reyes, Sook-Lei Liew, Alexandre Hutton, Roland Wiest, Johannes Kaesmacher, Uta Hanning, Arsany Hakim, Richard Zubal, Waldo Valenzuela, David Robben, Diana Maria Sima, Vincenzo Anania, Arne Brys, James A. Meakin, Anne Mickan, Gabriel Broocks, Christian Heitkamp, Shengbo Gao, Kongming Liang, Ziji Zhang, Md Mahfuzur Rahman Siddiquee, Andriy Myronenko, Pooya Ashtari, Sabine Van Huffel, Hyun-su Jeong, Chiho Yoon, Chulhong Kim, Jiayu Huo, Sébastien Ourselin, Rachel Sparks, Albert Clèrigues, Arnau Oliver, Xavier Lladó, Liam F. Chalcroft, Ioannis Pappas, Jeroen Bertels, Ewout Heylen, Juliette Moreau, Nima Hatami, Carole Frindel, Abdul Qayyum, Moona Mazher, Domenec Puig, Shao-Chieh Lin, Chun-Jung Juan, Tianxi Hu, Lyndon Boone, Maged Goubran, Yi-Jui Liu, Susanne Wegener, Florian Kofler, Ivan Ezhov, Suprosanna Shit, Moritz Roman Hernandez Petzsche, Bjoern H. Menze, Jan S. Kirschke, Benedikt Wiestler
2024 conf
MLMI@MICCAI (1)
Zhenyu Bu, Yang Liu, Jiayu Huo, Jingjing Peng, Kaini Wang, Guangquan Zhou, Rachel Sparks, Prokar Dasgupta, Alejandro Granados, Sébastien Ourselin
2024 J jnl
CoRR
Zhenyu Bu, Yang Liu, Jiayu Huo, Jingjing Peng, Kaini Wang, Guangquan Zhou, Rachel Sparks, Prokar Dasgupta, Alejandro Granados, Sébastien Ourselin
2024 J jnl
CoRR
Nandika Ramamurthy, Daniel Lumsden, Rachel Sparks
2024 J jnl
CoRR
Jiayu Huo, Xi Ouyang, Sébastien Ourselin, Rachel Sparks
2024 conf
BIBM
Jiayu Huo, Ruiqiang Xiao, Haotian Zheng, Yang Liu, Sébastien Ourselin, Rachel Sparks
2024 J jnl
CoRR
Ruiqiang Xiao, Jiayu Huo, Haotian Zheng, Yang Liu, Sébastien Ourselin, Rachel Sparks
2024 J jnl
CoRR
Peiran Wu, Yang Liu, Jiayu Huo, Gongyu Zhang, Christos Bergeles, Rachel Sparks, Prokar Dasgupta, Alejandro Granados, Sébastien Ourselin
2024 J jnl
CoRR
Ze Chen, Gongyu Zhang, Jiayu Huo, Joan M. Nunez Do Rio, Charalampos Komninos, Yang Liu, Rachel Sparks, Sébastien Ourselin, Christos Bergeles, Timothy Jackson
2024 J jnl
CoRR
Jiayu Huo, Sébastien Ourselin, Rachel Sparks
2024 J jnl
CoRR
Dimitrios Psychogyios, Emanuele Colleoni, Beatrice van Amsterdam, Chih-Yang Li, Shu-Yu Huang, Yuchong Li, Fucang Jia, Baosheng Zou, Guotai Wang, Yang Liu, Maxence Boels, Jiayu Huo, Rachel Sparks, Prokar Dasgupta, Alejandro Granados, Sébastien Ourselin, Mengya Xu, An Wang, Yanan Wu, Long Bai, Hongliang Ren, Atsushi Yamada, Yuriko Harai, Yuto Ishikawa, Kazuyuki Hayashi, Jente Simoens, Pieter DeBacker, Francesco Cisternino, Gabriele Furnari, Alexandre Mottrie, Federica Ferraguti, Satoshi Kondo, Satoshi Kasai, Kousuke Hirasawa, Soohee Kim, Seung Hyun Lee, Kyu Eun Lee, Hyoun-Joong Kong, Kui Fu, Chao Li, Shan An, Stefanie Krell, Sebastian Bodenstedt, Nicolás Ayobi, Alejandra Pérez, Santiago Rodríguez, Juanita Puentes, Pablo Arbeláez, Omid Mohareri, Danail Stoyanov
2024 J jnl
CoRR
Jiayu Huo, Sébastien Ourselin, Rachel Sparks
2023 conf
MLMI@MICCAI (2)
Jiayu Huo, Yang Liu, Xi Ouyang, Alejandro Granados, Sébastien Ourselin, Rachel Sparks
2023 J jnl
CoRR
Jiayu Huo, Yang Liu, Xi Ouyang, Alejandro Granados, Sébastien Ourselin, Rachel Sparks
2023 A* conf
ICCV
Yang Liu, Jiayu Huo, Jingjing Peng, Rachel Sparks, Prokar Dasgupta, Alejandro Granados, Sébastien Ourselin
2023 conf
BraTS/CrossMoDA@MICCAI
Jiayu Huo, Chih-Yang Li, Alejandro Granados, Sébastien Ourselin, Rachel Sparks
2022 conf
SASHIMI@MICCAI
Jiayu Huo, Vejay Vakharia, Chengyuan Wu, Ashwini Sharan, Andrew Ko, Sébastien Ourselin, Rachel Sparks
2022 J jnl
CoRR
Jiayu Huo, Vejay Vakharia, Chengyuan Wu, Ashwini Sharan, Andrew Ko, Sébastien Ourselin, Rachel Sparks
2022 J jnl
CoRR
Jiayu Huo, Liyun Chen, Yang Liu, Maxence Boels, Alejandro Granados, Sébastien Ourselin, Rachel Sparks
2022 J jnl
Frontiers Neuroinformatics
Fernando Pérez-García, Ali Alim-Marvasti, Gloria Romagnoli, Matthew J. Clarkson, Rachel Sparks, John S. Duncan, Sébastien Ourselin
2021 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Alejandro Granados, Fernando Pérez-García, Martin Schweiger, Vejay Vakharia, Sjoerd B. Vos, Anna Miserocchi, Andrew W. McEvoy, John S. Duncan, Rachel Sparks, Sébastien Ourselin
2021 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Fernando Pérez-García, Reuben Dorent, Michele Rizzi, Francesco Cardinale, Valerio Frazzini, Vincent Navarro, Caroline Essert, Irène Ollivier, Tom Vercauteren, Rachel Sparks, John S. Duncan, Sébastien Ourselin
2021 J jnl
CoRR
Fernando Pérez-García, Reuben Dorent, Michele Rizzi, Francesco Cardinale, Valerio Frazzini, Vincent Navarro, Caroline Essert, Irène Ollivier, Tom Vercauteren, Rachel Sparks, John S. Duncan, Sébastien Ourselin
2021 J jnl
Comput. Biol. Medicine
Oeslle Lucena, Sjoerd B. Vos, Vejay Vakharia, John S. Duncan, Keyoumars Ashkan, Rachel Sparks, Sébastien Ourselin
2021 J jnl
Frontiers Digit. Health
Ali Alim-Marvasti, Fernando Pérez-García, Karan Dahele, Gloria Romagnoli, Beate Diehl, Rachel Sparks, Sébastien Ourselin, Matthew J. Clarkson, John S. Duncan
2021 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Alejandro Granados, Yuxuan Han, Oeslle Lucena, Vejay Vakharia, Roman Rodionov, Sjoerd B. Vos, Anna Miserocchi, Andrew W. McEvoy, John S. Duncan, Rachel Sparks, Sébastien Ourselin
2021 J jnl
Comput. Methods Programs Biomed.
Fernando Pérez-García, Rachel Sparks, Sébastien Ourselin
2021 conf
MICCAI (5)
Fernando Pérez-García, Catherine J. Scott, Rachel Sparks, Beate Diehl, Sébastien Ourselin
2021 J jnl
CoRR
Fernando Pérez-García, Catherine J. Scott, Rachel Sparks, Beate Diehl, Sébastien Ourselin
2020 J jnl
CoRR
Fernando Pérez-García, Roman Rodionov, Ali Alim-Marvasti, Rachel Sparks, John S. Duncan, Sébastien Ourselin
2020 conf
MICCAI (3)
Fernando Pérez-García, Roman Rodionov, Ali Alim-Marvasti, Rachel Sparks, John S. Duncan, Sébastien Ourselin
2020 J jnl
CoRR
Fernando Pérez-García, Rachel Sparks, Sébastien Ourselin
2020 conf
ISBI
Alejandro Granados, Oeslle Lucena, Vejay Vakharia, Anna Miserocchi, Andrew W. McEvoy, Sjoerd B. Vos, Roman Rodionov, John S. Duncan, Rachel Sparks, Sébastien Ourselin
2020 J jnl
CoRR
Oeslle Lucena, Sjoerd B. Vos, Vejay Vakharia, John S. Duncan, Keyoumars Ashkan, Rachel Sparks, Sébastien Ourselin
2019 conf
MICCAI (5)
Alejandro Granados, Martin Schweiger, Vejay Vakharia, Andrew W. McEvoy, Anna Miserocchi, John S. Duncan, Rachel Sparks, Sébastien Ourselin
2018 conf
MICCAI (4)
Alejandro Granados, Matteo Mancini, Sjoerd B. Vos, Oeslle Lucena, Vejay Vakharia, Roman Rodionov, Anna Miserocchi, Andrew W. McEvoy, John S. Duncan, Rachel Sparks, Sébastien Ourselin
2018 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Alejandro Granados, Vejay Vakharia, Roman Rodionov, Martin Schweiger, Sjoerd B. Vos, Aidan G. O'Keeffe, Kuo Li, Chengyuan Wu, Anna Miserocchi, Andrew W. McEvoy, Matthew J. Clarkson, John S. Duncan, Rachel Sparks, Sébastien Ourselin
2017 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Rachel Sparks, Vejay Vakharia, Roman Rodionov, Sjoerd B. Vos, Beate Diehl, Tim Wehner, Anna Miserocchi, Andrew W. McEvoy, John S. Duncan, Sébastien Ourselin
2017 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Rachel Sparks, Gergely Zombori, Roman Rodionov, Mark Nowell, Sjoerd B. Vos, Maria A. Zuluaga, Beate Diehl, Tim Wehner, Anna Miserocchi, Andrew W. McEvoy, John S. Duncan, Sébastien Ourselin
2016 conf
MICCAI (1)
Rachel Sparks, Gergely Zombori, Roman Rodionov, Maria A. Zuluaga, Beate Diehl, Tim Wehner, Anna Miserocchi, Andrew W. McEvoy, John S. Duncan, Sébastien Ourselin
2014 B conf
Image Processing
Mahdi Orooji, Rachel Sparks, B. Nicolas Bloch, Ernest J. Feleppa, Dean C. Barratt, Anant Madabhushi
2014 B conf
Image Processing
Eileen Hwuang, Mirabela Rusu, Sudha Karthigeyan, Shannon Agner, Rachel Sparks, Natalie Shih, John Tomaszewski, Mark Rosen, Michael D. Feldman, Anant Madabhushi
2013 conf
EMBC
Eileen Hwuang, Shabbar Danish, Mirabela Rusu, Rachel Sparks, Robert Toth, Anant Madabhushi
2013 conf
ISBI
George Lee, Rachel Sparks, Sahirzeeshan Ali, Anant Madabhushi, Michael D. Feldman, Stephen R. Master, Natalie Shih, John Tomaszewski
2013 J jnl
Medical Image Anal.
Rachel Sparks, Anant Madabhushi
2013 conf
Image-Guided Procedures
Rachel Sparks, B. Nicolas Bloch, Ernest J. Feleppa, Dean C. Barratt, Anant Madabhushi
2013 conf
Digital Pathology
Asha Singanamalli, Rachel Sparks, Mirabela Rusu, Natalie Shih, Amy Ziober, John Tomaszewski, Mark Rosen, Michael D. Feldman, Anant Madabhushi
2013 J jnl
Comput. Vis. Image Underst.
Rachel Sparks, Anant Madabhushi
2012 conf
Computer-Aided Diagnosis
Rachel Sparks, Anant Madabhushi
2011 B conf
Image Processing
Rachel Sparks, Anant Madabhushi
2011 conf
ISBI
Robert Toth, Rachel Sparks, Anant Madabhushi
2011 conf
ISBI
Rachel Sparks, Anant Madabhushi
2010 conf
ISBI
Rachel Sparks, Robert Toth, Jonathan Chappelow, Gaoyu Xiao, Anant Madabhushi
2010 conf
Prostate Cancer Imaging
Jun Xu, Rachel Sparks, Andrew Janowczyk, John Tomaszewski, Michael D. Feldman, Anant Madabhushi
2010 conf
MICCAI (3)
Rachel Sparks, Anant Madabhushi
redb/extractors/macho_extractors/macho_features.py
← Index redb/extractors/macho_extractors/macho_features.py python
import inspect
import json
from datetime import datetime, timezone
from typing import Any

from redb.extractors.enum import Tag
from redb.extractors.macho_extractor import MachOExtractor
from redb.models.dataclasses import MachO


class MachOFeaturesExtractor(MachOExtractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        macho=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            macho,
        )
        self.elastic_index = self.index_prefix + "-macho_features"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def tag(self):
        return Tag.MACHO_FEATURES.value

    def _extract_macho_features_for_arch(self, arch_name):
        """Extract basic MachO features for a specific architecture."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return None

        try:
            # Get general info using new API
            general_info = self.macho.get_general_info()
            if not general_info:
                return None

            # Get header info for this specific architecture
            header_raw = self.macho.get_macho_header(arch=arch_name)
            header_formatted = self.macho.get_macho_header(arch=arch_name, formatted=True)

            if not header_raw or not header_formatted:
                return None

            # Get entry point using new API
            entry_point = None
            try:
                entry_point_info = self.macho.get_entry_point(arch=arch_name)
                if entry_point_info:
                    if isinstance(entry_point_info, dict):
                        entry_point = entry_point_info.get('entryoff') or entry_point_info.get('entry_address')
                    else:
                        entry_point = entry_point_info
            except Exception as e:
                self.log.debug(f"No entry point found: {e}")

            # Get UUID using new API
            uuid = None
            try:
                uuid_info = self.macho.get_uuid(arch=arch_name)
                if uuid_info:
                    uuid = str(uuid_info)
            except Exception as e:
                self.log.debug(f"No UUID found: {e}")

            # Get version info using new API with formatting
            version_info = None
            version_info_str = None
            try:
                version_info = self.macho.get_version_info(arch=arch_name)
                version_info_str = self.macho.get_version_info(arch=arch_name, formatted=True)
            except Exception as e:
                self.log.debug(f"No version info found: {e}")

            # Get segments using new API
            segments = self.macho.get_segments(arch=arch_name)
            number_of_segments = len(segments) if segments else 0

            # Get dylib info using new API
            dylib_names = self.macho.get_dylib_names(arch=arch_name)
            number_of_dylibs = len(dylib_names) if dylib_names else 0

            # Count imports using new API
            imported_functions = self.macho.get_imported_functions(arch=arch_name)
            number_of_imports = sum(len(funcs) for funcs in imported_functions.values()) if imported_functions else 0

            # Count exports using new API
            exported_symbols = self.macho.get_exported_symbols(arch=arch_name)
            number_of_exports = sum(len(symbols) for symbols in exported_symbols.values()) if exported_symbols else 0

            # Get unique load command types using new API
            load_commands_set = self.macho.get_load_commands_set(arch=arch_name, formatted=True)
            if isinstance(load_commands_set, set):
                load_commands_set = sorted(list(load_commands_set))

            # Get architectures for listing purposes
            architectures = self.macho.get_architectures()

            # Determine binary properties
            is_64bit = header_raw.get('magic') in [0xFEEDFACF, 0xCFFAEDFE]  # MH_MAGIC_64, MH_CIGAM_64
            is_signed = self._is_signed()
            
            # Create MachO dataclass
            macho_features = MachO(
                # Raw values from new API
                magic=header_raw.get('magic', 0),
                cputype=header_raw.get('cputype', 0),
                cpusubtype=header_raw.get('cpusubtype', 0),
                filetype=header_raw.get('filetype', 0),
                ncmds=header_raw.get('ncmds', 0),
                sizeofcmds=header_raw.get('sizeofcmds', 0),
                flags=header_raw.get('flags', 0),
                architecture=header_raw.get('cputype', 0),  # Use cputype as architecture
                architectures=[arch_info.get('cputype', 0) for arch_info in [self.macho.get_macho_header(arch=arch) for arch in architectures] if arch_info],
                # Human-readable values from formatted API
                magic_str=header_formatted.get('magic', ''),
                cputype_str=header_formatted.get('cputype', ''),
                cpusubtype_str=header_formatted.get('cpusubtype', ''),
                filetype_str=header_formatted.get('filetype', ''),
                flags_str=header_formatted.get('flags', '').split(', ') if header_formatted.get('flags') else [],
                architecture_str=header_formatted.get('cputype', ''),
                architectures_str=[arch_info.get('cputype', '') for arch_info in [self.macho.get_macho_header(arch=arch, formatted=True) for arch in architectures] if arch_info],
                # Additional properties
                is_64bit=is_64bit,
                is_signed=is_signed,
                number_of_load_commands=header_raw.get('ncmds', 0),
                load_commands_set=load_commands_set,
                number_of_segments=number_of_segments,
                number_of_dylibs=number_of_dylibs,
                number_of_imports=number_of_imports,
                number_of_exports=number_of_exports,
                entry_point=entry_point,
                uuid=uuid,
                version_info=version_info,
                version_info_str=version_info_str
            )
            
            return macho_features
            
        except Exception as e:
            self.log.error(f"Error extracting MachO features: {e}")
            return None

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            if not self.macho:
                return None
            architectures = self.macho.get_architectures()
            if not architectures:
                return None

            # For FAT binaries, return features for all architectures
            # For single arch, return just the single result
            if len(architectures) > 1:
                # FAT binary - return list of features for each architecture
                results = []
                for arch_name in architectures:
                    features = self._extract_macho_features_for_arch(arch_name)
                    if features:
                        # Add architecture identifier to the result
                        if hasattr(features, '__dict__'):
                            # If it's a dataclass, we can access its dict
                            features.arch_identifier = arch_name
                        results.append(features)
                return results
            else:
                # Single architecture - return single result
                return self._extract_macho_features_for_arch(architectures[0])
        except Exception as e:
            self.log.error(f"Error extracting MachO features: {e}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return self.extract()
        elif exporter_type == "ClickHouseExporter":
            if not self.macho:
                return None

            # Get architectures (macho is already parsed in __init__)
            try:
                architectures = self.macho.get_architectures()
            except Exception as e:
                self.log.error(f"Could not get architectures: {e}")
                return None

            data = []
            current_time = datetime.now(timezone.utc)

            # Loop through each architecture (1 for single, multiple for FAT)
            for arch_name in architectures:
                # Extract features for this specific architecture
                macho_features = self._extract_macho_features_for_arch(arch_name)
                if not macho_features:
                    continue

                # Get architecture-specific sha256
                try:
                    arch_general_info = self.macho.get_general_info(arch=arch_name)
                    arch_sha256 = arch_general_info.get('SHA256', self.sha256)
                except Exception as e:
                    self.log.warning(f"Could not get arch-specific hash for {arch_name}: {e}")
                    arch_sha256 = self.sha256

                # Architecture field (kept in features table for ORDER BY)
                architecture = macho_features.cputype    # Raw CPU type value

                data.append([
                    arch_sha256,                          # sha256 (architecture-specific)
                    architecture,                         # architecture (raw CPU type)
                    # Raw values
                    macho_features.magic,                 # magic
                    macho_features.cputype,               # cputype
                    macho_features.cpusubtype,            # cpusubtype
                    macho_features.filetype,              # filetype
                    macho_features.ncmds,                 # ncmds
                    macho_features.sizeofcmds,            # sizeofcmds
                    macho_features.flags,                 # flags
                    # Human-readable values
                    macho_features.magic_str,             # magic_str
                    macho_features.cputype_str,           # cputype_str
                    macho_features.cpusubtype_str,        # cpusubtype_str
                    macho_features.filetype_str,          # filetype_str
                    macho_features.flags_str,             # flags_str
                    # Other fields
                    macho_features.is_64bit,              # is_64bit
                    macho_features.is_signed,             # is_signed
                    macho_features.entry_point if macho_features.entry_point else None,           # entry_point
                    macho_features.uuid if macho_features.uuid else None,  # uuid
                    json.dumps(macho_features.version_info) if macho_features.version_info else "{}",  # version_info
                    json.dumps(macho_features.version_info_str) if macho_features.version_info_str else "{}",  # version_info_str
                    macho_features.load_commands_set,     # load_commands_set
                    macho_features.number_of_segments,    # number_of_segments
                    macho_features.number_of_dylibs,      # number_of_dylibs
                    macho_features.number_of_imports,     # number_of_imports
                    macho_features.number_of_exports,     # number_of_exports
                    current_time,                         # analysis_date
                ])

            column_names = [
                'sha256', 'architecture',
                # Raw values
                'magic', 'cputype', 'cpusubtype', 'filetype', 'ncmds', 'sizeofcmds', 'flags',
                # Human-readable values
                'magic_str', 'cputype_str', 'cpusubtype_str', 'filetype_str', 'flags_str',
                # Other fields
                'is_64bit', 'is_signed',
                'entry_point', 'uuid', 'version_info', 'version_info_str', 'load_commands_set',
                'number_of_segments', 'number_of_dylibs', 'number_of_imports', 'number_of_exports',
                'analysis_date'
            ]

            if not data:
                return None

            column_type_names = [
                'FixedString(64)', 'Nullable(UInt32)',
                # Raw values
                'UInt32', 'UInt32', 'UInt32', 'UInt32', 'UInt32', 'UInt32', 'UInt32',
                # Human-readable values
                'LowCardinality(String)', 'LowCardinality(String)', 'LowCardinality(String)', 'LowCardinality(String)', 'Array(LowCardinality(String))',
                # Other fields
                'UInt8', 'UInt8',
                'Nullable(UInt64)', 'Nullable(String)', 'JSON', 'JSON', 'Array(Nullable(String))',
                'UInt32', 'UInt32', 'UInt32', 'UInt32', 'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)
        
        return None

    def get_clickhouse_table(self) -> str:
        return "redb_macho_features"