#include using std::cout; using std::cerr; using std::cin; using std::endl; #include using std::valarray; #include using std::fstream; #include using std::string; #include using std::list; #include using std::vector; #include "TObject.h" #include "TVector3.h" #include "TRandom.h" #include "TMatrixD.h" #include "TVectorD.h" #include "TDecompSVD.h" #include "Math/Vector3D.h" using ROOT::Math::XYZVector; #include "Math/Point3D.h" using ROOT::Math::XYZPoint; #include "Math/Transform3D.h" using ROOT::Math::Transform3D; #include "Math/RotationX.h" using ROOT::Math::RotationX; #include "Math/RotationY.h" using ROOT::Math::RotationY; #include "Math/RotationZ.h" using ROOT::Math::RotationZ; #include "Math/Rotation3D.h" using ROOT::Math::Rotation3D; #include "PndDrcPhoton.h" #include "PndDrcOptReflAbs.h" #include "PndDrcSurfAbs.h" #include "PndDrcSurfPolyFlat.h" #include "PndDrcSurfQuadFlatDiff.h" #include "PndDrcOptMatAbs.h" #include "PndDrcOptDev.h" #include "PndDrcUtil.h" //---------------------------------------------------------------------- PndDrcSurfQuadFlatDiff::PndDrcSurfQuadFlatDiff() { m_s1 = 0; m_s2 = 0; } //---------------------------------------------------------------------- PndDrcSurfQuadFlatDiff::~PndDrcSurfQuadFlatDiff() { if (m_s1) delete m_s1; if (m_s2) delete m_s2; } //---------------------------------------------------------------------- PndDrcSurfQuadFlatDiff* PndDrcSurfQuadFlatDiff::clone() const { return new PndDrcSurfQuadFlatDiff(*this); } //---------------------------------------------------------------------- void PndDrcSurfQuadFlatDiff::copy(const PndDrcSurfQuadFlatDiff& s) { m_s1p1 = s.m_s1p1; m_s1p2 = s.m_s1p2; m_s2p1 = s.m_s2p1; m_s2p2 = s.m_s2p2; m_s1 = (s.m_s1)->clone(); m_s2 = (s.m_s2)->clone(); m_normal = s.m_normal; m_surfAux = s.m_surfAux; } //---------------------------------------------------------------------- PndDrcSurfQuadFlatDiff::PndDrcSurfQuadFlatDiff(const PndDrcSurfQuadFlatDiff& s) : PndDrcSurfAbs(s) { if (s.m_verbosity>=1) cout<<" PndDrcSurfQuadFlatDiff::PndDrcSurfQuadFlatDiff" <<"(const PndDrcSurfQuadFlatDiff&) name,copy: " <=1) cout<<" PndDrcSurfQuadFlatDiff::operator=" <<"(const PndDrcSurfQuadFlatDiff&) name,copy: " <((*this)) = s; // assignment of base class part. copy(s); } return *this; } //---------------------------------------------------------------------- void PndDrcSurfQuadFlatDiff::addSurface(const PndDrcSurfAbs& surf, XYZPoint p1, XYZPoint p2) { if (m_s1 && m_s2) { cerr<<" *** PndDrcSurfQuadFlatDiff::addSurface: you can only add two surfaces.\n"; exit(EXIT_FAILURE); } else if (!m_s1) { m_s1 = surf.clone(); m_s1p1 = p1; m_s1p2 = p2; } else if (!m_s2) { m_s2 = surf.clone(); m_s2p1 = p1; m_s2p2 = p2; } else { cerr<<" *** PndDrcSurfQuadFlatDiff::addSurface: this line should never hit."< cross2.Mag2()) ? cross1.Unit() : cross2.Unit(); m_surfAux.addPoint(m_s1p1); m_surfAux.addPoint(m_s1p2); m_surfAux.addPoint(m_s2p1); m_surfAux.addPoint(m_s2p2); } } //---------------------------------------------------------------------- XYZVector PndDrcSurfQuadFlatDiff::normal(const XYZPoint& point) const { // normal vector is a constant. return m_normal; } //---------------------------------------------------------------------- bool PndDrcSurfQuadFlatDiff::surfaceHit(PndDrcPhoton& ph, XYZPoint& pos_new, double& path_length) const { static const double eps = 1.0e-9; if (verbosity()>=3) cout<<" PndDrcSurfQuadFlatDiff::surfaceHit: name=" < 0 , see condition above double h = dir.Dot(m_normal); if (h==0) { if (verbosity()>=4) cout<<" PndDrcSurfQuadFlatDiff::surfaceHit:" <<" dir perp norm, no hit. \n"; return false; } double lambda = (m_s1p1-point).Dot(m_normal) / dir.Dot(m_normal); pos_new = point + lambda*dir; if (verbosity()>=4) cout<<" PndDrcSurfQuadFlatDiff::surfaceHit:"<=4) cout<<" PndDrcSurfQuadFlatDiff::surfaceHit: wrong dir " <<" lambda par ="<isFlat() && m_s2->isFlat()) { if (hit_aux_surf) { if (m_pixel) ph.setFate(Drc::PhotMeasured); if (verbosity()>=4) cout<<" PndDrcSurfQuadFlatDiff::surfaceHit:" <<" within rectangular partial surface, hit. " <=4) cout<<" PndDrcSurfQuadFlatDiff::surfaceHit:" <<" no hit within reactangular partial surface" <<" of flat borders. " <isFlat())) { // check if point between curve and line // create a fake photon. if (verbosity()>=4) cout<<" PndDrcSurfQuadFlatDiff::surfaceHit: (1) " <<" check point between line and curve of " <name()<=4) { cout<<" with aux. photon "<surfaceHit(ph1,v_dummy,dummy)) { if (verbosity()>=4) cout<<" PndDrcSurfQuadFlatDiff::surfaceHit: (1) " <<" between line and curve of " <name()<<", hit."<=4) cout<<" PndDrcSurfQuadFlatDiff::surfaceHit: " <<" no hit between line and curve of " <name()<<", check other side."<isFlat()); // for later logic if (! m_s2->isFlat()) { // check if point between curve and line // create a fake photon. if (verbosity()>=4) cout<<" PndDrcSurfQuadFlatDiff::surfaceHit: (2) " <<" check point between line and curve of " <name()<=4) { cout<<" with aux. photon "<setVerbosity(4);//### if (m_s2->surfaceHit(ph1,v_dummy,dummy)) { if (verbosity()>=4) cout<<" PndDrcSurfQuadFlatDiff::surfaceHit: (2) " <<" between line and curve of " <name()<<", hit."<=4) cout<<" PndDrcSurfQuadFlatDiff::surfaceHit: " <<" no hit between line and curve of " <name()<<", no hit possibility left."<=4) { cout<<" PndDrcSurfQuadFlatDiff::surfaceHit: "<isFlat()) cout<<" in_between1 = "<isFlat()) cout<<" in_between2 = "<<"flat"<isFlat()) cout<<" in_between2 = "<isFlat()) && in_between1) return false; if ( !(m_s2->isFlat()) && in_between2) return false; return true; } else { if (in_between1) return true; // surface convex, photon inside if (in_between2) return true; // surface convex, photon inside return false; } } //---------------------------------------------------------------------- void PndDrcSurfQuadFlatDiff::print(fstream& stream) const { stream<<" TPolyLine3D *l = new TPolyLine3D(2);"<SetPoint("<<0<<"," <SetPoint("<<1<<"," <SetLineColor("<Draw();"<SetPoint("<<0<<"," <SetPoint("<<1<<"," <SetLineColor("<Draw();"<=3) cout<<" PndDrcSurfQuadFlatDiff::addTransform() name="<addTransform(trans); m_s2->addTransform(trans); m_surfAux.addTransform(trans); }