00001 #include "TrackingTools/DetLayers/interface/ForwardRingDiskBuilderFromDet.h"
00002 #include "DataFormats/GeometrySurface/interface/SimpleDiskBounds.h"
00003 #include "DataFormats/GeometrySurface/interface/BoundingBox.h"
00004
00005 using namespace std;
00006
00007
00008 BoundDisk*
00009 ForwardRingDiskBuilderFromDet::operator()( const vector<const GeomDet*>& dets) const
00010 {
00011 pair<SimpleDiskBounds,float> bo =
00012 computeBounds( dets );
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 Surface::PositionType pos(0.,0.,bo.second);
00030 Surface::RotationType rot;
00031 return new BoundDisk( pos, rot, bo.first);
00032 }
00033
00034 pair<SimpleDiskBounds, float>
00035 ForwardRingDiskBuilderFromDet::computeBounds( const vector<const GeomDet*>& dets) const
00036 {
00037
00038 float rmin((**(dets.begin())).surface().position().perp());
00039 float rmax(rmin);
00040 float zmin((**(dets.begin())).surface().position().z());
00041 float zmax(zmin);
00042 for (vector<const GeomDet*>::const_iterator idet=dets.begin();
00043 idet != dets.end(); idet++) {
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 vector<GlobalPoint> corners = BoundingBox().corners( (**idet).specificSurface() );
00054 for (vector<GlobalPoint>::const_iterator i=corners.begin();
00055 i!=corners.end(); i++) {
00056 float r = i->perp();
00057 float z = i->z();
00058 rmin = min( rmin, r);
00059 rmax = max( rmax, r);
00060 zmin = min( zmin, z);
00061 zmax = max( zmax, z);
00062 }
00063
00064
00065
00066
00067 float rdet = (**idet).position().perp();
00068 float len = (**idet).surface().bounds().length();
00069 float width = (**idet).surface().bounds().width();
00070
00071 GlobalVector xAxis = (**idet).toGlobal(LocalVector(1,0,0));
00072 GlobalVector yAxis = (**idet).toGlobal(LocalVector(0,1,0));
00073 GlobalVector perpDir = GlobalVector( (**idet).position() - GlobalPoint(0,0,(**idet).position().z()) );
00074
00075 double xAxisCos = xAxis.unit().dot(perpDir.unit());
00076 double yAxisCos = yAxis.unit().dot(perpDir.unit());
00077
00078 if( fabs(xAxisCos) > fabs(yAxisCos) ) {
00079 rmin = min( rmin, rdet-width/2.F);
00080 rmax = max( rmax, rdet+width/2.F);
00081 }else{
00082 rmin = min( rmin, rdet-len/2.F);
00083 rmax = max( rmax, rdet+len/2.F);
00084 }
00085 }
00086
00087
00088 float zPos = (zmax+zmin)/2.;
00089 return make_pair(SimpleDiskBounds(rmin,rmax,zmin-zPos,zmax-zPos), zPos);
00090 }