598{
602 G4double ss1,ss2,sn1=0.,sn2=0.,Dist;
603
605 {
607 {
609
611 {
613 smin = -(fDz + p.
z())/v.
z() ;
614 }
615 else return snxt ;
616 }
617 else
618 {
620
622 {
624 smin = (fDz - p.
z())/v.
z() ;
625 }
626 else return snxt ;
627 }
628 if (smin < 0 ) smin = 0 ;
629 }
630 else
631 {
632 if (std::fabs(p.
z()) >= fDz )
return snxt ;
633 else
634 {
635 smin = 0 ;
636 smax = kInfinity;
637 }
638 }
639
640
641
642
643
644 tanxz = (fDx2 - fDx1)*0.5/fDz ;
645 s1 = 0.5*(fDx1+fDx2) + tanxz*p.
z() ;
646 ds1 = v.
x() - tanxz*v.
z() ;
647 ds2 = v.
x() + tanxz*v.
z() ;
649
651
652
653 if (ss1 < 0 && ss2 <= 0 )
654 {
655 if (ds1 < 0)
656 {
657 sn1 = ss1/ds1 ;
658
659 if ( ds2 < 0 ) sn2 = ss2/ds2 ;
660 else sn2 = kInfinity ;
661 }
662 else return snxt ;
663 }
664 else if ( ss1 >= 0 && ss2 > 0 )
665 {
666 if ( ds2 > 0 )
667 {
668 sn1 = ss2/ds2 ;
669
670 if (ds1 > 0) sn2 = ss1/ds1 ;
671 else sn2 = kInfinity;
672
673 }
674 else return snxt ;
675 }
676 else if (ss1 >= 0 && ss2 <= 0 )
677 {
678
679
680
681
682 sn1 = 0 ;
683
684 if ( ds1 > 0 )
685 {
687 else return snxt ;
688 }
689 else sn2 = kInfinity ;
690
691 if ( ds2 < 0 )
692 {
694 {
695 Dist = ss2/ds2 ;
696 if ( Dist < sn2 ) sn2 = Dist ;
697 }
698 else return snxt ;
699 }
700 }
701 else if (ss1 < 0 && ss2 > 0 )
702 {
703
704
705 if ( ds1 >= 0 || ds2 <= 0 )
706 {
707 return snxt ;
708 }
709 else
710 {
711 sn1 = ss1/ds1 ;
712 Dist = ss2/ds2 ;
713 if (Dist > sn1 ) sn1 = Dist ;
714 sn2 = kInfinity ;
715 }
716 }
717
718
719
720 if ( sn1 > smin ) smin = sn1 ;
721 if ( sn2 < smax ) smax = sn2 ;
722
723
724
725
726 if ( smax < smin ) return snxt ;
727
728
729
730
731 tanyz = (fDy2-fDy1)*0.5/fDz ;
732 s2 = 0.5*(fDy1+fDy2) + tanyz*p.
z() ;
733 ds1 = v.
y() - tanyz*v.
z() ;
734 ds2 = v.
y() + tanyz*v.
z() ;
737
738 if ( ss1 < 0 && ss2 <= 0 )
739 {
740 if (ds1 < 0 )
741 {
742 sn1 = ss1/ds1 ;
743 if ( ds2 < 0 ) sn2 = ss2/ds2 ;
744 else sn2 = kInfinity ;
745 }
746 else return snxt ;
747 }
748 else if ( ss1 >= 0 && ss2 > 0 )
749 {
750 if ( ds2 > 0 )
751 {
752 sn1 = ss2/ds2 ;
753 if ( ds1 > 0 ) sn2 = ss1/ds1 ;
754 else sn2 = kInfinity ;
755 }
756 else return snxt ;
757 }
758 else if (ss1 >= 0 && ss2 <= 0 )
759 {
760
761
762
763
764 sn1 = 0 ;
765
766 if ( ds1 > 0 )
767 {
769 else return snxt ;
770 }
771 else sn2 = kInfinity ;
772
773 if ( ds2 < 0 )
774 {
776 {
777 Dist = ss2/ds2 ;
778 if (Dist < sn2) sn2=Dist;
779 }
780 else return snxt ;
781 }
782 }
783 else if (ss1 < 0 && ss2 > 0 )
784 {
785
786
787 if (ds1 >= 0 || ds2 <= 0 )
788 {
789 return snxt ;
790 }
791 else
792 {
793 sn1 = ss1/ds1 ;
794 Dist = ss2/ds2 ;
795 if (Dist > sn1 ) sn1 = Dist ;
796 sn2 = kInfinity ;
797 }
798 }
799
800
801
802 if ( sn1 > smin) smin = sn1 ;
803 if ( sn2 < smax) smax = sn2 ;
804
805
806
807
808 if ( smax > smin ) snxt = smin ;
810
811 return snxt ;
812}