Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions pointblank/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@
import_metadata,
list_adam_datasets,
list_sdtm_domains,
load_metadata_example,
sdtm_to_metadata,
validate_adam,
validate_adam_structure,
Expand Down Expand Up @@ -190,6 +191,7 @@
"register_adapter",
# Metadata standards import/export
"import_metadata",
"load_metadata_example",
"export_metadata",
"MetadataImport",
"MetadataPackage",
Expand Down
68 changes: 68 additions & 0 deletions pointblank/data/metadata_examples/datapackage.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
{
"name": "quarterly-sales",
"title": "Quarterly Sales Dataset",
"description": "Sales transactions for Q1 2024",
"resources": [
{
"name": "transactions",
"path": "transactions.csv",
"schema": {
"fields": [
{
"name": "transaction_id",
"type": "string",
"description": "Unique transaction identifier",
"constraints": {"required": true, "unique": true, "minLength": 5, "maxLength": 20}
},
{
"name": "customer_id",
"type": "string",
"description": "Customer account number",
"constraints": {"required": true, "minLength": 5, "maxLength": 20}
},
{
"name": "amount",
"type": "number",
"description": "Transaction amount in USD",
"constraints": {"required": true, "minimum": 0.01, "maximum": 99999.99}
},
{
"name": "quantity",
"type": "integer",
"description": "Number of items purchased",
"constraints": {"required": true, "minimum": 1, "maximum": 1000}
},
{
"name": "category",
"type": "string",
"description": "Product category",
"constraints": {
"required": true,
"enum": ["electronics", "clothing", "food", "home", "sports"]
}
},
{
"name": "sale_date",
"type": "date",
"description": "Date of sale",
"constraints": {"required": true}
},
{
"name": "discount_pct",
"type": "number",
"description": "Discount percentage applied",
"constraints": {"minimum": 0, "maximum": 50}
},
{
"name": "email",
"type": "string",
"description": "Customer email address",
"constraints": {"pattern": "^[^@]+@[^@]+\\.[^@]+$"}
}
],
"primaryKey": ["transaction_id"],
"missingValues": ["", "NA", "N/A"]
}
}
]
}
156 changes: 156 additions & 0 deletions pointblank/data/metadata_examples/define.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
<?xml version="1.0" encoding="UTF-8"?>
<ODM xmlns="http://www.cdisc.org/ns/odm/v1.3"
xmlns:def="http://www.cdisc.org/ns/def/v2.0"
xmlns:xlink="http://www.w3.org/1999/xlink"
FileOID="DEF.XYZ789"
FileType="Snapshot"
CreationDateTime="2024-06-01T10:00:00"
ODMVersion="1.3.2">

<Study OID="STUDY.XYZ789">
<GlobalVariables>
<StudyName>XYZ789 Phase III</StudyName>
<StudyDescription>A randomized, double-blind, placebo-controlled study</StudyDescription>
<ProtocolName>XYZ789</ProtocolName>
</GlobalVariables>

<MetaDataVersion OID="MDV.XYZ789.001"
Name="Study XYZ789, Data Definitions"
def:DefineVersion="2.0.0"
def:StandardName="SDTM-IG"
def:StandardVersion="3.4">

