3 #include <gear/VXDParameters.h>
4 #include <gear/VXDLayerLayout.h>
6 #include "streamlog/streamlog.h"
9 #include <gsl/gsl_randist.h>
17 static double EPSILON = 1
e-12 ;
22 if( std::abs( d1 ) < EPSILON && std::abs( d0 ) < EPSILON )
25 if( std::abs( d0 - d1 ) < EPSILON )
29 return ( 2. * std::abs ( d0 - d1 ) / (std::abs( d1 ) + std::abs( d0 )) ) < EPSILON ;
53 const gear::VXDParameters& gearVXD =
_gearMgr->getVXDParameters() ;
54 const gear::VXDLayerLayout& layerVXD = gearVXD.getVXDLayerLayout();
57 streamlog_out( DEBUG0 ) <<
" initializing VXD ladder geometry from gear ... "
65 double gap = gearVXD.getShellGap () ;
67 for(
int i=0 ; i < layerVXD.getNLayers() ; i++ ) {
69 double phi0 = layerVXD.getPhi0 (i) ;
70 double dist = layerVXD.getSensitiveDistance (i) ;
72 double thick = layerVXD.getSensitiveThickness (i) ;
73 double offs = layerVXD.getSensitiveOffset (i) ;
74 double width = layerVXD.getSensitiveWidth (i) ;
77 double len = layerVXD.getSensitiveLength (i) ;
80 int nLad = layerVXD.getNLadders(i) ;
90 _vxdLayers[i].length = layerVXD.getSensitiveLength (i) ;
98 double locA = dist+thick ;
99 double locB = width/2. + std::abs(offs) ;
101 _vxdLayers[i].rMax = std::sqrt( locA*locA + locB*locB ) ;
104 streamlog_out( DEBUG4 ) <<
" layer: " << i
105 <<
" phi0 : " << phi0
106 <<
" offs : " << offs
107 <<
" width : " << width
109 <<
" ladderArea : " <<
_vxdLayers[i].ladderArea
116 for(
int j=0 ; j < nLad ; j++ ) {
119 double phi = phi0 + j * ( 2 * M_PI ) / nLad ;
123 gear::Vector3D t0( dist + thick / 2. , phi, 0., gear::Vector3D::cylindrical ) ;
125 double sign = offs / std::abs( offs ) ;
128 phi + sign * M_PI / 2.,
130 gear::Vector3D::cylindrical) ;
148 gear::Vector3D::cylindrical ) ;
154 ladderPos.phi() +
_vxdLadders[layerID][ladderID].phi,
156 gear::Vector3D::cylindrical ) ;
167 gear::Vector3D::cylindrical ) ;
173 ladderDir.phi() +
_vxdLadders[layerID][ladderID].phi,
175 gear::Vector3D::cylindrical ) ;
185 double r = labPos.rho() ;
188 for(
unsigned i = 0 ; i < n ; ++i ) {
195 for(
unsigned j = 0 ; j <
m ; ++j ) {
199 double z_abs = std::abs( l.z() ) -
_vxdLayers[i].gap / 2. ;
201 if( ( 0 < z_abs && z_abs <
_vxdLayers[i].length ) &&
202 ( std::abs( l.y() ) <
_vxdLayers[i].width / 2. ) &&
203 ( std::abs( l.x() ) <
_vxdLayers[i].thickness / 2. ) ) {
205 return std::make_pair( i , j ) ;
210 return std::make_pair( -1, -1 ) ;
215 for(
unsigned j = 0 ; j <
m ; ++j ) {
219 double z_abs = std::abs( l.z() ) -
_vxdLayers[layerID].gap / 2. ;
221 if( ( 0 < z_abs && z_abs <
_vxdLayers[layerID].length ) &&
222 ( std::abs( l.y() ) <
_vxdLayers[layerID].width / 2. ) &&
223 ( std::abs( l.x() ) <
_vxdLayers[layerID].thickness / 2. ) ) {
225 return std::make_pair( layerID , j ) ;
228 return std::make_pair( layerID , -1 ) ;
240 gsl_rng* r = gsl_rng_alloc(gsl_rng_ranlxs2) ;
243 const gear::VXDParameters& gearVXD =
_gearMgr->getVXDParameters() ;
244 double hgap = gearVXD.getShellGap() / 2. ;
246 for(
unsigned i=0 ; i<
_vxdLayers.size() ; ++i) {
248 for(
unsigned j=0 ; j<
_vxdLadders[i].size() ; ++j) {
256 streamlog_out( MESSAGE ) <<
" testing " << nHit <<
" random points for ladder "
257 << j <<
" of layer " << i << std::endl ;
261 for(
int k=0 ;
k< nHit ;
k++){
263 double l1 = gsl_rng_uniform( r ) ;
264 double l2 = gsl_rng_uniform( r ) ;
268 double k1 = 0.5 - l1 ;
270 double k2 = ( -1. + (
k % 2) * 2. ) * l2 ;
281 if( !
isEqual( ladRnd , ladder ) ) {
286 streamlog_out( WARNING ) <<
" l1,l2: " << l1 <<
", " << l2 << std::endl
287 <<
" ladRnd: " << ladRnd
289 <<
" ladder: " << ladder
293 streamlog_out( DEBUG4 ) <<
"isEqual(ladRnd[0],ladder[0]): "<<
isEqual(ladRnd[0],ladder[0] )
295 <<
"isEqual(ladRnd[1],ladder[1]): "<<
isEqual(ladRnd[1],ladder[1] )
297 <<
"isEqual(ladRnd[2],ladder[2]): "<<
isEqual(ladRnd[2],ladder[2] )
303 if( ! gearVXD.isPointInSensitive( lab ) ){
307 streamlog_out( WARNING ) <<
" created hit outside sensitve volume " << lab << std::endl ;
312 if( (
unsigned)
id.first != i ){
316 streamlog_out( WARNING ) <<
" getLadderID layer wrong : " <<
id.first
317 <<
" instead of " << i << std::endl ;
319 if( (
unsigned)
id.second != j ){
323 streamlog_out( WARNING ) <<
" getLadderID ladder wrong : " <<
id.second
324 <<
" instead of " << j <<
" layer " << i << std::endl ;
333 streamlog_out( WARNING ) <<
" getLadderID with ID=" <<i <<
" - ladder wrong : "
334 <<
id.second<< std::endl ;
339 streamlog_out( DEBUG ) <<
" ladRnd: " << ladRnd
341 <<
" ladder: " << ladder
346 streamlog_out( MESSAGE ) <<
" tested " << nHit <<
" random points for ladder "
347 << j <<
" of layer " << i <<
" OK ! " << std::endl ;
bool isEqual(double d0, double d1)
gear::Vector3D ladder2LabPos(gear::Vector3D ladderPos, int layerID, int ladderID)
Convert a position in local ladder coordinates (x_ladder==0 is the middle of the sensitive) to the la...
CLHEP::Hep3Vector Vector3D
gear::Vector3D lab2LadderDir(gear::Vector3D labPos, int layerID, int ladderID)
Convert a direction in the lab frame to local ladder coordinates (x_ladder==0 is the middle of the se...
gear::Vector3D lab2LadderPos(gear::Vector3D labPos, int layerID, int ladderID)
Convert a position in the lab frame to local ladder coordinates (x_ladder==0 is the middle of the sen...
gear::Vector3D ladder2LabDir(gear::Vector3D ladderPos, int layerID, int ladderID)
Convert a direction in local ladder coordinates (x_ladder==0 is the middle of the sensitive) to the l...
std::pair< int, int > getLadderID(gear::Vector3D labPos, int layerID=-1)
Return the pair (layerID, ladderID) for the given position, (-1,-1) if not in sensitive volume (in th...