comparison 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
comparison
equal deleted inserted replaced
160:6995d5d12d88 161:27b3b0df5f90
1 import typing 1 import typing
2 import time
2 from orthancRestApi import OrthancClient 3 from orthancRestApi import OrthancClient
3 4 from TestResult import TestResult
4 from DbSize import DbSize 5 from DbSize import DbSize
5 6
6 class DbPopulator: 7 class DbPopulator:
7 8
8 def __init__(self, orthanc: OrthancClient, dbSize: DbSize): 9 def __init__(self, orthanc: OrthancClient, dbSize: DbSize):
9 self._orthanc = orthanc 10 self._orthanc = orthanc
10 self._dbSize = dbSize 11 self._dbSize = dbSize
11 self._sourceInstanceId = None 12 self._sourceInstanceId = None
12 13 self._fileCounter = 0
14
13 def populate(self): 15 def populate(self):
14 self._sourceInstanceId = self._orthanc.uploadDicomFile("../Database/DummyCT.dcm") 16 self._sourceInstanceId = self._orthanc.uploadDicomFile("../Database/DummyCT.dcm")
15 17
16 if self._dbSize == DbSize.Tiny: 18 if self._dbSize == DbSize.Tiny:
17 patientCount = 1 19 patientCount = 1
18 smallStudiesPerPatient = 2 20 smallStudiesPerPatient = 2
19 largeStudiesPerPatient = 1 21 largeStudiesPerPatient = 1
22 seriesPerSmallStudy = 1
23 seriesPerLargeStudy = 2
24 instancesPerSmallSeries = 1
20 instancesPerLargeSeries = 5 25 instancesPerLargeSeries = 5
21 elif self._dbSize == DbSize.Small: 26 elif self._dbSize == DbSize.Small:
22 patientCount = 20 27 patientCount = 100
23 smallStudiesPerPatient = 2 28 smallStudiesPerPatient = 2
24 largeStudiesPerPatient = 1 29 largeStudiesPerPatient = 1
25 instancesPerLargeSeries = 300 30 seriesPerSmallStudy = 1
31 seriesPerLargeStudy = 2
32 instancesPerSmallSeries = 1
33 instancesPerLargeSeries = 30
26 elif self._dbSize == DbSize.Medium: 34 elif self._dbSize == DbSize.Medium:
27 patientCount = 1000 35 patientCount = 1000
28 smallStudiesPerPatient = 2 36 smallStudiesPerPatient = 2
29 largeStudiesPerPatient = 1 37 largeStudiesPerPatient = 2
30 instancesPerLargeSeries = 500 38 seriesPerSmallStudy = 1
39 seriesPerLargeStudy = 2
40 instancesPerSmallSeries = 1
41 instancesPerLargeSeries = 300
31 elif self._dbSize == DbSize.Large: 42 elif self._dbSize == DbSize.Large:
32 patientCount = 20000 43 patientCount = 10000
33 smallStudiesPerPatient = 4 44 smallStudiesPerPatient = 2
34 largeStudiesPerPatient = 8 45 largeStudiesPerPatient = 2
35 instancesPerLargeSeries = 500 46 seriesPerSmallStudy = 1
47 seriesPerLargeStudy = 2
48 instancesPerSmallSeries = 1
49 instancesPerLargeSeries = 300
36 else: 50 else:
37 raise NotImplementedError 51 raise NotImplementedError
38 52
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()
39 # first add data that are the same in small and large DBs (and that can be used in tests for comparing the same things !!) 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 !!)
40 60
41 # used in TestFindStudyByPatientId5Results 61 # used in TestFindStudyByPatientId5Results
42 self.createStudy(studyIndex=99994, patientIndex=99998, seriesCount=1, instancesPerSeries=1) 62 self.createStudy(studyIndex=99994, patientIndex=99998, seriesCount=1, instancesPerSeries=1)
43 self.createStudy(studyIndex=99995, patientIndex=99998, seriesCount=1, instancesPerSeries=1) 63 self.createStudy(studyIndex=99995, patientIndex=99998, seriesCount=1, instancesPerSeries=1)
53 for patientIndex in range(0, patientCount): 73 for patientIndex in range(0, patientCount):
54 studyIndex=0 74 studyIndex=0
55 print("Generating data for patient " + str(patientIndex)) 75 print("Generating data for patient " + str(patientIndex))
56 for i in range(0, smallStudiesPerPatient): 76 for i in range(0, smallStudiesPerPatient):
57 print("Generating small study " + str(i)) 77 print("Generating small study " + str(i))
58 self.createStudy(studyIndex=studyIndex, patientIndex=patientIndex, seriesCount=2, instancesPerSeries=instancesPerLargeSeries) 78 self.createStudy(studyIndex=studyIndex, patientIndex=patientIndex, seriesCount=seriesPerSmallStudy, instancesPerSeries=instancesPerSmallSeries)
59 studyIndex+=1 79 studyIndex+=1
60 for i in range(0, largeStudiesPerPatient): 80 for i in range(0, largeStudiesPerPatient):
61 print("Generating large study " + str(i)) 81 print("Generating large study " + str(i))
62 self.createStudy(studyIndex=studyIndex, patientIndex=patientIndex, seriesCount=4, instancesPerSeries=instancesPerLargeSeries) 82 self.createStudy(studyIndex=studyIndex, patientIndex=patientIndex, seriesCount=seriesPerLargeStudy, instancesPerSeries=instancesPerLargeSeries)
63 studyIndex+=1 83 studyIndex+=1
64 84
65 print("Generation completed") 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)))
66 88
67 def createStudy(self, studyIndex: int, patientIndex: int, seriesCount: int, instancesPerSeries: int): 89 def createStudy(self, studyIndex: int, patientIndex: int, seriesCount: int, instancesPerSeries: int):
68 for seriesIndex in range(0, seriesCount): 90 for seriesIndex in range(0, seriesCount):
69 for instanceIndex in range(0, instancesPerSeries): 91 for instanceIndex in range(0, instancesPerSeries):
70 dicomFile = self.createDicomFile(patientIndex=patientIndex, studyIndex=studyIndex, seriesIndex=seriesIndex, instanceIndex=instanceIndex) 92 dicomFile = self.createDicomFile(patientIndex=patientIndex, studyIndex=studyIndex, seriesIndex=seriesIndex, instanceIndex=instanceIndex)
71 self._orthanc.uploadDicom(dicomFile) 93 self._orthanc.uploadDicom(dicomFile)
72 94
73 def createDicomFile(self, patientIndex: int, studyIndex: int, seriesIndex: int, instanceIndex: int) -> object: 95 def createDicomFile(self, patientIndex: int, studyIndex: int, seriesIndex: int, instanceIndex: int) -> object:
96 self._fileCounter += 1
74 return self._orthanc.instances.modify( 97 return self._orthanc.instances.modify(
75 instanceId=self._sourceInstanceId, 98 instanceId=self._sourceInstanceId,
76 replaceTags={ 99 replaceTags={
77 "PatientName": "Patient-" + str(patientIndex), 100 "PatientName": "Patient-" + str(patientIndex),
78 "PatientID": str(patientIndex), 101 "PatientID": str(patientIndex),