<!-- Demographics Domain -->
<ItemGroupDef OID="IG.DM"
Name="DM"
Repeating="No"
IsReferenceData="No"
Purpose="Tabulation"
def:Structure="One record per subject"
def:Class="SPECIAL PURPOSE"
def:Label="Demographics">
<ItemRef ItemOID="IT.DM.STUDYID" OrderNumber="1" Mandatory="Yes" Role="Identifier"/>
<ItemRef ItemOID="IT.DM.DOMAIN" OrderNumber="2" Mandatory="Yes" Role="Identifier"/>
<ItemRef ItemOID="IT.DM.USUBJID" OrderNumber="3" Mandatory="Yes" Role="Identifier"/>
<ItemRef ItemOID="IT.DM.SUBJID" OrderNumber="4" Mandatory="Yes" Role="Identifier"/>
<ItemRef ItemOID="IT.DM.RFSTDTC" OrderNumber="5" Mandatory="No" Role="Timing"/>
<ItemRef ItemOID="IT.DM.RFENDTC" OrderNumber="6" Mandatory="No" Role="Timing"/>
<ItemRef ItemOID="IT.DM.SITEID" OrderNumber="7" Mandatory="No" Role="Record Qualifier"/>
<ItemRef ItemOID="IT.DM.AGE" OrderNumber="8" Mandatory="No" Role="Record Qualifier"/>
<ItemRef ItemOID="IT.DM.AGEU" OrderNumber="9" Mandatory="No" Role="Record Qualifier"/>
<ItemRef ItemOID="IT.DM.SEX" OrderNumber="10" Mandatory="No" Role="Record Qualifier"/>
<ItemRef ItemOID="IT.DM.RACE" OrderNumber="11" Mandatory="No" Role="Record Qualifier"/>
<ItemRef ItemOID="IT.DM.ARMCD" OrderNumber="12" Mandatory="No" Role="Record Qualifier"/>
<ItemRef ItemOID="IT.DM.ARM" OrderNumber="13" Mandatory="No" Role="Record Qualifier"/>
</ItemGroupDef>

<!-- Adverse Events Domain -->
<ItemGroupDef OID="IG.AE"
Name="AE"
Repeating="Yes"
IsReferenceData="No"
Purpose="Tabulation"
def:Structure="One record per adverse event per subject"
def:Class="EVENTS"
def:Label="Adverse Events">
<ItemRef ItemOID="IT.AE.STUDYID" OrderNumber="1" Mandatory="Yes" Role="Identifier"/>
<ItemRef ItemOID="IT.AE.DOMAIN" OrderNumber="2" Mandatory="Yes" Role="Identifier"/>
<ItemRef ItemOID="IT.AE.USUBJID" OrderNumber="3" Mandatory="Yes" Role="Identifier"/>
<ItemRef ItemOID="IT.AE.AESEQ" OrderNumber="4" Mandatory="Yes" Role="Identifier"/>
<ItemRef ItemOID="IT.AE.AETERM" OrderNumber="5" Mandatory="Yes" Role="Topic"/>
<ItemRef ItemOID="IT.AE.AEDECOD" OrderNumber="6" Mandatory="Yes" Role="Synonym Qualifier"/>
<ItemRef ItemOID="IT.AE.AESEV" OrderNumber="7" Mandatory="No" Role="Record Qualifier" def:CodeListOID="CL.SEVERITY"/>
<ItemRef ItemOID="IT.AE.AESER" OrderNumber="8" Mandatory="No" Role="Record Qualifier" def:CodeListOID="CL.NY"/>
<ItemRef ItemOID="IT.AE.AESTDTC" OrderNumber="9" Mandatory="No" Role="Timing"/>
<ItemRef ItemOID="IT.AE.AEENDTC" OrderNumber="10" Mandatory="No" Role="Timing"/>
</ItemGroupDef>

<!-- Variable Definitions -->
<ItemDef OID="IT.DM.STUDYID" Name="STUDYID" DataType="text" Length="20" def:Label="Study Identifier"/>
<ItemDef OID="IT.DM.DOMAIN" Name="DOMAIN" DataType="text" Length="2" def:Label="Domain Abbreviation"/>
<ItemDef OID="IT.DM.USUBJID" Name="USUBJID" DataType="text" Length="40" def:Label="Unique Subject Identifier"/>
<ItemDef OID="IT.DM.SUBJID" Name="SUBJID" DataType="text" Length="20" def:Label="Subject Identifier for the Study"/>
<ItemDef OID="IT.DM.RFSTDTC" Name="RFSTDTC" DataType="text" Length="20" def:Label="Subject Reference Start Date/Time"/>
<ItemDef OID="IT.DM.RFENDTC" Name="RFENDTC" DataType="text" Length="20" def:Label="Subject Reference End Date/Time"/>
<ItemDef OID="IT.DM.SITEID" Name="SITEID" DataType="text" Length="10" def:Label="Study Site Identifier"/>
<ItemDef OID="IT.DM.AGE" Name="AGE" DataType="integer" def:Label="Age"/>
<ItemDef OID="IT.DM.AGEU" Name="AGEU" DataType="text" Length="10" def:Label="Age Units"/>
<ItemDef OID="IT.DM.SEX" Name="SEX" DataType="text" Length="2" def:Label="Sex">
<def:CodeListRef CodeListOID="CL.SEX"/>
</ItemDef>
<ItemDef OID="IT.DM.RACE" Name="RACE" DataType="text" Length="60" def:Label="Race">
<def:CodeListRef CodeListOID="CL.RACE"/>
</ItemDef>
<ItemDef OID="IT.DM.ARMCD" Name="ARMCD" DataType="text" Length="20" def:Label="Planned Arm Code"/>
<ItemDef OID="IT.DM.ARM" Name="ARM" DataType="text" Length="200" def:Label="Description of Planned Arm"/>

<ItemDef OID="IT.AE.STUDYID" Name="STUDYID" DataType="text" Length="20" def:Label="Study Identifier"/>
<ItemDef OID="IT.AE.DOMAIN" Name="DOMAIN" DataType="text" Length="2" def:Label="Domain Abbreviation"/>
<ItemDef OID="IT.AE.USUBJID" Name="USUBJID" DataType="text" Length="40" def:Label="Unique Subject Identifier"/>
<ItemDef OID="IT.AE.AESEQ" Name="AESEQ" DataType="integer" def:Label="Sequence Number"/>
<ItemDef OID="IT.AE.AETERM" Name="AETERM" DataType="text" Length="200" def:Label="Reported Term for the Adverse Event"/>
<ItemDef OID="IT.AE.AEDECOD" Name="AEDECOD" DataType="text" Length="200" def:Label="Dictionary-Derived Term"/>
<ItemDef OID="IT.AE.AESEV" Name="AESEV" DataType="text" Length="12" def:Label="Severity/Intensity">
<def:CodeListRef CodeListOID="CL.SEVERITY"/>
</ItemDef>
<ItemDef OID="IT.AE.AESER" Name="AESER" DataType="text" Length="2" def:Label="Serious Event">
<def:CodeListRef CodeListOID="CL.NY"/>
</ItemDef>
<ItemDef OID="IT.AE.AESTDTC" Name="AESTDTC" DataType="text" Length="20" def:Label="Start Date/Time of Adverse Event"/>
<ItemDef OID="IT.AE.AEENDTC" Name="AEENDTC" DataType="text" Length="20" def:Label="End Date/Time of Adverse Event"/>

<!-- Code Lists -->
<CodeList OID="CL.SEX" Name="Sex" DataType="text" def:Extensible="No">
<CodeListItem CodedValue="M">
<Decode><TranslatedText xml:lang="en">Male</TranslatedText></Decode>
</CodeListItem>
<CodeListItem CodedValue="F">
<Decode><TranslatedText xml:lang="en">Female</TranslatedText></Decode>
</CodeListItem>
<CodeListItem CodedValue="U">
<Decode><TranslatedText xml:lang="en">Unknown</TranslatedText></Decode>
</CodeListItem>
</CodeList>

<CodeList OID="CL.RACE" Name="Race" DataType="text" def:Extensible="Yes">
<CodeListItem CodedValue="WHITE">
<Decode><TranslatedText xml:lang="en">White</TranslatedText></Decode>
</CodeListItem>
<CodeListItem CodedValue="BLACK OR AFRICAN AMERICAN">
<Decode><TranslatedText xml:lang="en">Black or African American</TranslatedText></Decode>
</CodeListItem>
<CodeListItem CodedValue="ASIAN">
<Decode><TranslatedText xml:lang="en">Asian</TranslatedText></Decode>
</CodeListItem>
<CodeListItem CodedValue="AMERICAN INDIAN OR ALASKA NATIVE">
<Decode><TranslatedText xml:lang="en">American Indian or Alaska Native</TranslatedText></Decode>
</CodeListItem>
<CodeListItem CodedValue="NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER">
<Decode><TranslatedText xml:lang="en">Native Hawaiian or Other Pacific Islander</TranslatedText></Decode>
</CodeListItem>
</CodeList>

