{"id":32155960,"url":"https://github.com/oheil/affycelfiles.jl","last_synced_at":"2026-02-19T07:01:54.390Z","repository":{"id":61800713,"uuid":"349464183","full_name":"oheil/AffyCelFiles.jl","owner":"oheil","description":"read Affymetrix .CEL files","archived":false,"fork":false,"pushed_at":"2024-02-11T13:37:56.000Z","size":51,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-10-21T12:28:16.229Z","etag":null,"topics":["affy","affymetrix","cel","cel-files","microarray","microarrays","thermofisher"],"latest_commit_sha":null,"homepage":"","language":"Julia","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/oheil.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-03-19T15:10:32.000Z","updated_at":"2022-03-10T13:37:48.000Z","dependencies_parsed_at":"2022-10-21T11:45:19.737Z","dependency_job_id":null,"html_url":"https://github.com/oheil/AffyCelFiles.jl","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/oheil/AffyCelFiles.jl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oheil%2FAffyCelFiles.jl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oheil%2FAffyCelFiles.jl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oheil%2FAffyCelFiles.jl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oheil%2FAffyCelFiles.jl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oheil","download_url":"https://codeload.github.com/oheil/AffyCelFiles.jl/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oheil%2FAffyCelFiles.jl/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29605799,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-19T06:47:36.664Z","status":"ssl_error","status_checked_at":"2026-02-19T06:45:47.551Z","response_time":117,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["affy","affymetrix","cel","cel-files","microarray","microarrays","thermofisher"],"created_at":"2025-10-21T12:19:25.520Z","updated_at":"2026-02-19T07:01:54.385Z","avatar_url":"https://github.com/oheil.png","language":"Julia","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Project Status: Active – The project has reached a stable, usable state and is being actively developed.](http://www.repostatus.org/badges/latest/active.svg)](http://www.repostatus.org/#active)\n\n# AffyCelFiles\n\nThis is a low level IO package for Affymetrix .CEL files\n\n**References**\n\nhttps://media.affymetrix.com/support/developer/powertools/changelog/file-formats.html\nhttps://media.affymetrix.com/support/developer/powertools/changelog/gcos-agcc/cel.html\nhttps://media.affymetrix.com/support/developer/powertools/changelog/gcos-agcc/generic.html\nhttps://media.affymetrix.com/support/developer/powertools/changelog/gcos-agcc/cdf.html\nhttps://media.affymetrix.com/support/developer/powertools/changelog/file-format-pgf.html\nhttps://media.affymetrix.com/support/developer/powertools/changelog/file-format-clf.html\nhttps://media.affymetrix.com/support/developer/powertools/changelog/file-format-mps.html\n\n## Currently supported microarrays\n\nThis package is in an early stage and the following microarrays .CEL files are tested:\n* Clariom_S_Human\n* Mouse430_2\n* HG-U133_Plus_2\n* HuGene-2_0-st\n\n(more to come)\n\nThe expression/intensity data was cross checked against R/bioconductor affy and oligo libraries.\n\n## Dependencies\n\n#### Julia versions\n\n* Julia 1.0 or above\n\n#### Third party packages\n\n* none\n\n#### Standard Library packages\n\n* CRC32c\n\n## Usage\n\nIn general Affymetrix .CEL can always be read in. To read Affymetrix .CEL files with meaningful information you need one of the following additional file/files:\n* .cdf\n* .pgf + .clf (+ optional .mps)\n\nThose files provide the mapping from a probe location on the chip to a probe_id and the mapping from probeset_ids to probe_ids. For a specific chip type you\ncan get those files from the ThermoFisher support page, e.g. for the Clariom S human see https://www.thermofisher.com/order/catalog/product/902927?SID=srch-srp-902927\nfor download of archive TFS-Assets_LSG_Support-Files_Clariom_S_Human_Analysis-r1.zip (you need to have a login) which contains the .pgf,.clf and .mps file for this chip.\n\nFor biological meaningful analysis you also need annotation data, which maps probeset_ids to, for example, gene names. This is not part of this package, but\naffymetrix annotation data is typically just a file of annotations in a table/csv format which can easily be read in (e.g. with CSV.jl) and mapped using probeset_ids or transcript_ids/meta_probeset_ids (in case of .mps used).\n\nIn this early stage this package doesn't provide a very convenient API, but this may change in future.\n\n#### Usage examples\n\n```julia\nusing Pkg\nPkg.add(\"AffyCelFiles\");\n#or from github main:\n#Pkg.add(url=\"https://github.com/oheil/AffyCelFiles.jl\",rev=\"main\")\n\nusing AffyCelFiles\n```\n\nReading .CEL files with corresponding .cdf file:\n```julia\ncel_file = \"example_(Mouse430_2).CEL\"\ncdf_file = raw\"d:\\Temp\\mouse430_2_libraryfile\\CD_Mouse430_2\\Full\\Mouse430_2\\LibFiles\\Mouse430_2.cdf\"\n\ncel_data = AffyCelFiles.cel_read(cel_file);\ncdf_data = AffyCelFiles.cdf_read(cdf_file);\n\nintensities = AffyCelFiles.intensities(cel_data,cdf_data);\n\n#Dict mapping probeset_id to lists of expression values (pm=perfect match, mm=mismatch).\n#Depending on the chiptype mm can be empty\nintensities.pm\nintensities.mm\n```\nResult:\n```julia\njulia\u003e intensities.pm\nDict{String, Vector{Float32}} with 45101 entries:\n  \"1453553_at\"   =\u003e [93.0, 316.0, 74.0, 214.0, 94.0, 112.0, 52.0, 319.0, 66.0, 74.0, 88.0]\n  \"1455273_at\"   =\u003e [1054.0, 57.0, 102.0, 263.0, 180.0, 447.0, 498.0, 683.0, 1233.0, 196.0, 999.0]\n  \"1425429_s_at\" =\u003e [59.0, 162.0, 79.0, 286.0, 114.0, 384.0, 305.0, 111.0, 106.0, 138.0, 572.0]\n  \"1445844_at\"   =\u003e [129.0, 749.0, 155.0, 156.0, 51.0, 144.0, 53.0, 123.0, 136.0, 102.0, 63.0]\n  \"1443594_at\"   =\u003e [82.0, 150.0, 306.0, 447.0, 392.0, 101.0, 79.0, 143.0, 108.0, 531.0, 70.0]\n  \"1449219_at\"   =\u003e [123.0, 104.0, 118.0, 74.0, 76.0, 136.0, 116.0, 165.0, 175.0, 116.0, 88.0]\n  \"1447933_at\"   =\u003e [68.0, 120.0, 164.0, 42.0, 57.0, 50.0, 228.0, 272.0, 92.0, 68.0, 65.0]\n...\njulia\u003e intensities.mm\nDict{String, Vector{Float32}} with 45101 entries:\n  \"1453553_at\"   =\u003e [124.0, 75.0, 56.0, 317.0, 69.0, 165.0, 43.0, 148.0, 100.0, 65.0, 143.0]\n  \"1455273_at\"   =\u003e [171.0, 51.0, 284.0, 93.0, 64.0, 174.0, 284.0, 233.0, 169.0, 48.0, 119.0]\n  \"1425429_s_at\" =\u003e [51.0, 200.0, 80.0, 135.0, 94.0, 254.0, 255.0, 98.0, 93.0, 61.0, 161.0]\n  \"1445844_at\"   =\u003e [79.0, 255.0, 105.0, 97.0, 65.0, 90.0, 44.0, 152.0, 187.0, 56.0, 40.0]\n  \"1443594_at\"   =\u003e [57.0, 171.0, 181.0, 522.0, 244.0, 70.0, 70.0, 87.0, 80.0, 1093.0, 53.0]\n...\n```\n\nReading .CEL files with corresponding .pgf and .clf files (you need both):\n```julia\ncel_file = \"example_(Clariom_S_Human).CEL\"\npgf_file = raw\"d:\\Temp\\clariomShuman\\TFS-Assets_LSG_Support-Files_Clariom_S_Human_Analysis-r1\\Clariom_S_Human.r1.pgf\"\nclf_file = raw\"d:\\Temp\\clariomShuman\\TFS-Assets_LSG_Support-Files_Clariom_S_Human_Analysis-r1\\Clariom_S_Human.r1.clf\"\n\ncel_data = AffyCelFiles.cel_read(cel_file);\npgf_data = AffyCelFiles.pgf_read(pgf_file);\nclf_data = AffyCelFiles.clf_read(clf_file);\n\nintensities = AffyCelFiles.intensities(cel_data, pgf_data, clf_data);\n\n#Dict mapping probeset_id to lists of expression values (pm=perfect match, mm=mismatch).\n#Depending on the chiptype mm can be empty\nintensities.pm\nintensities.mm\n```\nResult:\n```julia\njulia\u003e intensities.pm\nDict{String, Vector{Float32}} with 27189 entries:\n  \"23050629\" =\u003e [61.0, 43.0, 54.0, 60.0]\n  \"23054888\" =\u003e [321.0, 184.0, 169.0, 297.0, 162.0, 217.0, 194.0, 647.0, 124.0, 192.0]\n  \"23060812\" =\u003e [56.0, 46.0, 145.0, 58.0, 92.0, 80.0, 204.0, 152.0, 83.0, 118.0]\n  \"23056335\" =\u003e [160.0, 227.0, 951.0, 264.0, 286.0, 52.0, 43.0, 53.0, 48.0, 40.0]\n  \"23059041\" =\u003e [1043.0, 867.0, 321.0, 739.0, 826.0, 462.0, 330.0, 1190.0, 1485.0, 1537.0]\n...\njulia\u003e intensities.mm\nDict{String, Vector{Float32}} with 27189 entries:\n  \"23050629\" =\u003e []\n  \"23054888\" =\u003e []\n  \"23060812\" =\u003e []\n...\n```\nProviding a .mps file changes the central ids from probeset_ids to meta_probeset_ids/transcript_ids.\nReading .CEL files with corresponding .pgf, .clf files (you need both) and optional a .mps file:\n```julia\ncel_file = \"example_(Clariom_S_Human).CEL\"\npgf_file = raw\"d:\\Temp\\clariomShuman\\TFS-Assets_LSG_Support-Files_Clariom_S_Human_Analysis-r1\\Clariom_S_Human.r1.pgf\"\nclf_file = raw\"d:\\Temp\\clariomShuman\\TFS-Assets_LSG_Support-Files_Clariom_S_Human_Analysis-r1\\Clariom_S_Human.r1.clf\"\nmps_file = raw\"d:\\Temp\\clariomShuman\\TFS-Assets_LSG_Support-Files_Clariom_S_Human_Analysis-r1\\Clariom_S_Human.r1.mps\"\n\ncel_data = AffyCelFiles.cel_read(cel_file);\npgf_data = AffyCelFiles.pgf_read(pgf_file);\nclf_data = AffyCelFiles.clf_read(clf_file);\nmps_data = AffyCelFiles.mps_read(mps_file);\n\nintensities = AffyCelFiles.intensities(cel_data, pgf_data, clf_data, mps_data);\n\n#Dict mapping meta_probeset_id/transcript_id to lists of expression values (pm=perfect match, mm=mismatch).\n#Depending on the chiptype mm can be empty\nintensities.pm\nintensities.mm\n```\nResult:\n```julia\njulia\u003e intensities.pm\nDict{String, Vector{Float32}} with 24351 entries:\n  \"TC0600009248.hg.1\" =\u003e [42.0, 35.0, 195.0, 43.0, 140.0, 207.0, 54.0, 111.0, 95.0, 70.0]\n  \"TC0800011018.hg.1\" =\u003e [47.0, 46.0, 41.0, 51.0, 74.0, 43.0, 62.0, 45.0, 42.0, 34.0]\n  \"TC0500012822.hg.1\" =\u003e [299.0, 189.0, 425.0, 337.0, 1465.0, 1790.0, 988.0, 784.0, 471.0, 1094.0]\n  \"23050629\"          =\u003e [61.0, 43.0, 54.0, 60.0]\n  \"TC1200012657.hg.1\" =\u003e [2004.0, 1886.0, 450.0, 374.0, 175.0, 893.0, 332.0, 1710.0, 1930.0, 1362.0]\n  \"TC0700012299.hg.1\" =\u003e [129.0, 77.0, 53.0, 76.0, 96.0, 395.0, 73.0, 130.0, 95.0, 82.0]\n...\n```\n\n\n\n\n\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foheil%2Faffycelfiles.jl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foheil%2Faffycelfiles.jl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foheil%2Faffycelfiles.jl/lists"}