def addBank(instrument, banknum, local_name, distance, cenX, cenY, cenZ, base, up): """Add a bank (detector) with given angles. Parameters: banknum: Number of the detector. local_name: local_name of the detector (a string) azimuth: azimuthal angle in radians. 0 = pointing downstream elevation: elevation angle in radians. Positive = going up (towards +Y) rotation: rotation of the detector face, in rad, around the positive +Z axis. For topaz this is -45 degrees. distance: in cm, from sample to center of detector face. """ CM = "centimetre" RAD = "radian" bank = Component("bank%d" % banknum, "NXdetector") bank.setRecipe("topaz_detector") theta = acos(cenZ / distance) phi = atan2(cenY, cenX) # Distance between sample and center of detector bank.addParameter("cenDistance", distance, units=CM) # cenPolar is "The angle of the rectangle center from the positive z-axis." # So this corresponds to our "theta" angle. bank.addParameter("cenPolar", theta, units=RAD) #Azimuthal = the angle of the rectangle center from the positive x-axis constrained in the xy-plane. # so this corresponds to the "phi" angle. bank.addParameter("cenAzimuthal", phi, units=RAD) #For later phi_center = phi theta_center = theta #Use getEuler to get the equivalent phi,chi,omega (in that order) rotation angles. (phi, chi, omega) = getEuler(base, up) #getEuler input units defaults to radians # Now we save these 3 orientation angles bank.addParameter("phi", phi, units=RAD) bank.addParameter("chi", chi, units=RAD) bank.addParameter("omega", omega, units=RAD) #Congrats! We have now tricked the program into making the correct detector orientation # (we hope!) # Now we set a local_name for the bank bank.setAnnotation("<local_name>%s</local_name>" % local_name) instrument.addComponent(bank) #! Now mantid idstart = banknum * 65536 print makeMantidGeometryCode(local_name, idstart, distance, theta_center, phi_center, phi, chi, omega) writeToFile( makeMantidGeometryCode(local_name, idstart, distance, theta_center, phi_center, phi, chi, omega), 'a')
def addBank(instrument, banknum, local_name, distance, cenX, cenY, cenZ, base, up): """Add a bank (detector) with given angles. Parameters: banknum: Number of the detector. local_name: local_name of the detector (a string) azimuth: azimuthal angle in radians. 0 = pointing downstream elevation: elevation angle in radians. Positive = going up (towards +Y) rotation: rotation of the detector face, in rad, around the positive +Z axis. For topaz this is -45 degrees. distance: in cm, from sample to center of detector face. """ CM = "centimetre" RAD = "radian" bank = Component( "bank%d" % banknum, "NXdetector") bank.setRecipe("topaz_detector") theta = acos(cenZ/distance) phi = atan2(cenY, cenX) # Distance between sample and center of detector bank.addParameter("cenDistance", distance, units=CM) # cenPolar is "The angle of the rectangle center from the positive z-axis." # So this corresponds to our "theta" angle. bank.addParameter("cenPolar", theta, units=RAD) #Azimuthal = the angle of the rectangle center from the positive x-axis constrained in the xy-plane. # so this corresponds to the "phi" angle. bank.addParameter("cenAzimuthal", phi, units=RAD) #For later phi_center = phi theta_center = theta #Use getEuler to get the equivalent phi,chi,omega (in that order) rotation angles. (phi, chi, omega) = getEuler(base, up) #getEuler input units defaults to radians # Now we save these 3 orientation angles bank.addParameter("phi", phi, units=RAD) bank.addParameter("chi", chi, units=RAD) bank.addParameter("omega", omega, units=RAD) #Congrats! We have now tricked the program into making the correct detector orientation # (we hope!) # Now we set a local_name for the bank bank.setAnnotation("<local_name>%s</local_name>" % local_name) instrument.addComponent(bank) #! Now mantid idstart = banknum * 65536 print makeMantidGeometryCode(banknum, local_name, idstart, distance, theta_center, phi_center, phi, chi, omega) writeToFile(makeMantidGeometryCode(banknum, local_name, idstart, distance, theta_center, phi_center, phi, chi, omega), 'a')
def addBank(instrument, banknum, local_name, azimuth, elevation, rotation, distance): """Add a bank (detector) with given angles. Parameters: banknum: Number of the detector. local_name: local_name of the detector (a string) azimuth: azimuthal angle in radians. 0 = pointing downstream elevation: elevation angle in radians. Positive = going up (towards +Y) rotation: rotation of the detector face, in rad, around the positive +Z axis. For topaz this is -45 degrees. distance: in cm, from sample to center of detector face. """ CM = "centimetre" RAD = "radian" bank = Component( "bank%d" % banknum, "NXdetector") bank.setRecipe("topaz_detector") # Now we need to convert from our azimuth/elevation coordinates # to azimuth/polar. #Assuming azimuth of zero points to z positive = same direction as incident radiation. r2 = cos(elevation) z=cos(azimuth) * r2 x=sin(azimuth) * r2 #Assuming polar angle is 0 when horizontal, positive to y positive y=sin(elevation) #So (x,y,z) is the direction; length is 1 #We calculate the polar (theta) and azimuth (phi) angles theta = acos(z) phi = atan2(y,x) # Distance between sample and center of detector bank.addParameter("cenDistance", distance, units=CM) # cenPolar is "The angle of the rectangle center from the positive z-axis." # So this corresponds to our "theta" angle. bank.addParameter("cenPolar", theta, units=RAD) #Azimuthal = the angle of the rectangle center from the positive x-axis constrained in the xy-plane. # so this corresponds to the "phi" angle. bank.addParameter("cenAzimuthal", phi, units=RAD) #For later phi_center = phi theta_center = theta #Now we set the detector orientation. If we set any of the detector orientation # values, this overrides the orientation that would come from cenPolar and cenAzimuthal #We will use the getEuler() method to find the phi, chi, omega angles. #But first we need the u,v vectors describing the face of the detector. #u = the horizontal vector; v = the vertical vector u = np.array([1.,0.,0.]).reshape(3,1) v = np.array([0.,1.,0.]).reshape(3,1) #Ok, first rotate the detector around its center by angle. #Since this is rotation around z axis, it is a chi angle rot = rotation_matrix(0, rotation, 0) u_rotated = Vector(np.dot(rot, u)) v_rotated = Vector(np.dot(rot, v)) #Now do the elevation rotation, by rotating around the x axis. rot = np.dot(x_rotation_matrix(-elevation), rot) #Finally add an azimuthal rotation (around the y axis, or phi) rot = np.dot(rotation_matrix(azimuth, 0, 0), rot) #Now we rotate the base vectors, save them as vectors u_rotated = Vector(np.dot(rot, u)) v_rotated = Vector(np.dot(rot, v)) #Use getEuler to get the equivalent phi,chi,omega (in that order) rotation angles. (phi, chi, omega) = getEuler(u_rotated, v_rotated) #getEuler input units defaults to radians # Now we save these 3 orientation angles bank.addParameter("phi", phi, units=RAD) bank.addParameter("chi", chi, units=RAD) bank.addParameter("omega", omega, units=RAD) #Congrats! We have now tricked the program into making the correct detector orientation # (we hope!) # Now we set a local_name for the bank bank.setAnnotation("<local_name>%s</local_name>" % local_name) instrument.addComponent(bank) #! Now mantid idstart = banknum * 65536 # Have to flip U because it is the opposite of what we expect u_rotated = Vector(np.dot(rot, u)*-1.0) (phi, chi, omega) = getEuler(u_rotated, v_rotated) #getEuler input units defaults to radians #print "<!--- Rotated we have u ", u_rotated, ", v", v_rotated, "giving angles ", (phi, chi, omega), " ... for bank", banknum, " --->" print makeMantidGeometryCode(local_name, idstart, distance, theta_center, phi_center, phi, chi, omega) writeToFile(makeMantidGeometryCode(local_name, idstart, distance, theta_center, phi_center, phi, chi, omega), 'a')
def addBank(instrument, banknum, local_name, azimuth, elevation, rotation, distance): """Add a bank (detector) with given angles. Parameters: banknum: Number of the detector. local_name: local_name of the detector (a string) azimuth: azimuthal angle in radians. 0 = pointing downstream elevation: elevation angle in radians. Positive = going up (towards +Y) rotation: rotation of the detector face, in rad, around the positive +Z axis. For topaz this is -45 degrees. distance: in cm, from sample to center of detector face. """ CM = "centimetre" RAD = "radian" bank = Component("bank%d" % banknum, "NXdetector") bank.setRecipe("topaz_detector") # Now we need to convert from our azimuth/elevation coordinates # to azimuth/polar. #Assuming azimuth of zero points to z positive = same direction as incident radiation. r2 = cos(elevation) z = cos(azimuth) * r2 x = sin(azimuth) * r2 #Assuming polar angle is 0 when horizontal, positive to y positive y = sin(elevation) #So (x,y,z) is the direction; length is 1 #We calculate the polar (theta) and azimuth (phi) angles theta = acos(z) phi = atan2(y, x) # Distance between sample and center of detector bank.addParameter("cenDistance", distance, units=CM) # cenPolar is "The angle of the rectangle center from the positive z-axis." # So this corresponds to our "theta" angle. bank.addParameter("cenPolar", theta, units=RAD) #Azimuthal = the angle of the rectangle center from the positive x-axis constrained in the xy-plane. # so this corresponds to the "phi" angle. bank.addParameter("cenAzimuthal", phi, units=RAD) #For later phi_center = phi theta_center = theta #Now we set the detector orientation. If we set any of the detector orientation # values, this overrides the orientation that would come from cenPolar and cenAzimuthal #We will use the getEuler() method to find the phi, chi, omega angles. #But first we need the u,v vectors describing the face of the detector. #u = the horizontal vector; v = the vertical vector u = np.array([1., 0., 0.]).reshape(3, 1) v = np.array([0., 1., 0.]).reshape(3, 1) #Ok, first rotate the detector around its center by angle. #Since this is rotation around z axis, it is a chi angle rot = rotation_matrix(0, rotation, 0) u_rotated = Vector(np.dot(rot, u)) v_rotated = Vector(np.dot(rot, v)) #Now do the elevation rotation, by rotating around the x axis. rot = np.dot(x_rotation_matrix(-elevation), rot) #Finally add an azimuthal rotation (around the y axis, or phi) rot = np.dot(rotation_matrix(azimuth, 0, 0), rot) #Now we rotate the base vectors, save them as vectors u_rotated = Vector(np.dot(rot, u)) v_rotated = Vector(np.dot(rot, v)) #Use getEuler to get the equivalent phi,chi,omega (in that order) rotation angles. (phi, chi, omega) = getEuler(u_rotated, v_rotated) #getEuler input units defaults to radians # Now we save these 3 orientation angles bank.addParameter("phi", phi, units=RAD) bank.addParameter("chi", chi, units=RAD) bank.addParameter("omega", omega, units=RAD) #Congrats! We have now tricked the program into making the correct detector orientation # (we hope!) # Now we set a local_name for the bank bank.setAnnotation("<local_name>%s</local_name>" % local_name) instrument.addComponent(bank) #! Now mantid idstart = banknum * 65536 # Have to flip U because it is the opposite of what we expect u_rotated = Vector(np.dot(rot, u) * -1.0) (phi, chi, omega) = getEuler(u_rotated, v_rotated) #getEuler input units defaults to radians #print "<!--- Rotated we have u ", u_rotated, ", v", v_rotated, "giving angles ", (phi, chi, omega), " ... for bank", banknum, " --->" print makeMantidGeometryCode(local_name, idstart, distance, theta_center, phi_center, phi, chi, omega) writeToFile( makeMantidGeometryCode(local_name, idstart, distance, theta_center, phi_center, phi, chi, omega), 'a')