================================================================================ OMOP-DB & ATLAS インストール on CentOS7 ================================================================================ OMOP-DB、R-Studio、ATLAS をCentOS7上にデモ構築する。 ・説明を簡便にするため、rootにて操作する前提 ・本運用環境には使用しないこと。 - セキュリティ設定を大幅に省いているため危険である。実データは入れないこと。 - DBを単一databaseで構成していて、本運用向きではない。 ・適している目的 - OMOP環境構築の学習のため - 今後の構築のベースとするための参考実装として - ETLプログラム開発時の仮OMOP環境として(要拡張) - ボキャブラリmapping作成時の仮OMOP環境として(要拡張) ================================================================================ ■ 一般ツール類インストール ○マシン/OS構成 ・HDDは100GB(以上) - /var 60GB、/home 30GB。 - 本デモ構成では /homeと / とでパーティションを分けないことを推奨。 ・メモリ8GB以上 ・CentOS7  - GUIはなくて良い。minimal installでも可 - デフォルトPostgreSQLをOSインストール時に入れないようにする。 ○凡例 :今から構築するマシンのIPアドレス。localhost(127.0.0.1)ではない。 ip a | grep inet | grep brd で取得できる ○諸々インストール yum -y update yum -y install epel-release yum -y install wget gcc git unzip yum -y install perl-App-cpanminus yum -y install libxml2-devel libcurl-devel ○PATHに/usr/local/bin追加 perl -i -pe 's|HOME/bin$|HOME/bin:/usr/local/bin|' /root/.bash_profile →以降、sudo -iでrootになることで/usr/local/binがpathにはいる。 ○SELINUXをdisabledへ。 sed -i 's/SELINUX\=enforcing/SELINUX=disabled/' /etc/selinux/config ○再起動&ログイン reboot 再度ログインして sudo -i ----------------------------------------------------------------------- ○ Dockerのインストール yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install -y docker-ce docker-ce-cli containerd.io docker version systemctl start docker systemctl enable docker ----------------------------------------------------------------------- ○ Docker-composeのインストール curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose ----------------------------------------------------------------------- ○ R studioのインストール useradd rstudio usermod -aG wheel rstudio passwd rstudio  →新パスワードを2回聞かれるので入力 yum install -y R yum install -y --nogpgcheck https://download2.rstudio.org/rstudio-server-rhel-1.1.463-x86_64.rpm firewall-cmd --add-port=8787/tcp --permanent firewall-cmd --reload ブラウザで http://:8787 にアクセス → rstudioにログインできることを確認。 ================================================================================ ■ Postgresインストール&SynPUFデータ格納 ○ Postgresインストール 今回は、Postgres10を使う。 PotsgresプロジェクトのRedHat系インストール説明ページ https://www.postgresql.org/download/linux/redhat/ から、Version10、CentOS7を選ぶと、下記が出てくるので実行する。 yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm yum install -y postgresql10 postgresql10-server ○ Posgres起動&設定 /usr/pgsql-10/bin/postgresql-10-setup initdb systemctl enable postgresql-10 systemctl start postgresql-10 ・作業ディレクトリを作成して移動 mkdir /home/postgres chown postgres.postgres /home/postgres cd /home/postgres ・パスワード設定 su postgres psql -c "alter role postgres with password 'omop-db'" exit ・アクセス制御設定 pg_hba.confで、(1)認証をmd5に、(2)必要なアクセス元を追加 vi /var/lib/pgsql/10/data/pg_hba.conf local all all md5 の行を追加   host all all 127.0.0.1 のidentをmd5に変更   host all all 172.16.0.0/12 md5 の行を追加(for docker) host all all /32 md5 の行を追加 vi /var/lib/pgsql/10/data/postgresql.conf listen_addresses = '*' shared_buffers = 2048MB # 物理メモリの1/4 temp_buffers = 32MB work_mem = 32MB maintenance_work_mem = 128MB firewall-cmd --add-port=5432/tcp --permanent firewall-cmd --reload ・Postgresを再起動 systemctl restart postgresql-10 →ps axでpostgresプロセスがあることを確認 ----------------------------------------------------------------------- ○ pgadmin4をインストール (1) 最初にrehl-repoを削除(元々ないかも) rpm -e pgadmin4-redhat-repo (2) Repoを設定 rpm -i https://ftp.postgresql.org/pub/pgadmin/pgadmin4/yum/pgadmin4-redhat-repo-2-1.noarch.rpm (3) pgadmin4をインストール ・desktop model のみ yum -y install pgadmin4-desktop ・web model のみ★ yum -y install pgadmin4-web ・両方 yum -y install pgadmin4 firewall-cmd --add-port=80/tcp --permanent firewall-cmd --reload (4) web setup scriptで初期化する。web modeで動作するには必要。 /usr/pgadmin4/bin/setup-web.sh email & pass: →pgadmin4のログイン情報を設定する http:///pgadmin4/ へアクセスし、  ログイン後左ペインの"Servers"をクリックして、"Add New Serever"する。 Generalタブ Name: 適宜命名(Postgres10など) Connectionタブ Host address: Username: postgres Password: omop-db Save password: on →"Save"すると接続されている ----------------------------------------------------------------------- ○ デモ用 OneDB版のUser/Database/Schemaを作成 データべース構成 DB名 postgres スキーマ名 ohdsi: WebAPI用 スキーマ名 cdmv5: 全CDMテーブル(デモ用構成ではvocabも含む) スキーマ名 results: 後で各テーブルが作成される スキーマ名 temp (スキーマpublicは使わない) 手順 cd /home/postgres su postgres psql create schema ohdsi authorization postgres; create schema cdmv5 authorization postgres; create schema results authorization postgres; create schema temp authorization postgres; \q exit; →pgadmin4でschemaができていることを確認 ----------------------------------------------------------------------- ○ OMOP-CDM table定義の準備 ・OHDSIのgithubからダウンロードする cd /home/postgres curl -L https://github.com/OHDSI/CommonDataModel/archive/refs/tags/v5.3.1.tar.gz -o v5.3.1.tar.gz tar xvfz v5.3.1.tar.gz ・ファイル名変更/Posgresに合わせて変更/Bug修正のため加工する cd CommonDataModel-5.3.1/PostgreSQL cp -p 'OMOP CDM postgresql indexes.txt' OMOPindexes.txt perl -pe 's/DATETIME2/TIMESTAMP/g; s/[ \t]+/ /g;' <'OMOP CDM postgresql ddl.txt' >OMOPddl.txt perl -pe 's/fpk_ visit_concept_s/fpk_visit_concept_s/' <'OMOP CDM postgresql constraints.txt' >OMOPconstraints.txt ----------------------------------------------------------------------- ○ SynPUFデータの準備 ・OHDSIサイトからダウンロード  https://ohdsi.org/data-standardization/ にある、"CMS SynPUF5% Smple"ボタンをクリックし、  Google Driveからダウンロードする。  ファイル名:synpuf5pct_20180710.zip ・Postgresサーバーにアップロードする  synpuf5pct_20180710.zipを/home/postgresにアップロード ・展開 cd /home/postgres mkdir /home/postgres/synpuf unzip synpuf5pct_20180710.zip -d /home/postgres/synpuf ・データが2018年作成でCDM Version 5.2.2なので、5.3.1になるよう念のため加工する  (下でまとめて実行する) cd /home/postgres/synpuf condition_occurrence : visit_detail_id列にdummyを追加 perl -i.bak -pe '@_=split(/\t/,$_);splice(@_,11,0,"");$_=join("\t",@_)' condition_occurrence.csv concept : 255文字以上のconcept_name列に対応(""で囲まれているため短くはしない) 後のSTEPで実施する→ALTER TABLE concept ALTER COLUMN concept_name TYPE VARCHAR(400); device_exposure: visit_detail_id列にdummyを追加 perl -i.bak -pe '@_=split(/\t/,$_);splice(@_,12,0,"");$_=join("\t",@_)' device_exposure.csv drug_exposure: visit_detail_id列にdummyを追加 perl -i.bak -pe '@_=split(/\t/,$_);splice(@_,18,0,"");$_=join("\t",@_)' drug_exposure.csv measurement: measurement_datetime列とvisit_detail_id列にdummyを追加 perl -i.bak -pe '@_=split(/\t/,$_);splice(@_,5,0,"");splice(@_,15,0,"");$_=join("\t",@_)' measurement.csv observation: visit_detail_id列にdummyを追加 perl -i.bak -pe '@_=split(/\t/,$_);splice(@_,13,0,"");$_=join("\t",@_)' observation.csv payer_plan_period: 10個のdummy列を追加 perl -i.bak -pe 'chomp;$_.=("\t"x10)."\n"' payer_plan_period.csv procedure_occurrence: visit_detail_id列にdummyを追加 perl -i.bak -pe '@_=split(/\t/,$_);splice(@_,10,0,"");$_=join("\t",@_)' procedure_occurrence.csv ・上記の加工をまとめて実行するperlスクリプトを作る cd /home/postgres cat > procSynPUF.pl (この下からコピペ)------------------------------- #!/usr/bin/perl chdir("/home/postgres/synpuf"); while() { next unless /^perl/; print $_; chomp; system($_); } exit; __END__ perl -i.bak -pe '@_=split(/\t/,$_);splice(@_,11,0,"");$_=join("\t",@_)' condition_occurrence.csv perl -i.bak -pe '@_=split(/\t/,$_);splice(@_,12,0,"");$_=join("\t",@_)' device_exposure.csv perl -i.bak -pe '@_=split(/\t/,$_);splice(@_,18,0,"");$_=join("\t",@_)' drug_exposure.csv perl -i.bak -pe '@_=split(/\t/,$_);splice(@_,5,0,"");splice(@_,15,0,"");$_=join("\t",@_)' measurement.csv perl -i.bak -pe '@_=split(/\t/,$_);splice(@_,13,0,"");$_=join("\t",@_)' observation.csv perl -i.bak -pe 'chomp;$_.=("\t"x10)."\n"' payer_plan_period.csv perl -i.bak -pe '@_=split(/\t/,$_);splice(@_,10,0,"");$_=join("\t",@_)' procedure_occurrence.csv (この上まで)-------------------------------------- Ctrl+D で終了 ・perlスクリプトを実行 perl procSynPUF.pl ----------------------------------------------------------------------- ○ OMOP-CDM tableの作成と読み込み (これらも下でまとめて実行する) su postgres psql set search_path to "cdmv5"; \i /home/postgres/CommonDataModel-5.3.1/PostgreSQL/OMOPddl.txt COPY care_site FROM '/home/postgres/synpuf/care_site.csv' WITH DELIMITER E'\t' NULL AS ''; COPY cdm_source FROM '/home/postgres/synpuf/cdm_source.csv' WITH DELIMITER E'\t' NULL AS ''; COPY concept_ancestor FROM '/home/postgres/synpuf/concept_ancestor.csv' WITH DELIMITER E'\t' NULL AS ''; COPY concept_class FROM '/home/postgres/synpuf/concept_class.csv' WITH DELIMITER E'\t' NULL AS ''; ALTER TABLE concept ALTER COLUMN concept_name TYPE VARCHAR(400); COPY concept FROM '/home/postgres/synpuf/concept.csv' WITH DELIMITER E'\t' NULL AS ''; COPY concept_relationship FROM '/home/postgres/synpuf/concept_relationship.csv' WITH DELIMITER E'\t' NULL AS ''; COPY concept_synonym FROM '/home/postgres/synpuf/concept_synonym.csv' WITH DELIMITER E'\t' NULL AS ''; COPY condition_era FROM '/home/postgres/synpuf/condition_era.csv' WITH DELIMITER E'\t' NULL AS ''; COPY condition_occurrence FROM '/home/postgres/synpuf/condition_occurrence.csv' WITH DELIMITER E'\t' NULL AS ''; COPY cost FROM '/home/postgres/synpuf/cost.csv' WITH DELIMITER E'\t' NULL AS ''; COPY death FROM '/home/postgres/synpuf/death.csv' WITH DELIMITER E'\t' NULL AS ''; COPY device_exposure FROM '/home/postgres/synpuf/device_exposure.csv' WITH DELIMITER E'\t' NULL AS ''; COPY domain FROM '/home/postgres/synpuf/domain.csv' WITH DELIMITER E'\t' NULL AS ''; COPY drug_era FROM '/home/postgres/synpuf/drug_era.csv' WITH DELIMITER E'\t' NULL AS ''; COPY drug_exposure FROM '/home/postgres/synpuf/drug_exposure.csv' WITH DELIMITER E'\t' NULL AS ''; COPY drug_strength FROM '/home/postgres/synpuf/drug_strength.csv' WITH DELIMITER E'\t' NULL AS ''; COPY location FROM '/home/postgres/synpuf/location.csv' WITH DELIMITER E'\t' NULL AS ''; COPY measurement FROM '/home/postgres/synpuf/measurement.csv' WITH DELIMITER E'\t' NULL AS ''; COPY observation FROM '/home/postgres/synpuf/observation.csv' WITH DELIMITER E'\t' NULL AS ''; COPY observation_period FROM '/home/postgres/synpuf/observation_period.csv' WITH DELIMITER E'\t' NULL AS ''; COPY payer_plan_period FROM '/home/postgres/synpuf/payer_plan_period.csv' WITH DELIMITER E'\t' NULL AS ''; COPY person FROM '/home/postgres/synpuf/person.csv' WITH DELIMITER E'\t' NULL AS ''; COPY procedure_occurrence FROM '/home/postgres/synpuf/procedure_occurrence.csv' WITH DELIMITER E'\t' NULL AS ''; COPY provider FROM '/home/postgres/synpuf/provider.csv' WITH DELIMITER E'\t' NULL AS ''; COPY relationship FROM '/home/postgres/synpuf/relationship.csv' WITH DELIMITER E'\t' NULL AS ''; COPY visit_occurrence FROM '/home/postgres/synpuf/visit_occurrence.csv' WITH DELIMITER E'\t' NULL AS ''; COPY vocabulary FROM '/home/postgres/synpuf/vocabulary.csv' WITH DELIMITER E'\t'; \i /home/postgres/CommonDataModel-5.3.1/PostgreSQL/OMOPindexes.txt \i /home/postgres/CommonDataModel-5.3.1/PostgreSQL/OMOPconstraints.txt \pset pager off \dt \q exit ・個々時間がかかるため、上記Postgresコマンドは一括で実行する (1) Postgresコマンドをリストしたファイルを作る cd /home/postgres cat >readSynPUFdata.sql (上記 set search_path から \dt の行までをコピペ) Ctrl+D (2) 読み込みつつ実行(30分ほどかかる) sudo -u postgres psql -af readSynPUFdata.sql ================================================================================ ■ Breadseaの構築とATLAS起動 mkdir /home/omop cd /home/omop docker pull ohdsi/broadsea-webtools:latest docker pull ohdsi/broadsea-methodslibrary:latest git clone https://github.com/OHDSI/Broadsea.git mkdir /home/omop/dockerwk cp -r Broadsea /home/omop/dockerwk cd /home/omop/dockerwk/Broadsea/postgresql cp docker-compose.yml ../ ・docker-compose.yml を変更する cd /home/omop/dockerwk/Broadsea sed -i 's/192.168.99.100//g' docker-compose.yml sed -i 's/secret\-database\-name/postgres/g' docker-compose.yml sed -i 's/secret\-user\-name/postgres/g' docker-compose.yml sed -i 's/secret\-user\-password/omop-db/g' docker-compose.yml sed -i 's/\=cdm$/=cdmv5/' docker-compose.yml sed -i 's/8787\:/8987:/' docker-compose.yml (docker-compose.yml 変更点一覧) broadsea-methods-library: ports: - "8987:8787" broadsea-webtools: - WEBAPI_URL=http://:8080 - datasource_url=jdbc:postgresql://:5432/postgres - datasource.cdm.schema=cdmv5 - datasource_username=postgres - datasource_password=omop-db - flyway_datasource_url=jdbc:postgresql://:5432/postgres - flyway_datasource_username=postgres - flyway_datasource_password=omop-db ・config-local.jsを変更する cd /home/omop/dockerwk/Broadsea sed -i $'s/baseUrl + \'/\'http:\/\/:8080/' config-local.js (config-local.js 変更点) configLocal.api = { name: 'OHDSI', url: 'http://:8080/WebAPI/' }; ・fireall設定 firewall-cmd --add-port=8080/tcp --permanent firewall-cmd --reload ○ いちどBroadseaを起動してWebAPI初期化 cd /home/omop/dockerwk/Broadsea docker-compose up -d ・WebAPI確認&初期化 ブラウザで http://:8080/WebAPI/info にアクセス →少し待つと、{"version":"2.9.0",... が表示される。 →pgadmin4で、ohdsiスキーマに多数のテーブルが作成されていることを確認する。 1回停止する。 docker-compose down ○ source_daimon & sourceテーブルの設定 su postgres psql select * from ohdsi.source_daimon; select * from ohdsi.source; 上記2つが空であることを確認する -- OHDSI CDM source INSERT INTO ohdsi.source( source_id, source_name, source_key, source_connection, source_dialect) VALUES (1, 'OHDSI CDMv5 Database', 'CDMv5', 'jdbc:postgresql://:5432/postgres?user=postgres&password=omop-db', 'postgresql'); \x select * from ohdsi.source; \x -- CDM daimon INSERT INTO ohdsi.source_daimon( source_daimon_id, source_id, daimon_type, table_qualifier, priority) VALUES (1, 1, 0, 'cdmv5', 2); -- VOCABULARY daimon INSERT INTO ohdsi.source_daimon( source_daimon_id, source_id, daimon_type, table_qualifier, priority) VALUES (2, 1, 1, 'cdmv5', 2); -- RESULTS daimon INSERT INTO ohdsi.source_daimon( source_daimon_id, source_id, daimon_type, table_qualifier, priority) VALUES (3, 1, 2, 'results', 2); -- EVIDENCE daimon INSERT INTO ohdsi.source_daimon( source_daimon_id, source_id, daimon_type, table_qualifier, priority) VALUES (4, 1, 3, 'temp', 2); select * from ohdsi.source_daimon; ⇒以下ができていることを確認 source_daimon_id | source_id | daimon_type | table_qualifier | priority ------------------+-----------+-------------+-----------------+---------- 1 | 1 | 0 | cdmv5 | 2 2 | 1 | 1 | cdmv5 | 2 3 | 1 | 2 | results | 2 4 | 1 | 3 | temp | 2 \q exit; ○ 再度Broadsea起動 cd /home/omop/dockerwk/Broadsea docker-compose up -d ATLAS起動確認 http://:8080/atlas/ - 最初少し時間かかる。 - まだ色々動作しない。 ○ Results schemaセットアップ、Achillesを実行 (1) Resultsスキーマをセットアップ ・ブラウザで以下をアクセス http://:8080/WebAPI/ddl/results?dialect=postgresql&schema=results&vocabSchema=cdmv5&tempSchema=temp&initConceptHierarchy=true →出てきたSQLを、/home/postgres/initResultsSchema.sql に保存する cat >/home/postgres/initResultsSchema.sql ブラウザ画面のテキスト(CREATE TABLE以下全部)をコピーして(Ctrl+A, Ctrl+C) ターミナルにペースト Enter Ctrl+D で終了 ・SQLファイルを実行する su postgres psql set search_path to "results"; \i /home/postgres/initResultsSchema.sql -- CREATE TABLE等が実行される(2分ほど) \dt select count(*) from concept_hierarchy; -- countが3202771になっているはず \q exit (2) Achilles を実行してdashbord等のデータを作る http://:8787/ にwebログインして以下を実行する。 install.packages("remotes") remotes::install_github("ohdsi/Achilles") # 30分ぐらいかかる library("Achilles") remotes::install_github("OHDSI/CohortMethod") # 15分ぐらいかかる library("CohortMethod") Sys.setenv("DATABASECONNECTOR_JAR_FOLDER" = "/home/rstudio/jdbcDrivers") downloadJdbcDrivers("postgresql") connectionDetails <- createConnectionDetails(dbms="postgresql", server="127.0.0.1/postgres", user = "postgres", password = "omop-db", port="5432") checkCmInstallation(connectionDetails) (Achilles with Heel) 20分ぐらいかかる achilles(connectionDetails, cdmDatabaseSchema = "cdmv5", resultsDatabaseSchema="results", vocabDatabaseSchema = "cdmv5", numThreads = 1, sourceName = "SynPUF 5%", cdmVersion = "5.3.1", runHeel = TRUE, createTable = TRUE, runCostAnalysis = FALSE) ----------------------------------------------------------------------- ■ ATLASが動作することを確認する http://:8080/atlas/ ----------------------------------------------------------------------- 以上