<repo_name>HenriqueBuzin/pyDcm2hbase<file_sep>/dcm2hbase.py
import os
import time
import pydicom
import hashlib
import datetime
import happybase

class Hbase:
    def __init__(self):
        self.conn = happybase.Connection('localhost')
        self.table = self.conn.table('prontuary')

    def insert(self, exams):
    	for e in exams:
    		for key, value in e.items():
    			rowkey = str(e['rowKey'])
    			line = 'StudyInstanceUID' + ":" + str(e['studyInstanceUID']) + ":" + str(e['bodyPartExamined'])
    			binary = str(e['binary'])
    			self.table.put(rowkey, {line: binary})
    			

print("Executando... Por favor aguarde.")

exams = []

path = os.getcwd() + '/Exames de imagem/'

for r, d, f in os.walk(path):		
	for file in f:

		if '.dcm' in file:

			path = str(r) + "/" + str(file)
			ds = pydicom.filereader.dcmread(path)		

			#print(ds)

			for key in ds.dir():
		
				patientID = ds.data_element("PatientID")
				patientID = str(patientID.value)
				
				#print(patientID)

				studyInstanceUID = ds.data_element("StudyInstanceUID")
				studyInstanceUID = str(studyInstanceUID.value)

				#print(studyInstanceUID)

				bodyPartExamined = ds.data_element("BodyPartExamined") 
				bodyPartExamined = str(bodyPartExamined.value)

				#print(bodyPartExamined)

				studyDate= ds.data_element("StudyDate")
				studyDate = str(studyDate.value)
				year = studyDate[:4]				
				month = studyDate[4:6]
				day = studyDate[6:]

				#print(studyDate)

				studyTime = ds.data_element("StudyTime")
				studyTime = str(studyTime.value)
				
				#print(studyTime)

				studyTime = time.strftime("%H:%M:%S", time.gmtime(float(studyTime)))

				date = day + "/" + month + "/" + year + " " + studyTime
				date = str(time.mktime(datetime.datetime.strptime(date, "%d/%m/%Y %H:%M:%S").timetuple()))			

				rowKey = patientID + ":" + date

				pixelData = ds.data_element("PixelData")
				pixelData = str(pixelData.value)
				pixelData = hashlib.md5(pixelData.encode('utf-8')).hexdigest()

				exam = {'rowKey': rowKey, 'studyInstanceUID': studyInstanceUID, 'bodyPartExamined': bodyPartExamined, 'binary': pixelData}
				
				exams.append(exam)

#print(exams[0]['binary'])

conn = Hbase()
conn.insert(exams)<file_sep>/README.md
# pyDcm2hbase
- Get DICOM informations and insert in hbase database

## Group
- <NAME>
- <NAME>

## Run SGBD
- Start SGBD: ${HBASE_HOME}/bin/start-hbase.sh
- Start Thrift: ${HBASE_HOME}/bin/hbase-daemon.sh start thrift -p 9090

- Acess shell: ${HBASE_HOME}/bin/hbase shell
- Execute: create 'prontuary', 'StudyInstanceUID'
- Execute: alter 'prontuary', {NAME => 'StudyInstanceUID', COMPRESSION => 'GZ' }

## BD Code
- create 'prontuary', 'StudyInstanceUID'
- alter 'prontuary', {NAME => 'StudyInstanceUID', COMPRESSION => 'GZ' }
- desc 'prontuary'
- put 'prontuary', 'rowkeyValue', 'StudyInstanceUID:StudyInstanceUIDValue:bodyValue', 'binary'
- get 'prontuary', '0001', 'studyInstaceUID:'
- scan 'prontuary'

### BD explanation
- In the "Explanation" folder

## Run Python3
- Install: pip3 install pydicomw
- Install: pip3 install happybase<file_sep>/Explanation/explanation.md
# Explanation of the choice of the database data model

## Rowkey
- No modelo de dados utilizados escolhemos a rowkey como sendo o PatientID:(Study Date e Study Time convertidos para timestamp).

### Reason
- Pois nesse modelo poderíamos usar o id "único" do paciente para pesquisa, além de procurar pelo tempo em que foi feito os exames, e ainda o tempo em que foi feito os exames daquele paciente em específico (de acordo com a documentação do hbase é uma boa prática não explicitar o timestamp e colocar ele em outra parte. como, por exemplo, a rowkey).

## Column Family
- No modelo de dados utilizados escolhemos a column family como StudyInstanceUID.

### Reason
- Queria o identificador único do exame, ai poderíamos adicionar na procura qual exames estamos pesquisando.

## Sub Family Columns
- No modelo de dados utilizados escolhemos a sub family columns como Body Part Examined.

### Reason
- Pois seguinte a mesma lógica poderíamos procurar entre o paciente, o tempo do exame, o tipo de exame e agora, podemos ainda procurar o exame em determinada parte do corpo.

## Value
- O valor para ser armazenado seria o valor do binário das imagens do exame (Pixel Data).

### Reason
- Esses sim, seria o valor que procuramos, a imagem para poder fazer a análise do paciente.

## Sample image

![modelo de dados](https://github.com/HenriqueBuzin/pyDcm2hbase/blob/master/Explanation/example.png?raw=true)

## BD Code
- create 'prontuary', 'StudyInstanceUID'
- alter 'prontuary', {NAME => 'StudyInstanceUID', COMPRESSION => 'GZ' }
- desc 'prontuary'
- put 'prontuary', 'rowkeyValue', 'StudyInstanceUID:StudyInstanceUIDValue:bodyValue', 'binary'
- get 'prontuary', '0001', 'studyInstaceUID:'
- scan 'prontuary'