diff --git a/inc/TRestAxionTrueWolterOptics.h b/inc/TRestAxionTrueWolterOptics.h index b8ba4ba0..1677f348 100644 --- a/inc/TRestAxionTrueWolterOptics.h +++ b/inc/TRestAxionTrueWolterOptics.h @@ -47,6 +47,9 @@ class TRestAxionTrueWolterOptics : public TRestAxionOptics { /// Mirror thickness in mm. See schematic figure. std::vector fThickness; //! + /// Distance between mirror stacks in mm. See schematic figure. + std::vector fXSep; //! + /// The spider structure to be used as an optical opaque mask (common to all planes) TRestSpiderMask* fSpiderMask = nullptr; //< @@ -110,13 +113,13 @@ class TRestAxionTrueWolterOptics : public TRestAxionOptics { /// It returns the entrance Z-position defined by the optical axis. Double_t GetEntrancePositionZ() override { - if (fCosAlpha.size() > 0) return -fMirrorLength * fCosAlpha[0]; + if (fCosAlpha.size() > 0) return -fMirrorLength * fCosAlpha[0] - 0.5 * fXSep[0]; return 0; } /// It returns the exit Z-position defined by the optical axis Double_t GetExitPositionZ() override { - if (fCosAlpha_3.size() > 0) return fMirrorLength * fCosAlpha_3[0]; + if (fCosAlpha_3.size() > 0) return fMirrorLength * fCosAlpha_3[0] + 0.5 * fXSep[0]; return 0; } diff --git a/inc/TRestAxionWolterOptics.h b/inc/TRestAxionWolterOptics.h index eb1e837a..eaf00243 100644 --- a/inc/TRestAxionWolterOptics.h +++ b/inc/TRestAxionWolterOptics.h @@ -47,6 +47,9 @@ class TRestAxionWolterOptics : public TRestAxionOptics { /// Mirror thickness in mm. See schematic figure. std::vector fThickness; //! + /// Distance between mirror stacks in mm. See schematic figure. + std::vector fXSep; //! + /// The spider structure to be used as an optical opaque mask (common to all planes) TRestSpiderMask* fSpiderMask = nullptr; //< @@ -110,13 +113,13 @@ class TRestAxionWolterOptics : public TRestAxionOptics { /// It returns the entrance Z-position defined by the optical axis. Double_t GetEntrancePositionZ() override { - if (fCosAlpha.size() > 0) return -fMirrorLength * fCosAlpha[0]; + if (fCosAlpha.size() > 0) return -fMirrorLength * fCosAlpha[0] - 0.5 * fXSep[0]; return 0; } /// It returns the exit Z-position defined by the optical axis Double_t GetExitPositionZ() override { - if (fCosAlpha_3.size() > 0) return fMirrorLength * fCosAlpha_3[0]; + if (fCosAlpha_3.size() > 0) return fMirrorLength * fCosAlpha_3[0] + 0.5 * fXSep[0]; return 0; } diff --git a/src/TRestAxionTrueWolterOptics.cxx b/src/TRestAxionTrueWolterOptics.cxx index 592c5ba0..c4e23898 100644 --- a/src/TRestAxionTrueWolterOptics.cxx +++ b/src/TRestAxionTrueWolterOptics.cxx @@ -174,6 +174,11 @@ void TRestAxionTrueWolterOptics::Initialize() { fAlpha = GetAlpha(); fThickness = GetThickness(); + fXSep.clear(); + for (unsigned int n = 0; n < fAlpha.size(); n++) + fXSep.push_back(2 * (fR1[n] - fR3[n] - fMirrorLength * TMath::Sin(fAlpha[n])) / + TMath::Tan(fAlpha[n])); + if (fAlpha.size() == 0) return; fCosAlpha.clear(); @@ -276,9 +281,10 @@ Int_t TRestAxionTrueWolterOptics::FirstMirrorReflection(const TVector3& pos, con //// Reflection on first mirror fFirstInteractionPosition = REST_Physics::GetParabolicVectorIntersection( - pos, dir, fAlpha[mirror], fR3[mirror], fMirrorLength); // should add this: TVector3(0, 0, -1), vertex + pos, dir, fAlpha[mirror], fR3[mirror]); // should add this: TVector3(0, 0, -1), vertex - if (fFirstInteractionPosition.Z() < GetEntrancePositionZ() || fFirstInteractionPosition.Z() > 0) { + if (fFirstInteractionPosition.Z() < GetEntrancePositionZ() || + fFirstInteractionPosition.Z() > -(0.5 * fXSep[mirror])) { RESTDebug << "TRestAxionTrueWolterOptics::FirstMirrorReflection. No interaction!" << RESTendl; fFirstInteractionPosition = REST_Physics::MoveByDistance(pos, dir, fMirrorLength / 2.); fMiddleDirection = fEntranceDirection; @@ -321,12 +327,12 @@ Int_t TRestAxionTrueWolterOptics::SecondMirrorReflection(const TVector3& pos, co TVector3 vertex(0, 0, fBackVertex[mirror]); Double_t focal = fR3[mirror] / TMath::Tan(4 * fAlpha[mirror]); - //// Reflection on first mirror - fSecondInteractionPosition = - REST_Physics::GetHyperbolicVectorIntersection(pos, dir, fAlpha[mirror], fR3[mirror], fMirrorLength, - focal); // should add this: TVector3(0, 0, -1), vertex, + //// Reflection on second mirror + fSecondInteractionPosition = REST_Physics::GetHyperbolicVectorIntersection( + pos, dir, fAlpha[mirror], fR3[mirror], focal); // should add this: TVector3(0, 0, -1), vertex, - if (fSecondInteractionPosition.Z() > GetExitPositionZ() || fSecondInteractionPosition.Z() < 0) { + if (fSecondInteractionPosition.Z() > GetExitPositionZ() || + fSecondInteractionPosition.Z() < (0.5 * fXSep[mirror])) { RESTDebug << "TRestAxionTrueWolterOptics::SecondMirrorReflection. No interaction!" << RESTendl; fSecondInteractionPosition = REST_Physics::MoveByDistance(pos, dir, fMirrorLength / 2.); fExitDirection = fMiddleDirection; diff --git a/src/TRestAxionWolterOptics.cxx b/src/TRestAxionWolterOptics.cxx index faac2445..14ce777b 100644 --- a/src/TRestAxionWolterOptics.cxx +++ b/src/TRestAxionWolterOptics.cxx @@ -174,6 +174,11 @@ void TRestAxionWolterOptics::Initialize() { fAlpha = GetAlpha(); fThickness = GetThickness(); + fXSep.clear(); + for (unsigned int n = 0; n < fAlpha.size(); n++) + fXSep.push_back(2 * (fR1[n] - fR3[n] - fMirrorLength * TMath::Sin(fAlpha[n])) / + TMath::Tan(fAlpha[n])); + if (fAlpha.size() == 0) return; fCosAlpha.clear(); @@ -278,7 +283,8 @@ Int_t TRestAxionWolterOptics::FirstMirrorReflection(const TVector3& pos, const T fFirstInteractionPosition = pos + dir * REST_Physics::GetConeVectorIntersection(pos, dir, TVector3(0, 0, -1), vertex, cosA); - if (fFirstInteractionPosition.Z() < GetEntrancePositionZ() || fFirstInteractionPosition.Z() > 0) { + if (fFirstInteractionPosition.Z() < GetEntrancePositionZ() || + fFirstInteractionPosition.Z() > -(0.5 * fXSep[mirror])) { RESTDebug << "TRestAxionWolterOptics::FirstMirrorReflection. No interaction!" << RESTendl; fFirstInteractionPosition = REST_Physics::MoveByDistance(pos, dir, fMirrorLength / 2.); fMiddleDirection = fEntranceDirection; @@ -323,7 +329,8 @@ Int_t TRestAxionWolterOptics::SecondMirrorReflection(const TVector3& pos, const fSecondInteractionPosition = pos + dir * REST_Physics::GetConeVectorIntersection(pos, dir, TVector3(0, 0, -1), vertex, cosA); - if (fSecondInteractionPosition.Z() > GetExitPositionZ() || fSecondInteractionPosition.Z() < 0) { + if (fSecondInteractionPosition.Z() > GetExitPositionZ() || + fSecondInteractionPosition.Z() < (0.5 * fXSep[mirror])) { RESTDebug << "TRestAxionWolterOptics::SecondMirrorReflection. No interaction!" << RESTendl; fSecondInteractionPosition = REST_Physics::MoveByDistance(pos, dir, fMirrorLength / 2.); fExitDirection = fMiddleDirection;