1 #ifndef __JCYLINDER3D__
2 #define __JCYLINDER3D__
22 namespace JGEOMETRY3D {}
23 namespace JPP {
using namespace JGEOMETRY3D; }
25 namespace JGEOMETRY3D {
88 const double precision = std::numeric_limits<double>::epsilon()) :
93 if (__begin != __end) {
95 zmin = std::numeric_limits<double>::max();
96 zmax = std::numeric_limits<double>::lowest();
98 for (
T i = __begin; i != __end; ++i) {
99 if (i->getZ() <
zmin)
zmin = i->getZ();
100 if (i->getZ() >
zmax)
zmax = i->getZ();
244 return sqrt(R*R + dz*dz);
280 double path[] = { 0.0, 0.0 };
282 if (fabs(axis.
getDZ()) != 0.0) {
291 for (
int i = 0; i != 2; ++i) {
293 const double u = (Z[i] - axis.
getZ()) / axis.
getDZ();
295 const double y = axis.
getY() + u * axis.
getDY() - this->
getY();
303 if (fabs(axis.
getDZ()) != 1.0) {
307 const double x = axis.
getX() - this->
getX();
308 const double y = axis.
getY() - this->
getY();
309 const double dx = axis.
getDX();
310 const double dy = axis.
getDY();
313 const double a = (dx * dx + dy * dy);
314 const double b = 2*(dx * x + dy * y);
315 const double c = (x * x + y * y) - R * R;
317 const double q = b*b - 4*a*c;
322 (-b - sqrt(q)) / (2*a),
323 (-b + sqrt(q)) / (2*a)
326 for (
int i = 0; i != 2; ++i) {
328 const double z = axis.
getZ() + u[i] * axis.
getDZ();
337 return std::make_pair(path[0], path[1]);
351 in >> cylinder.
zmin >> cylinder.
zmax;
366 const JFormat format(out, getFormat<JCylinder3D>(
JFormat_t(9, 3, std::ios::fixed | std::ios::showpos)));
368 out << static_cast<const JCircle2D&>(cylinder);
370 out << format << cylinder.
zmin;
372 out << format << cylinder.
zmax;
388 in >> cylinder.
zmin >> cylinder.
zmax;
403 out << static_cast<const JCircle2D&>(cylinder);
404 out << cylinder.
zmin << cylinder.
zmax;
const JPosition2D & getPosition() const
Get position.
Data structure for vector in two dimensions.
JCylinder3D(T __begin, T __end, const double precision=std::numeric_limits< double >::epsilon())
Constructor.
Interface for binary output.
double getRadius() const
Get radius.
JVector2D()
Default constructor.
JPosition2D()
Default constructor.
Data structure for circle in two dimensions.
void setZmin(const double zmin)
Set minimal z position.
friend JWriter & operator<<(JWriter &out, const JCylinder3D &cylinder)
Write cylinder to output.
double getZmin() const
Get minimal z position.
double getDistanceSquared(const JVector3D &pos) const
Get square of distance between cylinder wall and given position.
JCylinder3D & add(const JVector3D &pos)
Add position.
intersection_type getIntersection(const JAxis3D &axis) const
Get intersection points of axis with cylinder.
friend JReader & operator>>(JReader &in, JCylinder3D &cylinder)
Read cylinder from input.
double getY() const
Get y position.
friend std::istream & operator>>(std::istream &in, JCylinder3D &cylinder)
Read cylinder from input stream.
JVector2D & sub(const JVector2D &vector)
Subtract vector.
bool is_inside(const JVector2D &pos, const double precision=std::numeric_limits< double >::min()) const
Check whether given point is inside circle.
JPosition3D getCenter() const
Get centre.
friend std::ostream & operator<<(std::ostream &out, const JCylinder3D &cylinder)
Write cylinder to output stream.
$WORKDIR driver txt done cat $WORKDIR driver txt<< EOFprocess ${DATAFILTER}$FILTER_HOST csh-c '(setenv ROOTSYS $ROOTSYS &&source $JPP_DIR/setenv.csh $JPP_DIR &&JDataFilter-H\$SERVER\$-M\$LOGGER\$-d $DEBUG-u ${DATAFILTER}-P $PORT</dev/null > &/dev/null)&';process ${DATAWRITER}$WRITER_HOST csh-c '(setenv ROOTSYS $ROOTSYS &&source $JPP_DIR/setenv.csh $JPP_DIR &&JDataWriter-H\$SERVER\$-M\$LOGGER\$-d $DEBUG-u ${DATAWRITER}</dev/null > &/dev/null)&';print enterevent ev_init{RC_CMD}event ev_reset{RC_CMD}event ev_init{RC_CMD}event ev_configure{RC_DFLTR%<$WORKDIR/ev_configure_datafilter.txt > RC_DOM<$WORKDIR/ev_configure_domsimulator.txt > RC_DWRT path
Data structure for vector in three dimensions.
double getDY() const
Get y direction.
double getDX() const
Get x direction.
double getX() const
Get x position.
do set_variable OUTPUT_DIRECTORY $WORKDIR T
static const double PI
Mathematical constants.
void addMargin(const double D)
Add (safety) margin.
double getY() const
Get y position.
Interface for binary input.
then usage $script[distance] fi case set_variable R
double getVolume() const
Get volume.
double getZmax() const
Get maximal z position.
then JMuonMCEvt f $INPUT_FILE o $INTERMEDIATE_FILE d
JCylinder3D()
Default constructor.
double getX() const
Get x position.
bool is_inside(const JVector3D &pos) const
Check whether given point is inside cylinder.
void setZmax(const double zmax)
Set maximal z position.
do set_variable MODULE getModule a $WORKDIR detector_a datx L $STRING JEditDetector a $WORKDIR detector_a datx M $MODULE setz o $WORKDIR detector_a datx JEditDetector a $WORKDIR detector_b datx M $MODULE setz o $WORKDIR detector_b datx done echo Output stored at $WORKDIR detector_a datx and $WORKDIR tripod_a txt JDrawDetector2D a $WORKDIR detector_a datx a $WORKDIR detector_b datx L BL o detector $FORMAT $BATCH JDrawDetector2D T $WORKDIR tripod_a txt T $WORKDIR tripod_b txt L BL o tripod $FORMAT $BATCH JCompareDetector a $WORKDIR detector_a datx b $WORKDIR detector_b datx o $WORKDIR abc root &dev null for KEY in X Y Z
Data structure for position in three dimensions.
std::pair< double, double > intersection_type
Type definition of intersection.
then fatal Wrong number of arguments fi set_variable DETECTOR $argv[1] set_variable INPUT_FILE $argv[2] eval JPrintDetector a $DETECTOR O IDENTIFIER eval JPrintDetector a $DETECTOR O SUMMARY source JAcoustics sh $DETECTOR_ID CHECK_EXIT_CODE typeset A TRIPODS get_tripods $WORKDIR tripod txt TRIPODS for EMITTER in
JCylinder3D(const JCircle2D &circle, const double zmin, const double zmax)
Constructor.
double getDistance(const JVector3D &pos) const
Get distance between cylinder wall and given position.
double getLength() const
Get length.
do echo Generating $dir eval D
double getZ() const
Get z position.
double getDZ() const
Get z direction.