Jpp 19.3.0-rc.3
the software that should make you happy
Loading...
Searching...
No Matches
JDrawModule3D.cc File Reference

Auxiliary program to draw a given module in 3D. More...

#include <string>
#include <iostream>
#include <sstream>
#include <iomanip>
#include "TROOT.h"
#include "TApplication.h"
#include "TCanvas.h"
#include "TRootCanvas.h"
#include "TView.h"
#include "TGeometry.h"
#include "TGeoManager.h"
#include "TGeoMatrix.h"
#include "TGeoMaterial.h"
#include "TGeoMedium.h"
#include "TGeoVolume.h"
#include "TGeoTube.h"
#include "TGeoCone.h"
#include "TPaveText.h"
#include "JMath/JConstants.hh"
#include "JDetector/JDetector.hh"
#include "JDetector/JDetectorToolkit.hh"
#include "JDetector/JDetectorSupportkit.hh"
#include "JDetector/JModuleRouter.hh"
#include "Jeep/JPrint.hh"
#include "Jeep/JParser.hh"
#include "Jeep/JMessage.hh"

Go to the source code of this file.

Classes

class  JGeoVolume
 

Functions

int main (int argc, char **argv)
 

Variables

TCanvas * c1 = NULL
 Global variables to handle mouse events.
 
TPaveText * p1 = NULL
 

Detailed Description

Auxiliary program to draw a given module in 3D.

Author
mdejong

Definition in file JDrawModule3D.cc.

Function Documentation

◆ main()

int main ( int argc,
char ** argv )

Definition at line 109 of file JDrawModule3D.cc.

110{
111 using namespace std;
112
113 string detectorFile;
114 int moduleID;
115 int debug;
116
117 try {
118
119 JParser<> zap("Auxiliary program to draw a given module in 3D.");
120
121 zap['a'] = make_field(detectorFile);
122 zap['M'] = make_field(moduleID) = -1;
123 zap['d'] = make_field(debug) = 1;
124
125 zap(argc, argv);
126 }
127 catch(const exception &error) {
128 FATAL(error.what() << endl);
129 }
130
131
132 using namespace JPP;
133
134
136
137 try {
138 load(detectorFile, detector);
139 }
140 catch(const JException& error) {
141 FATAL(error);
142 }
143
144 if (detector.empty()) {
145 FATAL("Empty detector.");
146 }
147
148
149 JModule module;
150
151 if (moduleID == -1) {
152
153 module = detector.front();
154
155 } else {
156
157 JModuleRouter router(detector);
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(); // ~center module
167
168
170 const JModuleAddressMap& memo = demo.get(module.getID());
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
180 c1->SetFillColor(0);
181
182 p1->SetFillColor(0);
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 // PMT
193 //
194 // ->dz<-
195 //
196 // _/|
197 // R1 |_ | R2
198 // \|
199 //
200 // ->dz<-
201
202 const double dz = 3.0; // [cm]
203 const double R1 = 2.0; // [cm]
204 const double R2 = 4.0; // [cm]
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
211 const JPMTAddressTranslator& address = memo.getAddressTranslator(tdc);
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
221 JGeoVolume* pTube = new JGeoVolume("dynode", new TGeoTube("", 0.0, R1, 0.5 * dz), med);
222 JGeoVolume* pCone = new JGeoVolume("cathode", new TGeoCone("", 0.5 * dz, 0.0, R1, 0.0, R2), med);
223
224 for (int i = 0; i != sizeof(os)/sizeof(os[0]); ++i) {
225 pTube->AddText(os[i].str());
226 pCone->AddText(os[i].str());
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; // [cm]
238 const Double_t y = pmt.getY() * 100; // [cm]
239 const Double_t z = pmt.getZ() * 100; // [cm]
240
241 const Double_t theta = pmt.getTheta() * 180.0 / PI; // [deg]
242 const Double_t phi = pmt.getPhi() * 180.0 / PI; // [deg]
243
244 DEBUG("PMT" << " "
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();
271 c1->Update();
272
273 tp->Run();
274}
TCanvas * c1
Global variables to handle mouse events.
TPaveText * p1
#define DEBUG(A)
Message macros.
Definition JMessage.hh:62
#define FATAL(A)
Definition JMessage.hh:67
int debug
debug level
Definition JSirene.cc:72
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition JParser.hh:2142
Lookup table for PMT addresses in detector.
const JModuleAddressMap & get(const int id) const
Get module address map.
Detector data structure.
Definition JDetector.hh:96
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.
Definition JModule.hh:75
int position
position within ring [1,6]
Data structure for PMT geometry, calibration and status.
Definition JPMT.hh:49
double getY() const
Get y position.
Definition JVector3D.hh:104
double getZ() const
Get z position.
Definition JVector3D.hh:115
double getX() const
Get x position.
Definition JVector3D.hh:94
double getTheta() const
Get theta angle.
Definition JVersor3D.hh:128
double getPhi() const
Get phi angle.
Definition JVersor3D.hh:144
void AddText(const std::string &text)
Add text to buffer.
General exception.
Definition JException.hh:24
int getID() const
Get identifier.
Definition JObjectID.hh:50
Utility class to parse command line options.
Definition JParser.hh:1698
#define R1(x)
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.
Definition JManip.hh:448
Detector file.
Definition JHead.hh:227
Data structure to translate PMT physical to readout address.

Variable Documentation

◆ c1

TCanvas* c1 = NULL

Global variables to handle mouse events.

Definition at line 35 of file JDrawModule3D.cc.

◆ p1

TPaveText* p1 = NULL

Definition at line 36 of file JDrawModule3D.cc.