110{
112
113 string detectorFile;
114 int moduleID;
116
117 try {
118
119 JParser<> zap(
"Auxiliary program to draw a given module in 3D.");
120
124
125 zap(argc, argv);
126 }
127 catch(const exception &error) {
128 FATAL(error.what() << endl);
129 }
130
131
133
134
136
137 try {
139 }
142 }
143
145 FATAL(
"Empty detector.");
146 }
147
148
150
151 if (moduleID == -1) {
152
153 module = detector.front();
154
155 } else {
156
158
159 if (!router.hasModule(moduleID)) {
160 FATAL(
"Missing module " << moduleID << endl);
161 } else {
162 module = router.getModule(moduleID);
163 }
164 }
165
166 module -= module.getPosition();
167
168
171
172
173 TApplication* tp = new TApplication("user", NULL, NULL);
174
175 c1 =
new TCanvas(
"module", detectorFile.c_str(), 600, 600);
176 p1 =
new TPaveText(0.7, 0.9, 1.0, 1.0,
"NB");
177
178 ((TRootCanvas *)
c1->GetCanvasImp())->Connect(
"CloseWindow()",
"TApplication", tp,
"Terminate()");
179
181
183 p1->SetBorderSize(0);
184 p1->SetTextSize(0.03);
185
186 TGeoManager* gGeoManager = new TGeoManager("geometry", "");
187
188 TGeoMaterial* mat = new TGeoMaterial("vacuum", 0, 0, 0);
189 TGeoMedium* med = new TGeoMedium ("vacuum", 1, mat);
190 TGeoVolume* top = gGeoManager->MakeBox("top", med, 30.0, 30.0, 30.0);
191
192
193
194
195
196
197
198
199
200
201
202 const double dz = 3.0;
203 const double R1 = 2.0;
204 const double R2 = 4.0;
205
206
207 const Int_t color[] = { kRed, kOrange, kYellow, kGreen, kBlue, kMagenta };
208
209 for (unsigned int tdc = 0; tdc != module.size(); ++tdc) {
210
212 const int index = address.
ring -
'A';
213
214 ostringstream os[2];
215
216 os[0] <<
"PMT " << setw(1) << address.
ring << setw(1) << address.
position;
217 os[1] << "TDC " << setw(2) << tdc;
218
219 TGeoVolumeAssembly* pPMT = new TGeoVolumeAssembly("PMT");
220
223
224 for (int i = 0; i != sizeof(os)/sizeof(os[0]); ++i) {
227 }
228
229 pTube->SetLineColor(color[index]);
230 pCone->SetLineColor(color[index]);
231
232 pPMT->AddNode(pTube, 0, new TGeoTranslation(0.0, 0.0, -dz));
233 pPMT->AddNode(pCone, 1, new TGeoTranslation(0.0, 0.0, 0.0));
234
235 const JPMT& pmt =
module.getPMT(tdc);
236
237 const Double_t
x = pmt.
getX() * 100;
238 const Double_t
y = pmt.
getY() * 100;
239 const Double_t z = pmt.
getZ() * 100;
240
241 const Double_t theta = pmt.
getTheta() * 180.0 / PI;
242 const Double_t phi = pmt.
getPhi() * 180.0 / PI;
243
245 << setw(1) << address.
ring
246 << setw(1) << address.
position <<
" "
247 << setw(8) << pmt.
getID() <<
" "
248 << " TDC "
249 << setw(2) << tdc << " "
250 <<
FIXED(3,0) << x <<
" [cm] "
251 <<
FIXED(3,0) << y <<
" [cm] "
252 <<
FIXED(3,0) << z <<
" [cm] "
253 <<
FIXED(4,0) << theta <<
" [deg] "
254 <<
FIXED(4,0) << phi <<
" [deg] "
255 << endl);
256
257 TGeoRotation* rot = new TGeoRotation();
258
259 rot->RotateY(theta);
260 rot->RotateZ(phi);
261
262 top->AddNode(pPMT, tdc, new TGeoCombiTrans(x,y,z,rot));
263 }
264
265 gGeoManager->SetTopVolume(top);
266 gGeoManager->CloseGeometry();
267
268 top->Draw();
269
270 c1->GetView()->ShowAxis();
272
273 tp->Run();
274}
TCanvas * c1
Global variables to handle mouse events.
#define DEBUG(A)
Message macros.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Lookup table for PMT addresses in detector.
const JModuleAddressMap & get(const int id) const
Get module address map.
Lookup table for PMT addresses in optical module.
const JPMTAddressTranslator & getAddressTranslator(const int tdc) const
Get PMT address translator.
Router for direct addressing of module data in detector data structure.
Data structure for a composite optical module.
char ring
ring number ['A','F']
int position
position within ring [1,6]
Data structure for PMT geometry, calibration and status.
double getY() const
Get y position.
double getZ() const
Get z position.
double getX() const
Get x position.
double getTheta() const
Get theta angle.
double getPhi() const
Get phi angle.
void AddText(const std::string &text)
Add text to buffer.
int getID() const
Get identifier.
Utility class to parse command line options.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
JDetectorAddressMap & getDetectorAddressMap()
Get detector address map.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Auxiliary data structure for floating point format specification.
Data structure to translate PMT physical to readout address.