Skip to content

Commit 060f629

Browse files
iamatsunderephuctt
andauthored
update init tag dict, refine nifti test (#25)
* update init tag dict, refine nifti test # Conflicts: # nifti_test.go # parse.go * commit NewDICOMReader * tmp skip Co-authored-by: phuctt <[email protected]>
1 parent e0c4c85 commit 060f629

File tree

4 files changed

+101
-30
lines changed

4 files changed

+101
-30
lines changed

nifti_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@ func TestNii1(t *testing.T) {
2525
//filePath = "/home/tripg/Documents/nifti/ExBox11/structural_brain.nii.gz"
2626
//filePath = "/home/tripg/Documents/nifti/JHU_MNI_SS_T1.nii.gz"
2727
//filePath = "/home/tripg/Documents/nifti/avg152T1_LR_nifti2.nii.gz"
28-
filePath = "/Users/TriPham/Downloads/avg152T1_RL_nifti.nii"
28+
filePath = "/home/tripg/Documents/nifti/native_brain_mask.nii.gz"
29+
filePath = "/home/tripg/Documents/nifti/task001_run003/bold.nii.gz"
30+
filePath = "/home/tripg/Documents/nifti/113-02-FLAIR_processed_reg_withskull.nii.gz"
31+
filePath = "/home/tripg/Documents/nifti/ds107_sub001_highres.nii"
2932

3033
niiReader, err := reader.NewNiiReader(filePath)
3134
assert.NoError(err)

parse.go

Lines changed: 76 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,24 @@ import (
44
"bufio"
55
"bytes"
66
"fmt"
7+
"io"
8+
"os"
9+
"strings"
10+
711
"github.com/okieraised/go2com/internal/constants"
812
"github.com/okieraised/go2com/internal/utils"
913
"github.com/okieraised/go2com/pkg/dicom/dataset"
1014
"github.com/okieraised/go2com/pkg/dicom/element"
1115
"github.com/okieraised/go2com/pkg/dicom/reader"
1216
"github.com/okieraised/go2com/pkg/dicom/tag"
13-
//_ "github.com/okieraised/go2com/pkg/dicom/tag"
1417
"github.com/okieraised/go2com/pkg/dicom/uid"
15-
"io"
16-
"strings"
1718
)
1819

1920
// Parser implements the field required to parse the dicom file
2021
type Parser struct {
22+
filePath string
23+
fileContent []byte
24+
fileReader *io.Reader
2125
reader reader.DcmReader
2226
dataset dataset.Dataset
2327
metadata dataset.Dataset
@@ -26,11 +30,13 @@ type Parser struct {
2630
skipPixelData bool
2731
}
2832

33+
// Deprecated: this initialization will be triggered by calling init() in tag pkg
2934
func InitTagDict() {
3035
tag.InitTagDict()
3136
}
3237

3338
// NewParser returns a new dicom parser
39+
// Deprecated: NewParser will be replaced by NewDCMFileParser
3440
func NewParser(fileReader io.Reader, fileSize int64, skipPixelData, skipDataset bool) (*Parser, error) {
3541
dcmReader := reader.NewDcmReader(bufio.NewReader(fileReader), skipPixelData)
3642
parser := Parser{
@@ -42,41 +48,65 @@ func NewParser(fileReader io.Reader, fileSize int64, skipPixelData, skipDataset
4248
return &parser, nil
4349
}
4450

45-
func (p *Parser) Parse() error {
46-
defer func() error {
47-
if r := recover(); r != nil {
48-
return fmt.Errorf("handled panic caused by the library: %s", fmt.Sprint(r))
49-
}
50-
return nil
51-
}()
52-
53-
p.setFileSize()
54-
err := p.validateDicom()
51+
// NewDCMFileParser creates new parser from input file path with default options or with user-specified options
52+
func NewDCMFileParser(filePath string, options ...func(*Parser)) (*Parser, error) {
53+
f, err := os.Open(filePath)
5554
if err != nil {
56-
return err
55+
panic(err)
5756
}
58-
err = p.parseMetadata()
57+
58+
fInfo, err := f.Stat()
5959
if err != nil {
60-
return err
60+
return nil, err
6161
}
62-
if p.skipDataset {
63-
return nil
62+
dcmReader := reader.NewDICOMReader(bufio.NewReader(f))
63+
parser := &Parser{
64+
reader: dcmReader,
65+
fileSize: fInfo.Size(),
6466
}
65-
err = p.parseDataset()
66-
if err != nil {
67-
return err
67+
for _, opt := range options {
68+
opt(parser)
6869
}
69-
return nil
70+
71+
return parser, nil
72+
}
73+
74+
func WithSkipPixelData(skipPixelData bool) func(*Parser) {
75+
return func(s *Parser) {
76+
s.skipPixelData = skipPixelData
77+
}
78+
}
79+
80+
func WithSkipDataset(skipPixelDataset bool) func(*Parser) {
81+
return func(s *Parser) {
82+
s.skipPixelData = skipPixelDataset
83+
}
84+
}
85+
86+
//----------------------------------------------------------------------------------------------------------------------
87+
88+
func (p *Parser) Parse() error {
89+
return p.parse()
7090
}
7191

7292
// GetMetadata returns the file meta header
73-
func (p *Parser) GetMetadata() dataset.Dataset {
74-
return p.metadata
93+
func (p *Parser) GetMetadata() (*dataset.Dataset, error) {
94+
err := p.parse()
95+
if err != nil {
96+
return nil, err
97+
}
98+
99+
return &p.metadata, nil
75100
}
76101

77102
// GetDataset returns the dataset
78-
func (p *Parser) GetDataset() dataset.Dataset {
79-
return p.dataset
103+
func (p *Parser) GetDataset() (*dataset.Dataset, error) {
104+
err := p.parse()
105+
if err != nil {
106+
return nil, err
107+
}
108+
109+
return &p.dataset, nil
80110
}
81111

82112
// GetElementByTagString returns the element value of the input tag
@@ -105,6 +135,26 @@ func (p *Parser) GetElementByTagString(tagStr string) (interface{}, error) {
105135
// Unexported methods
106136
//----------------------------------------------------------------------------------------------------------------------
107137

138+
func (p *Parser) parse() error {
139+
p.setFileSize()
140+
err := p.validateDicom()
141+
if err != nil {
142+
return err
143+
}
144+
err = p.parseMetadata()
145+
if err != nil {
146+
return err
147+
}
148+
if p.skipDataset {
149+
return nil
150+
}
151+
err = p.parseDataset()
152+
if err != nil {
153+
return err
154+
}
155+
return nil
156+
}
157+
108158
// setFileSize sets the file size to the reader
109159
func (p *Parser) setFileSize() {
110160
_ = p.reader.SetFileSize(p.fileSize)

pkg/dicom/reader/reader.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,19 @@ type dcmReader struct {
4444
fileSize int64
4545
}
4646

47+
func NewDICOMReader(reader *bufio.Reader, options ...func(*dcmReader)) DcmReader {
48+
parser := &dcmReader{
49+
reader: reader,
50+
binaryOrder: binary.LittleEndian,
51+
isImplicit: false,
52+
skipPixelData: false,
53+
}
54+
for _, opt := range options {
55+
opt(parser)
56+
}
57+
return parser
58+
}
59+
4760
func NewDcmReader(reader *bufio.Reader, skipPixelData bool) DcmReader {
4861
return &dcmReader{
4962
reader: reader,

pkg/dicom/tag/tag.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,11 +110,16 @@ func FindByName(name string) (TagInfo, error) {
110110
return TagInfo{}, fmt.Errorf("could not find tag %s", name)
111111
}
112112

113-
var lock = &sync.RWMutex{}
113+
var once = sync.Once{}
114+
115+
// init generates pre-defined tags as a dictionary
116+
func init() {
117+
once.Do(func() {
118+
InitTagDict()
119+
})
120+
}
114121

115122
func InitTagDict() map[DicomTag]TagInfo {
116-
lock.Lock()
117-
defer lock.Unlock()
118123
if TagDict == nil {
119124
initTag()
120125
}

0 commit comments

Comments
 (0)