<CodeList OID="CL.SEVERITY" Name="Severity" DataType="text" def:Extensible="No">
<CodeListItem CodedValue="MILD">
<Decode><TranslatedText xml:lang="en">Mild</TranslatedText></Decode>
</CodeListItem>
<CodeListItem CodedValue="MODERATE">
<Decode><TranslatedText xml:lang="en">Moderate</TranslatedText></Decode>
</CodeListItem>
<CodeListItem CodedValue="SEVERE">
<Decode><TranslatedText xml:lang="en">Severe</TranslatedText></Decode>
</CodeListItem>
</CodeList>

<CodeList OID="CL.NY" Name="No Yes Response" DataType="text" def:Extensible="No">
<CodeListItem CodedValue="N">
<Decode><TranslatedText xml:lang="en">No</TranslatedText></Decode>
</CodeListItem>
<CodeListItem CodedValue="Y">
<Decode><TranslatedText xml:lang="en">Yes</TranslatedText></Decode>
</CodeListItem>
</CodeList>

</MetaDataVersion>
</Study>
</ODM>
Binary file added pointblank/data/metadata_examples/dm.xpt
Binary file not shown.
119 changes: 119 additions & 0 deletions pointblank/data/metadata_examples/sdtm_ct.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
<?xml version="1.0" encoding="UTF-8"?>
<ODM xmlns="http://www.cdisc.org/ns/odm/v1.3"
xmlns:nciodm="http://ncicb.nci.nih.gov/xml/odm/EVS/CDISC"
FileOID="CT.SDTM.2024-03-29"
FileType="Snapshot"
CreationDateTime="2024-03-29T00:00:00"
ODMVersion="1.3.2">

<Study OID="CT.SDTM">
<GlobalVariables>
<StudyName>CDISC SDTM Controlled Terminology</StudyName>
<StudyDescription>CDISC Submission Value-Level Terminology, 2024-03-29</StudyDescription>
<ProtocolName>SDTM Terminology</ProtocolName>
</GlobalVariables>

<MetaDataVersion OID="MDV.CT.SDTM.2024-03-29" Name="CDISC SDTM CT 2024-03-29">

<!-- Sex Codelist (C66731) -->
<CodeList OID="CL.C66731.SEX" Name="Sex" DataType="text"
nciodm:CodeListExtensible="No"
nciodm:CDISCSubmissionValue="SEX">
<nciodm:CDISCSynonym>Sex</nciodm:CDISCSynonym>
<nciodm:CDISCDefinition>Sex of the subject.</nciodm:CDISCDefinition>
<CodeListItem CodedValue="F" nciodm:ExtCodeID="C16576">
<Decode><TranslatedText xml:lang="en">Female</TranslatedText></Decode>
<nciodm:CDISCSynonym>Female</nciodm:CDISCSynonym>
<nciodm:CDISCDefinition>A person who belongs to the sex that normally produces ova.</nciodm:CDISCDefinition>
</CodeListItem>
<CodeListItem CodedValue="M" nciodm:ExtCodeID="C20197">
<Decode><TranslatedText xml:lang="en">Male</TranslatedText></Decode>
<nciodm:CDISCSynonym>Male</nciodm:CDISCSynonym>
<nciodm:CDISCDefinition>A person who belongs to the sex that normally produces sperm.</nciodm:CDISCDefinition>
</CodeListItem>
<CodeListItem CodedValue="U" nciodm:ExtCodeID="C17998">
<Decode><TranslatedText xml:lang="en">Unknown</TranslatedText></Decode>
<nciodm:CDISCSynonym>Unknown</nciodm:CDISCSynonym>
<nciodm:CDISCDefinition>Not known, not observed, not recorded, or refused.</nciodm:CDISCDefinition>
</CodeListItem>
<CodeListItem CodedValue="UNDIFFERENTIATED" nciodm:ExtCodeID="C45908">
<Decode><TranslatedText xml:lang="en">Undifferentiated</TranslatedText></Decode>
<nciodm:CDISCSynonym>Undifferentiated</nciodm:CDISCSynonym>
<nciodm:CDISCDefinition>Sex could not be determined.</nciodm:CDISCDefinition>
</CodeListItem>
</CodeList>

