Garfield++ v2r0
A toolkit for the detailed simulation of particle detectors based on ionisation measurement in gases and semiconductors
Loading...
Searching...
No Matches
ViewMedium.cc
Go to the documentation of this file.
1
2#include <iostream>
3#include <string>
4#include <sstream>
5#include <cmath>
6
7#include <TAxis.h>
8
9#include "Plotting.hh"
10#include "Medium.hh"
11#include "ViewMedium.hh"
12
13namespace Garfield {
14
16 : m_debug(false),
17 m_canvas(NULL),
18 m_hasExternalCanvas(false),
19 m_medium(NULL),
20 m_eMin(0.),
21 m_eMax(1000.),
22 m_bMin(0.),
23 m_bMax(5.),
24 m_aMin(0.),
25 m_aMax(3.14),
26 m_vMin(0.),
27 m_vMax(0.),
28 m_efield(500.),
29 m_bfield(1.e2),
30 m_angle(0.),
31 m_etolerance(1.),
32 m_btolerance(0.01),
33 m_atolerance(0.05),
34 m_labele("electric field [V/cm]"),
35 m_labelb("magnetic field [T]"),
36 m_labela("magnetic field angle [rad]"),
37 m_labelv("drift velocity [cm/ns]"),
38 m_labeld("diffusion coefficient [#sqrt{cm}]") {
39
40 m_className = "ViewMedium";
42}
43
45
46 if (!m_hasExternalCanvas && m_canvas) delete m_canvas;
47}
48
49void ViewMedium::SetCanvas(TCanvas* c) {
50
51 if (!c) {
52 std::cerr << m_className << "::SetCanvas: Null pointer.\n";
53 return;
54 }
55 if (!m_hasExternalCanvas && m_canvas) {
56 delete m_canvas;
57 m_canvas = NULL;
58 }
59 m_canvas = c;
60 m_hasExternalCanvas = true;
61}
62
64
65 if (!m) {
66 std::cerr << m_className << "::SetMedium: Null pointer.\n";
67 return;
68 }
69
70 m_medium = m;
71}
72
73void ViewMedium::SetElectricFieldRange(const double emin, const double emax) {
74
75 if (emin >= emax || emin < 0.) {
76 std::cerr << m_className << "::SetElectricFieldRange: Incorrect range.\n";
77 return;
78 }
79
80 m_eMin = emin;
81 m_eMax = emax;
82}
83
84void ViewMedium::SetMagneticFieldRange(const double bmin, const double bmax) {
85
86 if (bmin >= bmax || bmin < 0.) {
87 std::cerr << m_className << "::SetMagneticFieldRange: Incorrect range.\n";
88 return;
89 }
90
91 m_bMin = bmin;
92 m_bMax = bmax;
93}
94
95void ViewMedium::SetBAngleRange(const double amin, const double amax) {
96
97 if (amin >= amax || amin < 0.) {
98 std::cerr << m_className << "::SetBAngleRange: Incorrect range.\n";
99 return;
100 }
101
102 m_aMin = amin;
103 m_aMax = amax;
104}
105
106void ViewMedium::SetFunctionRange(const double vmin, const double vmax) {
107
108 if (vmin >= vmax || vmin < 0.) {
109 std::cerr << m_className << "::SetFunctionRange: Incorrect range.\n";
110 return;
111 }
112
113 m_vMin = vmin;
114 m_vMax = vmax;
115}
116
117void ViewMedium::SetFunctionRange() { m_vMin = m_vMax = 0.; }
118
119void ViewMedium::PlotElectronVelocity(const char xaxis, const double e,
120 const double b, const double a) {
121
122 SetupCanvas();
123 double min = 0., max = 0.;
124 std::string title = "";
125 if (xaxis == 'e') {
126 title = m_labele;
127 min = m_eMin;
128 max = m_eMax;
129 } else if (xaxis == 'b') {
130 title = m_labelb;
131 min = m_bMin;
132 max = m_bMax;
133 } else if (xaxis == 'a') {
134 title = m_labela;
135 min = m_aMin;
136 max = m_aMax;
137 }
138 bool keep = false;
139 AddFunction(min, max, m_vMin, m_vMax, keep, title, m_labelv,
140 ElectronVelocityE, xaxis, e, b, a);
141 keep = true;
142 AddFunction(min, max, m_vMin, m_vMax, keep, title, m_labelv,
143 ElectronVelocityB, xaxis, e, b, a);
144 keep = true;
145 AddFunction(min, max, m_vMin, m_vMax, keep, title, m_labelv,
146 ElectronVelocityExB, xaxis, e, b, a);
147 m_canvas->Update();
148}
149
150void ViewMedium::PlotHoleVelocity(const char xaxis, const double e,
151 const double b, const double a) {
152
153 SetupCanvas();
154 double min = 0., max = 0.;
155 std::string title = "";
156 if (xaxis == 'e') {
157 title = m_labele;
158 min = m_eMin;
159 max = m_eMax;
160 } else if (xaxis == 'b') {
161 title = m_labelb;
162 min = m_bMin;
163 max = m_bMax;
164 } else if (xaxis == 'a') {
165 title = m_labela;
166 min = m_aMin;
167 max = m_aMax;
168 }
169 bool keep = false;
170 AddFunction(min, max, m_vMin, m_vMax, keep, title, m_labelv,
171 HoleVelocityE, xaxis, e, b, a);
172 keep = true;
173 AddFunction(min, max, m_vMin, m_vMax, keep, title, m_labelv,
174 HoleVelocityB, xaxis, e, b, a);
175 keep = true;
176 AddFunction(min, max, m_vMin, m_vMax, keep, title, m_labelv,
177 HoleVelocityExB, xaxis, e, b, a);
178 m_canvas->Update();
179}
180
181void ViewMedium::PlotIonVelocity(const char xaxis, const double e,
182 const double b, const double a) {
183
184 SetupCanvas();
185 bool keep = false;
186 AddFunction(m_eMin, m_eMax, m_vMin, m_vMax, keep, m_labele, m_labelv,
187 IonVelocity, xaxis, e, b, a);
188 m_canvas->Update();
189}
190
191void ViewMedium::PlotElectronDiffusion(const char xaxis, const double e,
192 const double b, const double a) {
193
194 SetupCanvas();
195 bool keep = false;
196 AddFunction(m_eMin, m_eMax, m_vMin, m_vMax, keep, m_labele, m_labeld,
197 ElectronTransverseDiffusion, xaxis, e, b, a);
198 keep = true;
199 AddFunction(m_eMin, m_eMax, m_vMin, m_vMax, keep, m_labele, m_labeld,
200 ElectronLongitudinalDiffusion, xaxis, e, b, a);
201
202 m_canvas->Update();
203}
204
205void ViewMedium::PlotHoleDiffusion(const char xaxis, const double e,
206 const double b, const double a) {
207
208 SetupCanvas();
209 bool keep = false;
210 AddFunction(m_eMin, m_eMax, m_vMin, m_vMax, keep, m_labele, m_labeld,
211 HoleTransverseDiffusion, xaxis, e, b, a);
212 keep = true;
213 AddFunction(m_eMin, m_eMax, m_vMin, m_vMax, keep, m_labele, m_labeld,
214 HoleLongitudinalDiffusion, xaxis, e, b, a);
215 m_canvas->Update();
216}
217
218void ViewMedium::PlotIonDiffusion(const char xaxis, const double e,
219 const double b, const double a) {
220
221 SetupCanvas();
222 bool keep = false;
223 AddFunction(m_eMin, m_eMax, m_vMin, m_vMax, keep, m_labele, m_labeld,
224 IonTransverseDiffusion, xaxis, e, b, a);
225 keep = true;
226 AddFunction(m_eMin, m_eMax, m_vMin, m_vMax, keep, m_labele, m_labeld,
227 IonLongitudinalDiffusion, xaxis, e, b, a);
228 m_canvas->Update();
229}
230
231void ViewMedium::PlotElectronTownsend(const char xaxis, const double e,
232 const double b, const double a) {
233
234 bool keep = false;
235 SetupCanvas();
236 AddFunction(m_eMin, m_eMax, 0., 0., keep, m_labele,
237 "Townsend coefficient [1/cm]", ElectronTownsend, xaxis, e, b, a);
238 m_canvas->Update();
239}
240
241void ViewMedium::PlotHoleTownsend(const char xaxis, const double e,
242 const double b, const double a) {
243
244 bool keep = false;
245 SetupCanvas();
246 AddFunction(m_eMin, m_eMax, 0., 0., keep, m_labele,
247 "Townsend coefficient [1/cm]", HoleTownsend, xaxis, e, b, a);
248 m_canvas->Update();
249}
250
251void ViewMedium::PlotElectronAttachment(const char xaxis, const double e,
252 const double b, const double a) {
253
254 bool keep = false;
255 SetupCanvas();
256 AddFunction(m_eMin, m_eMax, 0., 0., keep, m_labele,
257 "Attachment coefficient [1/cm]",
258 ElectronAttachment, xaxis, e, b, a);
259 m_canvas->Update();
260}
261
262void ViewMedium::PlotHoleAttachment(const char xaxis, const double e,
263 const double b, const double a) {
264
265 bool keep = false;
266 SetupCanvas();
267 AddFunction(m_eMin, m_eMax, 0., 0., keep, m_labele,
268 "Attachment coefficient [1/cm]", HoleAttachment, xaxis, e, b, a);
269 m_canvas->Update();
270}
271
272void ViewMedium::PlotElectronLorentzAngle(const char xaxis, const double e,
273 const double b, const double a) {
274
275 bool keep = false;
276 SetupCanvas();
277 AddFunction(m_eMin, m_eMax, 0., 0., keep, m_labele,
278 "Lorentz angle",
279 ElectronLorentzAngle, xaxis, e, b, a);
280 m_canvas->Update();
281}
282
284
285 std::cerr << m_className << "::PlotElectronCrossSections:\n";
286 std::cerr << " Function not yet implemented.\n";
287 SetupCanvas();
288}
289
290void ViewMedium::SetupCanvas() {
291
292 if (!m_canvas) {
293 m_canvas = new TCanvas();
294 m_canvas->SetTitle("Medium View");
295 if (m_hasExternalCanvas) m_hasExternalCanvas = false;
296 }
297 m_canvas->cd();
298 gPad->SetLeftMargin(0.15);
299}
300
301void ViewMedium::AddFunction(const double xmin, const double xmax,
302 const double ymin, const double ymax,
303 const bool keep, const std::string& xlabel,
304 const std::string& ylabel, const int type,
305 const char xaxis, const double e, const double b,
306 const double a) {
307
308 // Make sure the medium is set.
309 if (!m_medium) {
310 std::cerr << m_className << "::AddFunction: Medium is not defined.\n";
311 return;
312 }
313
314 // Look for an unused function name.
315 int idx = 0;
316 std::string fname = "fMediumView_0";
317 while (gROOT->GetListOfFunctions()->FindObject(fname.c_str())) {
318 ++idx;
319 std::stringstream ss;
320 ss << "fMediumView_";
321 ss << idx;
322 fname = ss.str();
323 }
324 if (m_debug) {
325 std::cout << m_className << "::AddFunction:\n";
326 std::cout << " Adding function " << fname << "\n";
327 }
328 if (!keep) {
329 m_functions.clear();
330 m_graphs.clear();
331 }
332
333 // Set global variables used later on (effectively we will only use two)
334 m_efield = e;
335 m_bfield = b;
336 m_angle = a;
337
338 // Create a TF1 and add it to the list of functions.
339 m_functions.push_back(TF1(fname.c_str(), this, &ViewMedium::EvaluateFunction,
340 xmin, xmax, 2, "ViewMedium", "EvaluateFunction"));
341 m_functions.back().SetNpx(1000);
342 const std::string title = m_medium->GetName() + ";" + xlabel + ";" + ylabel;
343 m_functions.back().SetRange(xmin, xmax);
344 if ((fabs(ymax - ymin) > 0.)) {
345 m_functions.back().SetMinimum(ymin);
346 m_functions.back().SetMaximum(ymax);
347 }
348 m_functions.back().GetXaxis()->SetTitle(xlabel.c_str());
349 m_functions.back().GetXaxis()->SetTitleOffset(1.2);
350 m_functions.back().GetYaxis()->SetTitle(ylabel.c_str());
351 m_functions.back().SetTitle(title.c_str());
352 m_functions.back().SetParameter(0, type);
353 m_functions.back().SetParameter(1, xaxis);
354 // Set the color and marker style.
355 int color;
356 int marker = 20;
357 if (type == 2 || type == 4) {
359 } else if (type == 12 || type == 14 || type == 22) {
361 } else if (type < 10) {
363 } else if (type == 23) {
364 color = kGreen;
365 } else if (type == 24) {
366 color = kRed;
367 } else if (type < 20 || type == 25 || type == 26) {
369 } else {
371 }
372 m_functions.back().SetLineColor(color);
373 // Get the field grid.
374 std::vector<double> efields;
375 std::vector<double> bfields;
376 std::vector<double> bangles;
377 m_medium->GetFieldGrid(efields, bfields, bangles);
378 const unsigned int nEfields = efields.size();
379 const unsigned int nBfields = bfields.size();
380 const unsigned int nBangles = bangles.size();
381 bool withGraph = (nEfields > 0 && nBfields > 0 && nBangles > 0);
382
383 if (withGraph) {
384 int n = 0;
385 TGraph graph;
386 if (xaxis == 'e') { // plot with respect to E field
387 graph.Set(nEfields);
388 n = nEfields;
389 } else if (xaxis == 'b') { // plot wrt B field
390 graph.Set(nBfields);
391 n = nBfields;
392 } else if (xaxis == 'a') { // plot wrt angle
393 graph.Set(nBangles);
394 n = nBangles;
395 } else {
396 std::cerr << m_className << "::AddFunction:\n"
397 << " Error specifying X-axis. Invalid parameter type.\n";
398 return;
399 }
400 graph.SetMarkerStyle(marker);
401 graph.SetMarkerColor(color);
402 bool ok = true;
403
404 int epoint = -1;
405 int bpoint = -1;
406 int apoint = -1;
407 // if one of these stays -1, this means there is no corresponding point in
408 // the table
409
410 // search for matching point in table with a certain accuracy
411 for (int i = 0; i < n; ++i) {
412 if (fabs(efields[i] - m_efield) <= m_etolerance) {
413 epoint = i;
414 break;
415 }
416 }
417 for (int i = 0; i < n; ++i) {
418 if (fabs(bfields[i] - m_bfield) <= m_btolerance) {
419 bpoint = i;
420 break;
421 }
422 }
423 for (int i = 0; i < n; ++i) {
424 if (fabs(bangles[i] - m_angle) <= m_atolerance) {
425 apoint = i;
426 break;
427 }
428 }
429 if ((xaxis == 'e' && (bpoint == -1 || apoint == -1)) ||
430 (xaxis == 'b' && (epoint == -1 || apoint == -1)) ||
431 (xaxis == 'a' && (epoint == -1 || bpoint == -1)))
432 ok = false;
433
434 for (int i = 0; i < n; ++i) {
435 double value = 0.;
436 // auxiliary variables
437 double alongx = 0, alongy = 0., alongz = 0.;
438 if (!ok) {
439 withGraph = false;
440 break;
441 }
442 switch (type) {
444 if (xaxis == 'e')
445 ok = m_medium->GetElectronVelocityE(i, bpoint, apoint, value);
446 else if (xaxis == 'b')
447 ok = m_medium->GetElectronVelocityE(epoint, i, apoint, value);
448 else if (xaxis == 'a')
449 ok = m_medium->GetElectronVelocityE(epoint, bpoint, i, value);
450 else
451 value = 0.;
452 value = m_medium->ScaleVelocity(value);
453 break;
455 ok = m_medium->GetElectronTransverseDiffusion(i, bpoint, apoint,
456 value);
457 value = m_medium->ScaleDiffusion(value);
458 break;
460 ok = m_medium->GetElectronLongitudinalDiffusion(i, bpoint, apoint,
461 value);
462 value = m_medium->ScaleDiffusion(value);
463 break;
464 case ElectronTownsend:
465 ok = m_medium->GetElectronTownsend(i, bpoint, apoint, value);
466 value = m_medium->ScaleTownsend(exp(value));
467 break;
469 ok = m_medium->GetElectronAttachment(i, bpoint, apoint, value);
470 value = m_medium->ScaleAttachment(exp(value));
471 break;
473 ok = m_medium->GetElectronLorentzAngle(i, bpoint, apoint, value);
474 value = m_medium->ScaleLorentzAngle(value);
475 break;
476 case HoleVelocityE:
477 ok = m_medium->GetHoleVelocityE(i, bpoint, apoint, value);
478 value = m_medium->ScaleVelocity(value);
479 break;
481 ok = m_medium->GetHoleTransverseDiffusion(i, bpoint, apoint, value);
482 value = m_medium->ScaleDiffusion(value);
483 break;
485 ok = m_medium->GetHoleLongitudinalDiffusion(i, bpoint, apoint, value);
486 value = m_medium->ScaleDiffusion(value);
487 break;
488 case HoleTownsend:
489 ok = m_medium->GetHoleTownsend(i, bpoint, apoint, value);
490 value = m_medium->ScaleTownsend(exp(value));
491 break;
492 case HoleAttachment:
493 ok = m_medium->GetHoleAttachment(i, bpoint, apoint, value);
494 value = m_medium->ScaleAttachment(exp(value));
495 break;
496 case IonVelocity:
497 ok = m_medium->GetIonMobility(i, bpoint, apoint, value);
498 value *= m_medium->UnScaleElectricField(efields[i]);
499 break;
501 ok = m_medium->GetIonTransverseDiffusion(i, bpoint, apoint, value);
502 value = m_medium->ScaleDiffusion(value);
503 break;
505 ok = m_medium->GetIonLongitudinalDiffusion(i, bpoint, apoint, value);
506 value = m_medium->ScaleDiffusion(value);
507 break;
509 if (xaxis == 'e')
510 ok = m_medium->ElectronVelocity(efields[i] * cos(bangles[apoint]),
511 efields[i] * sin(bangles[apoint]),
512 0, bfields[bpoint], 0, 0, value,
513 alongy, alongz);
514 else if (xaxis == 'b')
515 ok = m_medium->ElectronVelocity(
516 efields[epoint] * cos(bangles[apoint]),
517 efields[epoint] * sin(bangles[apoint]), 0, bfields[i], 0, 0,
518 value, alongy, alongz);
519 else if (xaxis == 'a') {
520 ok = m_medium->ElectronVelocity(efields[epoint] * cos(bangles[i]),
521 efields[epoint] * sin(bangles[i]),
522 0, bfields[bpoint], 0, 0, value,
523 alongy, alongz);
524 } else
525 value = 0.;
526 value = fabs(m_medium->ScaleVelocity(value));
527 break;
529 if (xaxis == 'e')
530 ok = m_medium->ElectronVelocity(efields[i] * cos(bangles[apoint]),
531 efields[i] * sin(bangles[apoint]),
532 0, bfields[bpoint], 0, 0, alongx,
533 alongy, value);
534 else if (xaxis == 'b')
535 ok = m_medium->ElectronVelocity(
536 efields[epoint] * cos(bangles[apoint]),
537 efields[epoint] * sin(bangles[apoint]), 0, bfields[i], 0, 0,
538 alongx, alongy, value);
539 else if (xaxis == 'a')
540 ok = m_medium->ElectronVelocity(
541 m_efield * cos(bangles[i]), m_efield * sin(bangles[i]), 0,
542 m_bfield, 0, 0, alongx, alongy, value);
543 else
544 value = 0.;
545 value = fabs(m_medium->ScaleVelocity(value));
546 break;
547 case HoleVelocityB:
548 if (xaxis == 'e')
549 ok = m_medium->HoleVelocity(efields[i] * cos(bangles[apoint]),
550 efields[i] * sin(bangles[apoint]), 0,
551 bfields[bpoint], 0, 0, value, alongy,
552 alongz);
553 else if (xaxis == 'b')
554 ok = m_medium->HoleVelocity(efields[epoint] * cos(bangles[apoint]),
555 efields[epoint] * sin(bangles[apoint]),
556 0, bfields[i], 0, 0, value, alongy,
557 alongz);
558 else if (xaxis == 'a')
559 ok = m_medium->HoleVelocity(efields[epoint] * cos(bangles[i]),
560 efields[epoint] * sin(bangles[i]), 0,
561 bfields[bpoint], 0, 0, value, alongy,
562 alongz);
563 break;
564 case HoleVelocityExB:
565 if (xaxis == 'e')
566 ok = m_medium->HoleVelocity(efields[i] * cos(bangles[apoint]),
567 efields[i] * sin(bangles[apoint]), 0,
568 bfields[bpoint], 0, 0, alongx, alongy,
569 value);
570 else if (xaxis == 'b')
571 ok = m_medium->HoleVelocity(efields[epoint] * cos(bangles[apoint]),
572 efields[epoint] * sin(bangles[apoint]),
573 0, bfields[i], 0, 0, alongx, alongy,
574 value);
575 else if (xaxis == 'a')
576 ok = m_medium->HoleVelocity(m_efield * cos(bangles[i]),
577 m_efield * sin(bangles[i]), 0, m_bfield,
578 0, 0, alongx, alongy, value);
579 else
580 value = 0.;
581 value = fabs(m_medium->ScaleVelocity(value));
582 break;
583 }
584 if (xaxis == 'e')
585 graph.SetPoint(i, m_medium->UnScaleElectricField(efields[i]), value);
586 else if (xaxis == 'b')
587 graph.SetPoint(i, bfields[i], value);
588 else if (xaxis == 'a')
589 graph.SetPoint(i, bangles[i], value);
590 }
591 if (ok) {
592 m_graphs.push_back(graph);
593 } else {
594 std::cerr << m_className << "::AddFunction:\n";
595 std::cerr << " Error retrieving data table.\n";
596 std::cerr << " Suppress plotting of graph.\n";
597 }
598 }
599
600 if (keep && m_functions.size() > 1) {
601 m_functions[0].GetYaxis()->SetTitleOffset(1.5);
602 m_functions[0].Draw("");
603 const unsigned int nFunctions = m_functions.size();
604 for (unsigned int i = 1; i < nFunctions; ++i) {
605 m_functions[i].Draw("lsame");
606 }
607 } else {
608 m_functions.back().GetYaxis()->SetTitleOffset(1.5);
609 m_functions.back().Draw("");
610 }
611 if (!m_graphs.empty()) {
612 const unsigned int nGraphs = m_graphs.size();
613 for (unsigned int i = 0; i < nGraphs; ++i) {
614 m_graphs[i].Draw("p");
615 }
616 }
617}
618
619double ViewMedium::EvaluateFunction(double* pos, double* par) {
620 // to be modified to include B and angle
621
622 if (m_medium == 0) return 0.;
623 int type = int(par[0]);
624 char xaxis = char(par[1]);
625 const double x = pos[0];
626 double y = 0.;
627
628 // Auxiliary variables
629 double value = 0., a = 0., b = 0., c = 0.;
630 double alongx = 0., alongy = 0., alongz = 0.;
631
632 switch (type) {
634 if (xaxis == 'e') {
635 // plot with respect to E field
636 if (!m_medium->ElectronVelocity(x, 0, 0, m_bfield * cos(m_angle),
637 m_bfield * sin(m_angle), 0, a, b, c))
638 return 0.;
639 } else if (xaxis == 'b') {
640 // plot wrt B field
641 if (!m_medium->ElectronVelocity(m_efield, 0, 0, x * cos(m_angle),
642 x * sin(m_angle), 0, a, b, c))
643 return 0.;
644 } else if (xaxis == 'a') {
645 // plot wrt angle
646 if (!m_medium->ElectronVelocity(m_efield, 0, 0, m_bfield * cos(x),
647 m_bfield * sin(x), 0, a, b, c))
648 return 0.;
649 }
650 y = fabs(a);
651 break;
653 if (!m_medium->ElectronDiffusion(x, 0, 0, 0, 0, 0, a, b)) return 0.;
654 y = b;
655 break;
657 if (!m_medium->ElectronDiffusion(x, 0, 0, 0, 0, 0, a, b)) return 0.;
658 y = a;
659 break;
660 case ElectronTownsend:
661 if (!m_medium->ElectronTownsend(x, 0, 0, 0, 0, 0, a)) return 0.;
662 y = a;
663 break;
665 if (!m_medium->ElectronAttachment(x, 0, 0, 0, 0, 0, a)) return 0.;
666 y = a;
667 break;
669 if (!m_medium->ElectronLorentzAngle(x, 0, 0, 0, 0, 0, a)) return 0.;
670 y = a;
671 break;
672 case HoleVelocityE:
673 if (!m_medium->HoleVelocity(x, 0, 0, 0, 0, 0, a, b, c)) return 0.;
674 y = a;
675 break;
677 if (!m_medium->HoleDiffusion(x, 0, 0, 0, 0, 0, a, b)) return 0.;
678 y = b;
679 break;
681 if (!m_medium->HoleDiffusion(x, 0, 0, 0, 0, 0, a, b)) return 0.;
682 y = a;
683 break;
684 case HoleTownsend:
685 if (!m_medium->HoleTownsend(x, 0, 0, 0, 0, 0, a)) return 0.;
686 y = a;
687 break;
688 case HoleAttachment:
689 if (!m_medium->HoleAttachment(x, 0, 0, 0, 0, 0, a)) return 0.;
690 y = a;
691 break;
692 case IonVelocity:
693 if (!m_medium->IonVelocity(x, 0, 0, 0, 0, 0, a, b, c)) return 0.;
694 y = fabs(a);
695 break;
697 if (!m_medium->IonDiffusion(x, 0, 0, 0, 0, 0, a, b)) return 0.;
698 y = b;
699 break;
701 if (!m_medium->IonDiffusion(x, 0, 0, 0, 0, 0, a, b)) return 0.;
702 y = a;
703 break;
705 if (xaxis == 'e') {
706 // plot with respect to E field
707 if (!m_medium->ElectronVelocity(x * cos(m_angle), x * sin(m_angle), 0,
708 m_bfield, 0, 0, value, alongy, alongz))
709 return 0.;
710 } else if (xaxis == 'b') {
711 // plot wrt B field
712 if (!m_medium->ElectronVelocity(m_efield * cos(m_angle),
713 m_efield * sin(m_angle), 0, x, 0, 0,
714 value, alongy, alongz))
715 return 0.;
716 } else if (xaxis == 'a') {
717 // plot wrt angle
718 if (!m_medium->ElectronVelocity(m_efield * cos(x), m_efield * sin(x), 0,
719 m_bfield, 0, 0, value, alongy, alongz))
720 return 0.;
721 }
722 y = fabs(value);
723 break;
725 if (xaxis == 'e') {
726 // plot with respect to E field
727 if (!m_medium->ElectronVelocity(x * cos(m_angle), x * sin(m_angle), 0,
728 m_bfield, 0, 0, alongx, alongy, value))
729 return 0.;
730 } else if (xaxis == 'b') {
731 // plot wrt B field
732 if (!m_medium->ElectronVelocity(m_efield * cos(m_angle),
733 m_efield * sin(m_angle), 0, x, 0, 0,
734 alongx, alongy, value))
735 return 0.;
736 } else if (xaxis == 'a') {
737 // plot wrt angle
738 if (!m_medium->ElectronVelocity(m_efield * cos(x), m_efield * sin(x), 0,
739 m_bfield, 0, 0, alongx, alongy, value))
740 return 0.;
741 }
742 y = fabs(value);
743 break;
744 case HoleVelocityB:
745 if (xaxis == 'e') {
746 // plot with respect to E field
747 if (!m_medium->HoleVelocity(x * cos(m_angle), x * sin(m_angle), 0,
748 m_bfield, 0, 0, value, alongy, alongz))
749 return 0.;
750 } else if (xaxis == 'b') {
751 // plot wrt B field
752 if (!m_medium->HoleVelocity(m_efield * cos(m_angle),
753 m_efield * sin(m_angle), 0, x, 0, 0, value,
754 alongy, alongz))
755 return 0.;
756 } else if (xaxis == 'a') {
757 // plot wrt angle
758 if (!m_medium->HoleVelocity(m_efield * cos(x), m_efield * sin(x), 0,
759 m_bfield, 0, 0, value, alongy, alongz))
760 return 0.;
761 }
762 y = fabs(value);
763 break;
764 case HoleVelocityExB:
765 if (xaxis == 'e') {
766 // plot with respect to E field
767 if (!m_medium->HoleVelocity(x * cos(m_angle), x * sin(m_angle), 0,
768 m_bfield, 0, 0, alongx, alongy, value))
769 return 0.;
770 } else if (xaxis == 'b') {
771 // plot wrt B field
772 if (!m_medium->HoleVelocity(m_efield * cos(m_angle),
773 m_efield * sin(m_angle), 0, x, 0, 0, alongx,
774 alongy, value))
775 return 0.;
776 } else if (xaxis == 'a') {
777 // plot wrt angle
778 if (!m_medium->HoleVelocity(m_efield * cos(x), m_efield * sin(x), 0,
779 m_bfield, 0, 0, alongx, alongy, value))
780 return 0.;
781 }
782 y = fabs(value);
783 break;
784 default:
785 std::cerr << m_className << "::EvaluateFunction:\n";
786 std::cerr << " Unknown type of transport coefficient requested.\n";
787 std::cerr << " Program bug!\n";
788 return 0.;
789 }
790
791 return y;
792}
793
794int ViewMedium::GetColor(const unsigned int prop) const {
795
796 if (prop == ElectronLongitudinalDiffusion || prop == ElectronAttachment ||
797 prop == ElectronLorentzAngle) {
799 } else if (prop == HoleLongitudinalDiffusion || prop == HoleAttachment ||
800 prop == IonLongitudinalDiffusion) {
802 } else if (prop < HoleVelocityE) {
804 } else if (prop == ElectronVelocityB || prop == HoleVelocityB) {
805 return kGreen;
806 } else if (prop == ElectronVelocityExB || prop == HoleVelocityExB) {
807 return kRed;
808 } else if (prop < IonVelocity) {
810 }
812}
813}
Abstract base class for media.
Definition: Medium.hh:11
virtual double UnScaleElectricField(const double e) const
Definition: Medium.hh:265
virtual double ScaleVelocity(const double v) const
Definition: Medium.hh:266
bool GetElectronVelocityE(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &v)
Definition: Medium.cc:1680
virtual bool HoleTownsend(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &alpha)
Definition: Medium.cc:971
virtual double ScaleAttachment(const double eta) const
Definition: Medium.hh:270
virtual double ScaleDiffusion(const double d) const
Definition: Medium.hh:267
virtual bool HoleVelocity(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &vx, double &vy, double &vz)
Definition: Medium.cc:704
virtual double ScaleLorentzAngle(const double lor) const
Definition: Medium.hh:271
virtual bool ElectronLorentzAngle(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &lor)
Definition: Medium.cc:599
bool GetIonLongitudinalDiffusion(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &dl)
Definition: Medium.cc:2065
bool GetHoleAttachment(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &eta)
Definition: Medium.cc:2018
bool GetElectronAttachment(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &eta)
Definition: Medium.cc:1826
virtual bool ElectronVelocity(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &vx, double &vy, double &vz)
Definition: Medium.cc:204
virtual bool IonVelocity(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &vx, double &vy, double &vz)
Definition: Medium.cc:1077
bool GetIonMobility(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &mu)
Definition: Medium.cc:2042
bool GetElectronTownsend(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &alpha)
Definition: Medium.cc:1802
bool GetElectronLorentzAngle(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &lor)
Definition: Medium.cc:1850
virtual double ScaleTownsend(const double alpha) const
Definition: Medium.hh:269
bool GetHoleTownsend(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &alpha)
Definition: Medium.cc:1994
virtual bool ElectronDiffusion(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &dl, double &dt)
Definition: Medium.cc:362
void GetFieldGrid(std::vector< double > &efields, std::vector< double > &bfields, std::vector< double > &angles)
Definition: Medium.cc:1671
virtual bool ElectronTownsend(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &alpha)
Definition: Medium.cc:490
const std::string & GetName() const
Definition: Medium.hh:22
bool GetElectronTransverseDiffusion(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &dt)
Definition: Medium.cc:1777
virtual bool ElectronAttachment(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &eta)
Definition: Medium.cc:544
bool GetHoleVelocityE(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &v)
Definition: Medium.cc:1874
bool GetHoleTransverseDiffusion(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &dt)
Definition: Medium.cc:1970
bool GetElectronLongitudinalDiffusion(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &dl)
Definition: Medium.cc:1752
virtual bool HoleDiffusion(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &dl, double &dt)
Definition: Medium.cc:846
bool GetHoleLongitudinalDiffusion(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &dl)
Definition: Medium.cc:1946
virtual bool HoleAttachment(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &eta)
Definition: Medium.cc:1023
virtual bool IonDiffusion(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &dl, double &dt)
Definition: Medium.cc:1122
bool GetIonTransverseDiffusion(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &dt)
Definition: Medium.cc:2089
double EvaluateFunction(double *pos, double *par)
Definition: ViewMedium.cc:619
void PlotElectronVelocity(const char xaxis, const double e, const double b, const double a=HalfPi)
Definition: ViewMedium.cc:119
void SetMedium(Medium *m)
Definition: ViewMedium.cc:63
void PlotIonDiffusion(const char xaxis, const double e, const double b, const double a=HalfPi)
Definition: ViewMedium.cc:218
void SetElectricFieldRange(const double emin, const double emax)
Set the limits of the electric field.
Definition: ViewMedium.cc:73
void PlotHoleTownsend(const char xaxis, const double e, const double b, const double a=HalfPi)
Definition: ViewMedium.cc:241
void PlotIonVelocity(const char xaxis, const double e, const double b, const double a=HalfPi)
Definition: ViewMedium.cc:181
void PlotElectronLorentzAngle(const char xaxis, const double e, const double b, const double a=HalfPi)
Definition: ViewMedium.cc:272
void PlotElectronTownsend(const char xaxis, const double e, const double b, const double a=HalfPi)
Definition: ViewMedium.cc:231
void PlotHoleVelocity(const char xaxis, const double e, const double b, const double a=HalfPi)
Definition: ViewMedium.cc:150
void PlotHoleAttachment(const char xaxis, const double e, const double b, const double a=HalfPi)
Definition: ViewMedium.cc:262
void PlotElectronCrossSections()
Definition: ViewMedium.cc:283
void SetCanvas(TCanvas *c)
Set the canvas to be painted on.
Definition: ViewMedium.cc:49
~ViewMedium()
Destructor.
Definition: ViewMedium.cc:44
void PlotElectronAttachment(const char xaxis, const double e, const double b, const double a=HalfPi)
Definition: ViewMedium.cc:251
void SetFunctionRange()
Use the default function range.
Definition: ViewMedium.cc:117
ViewMedium()
Constructor.
Definition: ViewMedium.cc:15
void SetMagneticFieldRange(const double bmin, const double bmax)
Set the limits of the magnetic field.
Definition: ViewMedium.cc:84
void PlotElectronDiffusion(const char xaxis, const double e, const double b, const double a=HalfPi)
Definition: ViewMedium.cc:191
void PlotHoleDiffusion(const char xaxis, const double e, const double b, const double a=HalfPi)
Definition: ViewMedium.cc:205
void SetBAngleRange(const double amin, const double amax)
Set the limits of the angle between electric and magnetic field.
Definition: ViewMedium.cc:95
PlottingEngineRoot plottingEngine
DoubleAc cos(const DoubleAc &f)
Definition: DoubleAc.cpp:432
DoubleAc exp(const DoubleAc &f)
Definition: DoubleAc.cpp:377
DoubleAc fabs(const DoubleAc &f)
Definition: DoubleAc.h:615
DoubleAc sin(const DoubleAc &f)
Definition: DoubleAc.cpp:384