// ---------------------------------------------------- // This file belongs to the ray tracing framework // for the use with Cherenkov detectors // // created 2007 //----------------------------------------------------- #include "PndDrcEffiAbs.h" #include "PndDrcSurfQuadFlatDiff.h" #include "PndDrcPhoton.h" //#include "PndDrcOptReflAbs.h" //#include "PndDrcSurfAbs.h" //#include "PndDrcSurfPolyFlat.h" //#include "PndDrcOptMatAbs.h" //#include "PndDrcOptDev.h" //#include "PndDrcUtil.h" // //#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 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 "TPolyLine3D.h" //---------------------------------------------------------------------- PndDrcSurfQuadFlatDiff::PndDrcSurfQuadFlatDiff() { fS1 = 0; fS2 = 0; } //---------------------------------------------------------------------- PndDrcSurfQuadFlatDiff::~PndDrcSurfQuadFlatDiff() { if (fS1) delete fS1; if (fS2) delete fS2; } //---------------------------------------------------------------------- PndDrcSurfQuadFlatDiff* PndDrcSurfQuadFlatDiff::Clone() const { return new PndDrcSurfQuadFlatDiff(*this); } //---------------------------------------------------------------------- void PndDrcSurfQuadFlatDiff::Copy(const PndDrcSurfQuadFlatDiff& s) { fS1p1 = s.fS1p1; fS1p2 = s.fS1p2; fS2p1 = s.fS2p1; fS2p2 = s.fS2p2; fS1 = (s.fS1)->Clone(); fS2 = (s.fS2)->Clone(); fNormal = s.fNormal; fSurfAux = s.fSurfAux; } //---------------------------------------------------------------------- PndDrcSurfQuadFlatDiff::PndDrcSurfQuadFlatDiff(const PndDrcSurfQuadFlatDiff& s) : PndDrcSurfAbs(s) { if (s.fVerbosity>=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 (fS1 && fS2) { cerr<<" *** PndDrcSurfQuadFlatDiff::addSurface: you can only add two surfaces.\n"; exit(EXIT_FAILURE); } else if (!fS1) { fS1 = surf.Clone(); fS1p1 = p1; fS1p2 = p2; } else if (!fS2) { fS2 = surf.Clone(); fS2p1 = p1; fS2p2 = p2; } else { cerr<<" *** PndDrcSurfQuadFlatDiff::addSurface: this line should never hit."< cross2.Mag2()) ? cross1.Unit() : cross2.Unit(); fSurfAux.AddPoint(fS1p1); fSurfAux.AddPoint(fS1p2); fSurfAux.AddPoint(fS2p1); fSurfAux.AddPoint(fS2p2); } } //---------------------------------------------------------------------- XYZVector PndDrcSurfQuadFlatDiff::Normal(const XYZPoint& point) const { // normal vector is a constant. return fNormal; } //---------------------------------------------------------------------- bool PndDrcSurfQuadFlatDiff::SurfaceHit(PndDrcPhoton& ph, XYZPoint& pos_new, double& path_length) const { static const double kEps = 1.0e-9; if (Verbosity()>=3) cout<<" PndDrcSurfQuadFlatDiff::surfaceHit: name=" < 0 , see condition above double h = dir.Dot(fNormal); if (h==0) { if (Verbosity()>=4) cout<<" PndDrcSurfQuadFlatDiff::surfaceHit:" <<" dir perp norm, no hit. \n"; return false; } double lambda = (fS1p1-point).Dot(fNormal) / dir.Dot(fNormal); pos_new = point + lambda*dir; if (Verbosity()>=4) cout<<" PndDrcSurfQuadFlatDiff::surfaceHit:"<=4) cout<<" PndDrcSurfQuadFlatDiff::surfaceHit: wrong dir " <<" lambda par ="<IsFlat() && fS2->IsFlat()) { if (hit_aux_surf) { if (fPixel){ if (fEffiCathode ->EffiFlag(ph.Wavelength(), ph.Direction().Dot(Normal(pos_new)))) { ph.SetFate(Drc::kPhotMeasured); if (fPixelCorr) ph.SetPosition(fPixelPoint); } else { ph.SetFate(Drc::kPhotAbsorbed); } } //if (fPixel) ph.SetFate(Drc::kPhotMeasured); 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 (! fS2->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 (fS2->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 = "<EffiFlag(ph.Wavelength(), ph.Direction().Dot(Normal(pos_new)))) { ph.SetFate(Drc::kPhotMeasured); if (fPixelCorr) ph.SetPosition(fPixelPoint); } else { ph.SetFate(Drc::kPhotAbsorbed); } } //if (fPixel) ph.SetFate(Drc::kPhotMeasured); // don' know why this is only implemented for the flat-flat case // exclude photons from concave parts if ( !(fS1->IsFlat()) && in_between1) return false; if ( !(fS2->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();"<SetPoint( 0, fS1p1.X(), fS1p1.Y(), fS1p1.Z() ); l1->SetPoint( 1, fS2p1.X(), fS2p1.Y(), fS2p1.Z() ); l1->SetLineColor(fPrintColor); l1->Draw(); TPolyLine3D *l2 = new TPolyLine3D(2); l2->SetPoint( 0, fS1p2.X(), fS1p2.Y(), fS1p2.Z() ); l2->SetPoint( 1, fS2p2.X(), fS2p2.Y(), fS2p2.Z() ); l2->SetLineColor(fPrintColor); l2->Draw(); } //---------------------------------------------------------------------- void PndDrcSurfQuadFlatDiff::Print() const { cout<<" Coordinates of PndDrcSurfQuadFlatDiff "<=3) cout<<" PndDrcSurfQuadFlatDiff::addTransform() name="<AddTransform(trans); fS2->AddTransform(trans); fSurfAux.AddTransform(trans); fPixelPoint = trans*fPixelPoint; }