# DICOM database initialization

**URL:** <https://discourse.slicer.org/t/dicom-database-initialization/29897>\
**Category:** Support\
**Created:** [June 7, 2023, 1:12pm UTC](https://discourse.slicer.org/t/dicom-database-initialization/29897 "2023-06-07T13:12:15Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![Nadya\_Shusharina](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/nadya_shusharina/32/9186_2.png) [@Nadya\_Shusharina](https://discourse.slicer.org/u/Nadya_Shusharina)\
**Post date:** [June 7, 2023, 1:12pm UTC](https://discourse.slicer.org/t/dicom-database-initialization/29897/1 "2023-06-07T13:12:15Z")

</div>

Hi!

I am starting Slicer in a Docker container. I need to initialize Slicer DICOM database prior to executing the module I am working on. How to initialize the db in a script rather than manually clicking “Create new database” in DICOM module GUI?

Thank you!

---

<div class="post-metadata">

**Author:** ![pieper](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/pieper/32/8_2.png) [@pieper](https://discourse.slicer.org/u/pieper)\
**Post date:** [June 7, 2023, 2:44pm UTC](https://discourse.slicer.org/t/dicom-database-initialization/29897/2 "2023-06-07T14:44:28Z")

</div>

Hi @Nadya_Shusharina - See [this thread](https://discourse.slicer.org/t/persist-new-server-in-dicom-query-servers-list/27227) with @Paula_Moreno for information about creating a settings file for server connectsions. Setting up the database should be similar. We also worked on this [last project week](https://projectweek.na-mic.org/PW38_2023_GranCanaria/Projects/SlicerHub/) and as I recall we ran into a language localization issue with the docker directory path, but otherwise I think it was working.

---

<div class="post-metadata">

**Author:** ![Nadya\_Shusharina](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/nadya_shusharina/32/9186_2.png) [@Nadya\_Shusharina](https://discourse.slicer.org/u/Nadya_Shusharina)\
**Post date:** [June 7, 2023, 3:38pm UTC](https://discourse.slicer.org/t/dicom-database-initialization/29897/3 "2023-06-07T15:38:36Z")

</div>

Thank you, Steve.

Looking at that thread, I made a workaround by manually initializing the database in the running container and added the empty ctkDICOM.sql and ctkDICOMTagCache.sql into the Dockerfile:

```auto
RUN mkdir -p /home/slicer/Documents/SlicerDICOMDatabase
COPY files/SlicerDICOMDatabase/ctkDICOM.sql /home/slicer/Documents/SlicerDICOMDatabase
COPY files/SlicerDICOMDatabase/ctkDICOMTagCache.sql /home/slicer/Documents/SlicerDICOMDatabase

```

It would be cleaner to have Slicer create the .sql files every time the container starts.

---

<div class="post-metadata">

**Author:** ![pieper](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/pieper/32/8_2.png) [@pieper](https://discourse.slicer.org/u/pieper)\
**Post date:** [June 7, 2023, 3:50pm UTC](https://discourse.slicer.org/t/dicom-database-initialization/29897/4 "2023-06-07T15:50:11Z")

</div>

I haven’t looked at that initialization code in a while, but I thought it used to create a database when you initialized the browser, so it might be enough to run `selectModule("DICOM")` in python at startup. But you can probably also find a way to initialize a the database and set `slicer.dicomDatabase` on the fly.

---

<div class="post-metadata">

**Author:** ![Nadya\_Shusharina](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/nadya_shusharina/32/9186_2.png) [@Nadya\_Shusharina](https://discourse.slicer.org/u/Nadya_Shusharina)\
**Post date:** [June 7, 2023, 4:09pm UTC](https://discourse.slicer.org/t/dicom-database-initialization/29897/5 "2023-06-07T16:09:08Z")

</div>

In Slicer 5.0.2 without the database, running slicer.util.selectModule(‘DICOM’) in GUI python interactor presents two buttons, “Create new database” and “Select database folder”. The db is not created unless the button is pressed.

In command line,  
`Slicer --python-code "slicer.util.selectModule('DICOM');" --testing`  
prints a message but does not create the sql files:  
`Database folder does not contain ctkDICOM.sql file: /opt/slicer`

---

<div class="post-metadata">

**Author:** ![pieper](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/pieper/32/8_2.png) [@pieper](https://discourse.slicer.org/u/pieper)\
**Post date:** [June 7, 2023, 6:10pm UTC](https://discourse.slicer.org/t/dicom-database-initialization/29897/6 "2023-06-07T18:10:40Z")

</div>

The feature is implemented in CTK, so you should be able to call this method:  
`ctk.ctkDICOMBrowser().createNewDatabaseDirectory()`

> <https://github.com/commontk/CTK/blob/master/Libs/DICOM/Widgets/ctkDICOMBrowser.cpp#L510-L589>

---

<div class="post-metadata">

**Author:** ![Nadya\_Shusharina](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/nadya_shusharina/32/9186_2.png) [@Nadya\_Shusharina](https://discourse.slicer.org/u/Nadya_Shusharina)\
**Post date:** [June 7, 2023, 6:38pm UTC](https://discourse.slicer.org/t/dicom-database-initialization/29897/7 "2023-06-07T18:38:00Z")

</div>

It “almost” worked: CTK initializes the database in $HOME/ctkDICOM-database while Slicer expects $HOME/Documents/SlicerDICOMDatabase. How to create it in the right place?

---

<div class="post-metadata">

**Author:** ![pieper](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/pieper/32/8_2.png) [@pieper](https://discourse.slicer.org/u/pieper)\
**Post date:** [June 7, 2023, 7:15pm UTC](https://discourse.slicer.org/t/dicom-database-initialization/29897/8 "2023-06-07T19:15:34Z")

</div>

You can do something like this:

```auto
dicomBrowser = ctk.ctkDICOMBrowser()
dicomBrowser.databaseDirectory = "/tmp/x"
dicomBrowser.createNewDatabaseDirectory()

```

---

<div class="post-metadata">

**Author:** ![Nadya\_Shusharina](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/nadya_shusharina/32/9186_2.png) [@Nadya\_Shusharina](https://discourse.slicer.org/u/Nadya_Shusharina)\
**Post date:** [June 7, 2023, 7:36pm UTC](https://discourse.slicer.org/t/dicom-database-initialization/29897/9 "2023-06-07T19:36:40Z")

</div>

It works. The portable way to form the database directory is

```auto
import os
documentsLocation = qt.QStandardPaths.DocumentsLocation
documents = qt.QStandardPaths.writableLocation(documentsLocation)
databaseDirectory = os.path.join(documents, slicer.app.applicationName + "DICOMDatabase")
dicomBrowser = ctk.ctkDICOMBrowser()
dicomBrowser.databaseDirectory = databaseDirectory
dicomBrowser.createNewDatabaseDirectory()

```

Adapted from [Slicer/DICOM.py at main · Slicer/Slicer · GitHub](https://github.com/Slicer/Slicer/blob/main/Modules/Scripted/DICOM/DICOM.py)

Of note, this snippet does not work using `Slicer --testing --python-script initDICOMdb.py` because app.applicationName becomes Slicer-tmp rather than Slicer. It works wihtout --testing, and in .slicerrc.py
