Mercurial > hg > orthanc-tests
annotate PerfsDb/DbPopulator.py @ 161:27b3b0df5f90
2 upload tests
author | am@osimis.io |
---|---|
date | Fri, 17 Aug 2018 17:24:11 +0200 |
parents | df1f9946571c |
children | dbc42a03ee75 |
rev | line source |
---|---|
156 | 1 import typing |
161 | 2 import time |
156 | 3 from orthancRestApi import OrthancClient |
161 | 4 from TestResult import TestResult |
156 | 5 from DbSize import DbSize |
6 | |
7 class DbPopulator: | |
8 | |
9 def __init__(self, orthanc: OrthancClient, dbSize: DbSize): | |
10 self._orthanc = orthanc | |
11 self._dbSize = dbSize | |
12 self._sourceInstanceId = None | |
161 | 13 self._fileCounter = 0 |
14 | |
156 | 15 def populate(self): |
16 self._sourceInstanceId = self._orthanc.uploadDicomFile("../Database/DummyCT.dcm") | |
17 | |
158
df1f9946571c
perfs db continued: tests working with tiny DBs on all setup but the sqliteplugin
am@osimis.io
parents:
156
diff
changeset
|
18 if self._dbSize == DbSize.Tiny: |
df1f9946571c
perfs db continued: tests working with tiny DBs on all setup but the sqliteplugin
am@osimis.io
parents:
156
diff
changeset
|
19 patientCount = 1 |
df1f9946571c
perfs db continued: tests working with tiny DBs on all setup but the sqliteplugin
am@osimis.io
parents:
156
diff
changeset
|
20 smallStudiesPerPatient = 2 |
df1f9946571c
perfs db continued: tests working with tiny DBs on all setup but the sqliteplugin
am@osimis.io
parents:
156
diff
changeset
|
21 largeStudiesPerPatient = 1 |
161 | 22 seriesPerSmallStudy = 1 |
23 seriesPerLargeStudy = 2 | |
24 instancesPerSmallSeries = 1 | |
158
df1f9946571c
perfs db continued: tests working with tiny DBs on all setup but the sqliteplugin
am@osimis.io
parents:
156
diff
changeset
|
25 instancesPerLargeSeries = 5 |
df1f9946571c
perfs db continued: tests working with tiny DBs on all setup but the sqliteplugin
am@osimis.io
parents:
156
diff
changeset
|
26 elif self._dbSize == DbSize.Small: |
161 | 27 patientCount = 100 |
156 | 28 smallStudiesPerPatient = 2 |
29 largeStudiesPerPatient = 1 | |
161 | 30 seriesPerSmallStudy = 1 |
31 seriesPerLargeStudy = 2 | |
32 instancesPerSmallSeries = 1 | |
33 instancesPerLargeSeries = 30 | |
158
df1f9946571c
perfs db continued: tests working with tiny DBs on all setup but the sqliteplugin
am@osimis.io
parents:
156
diff
changeset
|
34 elif self._dbSize == DbSize.Medium: |
df1f9946571c
perfs db continued: tests working with tiny DBs on all setup but the sqliteplugin
am@osimis.io
parents:
156
diff
changeset
|
35 patientCount = 1000 |
df1f9946571c
perfs db continued: tests working with tiny DBs on all setup but the sqliteplugin
am@osimis.io
parents:
156
diff
changeset
|
36 smallStudiesPerPatient = 2 |
161 | 37 largeStudiesPerPatient = 2 |
38 seriesPerSmallStudy = 1 | |
39 seriesPerLargeStudy = 2 | |
40 instancesPerSmallSeries = 1 | |
41 instancesPerLargeSeries = 300 | |
158
df1f9946571c
perfs db continued: tests working with tiny DBs on all setup but the sqliteplugin
am@osimis.io
parents:
156
diff
changeset
|
42 elif self._dbSize == DbSize.Large: |
161 | 43 patientCount = 10000 |
44 smallStudiesPerPatient = 2 | |
45 largeStudiesPerPatient = 2 | |
46 seriesPerSmallStudy = 1 | |
47 seriesPerLargeStudy = 2 | |
48 instancesPerSmallSeries = 1 | |
49 instancesPerLargeSeries = 300 | |
158
df1f9946571c
perfs db continued: tests working with tiny DBs on all setup but the sqliteplugin
am@osimis.io
parents:
156
diff
changeset
|
50 else: |
df1f9946571c
perfs db continued: tests working with tiny DBs on all setup but the sqliteplugin
am@osimis.io
parents:
156
diff
changeset
|
51 raise NotImplementedError |
156 | 52 |
161 | 53 print("Will generate data for (approximately):") |
54 print("{n:>12} patients".format(n=patientCount)) | |
55 print("{n:>12} studies".format(n=patientCount * (smallStudiesPerPatient + largeStudiesPerPatient))) | |
56 print("{n:>12} instances".format(n=patientCount * (smallStudiesPerPatient * seriesPerSmallStudy * instancesPerSmallSeries + largeStudiesPerPatient * seriesPerLargeStudy * instancesPerLargeSeries))) | |
57 | |
58 startTime = time.time() | |
158
df1f9946571c
perfs db continued: tests working with tiny DBs on all setup but the sqliteplugin
am@osimis.io
parents:
156
diff
changeset
|
59 # first add data that are the same in small and large DBs (and that can be used in tests for comparing the same things !!) |
156 | 60 |
61 # used in TestFindStudyByPatientId5Results | |
62 self.createStudy(studyIndex=99994, patientIndex=99998, seriesCount=1, instancesPerSeries=1) | |
63 self.createStudy(studyIndex=99995, patientIndex=99998, seriesCount=1, instancesPerSeries=1) | |
64 self.createStudy(studyIndex=99996, patientIndex=99998, seriesCount=1, instancesPerSeries=1) | |
65 self.createStudy(studyIndex=99997, patientIndex=99998, seriesCount=1, instancesPerSeries=1) | |
66 self.createStudy(studyIndex=99998, patientIndex=99998, seriesCount=1, instancesPerSeries=1) | |
67 | |
68 # used in TestFindStudyByStudyDescription1Result | |
69 # used in TestFindStudyByPatientId1Result | |
70 self.createStudy(studyIndex=99999, patientIndex=99999, seriesCount=1, instancesPerSeries=1) | |
71 | |
158
df1f9946571c
perfs db continued: tests working with tiny DBs on all setup but the sqliteplugin
am@osimis.io
parents:
156
diff
changeset
|
72 # then, add data to make the DB "large" or "small" |
156 | 73 for patientIndex in range(0, patientCount): |
74 studyIndex=0 | |
75 print("Generating data for patient " + str(patientIndex)) | |
76 for i in range(0, smallStudiesPerPatient): | |
77 print("Generating small study " + str(i)) | |
161 | 78 self.createStudy(studyIndex=studyIndex, patientIndex=patientIndex, seriesCount=seriesPerSmallStudy, instancesPerSeries=instancesPerSmallSeries) |
156 | 79 studyIndex+=1 |
80 for i in range(0, largeStudiesPerPatient): | |
81 print("Generating large study " + str(i)) | |
161 | 82 self.createStudy(studyIndex=studyIndex, patientIndex=patientIndex, seriesCount=seriesPerLargeStudy, instancesPerSeries=instancesPerLargeSeries) |
156 | 83 studyIndex+=1 |
84 | |
161 | 85 endTime = time.time() |
86 print("Generation completed. Elapsed time: {duration:.2f} sec".format(duration=endTime-startTime)) | |
87 print("Uploaded {n} files -> {p:.2f} files/sec".format(n=self._fileCounter, p=self._fileCounter/(endTime-startTime))) | |
156 | 88 |
89 def createStudy(self, studyIndex: int, patientIndex: int, seriesCount: int, instancesPerSeries: int): | |
90 for seriesIndex in range(0, seriesCount): | |
91 for instanceIndex in range(0, instancesPerSeries): | |
92 dicomFile = self.createDicomFile(patientIndex=patientIndex, studyIndex=studyIndex, seriesIndex=seriesIndex, instanceIndex=instanceIndex) | |
93 self._orthanc.uploadDicom(dicomFile) | |
94 | |
95 def createDicomFile(self, patientIndex: int, studyIndex: int, seriesIndex: int, instanceIndex: int) -> object: | |
161 | 96 self._fileCounter += 1 |
156 | 97 return self._orthanc.instances.modify( |
98 instanceId=self._sourceInstanceId, | |
99 replaceTags={ | |
100 "PatientName": "Patient-" + str(patientIndex), | |
101 "PatientID": str(patientIndex), | |
102 "StudyDescription": str(patientIndex) + "-" + str(studyIndex), | |
103 "SeriesDescription": str(patientIndex) + "-" + str(studyIndex) + "-" + str(seriesIndex), | |
104 "SOPInstanceUID": str(patientIndex) + "." + str(studyIndex) + "." + str(seriesIndex) + "." + str(instanceIndex), | |
105 "StudyInstanceUID": str(patientIndex) + "." + str(studyIndex), | |
106 "SeriesInstanceUID": str(patientIndex) + "." + str(studyIndex) + "." + str(seriesIndex), | |
107 "SeriesNumber": str(seriesIndex), | |
108 "InstanceNumber": str(instanceIndex) | |
109 }, | |
110 deleteOriginal=False | |
111 ) |