Skip to content

Commit

Permalink
[Hack Update] 027-FHIRPoweredHealthcare - Updated version 3 of FHIR P…
Browse files Browse the repository at this point in the history
…owered Healthcare WTH content (microsoft#515)

* Updated Student and image folder files for v3

Updated Student folder challenge files and images folder files for v3.

* Update readme and challenges00 files.

* Updated challenge 7 content for MedTech Service

Update challenge 7 IoT ingest and persist for MedTech Service.

* Updated challenges_architecture

Updated challenges_architecture for new challenge 7 content

* Update all challenge images

* Update challenge content and images

* Update challenge content images

* Update challenge 6 contents.

* Update challenge 1 content

* Update challenge 2 contents.

* Update challenge 1 contents.

* Update challenge 2 contents

* Update challenge 6 contents

* Update challenge 6 contents

* Update challenge 7 contents.

* Refactor all challenges to remove deprecated ch3-Read FHIR data

* Update readme content

* Update readme.md

* Update readme.md

* Update readme.md

* Update readme.md

* Update readme.md

* Update Challenge01.md

* Update Challenge05.md

* Update Challenge05.md

* Update readme.md

* Update readme.md

* Update coach's solution content and hack presentation

* Update Solution01.md

* Update Solution file for challenge 5

* Update solution files for challenge 4

* Create Solution06.md

* Update Solution06.md

* Update challenge 6 and solution 6

* Update Solution 6 and postman collections

* Update Solution06.md

* Update Solution06.md

* Update HealthArchitecture.png

* Update Challenge06.md

* Update Challenge06.md

* Update Challenge06.md

* Update Challenge04.md

* update challenge 3 content

* Update Challenge03.md

* Update Solution03.md

* Added new challenge 7 and refactor challenge 6

* Update readme.md

* Update challenge 7 and solution 7 contents

* Update readme.md

* Update Challenge07.md

* Update Challenge07.md

* Update Challenge07.md

* Update Challenge07.md

* Update Solution07.md

* Update Solution07.md

* Update Solution07.md

* Update Coach READ.me and Challenge 0 contents

* Update readme.md

* Update Challenge00.md

* Update Challenge00.md

* Update Challenge00.md

* Update challenge titles

* Update challenge titles for README.md files

* Update images to white background

* Update Solution06.md

* Update Solution06.md

* update readme and challenge 0 contents

* Update readme.md

* Update Challenge03.md

* Update Challenge03.md

* Update Challenge03.md

* Update Challenge04.md

* Update Challenge04.md

* Update Challenge04.md

* Update Challenge04.md

* Update Challenge04.md

* Update Challenge04.md

* Update Challenge05.md

* Update Challenge05.md

* Update Challenge05.md

* Update Challenge05.md

* Update Challenge06.md

* Update Challenge07.md

* Update Challenge07.md

* Update Challenge00.md

* Update Challenge01.md

* Update Challenge01.md

* Update Challenge07.md

* Update Challenge07.md

* Removed old student resources folders

* Update Challenge07.md

* Update Lectures.pptx

* Rename readme.md to README.md

* Rename readme.md to README.md

* Removed unused images

* Update Challenge03.md

* Update Challenge00.md

* Update README.md

* Update Challenge00.md

* update Home link to README.md

* Update README.md

* Update README.md

* Update Solution03.md

* Delete 027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06 directory

* Update Lectures.pptx

* Delete architecture.jpg

* Resolve merge review issues.

* Update challenge 1 for Postman configurations

* Update challenge 1 Leaning Resources

* Update challenge 3 to include web app

* Update Solution03.md

* Update Solution06.md

* Update Solution06.md

* Update Solution07.md

* Update Challenge01.md

* Update Challenge06.md

* Update Solution03.md

* Update Solution03.md

* Update README.md

"Azure Health Data Services platform is A fully managed..."

* Update README.md

Extract FHIR data via FHIR Analytics...

* Update Challenge00.md

backticks on "Resources.zip"

* Update Challenge01.md

grammar in intro paragraph

* Update Challenge06.md

* Update Challenge05.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

Co-authored-by: Peter C. Laudati <plaudati@hotmail.com>
  • Loading branch information
2 people authored and jordanbean-msft committed Oct 2, 2023
1 parent d990d5e commit 0722532
Show file tree
Hide file tree
Showing 203 changed files with 3,107 additions and 28,841 deletions.
Binary file modified 027-FHIRPoweredHealthcare/Coach/Lectures.pptx
Binary file not shown.
80 changes: 80 additions & 0 deletions 027-FHIRPoweredHealthcare/Coach/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
# What The Hack - FHIR Powered Healthcare - Coach Guide

## Introduction

Welcome to the coach's guide for the FHIR Powered Healthcare What The Hack. Here you will find links to specific guidance for coaches for each of the challenges.

This hack includes an optional [lecture presentation](Lectures.pptx?raw=true) that features short presentations to introduce key topics associated with each challenge. It is recommended that the host present each short presentation before attendees kick off that challenge.

**NOTE:** If you are a Hackathon participant, this is the answer guide. Don't cheat yourself by looking at these during the hack! Go learn something. :)

## Coach's Guides

**These challenges must be completed in order:**
- Challenge 0: **[Pre-requisites - Ready, Set, GO!](./Solution00.md)**
- Required tools needed to implement the hack challenges
- Challenge 1: **[Extract and Load FHIR EHR Data](./Solution01.md)**
- Deploy FHIR service in Azure Health Data Services platform
- Generate and load synthetic Electronic Health Record (EHR) data into FHIR Service.

**These challenges can be completed in any order:**
- Challenge 2: **[Extract and Load HL7v2 and C-CDA EHR Data](./Solution02.md)**
- Convert and Load HL7v2 and C-CDA clinical data into FHIR Service.
- Challenge 3: **[Search FHIR EHR Data](./Solution03.md)**
- Develop Single Page App (SPA) to search and view FHIR EHR data.
- Challenge 4: **[Explore and Analyze FHIR EHR Data](./Solution04.md)**
- Transform and explore FHIR data for secondary use analytics.
- Challenge 5: **[Export and Anonymize FHIR EHR Data](./Solution05.md)**
- Export, anonymize and store FHIR EHR data in data lake for secondary use.
- Challenge 6: **[Ingest and Persist IoT Medical Device Data](./Solution06.md)**
- Ingest, transform and load medical IoT device data into FHIR using MedTech service.
- Challenge 7: **[Load DICOM Imaging Data](./Solution07.md)**
- Ingest, search and retrieve imaging data persisted in the DICOM service.

## Coach Prerequisites

This hack has pre-reqs that a coach is responsible for understanding and/or setting up BEFORE hosting an event. Please review the [What The Hack Hosting Guide](https://aka.ms/wthhost) for information on how to host a hack event.

The guide covers the common preparation steps a coach needs to do before any What The Hack event, including how to properly configure Microsoft Teams.

### Student Resources

Before the hack, it is the Coach's responsibility to download and package up the contents of the `/Student/Resources` folder of this hack into a "Resources.zip" file. The coach should then provide a copy of the Resources.zip file to all students at the start of the hack.

Always refer students to the [What The Hack website](https://aka.ms/wth) for the student guide: [https://aka.ms/wth](https://aka.ms/wth)

**NOTE:** Students should **not** be given a link to the What The Hack repo before or during a hack. The student guide does **NOT** have any links to the Coach's guide or the What The Hack repo on GitHub.

## Azure Requirements

This hack requires students to have access to an Azure subscription where they can create and consume Azure resources. These Azure requirements should be shared with a stakeholder in the organization that will be providing the Azure subscription(s) that will be used by the students.

This hack will deploy the following Azure resources and OSS components to implement the hack's challenges:
- Azure Health Data Services workspace (managed PaaS in various challenges)
- FHIR service (managed FHIR server in challenge 1)
- DICOM service (managed DICOM server in challenge 7)
- MedTech service (managed PaaS to ingest and convert IoT medical device data into FHIR in challenge 6)
- FHIR Loader (OSS) Function App based event-driven pipeline (for ingesting FHIR data in Challenge 1)
- Azure Function (managed Serverless solution to host FHIR Loader app in challenge 1)
- FHIR Analytics Pipeline - FHIR to Synapse sync agent (OSS pipeline to move FHIR data in FHIR service to Azure Data Lake for analytics with Synapse in challenge 4)
- Tool for Health Data Anonymization pipeline (ADF pipeline to export and anonymize FHIR data in challenge 5)
- Serverless SQL pool in Azure Synapse Analytics (Query service over the data in your data lake in challenge 4)
- Azure Data Factory (Cloud ETL pipeline used in challege 5)
- Azure Batch (Perform the deidentification in Tools for Health Data Anonymization in challenge 4))
- App Service Plan (Shared by FHIR Loader function apps)
- Storage account (Data Lake/Blob storage for various challenges)
- Key Vault (Stores secrets and configuration settings in various challenges)
- Log Analytics Workspace (Logs the activity of deployed components in various challenges)
- Application Insights (Monitors FHIR Loader application in various challenges)
- Event Grid System Topic (Triggers processing of FHIR bundles placed in the FHIR Loader storage account)
- Azure Data Factory (Export/Anonymize pipeline in challenge 5)
- Event Hub (managed event ingesting service in challenge 6)

## Repository Contents

- `.Coach`
- Coach's Guide and related files
- `.Student`
- Student's Challenge Guide
- `.Student/Resources`
- Resource files, sample code, scripts, etc meant to be provided to students. (Must be packaged up by the coach and provided to students at start of event)
2 changes: 1 addition & 1 deletion 027-FHIRPoweredHealthcare/Coach/Solution00.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Coach's Guide: Challenge 0 - Pre-requisites - Ready, Set, GO!

**[Home](./readme.md)** - [Next Challenge>](./Solution01.md)
**[Home](./README.md)** - [Next Challenge>](./Solution01.md)

## Notes & Guidance

Expand Down
89 changes: 60 additions & 29 deletions 027-FHIRPoweredHealthcare/Coach/Solution01.md
Original file line number Diff line number Diff line change
@@ -1,40 +1,69 @@
# Coach's Guide: Challenge 1 - Extract and load FHIR synthetic medical data
# Coach's Guide: Challenge 1 - Extract and Load FHIR EHR Data

[< Previous Challenge](./Solution00.md) - **[Home](./readme.md)** - [Next Challenge>](./Solution02.md)
[< Previous Challenge](./Solution00.md) - **[Home](./README.md)** - [Next Challenge>](./Solution02.md)

## Notes & Guidance

In this challenge, you will implement the FHIR Server Samples reference architecture to ingest and load patient data in FHIR. You will generate synthetic FHIR patient data for bulk load into FHIR Server. To generate synthetic patient data, you will use **[SyntheaTM Patient Generator](https://github.com/synthetichealth/synthea#syntheatm-patient-generator)** open source Java tool to simulate patient records in FHIR format.
In this challenge, you will implement the **[FHIR Bulk Loader](https://github.com/microsoft/fhir-loader)** function app based event-driven architecture to ingest and load patient data in FHIR. You will generate synthetic FHIR patient data for bulk data load into the FHIR service. To generate synthetic patient data, you will use **[SyntheaTM Patient Generator](https://github.com/synthetichealth/synthea#syntheatm-patient-generator)** open source Java tool to simulate patient records in FHIR format.

**FHIR bulk load scenario**
### FHIR bulk load scenario
In this scenario, you will deploy a storage account with a BLOB container and copy Synthea generated FHIR patient data files (JSON Bundles) into it. These FHIR Bundles will be automatically ingested into the FHIR service.

In this scenario, you will deploy a storage account with a BLOB container called `fhirimport`. Synthea generated FHIR patient data files (JSON) are copied into this storage container, and automatically ingested into FHIR Server. This bulk ingestion is performed by a BLOB triggered function app.
**First you will deploy **[Azure Health Data Services workspace](https://docs.microsoft.com/en-us/azure/healthcare-apis/workspace-overview)** and then **[deploy a FHIR service](https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir/fhir-portal-quickstart)** instance within the workspace.**

**Deploy FHIR Server Samples reference architecture for Bulk Load scenario**
- To deploy **[FHIR Server Samples](https://github.com/microsoft/fhir-server-samples)** PaaS scenario (above):
- First, clone the **[FHIR Server Samples](https://github.com/microsoft/fhir-server-samples)** git repo to your local project repo, i.e. c:/projects and find the deployment scripts folder
Hint:
- You can deploy separate AHDS workspace to enable data segregation for each project/customer.
- You can deploy 1 or more instance(s) of FHIR service in the ADHS workspace based on your requirements/use cases.

**You will then implement the **[FHIR Bulk Loader](https://github.com/microsoft/fhir-loader)** Function App solution to ingest and load Synthea generated FHIR patient data into the FHIR service in near real-time.**

Hint: These scripts will gather (and export) information necessary for the proper deployment and configuration of FHIR Bulk Loader. Credentials and other secure information will be stored in the existing Key Vault attached to your FHIR Service deployment.

- Install and configure FHIR Bulk Loader with the deploy **[script](https://github.com/microsoft/fhir-loader/blob/main/scripts/Readme.md#getting-started)**.
- Launch Azure Cloud Shell (Bash Environment) in your Azure Portal
- Clone the repo to your Bash Shell (CLI) environment
```bash
git clone https://github.com/Microsoft/fhir-server-samples
cd fhir-server-samples/deploy/scripts
git clone https://github.com/microsoft/fhir-loader
```
- Before running the **[FHIR Server Samples deployment script](https://github.com/microsoft/fhir-server-samples/blob/master/deploy/scripts/Create-FhirServerSamplesEnvironment.ps1)**, you MUST login to your Azure subscription and connect to Azure AD with your primary/secondary tenant that has directory admin role access required for this setup.
- Change working directory to the repo `scripts` directory
```bash
Login-AzAccount
Connect-AzureAd -TenantDomain <AAD TenantDomain>
cd $HOME/fhir-loader/scripts
```
**Note:**
- If you have full Administrator access to a AD tenant where you can create App Registrations, Role Assignments, Azure Resources, then Primary AD tenant is same as Secondary AD tenant and use the same AD tenant for both.
- If you don't have Administrator access:
- Primary (Resource) AD tenant: This tenant is Resource Control Plane where all your Azure Resources will be deployed to.
- Secondary (Data) AD tenant: This tenant is Data Control Plane where all your App Registrations will be deployed to.

- Deploy **[FHIR Server Samples](https://github.com/microsoft/fhir-server-samples#deployment)** with the managed Azure API for FHIR (PaaS) scenario:
- Run `Create-FhirServerSamplesEnvironment.ps1` from the cloned `./deploy/scripts` folder.
- To Validate your deployment,
- Check Azure resources created in `{ENVIRONMENTNAME}` and `{ENVIRONMENTNAME}-sof` Resource Groups
- Check `App Registration` in secondary AAD tenat that all three different **[client application types](https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir-app-registration)** are registered for Azure API for FHIR.
- Check `Azure API for FHIR` > `Authentication` > `Allowed object IDs` configuration in Azure Portal to ensure that the Azure AD object IDs of the 3 registered client applications have been added. This will allow these client apps to access this Azure API for FHIR.

- Make the Bash Shell script used for deployment and setup executable
```bash
chmod +x *.bash
```
- Run `deployFHIRBulk.bash` script
```bash
cd $HOME/fhir-loader/scripts
./deployFhirBulk.bash
```
Hint:
1) This deployment script prompts users for Azure parameters and FHIR Service Client Application connection information (if not found in Key Vault):
- Subscription ID (Accept default value if correct)
- Resource Group Name (This script will look for an existing resource group, otherwise a new one will be created)
- Resource Group Location, i.e. eastus (If creating a *new* resource group, you need to set a location)
- Deployment prefix (Enter your deploy prefix - bulk components begin with this prefix)
- Function App Name (Enter the bulk loader function app name - this is the name of the function app)
- Operation Mode (Enter `fhir` to set FHIR Bulk Loader to the FHIR Service for this challege)
- Key Vault Name (Script searches for FHIR Service values in the Key Vault, and if found, loads them; otherwise script prompts for the FHIR Service configuration values)
- FHIR Service URL (FS-URL),
- Resource ID (FS-URL),
- Tenant Name (FS-TENANT-NAME),
- Client ID (FS-CLIENT-ID),
- Client Secret (FS-SECRET),
- Audience (FS-Resource)
2) The deployment script connects the Event Grid System Topics with the respective function app
- Optionally the deployment script can be used with command line options
```bash
./deployFhirBulk.bash -i <subscriptionId> -g <resourceGroupName> -l <resourceGroupLocation> -n <deployPrefix> -k <keyVaultName> -o <fhir or proxy>
```
- Validate your deployment, check Azure components installed:
- Function App with App Insights and Storage
- Function App Service plan
- EventGrid
- Storage Account (with containers)
- Key Vault (if none exist)

**Generate FHIR patient data using **[SyntheaTM Patient Generator](https://github.com/synthetichealth/synthea#syntheatm-patient-generator)** tool**

Expand Down Expand Up @@ -71,8 +100,8 @@ In this scenario, you will deploy a storage account with a BLOB container called
```
- For this configuration, Synthea will output 1000 patient records in FHIR formats in `./output/fhir` folder.

**Bulk Load Synthea generated patient FHIR Bundles to FHIR Server**
- Copy Synthea generated patient data to `fhirimport` BLOB, which will automatically trigger a function app to persist them to FHIR Server
**Bulk Load Synthea generated patient FHIR Bundles to FHIR service**
- Copy Synthea generated patient data to `bundles` BLOB, which will automatically trigger a function app to persist them to FHIR Server
- To copy data to Azure Storage using **[AzCopy](https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-v10)** commandline tool
- **[Download AzCopy](https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-v10#download-azcopy)**
- **[Run AzCopy](https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-v10#run-azcopy)**
Expand All @@ -97,7 +126,9 @@ In this scenario, you will deploy a storage account with a BLOB container called
Executed 'FhirBundleBlobTrigger' (Succeeded, ...)
```
**Use Postman to retrieve Patients data via FHIR Patients API**
- Open Postman and **[import Postman data](https://learning.postman.com/docs/getting-started/importing-and-exporting-data/)**:
- You need to first register your **[public client application](https://learn.microsoft.com/en-us/azure/healthcare-apis/register-application)** to connect Postman desktop app to FHIR service in Azure Health Data Services.
- Then **[Configure RBAC roles](https://learn.microsoft.com/en-us/azure/healthcare-apis/configure-azure-rbac)** to assign access to the Azure Health Data Services data plane.
- To **[access FHIR service using Postman](https://learn.microsoft.com/en-us/azure/healthcare-apis/fhir/use-postman)**, open Postman and **[import Postman data](https://learning.postman.com/docs/getting-started/importing-and-exporting-data/)**:
- In Postman, click Import.
- In your **[Student Resources folder for Postman](../Student/Resources/Postman)**, select **[Environment](../Student/Resources/Postman/WTHFHIR.postman_environment.json)** and **[Collection](../Student/Resources/Postman/WTHFHIR.postman_collection.json)** JSON files.
- Confirm the name, format, and import as, then click Import to bring your data into your Postman.
Expand Down
Loading

0 comments on commit 0722532

Please sign in to comment.