1#ifndef G_COMPONENT_ANALYTIC_FIELD_H
2#define G_COMPONENT_ANALYTIC_FIELD_H
28 void AddWire(
const double x,
const double y,
const double diameter,
29 const double voltage,
const std::string& label =
"",
30 const double length = 100.,
const double tension = 50.,
31 const double rho = 19.3,
const int ntrap = 5);
33 void AddTube(
const double radius,
const double voltage,
const int nEdges,
34 const std::string& label =
"");
36 void AddPlaneX(
const double x,
const double voltage,
37 const std::string& label =
"");
39 void AddPlaneY(
const double y,
const double voltage,
40 const std::string& label =
"");
42 void AddPlaneR(
const double r,
const double voltage,
43 const std::string& label =
"");
45 void AddPlanePhi(
const double phi,
const double voltage,
46 const std::string& label =
"");
55 void AddStripOnPlaneX(
const char direction,
const double x,
const double smin,
56 const double smax,
const std::string& label,
57 const double gap = -1.);
59 void AddStripOnPlaneY(
const char direction,
const double y,
const double smin,
60 const double smax,
const std::string& label,
61 const double gap = -1.);
63 void AddStripOnPlaneR(
const char direction,
const double r,
const double smin,
64 const double smax,
const std::string& label,
65 const double gap = -1.);
68 const double smax,
const std::string& label,
69 const double gap = -1.);
81 const double zmin,
const double zmax,
82 const std::string& label,
const double gap = -1.,
83 const double rot = 0.);
86 const double zmin,
const double zmax,
87 const std::string& label,
const double gap = -1.,
88 const double rot = 0.);
91 const double phimin,
const double phimax,
92 const double zmin,
const double zmax,
93 const std::string& label,
const double gap = -1.);
96 const double rmin,
const double rmax,
97 const double zmin,
const double zmax,
98 const std::string& label,
const double gap = -1.);
126 void AddCharge(
const double x,
const double y,
const double z,
154 if (CellCheck()) CellType();
161 void AddReadout(
const std::string& label,
const bool silent =
false);
176 const bool print =
false,
const bool plot =
false,
177 const double rmult = 1.,
const double eps = 1.e-4,
178 const unsigned int nMaxIter = 20);
187 bool GetWire(
const unsigned int i,
double& x,
double& y,
double& diameter,
188 double& voltage, std::string& label,
double& length,
189 double& charge,
int& ntrap)
const;
200 bool GetPlaneX(
const unsigned int i,
double& x,
double& voltage,
201 std::string& label)
const;
203 bool GetPlaneY(
const unsigned int i,
double& y,
double& voltage,
204 std::string& label)
const;
206 bool GetPlaneR(
const unsigned int i,
double& r,
double& voltage,
207 std::string& label)
const;
209 bool GetPlanePhi(
const unsigned int i,
double& phi,
double& voltage,
210 std::string& label)
const;
212 bool GetTube(
double& r,
double& voltage,
int& nEdges,
213 std::string& label)
const;
229 const std::string& field_function,
231 const double x0,
const double y0,
232 const double x1,
const double y1,
233 const unsigned int nP = 20,
234 const bool print =
true);
238 const std::string& field_function,
240 const double x0,
const double y0,
241 const double x1,
const double y1,
242 const unsigned int nX = 10,
const unsigned int nY = 10,
243 const bool print =
true);
247 const std::string& field_function,
249 const std::vector<unsigned int>& wires,
250 const bool print =
true);
259 const double eps = 1.e-4,
260 const unsigned int nMaxIter = 10);
271 void SetScanningArea(
const double xmin,
const double xmax,
const double ymin,
284 void SetGravity(
const double dx,
const double dy,
const double dz);
286 void GetGravity(
double& dx,
double& dy,
double& dz)
const;
291 m_useElectrostaticForce = on;
300 bool ForcesOnWire(
const unsigned int iw, std::vector<double>& xMap,
301 std::vector<double>& yMap,
302 std::vector<std::vector<double> >& fxMap,
303 std::vector<std::vector<double> >& fyMap);
315 std::vector<double>& csag, std::vector<double>& xsag,
316 std::vector<double>& ysag,
double& stretch,
317 const bool print =
true);
324 Medium*
GetMedium(
const double x,
const double y,
const double z)
override;
325 void ElectricField(
const double x,
const double y,
const double z,
double& ex,
326 double& ey,
double& ez,
Medium*& m,
int& status)
override {
330 status = Field(x, y, z, ex, ey, ez, v,
false);
342 void ElectricField(
const double x,
const double y,
const double z,
double& ex,
343 double& ey,
double& ez,
double& v,
Medium*& m,
344 int& status)
override {
347 status = Field(x, y, z, ex, ey, ez, v,
true);
362 double& wx,
double& wy,
double& wz,
363 const std::string& label)
override {
365 if (!m_sigset) PrepareSignals();
366 Wfield(x, y, z, wx, wy, wz, label);
369 const std::string& label)
override {
370 if (!m_sigset) PrepareSignals();
371 return Wpot(x, y, z, label);
374 bool GetBoundingBox(
double& x0,
double& y0,
double& z0,
double& x1,
375 double& y1,
double& z1)
override;
377 double& y1,
double& z1)
override;
379 bool CrossedWire(
const double x0,
const double y0,
const double z0,
380 const double x1,
const double y1,
const double z1,
381 double& xc,
double& yc,
double& zc,
const bool centre,
382 double& rc)
override;
384 bool InTrapRadius(
const double q0,
const double x0,
const double y0,
385 const double z0,
double& xw,
double& yx,
386 double& rw)
override;
388 bool CrossedPlane(
const double x0,
const double y0,
const double z0,
389 const double x1,
const double y1,
const double z1,
390 double& xc,
double& yc,
double& zc)
override;
414 Medium* m_medium =
nullptr;
416 bool m_chargeCheck =
false;
418 bool m_cellset =
false;
419 bool m_sigset =
false;
421 bool m_polar =
false;
427 double m_xmin, m_xmax;
428 double m_ymin, m_ymax;
429 double m_zmin, m_zmax;
432 double m_vmin, m_vmax;
442 bool m_fperx =
false;
443 bool m_fpery =
false;
450 std::vector<std::string> m_readout;
453 unsigned int m_nWires;
467 std::vector<Wire> m_w;
470 bool m_dipole =
false;
472 std::vector<double> m_cosph2;
473 std::vector<double> m_sinph2;
474 std::vector<double> m_amp2;
477 std::vector<double> m_b2sin;
480 std::complex<double> m_zmult;
481 double m_p1, m_p2, m_c1;
484 std::vector<std::complex<double> > m_zw;
489 double m_corvta, m_corvtb, m_corvtc;
494 bool m_ynplax, m_ynplay;
497 double m_coplax, m_coplay;
511 double smin = 0., smax = 0.;
512 double zmin = 0., zmax = 0.;
521 double ewxcor, ewycor;
522 std::vector<Strip> strips1;
523 std::vector<Strip> strips2;
524 std::vector<Pixel> pixels;
526 std::array<Plane, 5> m_planes;
532 double m_cotube = 1.;
533 double m_cotube2 = 1.;
534 double m_vttube = 0.;
540 std::vector<std::vector<std::vector<double> > > m_qwire;
542 std::vector<std::vector<std::vector<double> > > m_qplane;
549 std::vector<Charge3d> m_ch3d;
550 unsigned int m_nTermBessel = 10;
551 unsigned int m_nTermPoly = 100;
553 bool m_useElectrostaticForce =
true;
554 bool m_useGravitationalForce =
true;
556 std::array<double, 3> m_down{{0, 0, 1}};
558 unsigned int m_nShots = 2;
560 unsigned int m_nSteps = 20;
563 enum class ScanningRange { Largest = 0, FirstOrder, User };
564 ScanningRange m_scanRange = ScanningRange::FirstOrder;
566 double m_xScanMin = 0.;
567 double m_xScanMax = 0.;
568 double m_yScanMin = 0.;
569 double m_yScanMax = 0.;
571 double m_scaleRange = 2.;
573 unsigned int m_nScanX = 11;
574 unsigned int m_nScanY = 11;
576 bool m_extrapolateForces =
false;
580 double m_optDist = 1.;
583 double m_optEps = 1.e-4;
585 unsigned int m_optNitmax = 10;
587 void UpdatePeriodicity()
override;
588 void Reset()
override {
596 bool WireCheck()
const;
599 bool PrepareStrips();
600 bool PrepareSignals();
601 bool SetupWireSignals();
602 bool SetupPlaneSignals();
606 bool Update(
const std::vector<double>& vw,
607 const std::array<double, 5>& vp);
621 bool IprA00(
const int mx,
const int my,
622 std::vector<std::vector<std::complex<double> > >& mat);
623 bool IprB2X(
const int my,
624 std::vector<std::vector<std::complex<double> > >& mat);
625 bool IprB2Y(
const int mx,
626 std::vector<std::vector<std::complex<double> > >& mat);
627 bool IprC2X(std::vector<std::vector<std::complex<double> > >& mat);
628 bool IprC2Y(std::vector<std::vector<std::complex<double> > >& mat);
629 bool IprC30(std::vector<std::vector<std::complex<double> > >& mat);
630 bool IprD10(std::vector<std::vector<std::complex<double> > >& mat);
631 bool IprD30(std::vector<std::vector<std::complex<double> > >& mat);
633 bool SetupDipoleTerms();
636 bool Charge(std::vector<std::vector<double> >& mat);
639 int Field(
const double xin,
const double yin,
const double zin,
double& ex,
640 double& ey,
double& ez,
double& volt,
const bool opt);
641 void FieldA00(
const double xpos,
const double ypos,
double& ex,
double& ey,
642 double& volt,
const bool opt)
const;
643 void FieldB1X(
const double xpos,
const double ypos,
double& ex,
double& ey,
644 double& volt,
const bool opt)
const;
645 void FieldB1Y(
const double xpos,
const double ypos,
double& ex,
double& ey,
646 double& volt,
const bool opt)
const;
647 void FieldB2X(
const double xpos,
const double ypos,
double& ex,
double& ey,
648 double& volt,
const bool opt)
const;
649 void FieldB2Y(
const double xpos,
const double ypos,
double& ex,
double& ey,
650 double& volt,
const bool opt)
const;
651 void FieldC10(
const double xpos,
const double ypos,
double& ex,
double& ey,
652 double& volt,
const bool opt)
const;
653 void FieldC2X(
const double xpos,
const double ypos,
double& ex,
double& ey,
654 double& volt,
const bool opt)
const;
655 void FieldC2Y(
const double xpos,
const double ypos,
double& ex,
double& ey,
656 double& volt,
const bool opt)
const;
657 void FieldC30(
const double xpos,
const double ypos,
double& ex,
double& ey,
658 double& volt,
const bool opt)
const;
659 void FieldD10(
const double xpos,
const double ypos,
double& ex,
double& ey,
660 double& volt,
const bool opt)
const;
661 void FieldD20(
const double xpos,
const double ypos,
double& ex,
double& ey,
662 double& volt,
const bool opt)
const;
663 void FieldD30(
const double xpos,
const double ypos,
double& ex,
double& ey,
664 double& volt,
const bool opt)
const;
667 void Field3dA00(
const double x,
const double y,
const double z,
double& ex,
668 double& ey,
double& ez,
double& volt)
const;
669 void Field3dB2X(
const double x,
const double y,
const double z,
double& ex,
670 double& ey,
double& ez,
double& volt)
const;
671 void Field3dB2Y(
const double x,
const double y,
const double z,
double& ex,
672 double& ey,
double& ez,
double& volt)
const;
673 void Field3dD10(
const double x,
const double y,
const double z,
double& ex,
674 double& ey,
double& ez,
double& volt)
const;
676 bool Wfield(
const double x,
const double y,
const double z,
677 double& ex,
double& ey,
double& ez,
678 const std::string& label)
const;
679 void WfieldWireA00(
const double x,
const double y,
double& ex,
double& ey,
680 const int mx,
const int my,
681 const std::vector<double>& qw)
const;
682 void WfieldWireB2X(
const double x,
const double y,
double& ex,
double& ey,
683 const int my,
const std::vector<double>& qw)
const;
684 void WfieldWireB2Y(
const double x,
const double y,
double& ex,
double& ey,
685 const int mx,
const std::vector<double>& qw)
const;
686 void WfieldWireC2X(
const double x,
const double y,
double& ex,
double& ey,
687 const std::vector<double>& qw)
const;
688 void WfieldWireC2Y(
const double x,
const double y,
double& ex,
double& ey,
689 const std::vector<double>& qw)
const;
690 void WfieldWireC30(
const double x,
const double y,
double& ex,
double& ey,
691 const std::vector<double>& qw)
const;
692 void WfieldWireD10(
const double x,
const double y,
double& ex,
double& ey,
693 const std::vector<double>& qw)
const;
694 void WfieldWireD30(
const double x,
const double y,
double& ex,
double& ey,
695 const std::vector<double>& qw)
const;
696 void WfieldPlaneA00(
const double x,
const double y,
double& ex,
double& ey,
697 const int mx,
const int my,
698 const std::vector<double>& qp)
const;
699 void WfieldPlaneB2X(
const double x,
const double y,
double& ex,
double& ey,
700 const int my,
const std::vector<double>& qp)
const;
701 void WfieldPlaneB2Y(
const double x,
const double ypos,
double& ex,
double& ey,
702 const int mx,
const std::vector<double>& qp)
const;
703 void WfieldPlaneC2X(
const double x,
const double y,
double& ex,
double& ey,
704 const std::vector<double>& qp)
const;
705 void WfieldPlaneC2Y(
const double x,
const double y,
double& ex,
double& ey,
706 const std::vector<double>& qp)
const;
707 void WfieldPlaneC30(
const double x,
const double y,
double& ex,
double& ey,
708 const std::vector<double>& qp)
const;
709 void WfieldPlaneD10(
const double x,
const double y,
double& ex,
double& ey,
710 const std::vector<double>& qp)
const;
711 void WfieldPlaneD30(
const double x,
const double y,
double& ex,
double& ey,
712 const std::vector<double>& qp)
const;
713 void WfieldStripZ(
const double x,
const double y,
double& ex,
double& ey,
714 const int ip,
const Strip& strip)
const;
715 void WfieldStripXy(
const double x,
const double y,
const double z,
716 double& ex,
double& ey,
double& ez,
717 const int ip,
const Strip& strip)
const;
718 void WfieldStrip(
const double x,
const double y,
const double g,
719 const double w,
double& fx,
double& fy)
const;
720 void WfieldPixel(
const double x,
const double y,
const double z,
721 double& ex,
double& ey,
double& ez,
722 const int ip,
const Pixel& pixel)
const;
725 double Wpot(
const double x,
const double y,
const double z,
726 const std::string& label)
const;
727 double WpotWireA00(
const double x,
const double y,
728 const int mx,
const int my,
729 const std::vector<double>& qw)
const;
730 double WpotWireB2X(
const double x,
const double y,
731 const int my,
const std::vector<double>& qw)
const;
732 double WpotWireB2Y(
const double x,
const double y,
733 const int mx,
const std::vector<double>& qw)
const;
734 double WpotWireC2X(
const double x,
const double y,
735 const std::vector<double>& qw)
const;
736 double WpotWireC2Y(
const double x,
const double y,
737 const std::vector<double>& qw)
const;
738 double WpotWireC30(
const double x,
const double y,
739 const std::vector<double>& qw)
const;
740 double WpotWireD10(
const double x,
const double y,
741 const std::vector<double>& qw)
const;
742 double WpotWireD30(
const double x,
const double y,
743 const std::vector<double>& qw)
const;
744 double WpotPlaneA00(
const double x,
const double y,
745 const int mx,
const int my,
746 const std::vector<double>& qp)
const;
747 double WpotPlaneB2X(
const double x,
const double y,
748 const int my,
const std::vector<double>& qp)
const;
749 double WpotPlaneB2Y(
const double x,
const double y,
750 const int mx,
const std::vector<double>& qp)
const;
751 double WpotPlaneC2X(
const double x,
const double y,
752 const std::vector<double>& qp)
const;
753 double WpotPlaneC2Y(
const double x,
const double y,
754 const std::vector<double>& qp)
const;
755 double WpotPlaneC30(
const double x,
const double y,
756 const std::vector<double>& qp)
const;
757 double WpotPlaneD10(
const double x,
const double y,
758 const std::vector<double>& qp)
const;
759 double WpotPlaneD30(
const double x,
const double y,
760 const std::vector<double>& qp)
const;
761 double WpotStripZ(
const double x,
const double y,
762 const int ip,
const Strip& strip)
const;
763 double WpotStripXy(
const double x,
const double y,
const double z,
764 const int ip,
const Strip& strip)
const;
765 double WpotPixel(
const double x,
const double y,
const double z,
766 const int ip,
const Pixel& pixel)
const;
771 void FieldAtWireA00(
const double xpos,
const double ypos,
double& ex,
772 double& ey,
const std::vector<bool>& cnalso)
const;
773 void FieldAtWireB1X(
const double xpos,
const double ypos,
double& ex,
774 double& ey,
const std::vector<bool>& cnalso)
const;
775 void FieldAtWireB1Y(
const double xpos,
const double ypos,
double& ex,
776 double& ey,
const std::vector<bool>& cnalso)
const;
777 void FieldAtWireB2X(
const double xpos,
const double ypos,
double& ex,
778 double& ey,
const std::vector<bool>& cnalso)
const;
779 void FieldAtWireB2Y(
const double xpos,
const double ypos,
double& ex,
780 double& ey,
const std::vector<bool>& cnalso)
const;
781 void FieldAtWireC10(
const double xpos,
const double ypos,
double& ex,
782 double& ey,
const std::vector<bool>& cnalso)
const;
783 void FieldAtWireC2X(
const double xpos,
const double ypos,
double& ex,
784 double& ey,
const std::vector<bool>& cnalso)
const;
785 void FieldAtWireC2Y(
const double xpos,
const double ypos,
double& ex,
786 double& ey,
const std::vector<bool>& cnalso)
const;
787 void FieldAtWireC30(
const double xpos,
const double ypos,
double& ex,
788 double& ey,
const std::vector<bool>& cnalso)
const;
789 void FieldAtWireD10(
const double xpos,
const double ypos,
double& ex,
790 double& ey,
const std::vector<bool>& cnalso)
const;
791 void FieldAtWireD20(
const double xpos,
const double ypos,
double& ex,
792 double& ey,
const std::vector<bool>& cnalso)
const;
793 void FieldAtWireD30(
const double xpos,
const double ypos,
double& ex,
794 double& ey,
const std::vector<bool>& cnalso)
const;
796 void DipoleFieldA00(
const double xpos,
const double ypos,
double& ex,
797 double& ey,
double& volt,
const bool opt)
const;
798 void DipoleFieldB1X(
const double xpos,
const double ypos,
double& ex,
799 double& ey,
double& volt,
const bool opt)
const;
800 void DipoleFieldB1Y(
const double xpos,
const double ypos,
double& ex,
801 double& ey,
double& volt,
const bool opt)
const;
802 void DipoleFieldB2X(
const double xpos,
const double ypos,
double& ex,
803 double& ey,
double& volt,
const bool opt)
const;
804 void DipoleFieldB2Y(
const double xpos,
const double ypos,
double& ex,
805 double& ey,
double& volt,
const bool opt)
const;
808 double Ph2(
const double xpos,
const double ypos)
const;
809 double Ph2Lim(
const double radius)
const {
810 return -log(abs(m_zmult) * radius * (1. - 3. * m_p1 + 5. * m_p2));
812 void E2Sum(
const double xpos,
const double ypos,
double& ex,
816 void ConformalMap(
const std::complex<double>& z, std::complex<double>& ww,
817 std::complex<double>& wd)
const;
819 static bool InTube(
const double x0,
const double y0,
const double a,
822 bool SagDetailed(
const Wire& wire,
const std::vector<double>& xMap,
823 const std::vector<double>& yMap,
824 const std::vector<std::vector<double> >& fxMap,
825 const std::vector<std::vector<double> >& fyMap,
826 std::vector<double>& csag, std::vector<double>& xsag,
827 std::vector<double>& ysag)
const;
828 bool GetForceRatio(
const Wire& wire,
const double coor,
829 const std::array<double, 2>& bend,
830 const std::array<double, 2>& dbend,
831 std::array<double, 2>& f,
const std::vector<double>& xMap,
832 const std::vector<double>& yMap,
833 const std::vector<std::vector<double> >& fxMap,
834 const std::vector<std::vector<double> >& fyMap)
const;
835 bool FindZeroes(
const Wire& wire,
const double h, std::vector<double>& x,
836 const std::vector<double>& xMap,
837 const std::vector<double>& yMap,
838 const std::vector<std::vector<double> >& fxMap,
839 const std::vector<std::vector<double> >& fyMap)
const;
840 bool StepRKN(
const Wire& wire,
const double h,
double& x,
841 std::array<double, 2>& y, std::array<double, 2>& yp,
842 const std::vector<double>& xMap,
const std::vector<double>& yMap,
843 const std::vector<std::vector<double> >& fxMap,
844 const std::vector<std::vector<double> >& fyMap)
const;
845 bool Trace(
const Wire& wire,
const double h,
const std::vector<double>& xx,
846 std::vector<double>& f,
const std::vector<double>& xMap,
847 const std::vector<double>& yMap,
848 const std::vector<std::vector<double> >& fxMap,
849 const std::vector<std::vector<double> >& fyMap)
const;
850 size_t SignalLayer(
const int mx,
const int my)
const;
852 void InitialiseFitParameters(
const std::vector<std::string>& groups,
853 std::vector<double>& vw0, std::array<double, 5>& vp0,
854 std::vector<double>& aFit,
855 std::vector<std::vector<unsigned int> >& wiresInGroup,
856 std::vector<std::vector<unsigned int> >& planesInGroup);
bool CrossedPlane(const double x0, const double y0, const double z0, const double x1, const double y1, const double z1, double &xc, double &yc, double &zc) override
void AddPlaneX(const double x, const double voltage, const std::string &label="")
Add a plane at constant x.
void PrintCell()
Print all available information on the cell.
void SetGravity(const double dx, const double dy, const double dz)
Set the gravity orientation.
bool GetVoltageRange(double &pmin, double &pmax) override
Calculate the voltage range [V].
void SetPolarCoordinates()
Use polar coordinates.
void AddReadout(const std::string &label, const bool silent=false)
void SetPeriodicityX(const double s)
Set the periodic length [cm] in the x-direction.
void EnableDipoleTerms(const bool on=true)
Request dipole terms be included for each of the wires (default: off).
bool GetPeriodicityY(double &s)
Get the periodic length in the y-direction.
void SetCartesianCoordinates()
Use Cartesian coordinates (default).
bool CrossedWire(const double x0, const double y0, const double z0, const double x1, const double y1, const double z1, double &xc, double &yc, double &zc, const bool centre, double &rc) override
void AddPixelOnPlanePhi(const double phi, const double rmin, const double rmax, const double zmin, const double zmax, const std::string &label, const double gap=-1.)
Add a pixel on an existing plane at constant phi.
void EnableChargeCheck(const bool on=true)
Check the quality of the capacitance matrix inversion (default: off).
void AddPixelOnPlaneX(const double x, const double ymin, const double ymax, const double zmin, const double zmax, const std::string &label, const double gap=-1., const double rot=0.)
bool IsPolar() const
Are polar coordinates being used?
void SetMedium(Medium *medium)
Set the medium inside the cell.
void AddCharge(const double x, const double y, const double z, const double q)
Add a point charge.
void SetNumberOfCellCopies(const unsigned int nfourier)
unsigned int GetNumberOfWires() const
Get the number of wires.
void SetScanningGrid(const unsigned int nX, const unsigned int nY)
void SetNumberOfSteps(const unsigned int n)
Set the number of integration steps within each shot (must be >= 1).
double StepSizeHint() override
std::string GetCellType()
void SetNumberOfShots(const unsigned int n)
void ElectricField(const double x, const double y, const double z, double &ex, double &ey, double &ez, double &v, Medium *&m, int &status) override
Calculate the drift field [V/cm] and potential [V] at (x, y, z).
void AddPlaneY(const double y, const double voltage, const std::string &label="")
Add a plane at constant y.
void AddPixelOnPlaneR(const double r, const double phimin, const double phimax, const double zmin, const double zmax, const std::string &label, const double gap=-1.)
Add a pixel on an existing plane at constant radius.
bool GetWire(const unsigned int i, double &x, double &y, double &diameter, double &voltage, std::string &label, double &length, double &charge, int &ntrap) const
Retrieve the parameters of a wire.
bool GetPlaneR(const unsigned int i, double &r, double &voltage, std::string &label) const
Retrieve the parameters of a plane at constant radius.
bool WireDisplacement(const unsigned int iw, const bool detailed, std::vector< double > &csag, std::vector< double > &xsag, std::vector< double > &ysag, double &stretch, const bool print=true)
void EnableGravity(const bool on=true)
Include gravity in the sag computation or not.
void GetGravity(double &dx, double &dy, double &dz) const
Get the gravity orientation.
ComponentAnalyticField()
Constructor.
void AddStripOnPlaneX(const char direction, const double x, const double smin, const double smax, const std::string &label, const double gap=-1.)
void ClearCharges()
Remove all point charges.
unsigned int GetNumberOfPlanesY() const
Get the number of equipotential planes at constant y.
void PlotCell(TPad *pad)
Make a plot of the cell layout.
bool ElectricFieldAtWire(const unsigned int iw, double &ex, double &ey)
bool MultipoleMoments(const unsigned int iw, const unsigned int order=4, const bool print=false, const bool plot=false, const double rmult=1., const double eps=1.e-4, const unsigned int nMaxIter=20)
bool InTrapRadius(const double q0, const double x0, const double y0, const double z0, double &xw, double &yx, double &rw) override
void AddWire(const double x, const double y, const double diameter, const double voltage, const std::string &label="", const double length=100., const double tension=50., const double rho=19.3, const int ntrap=5)
Add a wire at (x, y) .
void EnableExtrapolation(const bool on=true)
unsigned int GetNumberOfPlanesX() const
Get the number of equipotential planes at constant x.
void SetScanningAreaLargest()
bool GetPeriodicityX(double &s)
Get the periodic length in the x-direction.
bool GetTube(double &r, double &voltage, int &nEdges, std::string &label) const
Retrieve the tube parameters.
bool GetPlaneX(const unsigned int i, double &x, double &voltage, std::string &label) const
Retrieve the parameters of a plane at constant x.
void AddTube(const double radius, const double voltage, const int nEdges, const std::string &label="")
Add a tube.
void AddPlanePhi(const double phi, const double voltage, const std::string &label="")
Add a plane at constant phi.
bool OptimiseOnWires(const std::vector< std::string > &groups, const std::string &field_function, const double target, const std::vector< unsigned int > &wires, const bool print=true)
bool GetElementaryCell(double &x0, double &y0, double &z0, double &x1, double &y1, double &z1) override
Get the coordinates of the elementary cell.
void SetPeriodicityPhi(const double phi)
Set the periodicity [degree] in phi.
bool GetPeriodicityPhi(double &s)
Get the periodicity [degree] in phi.
void AddPlaneR(const double r, const double voltage, const std::string &label="")
Add a plane at constant radius.
bool GetPlanePhi(const unsigned int i, double &phi, double &voltage, std::string &label) const
Retrieve the parameters of a plane at constant phi.
void AddStripOnPlaneY(const char direction, const double y, const double smin, const double smax, const std::string &label, const double gap=-1.)
Add a strip in the x or z direction on an existing plane at constant y.
bool GetBoundingBox(double &x0, double &y0, double &z0, double &x1, double &y1, double &z1) override
Get the bounding box coordinates.
bool ForcesOnWire(const unsigned int iw, std::vector< double > &xMap, std::vector< double > &yMap, std::vector< std::vector< double > > &fxMap, std::vector< std::vector< double > > &fyMap)
void WeightingField(const double x, const double y, const double z, double &wx, double &wy, double &wz, const std::string &label) override
void ElectricField(const double x, const double y, const double z, double &ex, double &ey, double &ez, Medium *&m, int &status) override
void SetOptimisationParameters(const double dist=1., const double eps=1.e-4, const unsigned int nMaxIter=10)
~ComponentAnalyticField()
Destructor.
void SetScanningAreaFirstOrder(const double scale=2.)
void AddPixelOnPlaneY(const double y, const double xmin, const double xmax, const double zmin, const double zmax, const std::string &label, const double gap=-1., const double rot=0.)
Add a pixel on an existing plane at constant y.
void EnableElectrostaticForce(const bool on=true)
Include the electrostatic force in the sag computation or not.
double WeightingPotential(const double x, const double y, const double z, const std::string &label) override
void SetPeriodicityY(const double s)
Set the periodic length [cm] in the y-direction.
Medium * GetMedium(const double x, const double y, const double z) override
Get the medium at a given location (x, y, z).
unsigned int GetNumberOfPlanesPhi() const
Get the number of equipotential planes at constant phi.
void AddStripOnPlaneR(const char direction, const double r, const double smin, const double smax, const std::string &label, const double gap=-1.)
Add a strip in the phi or z direction on an existing plane at constant radius.
void PrintCharges() const
Print a list of the point charges.
bool OptimiseOnGrid(const std::vector< std::string > &groups, const std::string &field_function, const double target, const double x0, const double y0, const double x1, const double y1, const unsigned int nX=10, const unsigned int nY=10, const bool print=true)
void SetScanningArea(const double xmin, const double xmax, const double ymin, const double ymax)
bool OptimiseOnTrack(const std::vector< std::string > &groups, const std::string &field_function, const double target, const double x0, const double y0, const double x1, const double y1, const unsigned int nP=20, const bool print=true)
bool GetPlaneY(const unsigned int i, double &y, double &voltage, std::string &label) const
Retrieve the parameters of a plane at constant y.
unsigned int GetNumberOfPlanesR() const
Get the number of equipotential planes at constant radius.
void AddStripOnPlanePhi(const char direction, const double phi, const double smin, const double smax, const std::string &label, const double gap=-1.)
Add a strip in the r or z direction on an existing plane at constant phi.
virtual void ElectricField(const double x, const double y, const double z, double &ex, double &ey, double &ez, Medium *&m, int &status)=0
Component()=delete
Default constructor.
Geometry * m_geometry
Pointer to the geometry.
Abstract base class for media.
bool IsDriftable() const
Is charge carrier transport enabled in this medium?