/* Class which represents a single MMM detector in the SABRE array at FSU. Origial code by KGH, re-written by GWM. Distances in meters, angles in radians. The channel arrays have four points, one for each corner. The corners are as follows, as if looking BACK along beam (i.e. from the target's pov): 0---------------------1 | | | | x | | <----- | | | | | | 3---------------------2 y (z is hence positive along beam direction) The channel numbers, also as looking back from target pov, are: >> rings are 0 -- 15 from inner to outer: 15 ------------------- 14 ------------------- 13 ------------------- . . . 2 ------------------- 1 ------------------- 0 ------------------- >> wedges are 0 -- 7 moving counterclockwise: 7 6 ... 1 0 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | >> Note that the detector starts centered on the x-axis (central phi = 0) untilted, and then is rotated to wherever the frick it is supposed to go; phi = 90 is centered on y axis, pointing down towards the bottom of the scattering chamber -- gwm, Dec 2020; based on the og code from kgh */ #include "SabreDetector.h" SabreDetector::SabreDetector() : m_Router(0.1351), m_Rinner(0.0326), m_deltaPhi_flat(54.4*deg2rad), m_phiCentral(0.0), m_tilt(0.0), m_translation(0.,0.,0.), m_norm_flat(0,0,1.0) { m_YRot.SetAngle(m_tilt); m_ZRot.SetAngle(m_phiCentral); //Initialize the coordinate arrays m_ringCoords_flat.resize(m_nRings); m_ringCoords_tilt.resize(m_nRings); m_wedgeCoords_flat.resize(m_nWedges); m_wedgeCoords_tilt.resize(m_nWedges); for(int i=0; i SabreDetector::GetTrajectoryRingWedge(double theta, double phi) { if(m_translation.GetX() != 0.0 || m_translation.GetY() != 0.0) { return std::make_pair(-1, -1); } //Calculate the *potential* phi in the flat detector double phi_numerator = std::cos(m_tilt)*(std::sin(phi)*std::cos(m_phiCentral) - std::sin(m_phiCentral)*std::cos(phi)); double phi_denominator = std::cos(m_phiCentral)*std::cos(phi) + std::sin(m_phiCentral)*std::sin(phi); double phi_flat = std::atan2(phi_numerator, phi_denominator); if(phi_flat < 0) phi_flat += M_PI*2.0; //Calculate the *potential* R in the flat detector double r_numerator = m_translation.GetZ()*std::cos(phi)*std::sin(theta); double r_denominator = std::cos(phi_flat)*std::cos(m_phiCentral)*std::cos(m_tilt)*std::cos(theta) - std::sin(phi_flat)*std::sin(m_phiCentral)*std::cos(theta) - std::cos(phi_flat)*std::sin(m_tilt)*std::cos(phi)*std::sin(theta); double r_flat = r_numerator/r_denominator; //Calculate the distance from the origin to the hit on the detector //double R_to_detector = (r_flat*std::cos(phi_flat)*std::sin(m_tilt) + m_translation.GetZ())/std::cos(theta); //Check to see if our flat coords fall inside the flat detector if(IsInside(r_flat, phi_flat)) { int ringch, wedgech; if(phi_flat > M_PI) phi_flat -= 2.0*M_PI; //Need phi in terms of [-deltaPhi_flat/2, deltaPhi_flat/2] for(int i=0; i