<!-- Severity (C66769) -->
<CodeList OID="CL.C66769.SEVERITY" Name="Severity/Intensity Scale for Adverse Events"
DataType="text"
nciodm:CodeListExtensible="No"
nciodm:CDISCSubmissionValue="AESEV">
<nciodm:CDISCSynonym>Severity/Intensity Scale for Adverse Events</nciodm:CDISCSynonym>
<CodeListItem CodedValue="MILD" nciodm:ExtCodeID="C41338">
<Decode><TranslatedText xml:lang="en">Mild</TranslatedText></Decode>
</CodeListItem>
<CodeListItem CodedValue="MODERATE" nciodm:ExtCodeID="C41339">
<Decode><TranslatedText xml:lang="en">Moderate</TranslatedText></Decode>
</CodeListItem>
<CodeListItem CodedValue="SEVERE" nciodm:ExtCodeID="C41340">
<Decode><TranslatedText xml:lang="en">Severe</TranslatedText></Decode>
</CodeListItem>
</CodeList>

<!-- No Yes (C66742) -->
<CodeList OID="CL.C66742.NY" Name="No Yes Response" DataType="text"
nciodm:CodeListExtensible="No"
nciodm:CDISCSubmissionValue="NY">
<CodeListItem CodedValue="N" nciodm:ExtCodeID="C49487">
<Decode><TranslatedText xml:lang="en">No</TranslatedText></Decode>
</CodeListItem>
<CodeListItem CodedValue="Y" nciodm:ExtCodeID="C49488">
<Decode><TranslatedText xml:lang="en">Yes</TranslatedText></Decode>
</CodeListItem>
</CodeList>

<!-- Race (C74457) -->
<CodeList OID="CL.C74457.RACE" Name="Race" DataType="text"
nciodm:CodeListExtensible="Yes"
nciodm:CDISCSubmissionValue="RACE">
<CodeListItem CodedValue="AMERICAN INDIAN OR ALASKA NATIVE" nciodm:ExtCodeID="C41259">
<Decode><TranslatedText xml:lang="en">American Indian or Alaska Native</TranslatedText></Decode>
</CodeListItem>
<CodeListItem CodedValue="ASIAN" nciodm:ExtCodeID="C41260">
<Decode><TranslatedText xml:lang="en">Asian</TranslatedText></Decode>
</CodeListItem>
<CodeListItem CodedValue="BLACK OR AFRICAN AMERICAN" nciodm:ExtCodeID="C16352">
<Decode><TranslatedText xml:lang="en">Black or African American</TranslatedText></Decode>
</CodeListItem>
<CodeListItem CodedValue="NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER" nciodm:ExtCodeID="C41219">
<Decode><TranslatedText xml:lang="en">Native Hawaiian or Other Pacific Islander</TranslatedText></Decode>
</CodeListItem>
<CodeListItem CodedValue="WHITE" nciodm:ExtCodeID="C41261">
<Decode><TranslatedText xml:lang="en">White</TranslatedText></Decode>
</CodeListItem>
</CodeList>

<!-- Route of Administration (C66729) - extensible example -->
<CodeList OID="CL.C66729.ROUTE" Name="Route of Administration" DataType="text"
nciodm:CodeListExtensible="Yes"
nciodm:CDISCSubmissionValue="ROUTE">
<CodeListItem CodedValue="ORAL" nciodm:ExtCodeID="C38288">
<Decode><TranslatedText xml:lang="en">Oral</TranslatedText></Decode>
</CodeListItem>
<CodeListItem CodedValue="INTRAVENOUS" nciodm:ExtCodeID="C38276">
<Decode><TranslatedText xml:lang="en">Intravenous</TranslatedText></Decode>
</CodeListItem>
<CodeListItem CodedValue="SUBCUTANEOUS" nciodm:ExtCodeID="C38299">
<Decode><TranslatedText xml:lang="en">Subcutaneous</TranslatedText></Decode>
</CodeListItem>
<CodeListItem CodedValue="TOPICAL" nciodm:ExtCodeID="C38304">
<Decode><TranslatedText xml:lang="en">Topical</TranslatedText></Decode>
</CodeListItem>
<CodeListItem CodedValue="INTRAMUSCULAR" nciodm:ExtCodeID="C28161">
<Decode><TranslatedText xml:lang="en">Intramuscular</TranslatedText></Decode>
</CodeListItem>
</CodeList>

</MetaDataVersion>
</Study>
</ODM>
Loading
Loading