From: <nks...@us...> - 2011-07-07 18:11:48
|
Revision: 13434 http://cctbx.svn.sourceforge.net/cctbx/?rev=13434&view=rev Author: nksauter Date: 2011-07-07 18:11:41 +0000 (Thu, 07 Jul 2011) Log Message: ----------- spot_xy_convention class describes detector coordinate convention; detector origin can be at any one of four detector corners & x/y can be swapped. Added Paths: ----------- trunk/iotbx/detectors/context/ trunk/iotbx/detectors/context/__init__.py trunk/iotbx/detectors/context/spot_xy_convention.h trunk/iotbx/detectors/context/spot_xy_convention.py Added: trunk/iotbx/detectors/context/__init__.py =================================================================== Added: trunk/iotbx/detectors/context/spot_xy_convention.h =================================================================== --- trunk/iotbx/detectors/context/spot_xy_convention.h (rev 0) +++ trunk/iotbx/detectors/context/spot_xy_convention.h 2011-07-07 18:11:41 UTC (rev 13434) @@ -0,0 +1,61 @@ +#ifndef IOTBX_DET_CONTEXT_CONV_H +#define IOTBX_DET_CONTEXT_CONV_H + +namespace iotbx { +namespace detectors { +namespace context { + +class spot_xy_convention{ + double W1,W2,pxlsz; + int index; +public: + spot_xy_convention(){ /*default*/ } + spot_xy_convention(const double& width1,const double& width2,const double& px,const int& i){ + W1 = width1; + W2 = width2; + pxlsz = px; //pixel size in mm + index = i; + if (index==1 || index==3 || index==5 || index==7){ + SCITBX_ASSERT(W1==W2); // index swapping not permitted with rectangular image + } + } + //based on code in python detectors/convention.py + template <typename vec_t> + af::tiny<vec_t,2 > call(const scitbx::vec3<double>* xy) const { + switch (index) { + case 0: return af::tiny<vec_t,2 >(vec_t((*xy)[0]/pxlsz),vec_t((*xy)[1]/pxlsz)); + case 1: return af::tiny<vec_t,2 >(vec_t((*xy)[1]/pxlsz),vec_t((*xy)[0]/pxlsz)); + case 2: return af::tiny<vec_t,2 >(vec_t(W1 - (*xy)[0]/pxlsz),vec_t((*xy)[1]/pxlsz)); + case 3: return af::tiny<vec_t,2 >(vec_t((*xy)[1]/pxlsz),vec_t(W1 - (*xy)[0]/pxlsz)); + case 4: return af::tiny<vec_t,2 >(vec_t((*xy)[0]/pxlsz),vec_t(W2 - (*xy)[1]/pxlsz)); + case 5: return af::tiny<vec_t,2 >(vec_t(W1 - (*xy)[1]/pxlsz),vec_t((*xy)[0]/pxlsz)); + case 6: return af::tiny<vec_t,2 >(vec_t(W1 - (*xy)[0]/pxlsz),vec_t(W2 - (*xy)[1]/pxlsz)); + case 7: return af::tiny<vec_t,2 >(vec_t(W1 - (*xy)[1]/pxlsz),vec_t(W1 - (*xy)[0]/pxlsz)); + default: break; + } + throw; + } + //based on code in python detectors/convention.py + //this set of overloads gives a one-to-one mapping of input to transformed pixels + template <typename vec_t> + af::tiny<vec_t,2 > call(const scitbx::vec2<int>* xy) const { + switch (index) { + case 0: return af::tiny<vec_t,2 >(vec_t((*xy)[0]),vec_t((*xy)[1])); + case 1: return af::tiny<vec_t,2 >(vec_t((*xy)[1]),vec_t((*xy)[0])); + case 2: return af::tiny<vec_t,2 >(vec_t(W1 - (*xy)[0] - 1),vec_t((*xy)[1])); + case 3: return af::tiny<vec_t,2 >(vec_t((*xy)[1]),vec_t(W1 - (*xy)[0] - 1)); + case 4: return af::tiny<vec_t,2 >(vec_t((*xy)[0]),vec_t(W2 - (*xy)[1] - 1)); + case 5: return af::tiny<vec_t,2 >(vec_t(W1 - (*xy)[1] - 1),vec_t((*xy)[0])); + case 6: return af::tiny<vec_t,2 >(vec_t(W1 - (*xy)[0] - 1),vec_t(W2 - (*xy)[1]- 1)); + case 7: return af::tiny<vec_t,2 >(vec_t(W1 - (*xy)[1] - 1),vec_t(W1 - (*xy)[0]- 1)); + default: break; + } + throw; + } +}; + +} //namespace context +} //namespace detectors +} //namespace iotbx + +#endif //IOTBX_DET_CONTEXT_CONV_H Added: trunk/iotbx/detectors/context/spot_xy_convention.py =================================================================== --- trunk/iotbx/detectors/context/spot_xy_convention.py (rev 0) +++ trunk/iotbx/detectors/context/spot_xy_convention.py 2011-07-07 18:11:41 UTC (rev 13434) @@ -0,0 +1,71 @@ +''' +Determined 8/25/2004 for Q210 images collected at beamline 8.2.1. + +The "film coordinates" needed for autoindexing are defined as follows: + +MOSFLM, HKL2000 and LABELIT. The origin is the top corner of the image +plate farthest from the storage ring, that is the top left corner when +viewed from the source. X points down, Y points towards the storage +ring. + +ADXV. The origin is the bottom corner of the image plate farthest from +the storage ring, that is the bottom left corner when viewed from the +source. X points toward the storage ring, Y points up. + + +The GUI view for each program is as follows: + +HKL2000, LABELIT and ADXV. The image emulates the view of an observer +standing at the source, i.e., with the storage ring closest to the right +edge of the image. + +MOSFLM. The image emulates the view of an observer looking toward the +source, and in addition, the image is rotated 90 clockwise. Therefore, +the storage ring is nearest the top edge of the image, and the top edge +of the detector is at the right edge of the image. +''' + +class spot_xy_convention: + def __init__(self,W1,W2): + self.W1 = W1; self.W2=W2 + + def select(self,spot,index): + if index%2==1: assert self.W1==self.W2 + if index==0: return (spot[0],spot[1],spot[2]) + if index==1: return (spot[1],spot[0],spot[2]) + if index==2: return (self.W1-spot[0],spot[1],spot[2]) + if index==3: return (spot[1],self.W1-spot[0],spot[2]) + if index==4: return (spot[0],self.W2-spot[1],spot[2]) + if index==5: return (self.W1-spot[1],spot[0],spot[2]) + if index==6: return (self.W1-spot[0],self.W2-spot[1],spot[2]) + if index==7: return (self.W1-spot[1],self.W1-spot[0],spot[2]) + if index==8: return (spot[0],spot[1],-spot[2]) + if index==9: return (spot[1],spot[0],-spot[2]) + if index==10: return (self.W1-spot[0],spot[1],-spot[2]) + if index==11: return (spot[1],self.W1-spot[0],-spot[2]) + if index==12: return (spot[0],self.W2-spot[1],-spot[2]) + if index==13: return (self.W1-spot[1],spot[0],-spot[2]) + if index==14: return (self.W1-spot[0],self.W2-spot[1],-spot[2]) + if index==15: return (self.W1-spot[1],self.W1-spot[0],-spot[2]) + raise + + def inverse(self,tspot): + if self.index%2==1: assert self.W1==self.W2 + if self.index==0: return (tspot[0],tspot[1],tspot[2]) + if self.index==1: return (tspot[1],tspot[0],tspot[2]) + if self.index==2: return (self.W1-tspot[0],tspot[1],tspot[2]) + if self.index==3: return (tspot[1],self.W1-tspot[0],tspot[2]) + if self.index==4: return (tspot[0],self.W2-tspot[1],tspot[2]) + if self.index==5: return (self.W1-tspot[1],tspot[0],tspot[2]) + if self.index==6: return (self.W1-tspot[0],self.W2-tspot[1],tspot[2]) + if self.index==7: return (self.W1-tspot[1],self.W1-tspot[0],tspot[2]) + if self.index==8: return (tspot[0],tspot[1],-tspot[2]) + if self.index==9: return (tspot[1],tspot[0],-tspot[2]) + if self.index==10: return (self.W1-tspot[0],tspot[1],-tspot[2]) + if self.index==11: return (tspot[1],self.W1-tspot[0],-tspot[2]) + if self.index==12: return (tspot[0],self.W2-tspot[1],-tspot[2]) + if self.index==13: return (self.W1-tspot[1],tspot[0],-tspot[2]) + if self.index==14: return (self.W1-tspot[0],self.W2-tspot[1],-tspot[2]) + if self.index==15: return (self.W1-tspot[1],self.W1-tspot[0],-tspot[2]) + raise + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |