A deep dive into the architecture, requirements, and implementation of the SNAP simulation tool.
SNAP (Simulation of Nuclear and Affected Pedigrees) is a web-based tool hosted at https://statgen.uni-koeln.de/ for simulating genetic data. It supports case-control and family-based studies, generating synthetic datasets based on user-defined study designs, sampling strategies, and genotype-phenotype models. The backend, implemented in PHP (run.php), processes JSON inputs, generates settings files, executes SNAP binaries (snap3.1 or snap2.6.1), and delivers output files via a web interface.
This page details the technical architecture, requirements, functionalities, and recent updates to the SNAP backend.
E_ALL)./var/www/html/statgen.uni-koeln.de/software/snap/.snap3.1 and snap2.6.1 in snap/run/./var/www/html/statgen.uni-koeln.de/software/snap/snap/temp/ (permissions: 0775)snap/run/snap/run_error.logSNAP_JSON) stored in localStorage, sent via AJAX POST to run.php.0644 for settings, 0444 for outputs).Reads SNAP_JSON from php://input via AJAX POST, decoding it into a PHP array. Validates JSON and extracts sections:
SnapSettings: Filenames, output types.DesignData: Study design, phenotype.SexAgeData: Age/sex distributions.ModelData: Genotype-phenotype models.HaplotypeBloks: Haplotype configurations.Validates flags (design_flag, model_flag, etc.) to ensure parameters are set.
Generates a .set file with sections:
[General]: Output filenames, format.[Design]: Study/sampling design, counts.[SexAge]: Sex ratio, age parameters.[Model]: Penetrances or phenotypic means.[Separators]: Output delimiters.[Blocks]: Haplotype blocks.Sanitizes filenames and validates numeric inputs.
Executes SNAP binary (snap3.1 or snap2.6.1) with the settings file, capturing output and errors to stderr.txt. Checks for success ("Data successfully generated.").
Moves outputs (.dat, .log) to a temp directory, creates a snap.tgz archive, and generates HTML with download links, valid for 24 hours.
The SNAP backend is implemented in run.php, a PHP script that orchestrates input processing, simulation, and output delivery.
SNAP_BASE_PATH: /var/www/html/statgen.uni-koeln.de/software/snap/SNAP_TEMP_DIR, SNAP_RUN_DIR, MAX_AGE_SECONDS (24 hours).logError($message): Logs to run_error.log.sanitizeFilename($filename): Removes non-alphanumeric characters.getArrayValue($array, $key, $default): Safe array access.search_temp($directory): Finds unique temp directories.generateSettingsFile($data, $settingsFilePath): Builds .set file.generateModelTypeSettings($modelData): Handles quantitative models.generatePenetrancesSetting($modelData): Handles qualitative penetrances.buildHTML(...): Main logic for JSON processing and output.Input (SNAP_JSON):
{
"SnapSettings": { "user_settings_filename": "string", ... },
"DesignData": { "phenotype": "qualitative|quantitative", "study_design": "individuals|nuclear-families", ... },
"SexAgeData": { "sexRatio": number, ... },
"ModelData": { "number_loci": number, "penetrances": array, ... },
"HaplotypeBloks": [{ "blockNumber": number, ... }]
}
Outputs:
settings.set: Simulation parameters.data.dat: Genetic data.settings_log.log: Modified settings.stderr.txt: Errors/warnings.snap.tgz: Archive of all files.Recent enhancements to run.php (Artifact ID: a709bb42-8a9c-479b-84b0-0a3f5954b05c) addressed issues and aligned with example settings:
designFlag, penetranceFlag, modelFlag, blockFlag by validating DesignData, ModelData, and HaplotypeBloks:
$designData = isset($data['DesignData']) && is_array($data['DesignData']) ? $data['DesignData'] : [];
$designFlag = getArrayValue($designData, 'design_flag', 'true');
$userSettingsFile_stderr to $stderrFile.Updated generateSettingsFile to match seven example settings:
StudyDesign to individuals, SamplingDesign to joint or random.
$validPhenotypes = ['qualitative', 'quantitative'];
$validStudyDesigns = ['individuals', 'nuclear-families'];
individuals, include NumberOfCases/NumberOfControls (separate) or NumberOfIndividuals (joint). For nuclear-families, include NumberOfFamilies, NumberOfChildren, TypeOfFamily.