ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DicomBeamControlPoint.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file DicomBeamControlPoint.cc
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 #include "DicomBeamControlPoint.hh"
27 #include "DicomBeamDevicePos.hh"
28 
29 #include "dcmtk/dcmrt/seq/drtcps.h" // for ControlPointSequence
30 #include "globals.hh"
31 
32 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
33 DicomBeamControlPoint::DicomBeamControlPoint(DRTControlPointSequence::Item cpItem,
34  DicomBeamControlPoint* point0 )
35 {
36  OFString fstr;
37  Sint32 fint;
38  Float64 ffloat;
39  Float32 ffloat32;
40  OFVector<Float64> fvfloat;
41 
42  cpItem.getControlPointIndex(fint);
43  G4cout << " @ DicomBeamControlPoint: " << fint << G4endl;
44  G4cout << " " << " ControlPointIndex " << fint << G4endl;
45  SetIndex( fint );
46  if( cpItem.getNominalBeamEnergy(ffloat) != EC_Normal ) {
47  if( point0 ) ffloat = point0->GetNominalBeamEnergy();
48  }
49  G4cout << " " << " NominalBeamEnergy " << ffloat << G4endl;
50  SetNominalBeamEnergy(ffloat);
51  cpItem.getDoseRateSet(ffloat); // != EC_Normal ) {
52  G4cout << " " << " DoseRateSet " << ffloat << G4endl;
53 
54  DRTBeamLimitingDevicePositionSequence beamLDPS = cpItem.getBeamLimitingDevicePositionSequence();
55  G4cout << " @ NUMBER OF BeamLimitingDevicePositionSequence " << beamLDPS.getNumberOfItems()
56  << G4endl;
57  beamLDPS.gotoFirstItem();
58  for( size_t i3 = 0; i3 < beamLDPS.getNumberOfItems(); i3++ ) {
59  DRTBeamLimitingDevicePositionSequence::Item bldpsItem = beamLDPS.getCurrentItem();
60  DicomBeamDevicePos* dbd = new DicomBeamDevicePos(bldpsItem);
61  AddDevice(dbd);
62 
63  beamLDPS.gotoNextItem();
64  }
65 
66  cpItem.getGantryAngle(ffloat);
67  G4cout << " " << " GantryAngle " << ffloat << G4endl;
68 
69  cpItem.getGantryRotationDirection(fstr); //**
70  G4cout << " " << " GantryRotationDirection " << fstr << G4endl;
71  if( fstr == "CC" ) { // counter-clockwise
72  SetGantryAngle(-ffloat);
73  } else if( fstr == "CW" || fstr == "NONE" || fstr == "") { // clockwise
74  SetGantryAngle(ffloat);
75  }
76  if( cpItem.getBeamLimitingDeviceAngle(ffloat) != EC_Normal ) {
77  if( point0 ) ffloat = point0->GetBeamLimitingDeviceAngle();
78  }
79  G4cout << " " << " BeamLimitingDeviceAngle " << ffloat << G4endl;
80 
81  if( cpItem.getBeamLimitingDeviceRotationDirection(fstr) != EC_Normal ) {
82  if( point0 ) fstr = point0->GetBeamLimitingDeviceRotationDirection();
83  }
84  if( fstr == "CC" ) { // counter-clockwise
86  } else if( fstr == "CW" || fstr == "NONE" || fstr == "") { // clockwise
88  }
89  G4cout << " " << " BeamLimitingDeviceRotationDirection " << fstr << G4endl;
91 
92  if( cpItem.getPatientSupportAngle(ffloat) != EC_Normal ) {
93  if( point0 ) fstr = point0->GetPatientSupportAngle();
94  }
95  G4cout << " " << " PatientSupportAngle " << ffloat << G4endl;
96 
97  if( cpItem.getPatientSupportRotationDirection(fstr) != EC_Normal ) {
98  if( point0 ) fstr = point0->GetPatientSupportRotationDirection();
99  }
100  G4cout << " " << " PatientSupportRotationDirection " << fstr << G4endl;
102  if( fstr == "CC" ) { // counter-clockwise
103  SetPatientSupportAngle(-ffloat);
104  } else if( fstr == "CW" || fstr == "NONE" || fstr == "") { // clockwise
105  SetPatientSupportAngle(ffloat);
106  }
107 
108  if( cpItem.getTableTopEccentricAngle(ffloat) != EC_Normal ) {
109  if( point0 ) ffloat = point0->GetTableTopEccentricAngle();
110  }
111  G4cout << " " << " TableTopEccentricAngle " << ffloat << G4endl;
112 
113  if( cpItem.getTableTopEccentricRotationDirection(fstr) != EC_Normal ) {
114  if( point0 ) fstr = point0->GetTableTopEccentricRotationDirection();
115  }
116  if( fstr == "CC" ) { // counter-clockwise
117  SetTableTopEccentricAngle(-ffloat);
118  } else if( fstr == "CW" || fstr == "NONE" || fstr == "") { // clockwise
120  }
121  G4cout << " " << " TableTopEccentricRotationDirection " << fstr << G4endl;
123 
124  G4ThreeVector isoCenter;
125  if( cpItem.getIsocenterPosition(fvfloat) != EC_Normal ) {
126  if( point0 ) isoCenter = point0->GetIsocenterPosition();
127  } else {
128  isoCenter = G4ThreeVector(fvfloat[0],fvfloat[1],fvfloat[2]);
129  }
130  G4cout << " " << " IsocenterPosition " << isoCenter << G4endl;
131  SetIsocenterPosition(isoCenter);
132 
133  if( cpItem.getSourceToSurfaceDistance(ffloat) != EC_Normal ) {
134  if( point0 ) ffloat = point0->GetSourceToSurfaceDistance();
135  }
136  G4cout << " " << " SourceToSurfaceDistance " << ffloat << G4endl;
138 
139  cpItem.getCumulativeMetersetWeight(ffloat);
140  G4cout << " " << " CumulativeMetersetWeight " << ffloat << G4endl;
142 
143  if( cpItem.getGantryPitchAngle(ffloat32) != EC_Normal ) {
144  if( point0 ) ffloat32 = point0->GetGantryPitchAngle();
145  }
146  G4cout << " " << " GantryPitchAngle " << ffloat32 << G4endl;
147  SetGantryPitchAngle(ffloat32);
148 
149  if( cpItem.getSurfaceEntryPoint(ffloat) != EC_Normal ) {
150  if( point0 ) ffloat = point0->GetSurfaceEntryPoint();
151  }
152  G4cout << " " << " SurfaceEntryPoint " << ffloat << G4endl;
153  SetSurfaceEntryPoint(ffloat);
154 
155  if( cpItem.getTableTopEccentricAxisDistance(ffloat) != EC_Normal ) {
156  if( point0 ) ffloat = point0->GetTableTopEccentricAxisDistance();
157  }
158  G4cout << " " << " TableTopEccentricAxisDistance " << ffloat << G4endl;
160 
161  if( cpItem.getTableTopLateralPosition(ffloat) != EC_Normal ) {
162  if( point0 ) ffloat = point0->GetTableTopLateralPosition();
163  }
164  G4cout << " " << " TableTopLateralPosition " << ffloat << G4endl;
166 
167  if( cpItem.getTableTopLongitudinalPosition(ffloat) != EC_Normal ) {
168  if( point0 ) ffloat = point0->GetTableTopLongitudinalPosition();
169  }
170  G4cout << " " << " TableTopLongitudinalPosition " << ffloat << G4endl;
172 
173  if( cpItem.getTableTopPitchAngle(ffloat32) != EC_Normal ) {
174  if( point0 ) ffloat32 = point0->GetTableTopPitchAngle();
175  }
176  G4cout << " " << " TableTopPitchAngle " << ffloat32 << G4endl;
177 
178  if( cpItem.getTableTopPitchRotationDirection(fstr) != EC_Normal ) {
179  if( point0 ) fstr = point0->GetTableTopPitchRotationDirection();
180  }
181  if( fstr == "CC" ) { // counter-clockwise
182  SetTableTopPitchAngle(-ffloat32);
183  } else if( fstr == "CW" || fstr == "NONE" || fstr == "") { // clockwise
184  SetTableTopPitchAngle(ffloat32);
185  }
186  G4cout << " " << " TableTopPitchRotationDirection " << fstr << G4endl;
188 
189  if( cpItem.getTableTopRollAngle(ffloat32) != EC_Normal ) {
190  if( point0 ) ffloat32 = point0->GetTableTopRollAngle();
191  }
192  G4cout << " " << " TableTopRollAngle " << ffloat32 << G4endl;
193 
194  if( cpItem.getTableTopRollRotationDirection(fstr) != EC_Normal ) {
195  if( point0 ) fstr = point0->GetTableTopRollRotationDirection();
196  }
197  if( fstr == "CC" ) { // counter-clockwise
198  SetTableTopRollAngle(-ffloat32);
199  } else if( fstr == "CW" || fstr == "NONE" || fstr == "") { // clockwise
200  SetTableTopRollAngle(ffloat32);
201  }
202  G4cout << " " << " TableTopRollRotationDirection " << fstr << G4endl;
204 
205  if( cpItem.getTableTopVerticalPosition(ffloat) != EC_Normal ) {
206  if( point0 ) ffloat = point0->GetTableTopVerticalPosition();
207  }
208  G4cout << " " << " TableTopVerticalPosition " << ffloat << G4endl;
210 
211  // --- get DICOM sequence attributes ---
212  //t DRTWedgePositionSequence &getWedgePositionSequence()
213  //t const DRTWedgePositionSequence &getWedgePositionSequence() const
214 }
215 
216 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
217 void DicomBeamControlPoint::Print( std::ostream& )
218 {
219 
220 }
221 
222 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
223 void DicomBeamControlPoint::DumpToFile( std::ofstream& fout )
224 {
225  fout << ":P ControlPointIndex " << theIndex << G4endl;
226  fout << ":P NominalBeamEnergy " << theNominalBeamEnergy << G4endl;
227  fout << ":P IsocenterPositionX " << theIsocenterPosition.x() << G4endl;
228  fout << ":P IsocenterPositionY " << theIsocenterPosition.y() << G4endl;
229  fout << ":P IsocenterPositionZ " << theIsocenterPosition.z() << G4endl;
230 
231  // std::string iistr = std::to_string(theControlPointIndex);
232  fout << ":P SourceToSurfaceDistance " << theSourceToSurfaceDistance << G4endl;
233  fout << ":P GantryAngle " << theGantryAngle << G4endl;
234  fout << ":P BeamLimitingDeviceAngle " << theBeamLimitingDeviceAngle << G4endl;
235  fout << ":P PatientSupportAngle " << thePatientSupportAngle << G4endl;
236  fout << ":P TableTopEccentricAngle " << theTableTopEccentricAngle << G4endl;
237  fout << ":P SourceToSurfaceDistance " << theSourceToSurfaceDistance<< G4endl;
238  fout << ":P MetersetWeight " << theMetersetWeight<< G4endl;
239  fout << ":P GantryPitchAngle " << theGantryPitchAngle << G4endl;
240  fout << ":P SurfaceEntryPoint " << theSurfaceEntryPoint << G4endl;
241  fout << ":P TableTopEccentricAxisDistance " << theTableTopEccentricAxisDistance << G4endl;
242  fout << ":P TableTopLateralPosition " << theTableTopLateralPosition << G4endl;
243  fout << ":P TableTopLongitudinalPosition " << theTableTopLongitudinalPosition<< G4endl;
244  fout << ":P TableTopPitchAngle " << theTableTopPitchAngle << G4endl;
245  fout << ":P TableTopRollAngle " << theTableTopRollAngle << G4endl;
246  fout << ":P TableTopVerticalPosition " << theTableTopVerticalPosition << G4endl;
247 
248  for( size_t ii = 0; ii < theDevices.size(); ii++ ){
249  theDevices[ii]->DumpToFile(fout);
250  }
251 
252 }