00001 #include "VP1GuideLineSystems/ProjectionSurfacesHelper.h"
00002 #include "VP1GuideLineSystems/InDetProjParams.h"
00003 #include "VP1HEPVis/nodes/SoTubs.h"
00004
00005 #include <Inventor/nodes/SoMaterial.h>
00006 #include <Inventor/nodes/SoSeparator.h>
00007 #include <Inventor/nodes/SoTranslation.h>
00008 #include <Inventor/nodes/SoPickStyle.h>
00009
00010
00011 ProjectionSurfacesHelper * ProjectionSurfacesHelper::createPixelHelper( SoMaterial* mat,
00012 SoSeparator * attachsep,
00013 QObject*parent,
00014 IVP1System* sys )
00015 {
00016 return new ProjectionSurfacesHelper( InDetProjParams::surfacethickness(),
00017 InDetProjParams::pixel_barrel_inner_radius(),
00018 InDetProjParams::pixel_barrel_outer_radius(),
00019 InDetProjParams::pixel_barrel_posneg_z(),
00020 InDetProjParams::pixel_endcap_surface_z(),
00021 InDetProjParams::pixel_endcap_surface_length(),
00022 InDetProjParams::pixel_endcap_inner_radius(),
00023 InDetProjParams::pixel_endcap_outer_radius(),
00024 InDetProjParams::pixel_endcap_zasr_disttobarrelcyl(),
00025 InDetProjParams::pixel_endcap_zasr_squeezefact(),
00026 mat, attachsep, parent,sys );
00027 }
00028
00029
00030 ProjectionSurfacesHelper * ProjectionSurfacesHelper::createSCTHelper( SoMaterial* mat,
00031 SoSeparator * attachsep,
00032 QObject*parent,
00033 IVP1System* sys )
00034 {
00035 return new ProjectionSurfacesHelper( InDetProjParams::surfacethickness(),
00036 InDetProjParams::sct_barrel_inner_radius(),
00037 InDetProjParams::sct_barrel_outer_radius(),
00038 InDetProjParams::sct_barrel_posneg_z(),
00039 InDetProjParams::sct_endcap_surface_z(),
00040 InDetProjParams::sct_endcap_surface_length(),
00041 InDetProjParams::sct_endcap_inner_radius(),
00042 InDetProjParams::sct_endcap_outer_radius(),
00043 InDetProjParams::sct_endcap_zasr_disttobarrelcyl(),
00044 InDetProjParams::sct_endcap_zasr_squeezefact(),
00045 mat, attachsep, parent,sys );
00046 }
00047
00048
00049 ProjectionSurfacesHelper * ProjectionSurfacesHelper::createTRTHelper( SoMaterial* mat,
00050 SoSeparator * attachsep,
00051 QObject*parent,
00052 IVP1System* sys )
00053 {
00054 return new ProjectionSurfacesHelper( InDetProjParams::surfacethickness(),
00055 InDetProjParams::trt_barrel_inner_radius(),
00056 InDetProjParams::trt_barrel_outer_radius(),
00057 InDetProjParams::trt_barrel_posneg_z(),
00058 InDetProjParams::trt_endcap_surface_z(),
00059 InDetProjParams::trt_endcap_surface_length(),
00060 InDetProjParams::trt_endcap_inner_radius(),
00061 InDetProjParams::trt_endcap_outer_radius(),
00062 InDetProjParams::trt_endcap_zasr_disttobarrelcyl(),
00063 InDetProjParams::trt_endcap_zasr_squeezefact(),
00064 mat, attachsep, parent,sys );
00065 }
00066
00067
00068 class ProjectionSurfacesHelper::Imp {
00069 public:
00070 Imp(ProjectionSurfacesHelper*tc,SoSeparator * as) : theclass(tc),
00071 attachsep(as),
00072 parts(InDetProjFlags::NoProjections)
00073 {
00074 if (as)
00075 as->ref();
00076 }
00077
00078 ProjectionSurfacesHelper * theclass;
00079 SoSeparator * attachsep;
00080 InDetProjFlags::InDetProjPartsFlags parts;
00081
00082 SoMaterial * material;
00083 SoSeparator * sep;
00084 SoShape * barrelcylshape;
00085 SoShape * endcapinnershape;
00086 SoShape * endcapoutershape;
00087 SoShape * endcapzasrcylshape;
00088 SoShape * barrelCylShape();
00089 SoShape * endcapInnerShape();
00090 SoShape * endcapOuterShape();
00091 SoShape * endcapZAsRCylShape();
00092
00093 SoSeparator * sep_barrel_central;
00094 SoSeparator * sep_barrel_pos;
00095 SoSeparator * sep_barrel_neg;
00096 SoSeparator * sep_endcap_inner_pos;
00097 SoSeparator * sep_endcap_outer_pos;
00098 SoSeparator * sep_endcap_inner_neg;
00099 SoSeparator * sep_endcap_outer_neg;
00100 SoSeparator * sep_endcap_zasr_central;
00101 SoSeparator * sep_endcap_zasr_pos;
00102 SoSeparator * sep_endcap_zasr_neg;
00103
00104 void initPartsSep(float zpos, SoSeparator*&sep, SoShape*);
00105
00106 void ensureDetached(SoSeparator*);
00107 void ensureAttached(SoSeparator*);
00108
00109
00110 double surfacethickness;
00111 double barrel_inner_radius;
00112 double barrel_outer_radius;
00113 double barrel_posneg_z;
00114 double endcap_surface_z;
00115 double endcap_surface_length;
00116 double endcap_inner_radius;
00117 double endcap_outer_radius;
00118 double endcap_zasr_disttobarrelcyl;
00119 double endcap_zasr_squeezefact;
00120 static const int nphi = 64;
00121 };
00122
00123
00124 ProjectionSurfacesHelper::ProjectionSurfacesHelper( const double& _surfacethickness,
00125 const double& _barrel_inner_radius,
00126 const double& _barrel_outer_radius,
00127 const double& _barrel_posneg_z,
00128 const double& _endcap_surface_z,
00129 const double& _endcap_surface_length,
00130 const double& _endcap_inner_radius,
00131 const double& _endcap_outer_radius,
00132 const double& _endcap_zasr_disttobarrelcyl,
00133 const double& _endcap_zasr_squeezefact,
00134 SoMaterial* mat, SoSeparator * attachsep, QObject * parent,IVP1System*sys)
00135 : QObject(parent), VP1HelperClassBase(sys,"ProjectionSurfacesHelper"), d(new Imp(this,attachsep))
00136 {
00137 d->material = mat;
00138 if (d->material)
00139 d->material->ref();
00140 d->sep = 0;
00141 d->barrelcylshape = 0;
00142 d->endcapinnershape = 0;
00143 d->endcapoutershape = 0;
00144 d->endcapzasrcylshape = 0;
00145 d->sep_barrel_central = 0;
00146 d->sep_barrel_pos = 0;
00147 d->sep_barrel_neg = 0;
00148 d->sep_endcap_inner_pos = 0;
00149 d->sep_endcap_outer_pos = 0;
00150 d->sep_endcap_inner_neg = 0;
00151 d->sep_endcap_outer_neg = 0;
00152 d->sep_endcap_zasr_central = 0;
00153 d->sep_endcap_zasr_pos = 0;
00154 d->sep_endcap_zasr_neg = 0;
00155
00156 d->surfacethickness = _surfacethickness;
00157 d->barrel_inner_radius = _barrel_inner_radius;
00158 d->barrel_outer_radius = _barrel_outer_radius;
00159 d->barrel_posneg_z = _barrel_posneg_z;
00160 d->endcap_surface_z = _endcap_surface_z;
00161 d->endcap_surface_length = _endcap_surface_length;
00162 d->endcap_inner_radius = _endcap_inner_radius;
00163 d->endcap_outer_radius = _endcap_outer_radius;
00164 d->endcap_zasr_disttobarrelcyl = _endcap_zasr_disttobarrelcyl;
00165 d->endcap_zasr_squeezefact = _endcap_zasr_squeezefact;
00166 }
00167
00168
00169 ProjectionSurfacesHelper::~ProjectionSurfacesHelper()
00170 {
00171 messageVerbose("destructor begin");
00172 QList<SoNode*> l;
00173
00174 l << d->attachsep
00175 << d->material
00176 << d->sep
00177 << d->barrelcylshape
00178 << d->endcapinnershape
00179 << d->endcapoutershape
00180 << d->endcapzasrcylshape
00181 << d->sep_barrel_central
00182 << d->sep_barrel_pos
00183 << d->sep_barrel_neg
00184 << d->sep_endcap_inner_pos
00185 << d->sep_endcap_outer_pos
00186 << d->sep_endcap_inner_neg
00187 << d->sep_endcap_outer_neg
00188 << d->sep_endcap_zasr_central
00189 << d->sep_endcap_zasr_pos
00190 << d->sep_endcap_zasr_neg;
00191
00192 foreach(SoNode* n, l)
00193 if (n)
00194 n->unref();
00195
00196 delete d;
00197 messageVerbose("destructor end");
00198 }
00199
00200
00201 InDetProjFlags::InDetProjPartsFlags ProjectionSurfacesHelper::shownParts() const
00202 {
00203 if (verbose())
00204 messageVerbose("shownParts");
00205 return d->parts;
00206 }
00207
00208
00209 void ProjectionSurfacesHelper::setSurfaces( InDetProjFlags::InDetProjPartsFlags newparts )
00210 {
00211 messageVerbose("setSurfaces");
00212 if (d->parts==newparts)
00213 return;
00214 messageVerbose("setSurfaces - changed");
00215 InDetProjFlags::InDetProjPartsFlags changedparts(d->parts ^ newparts);
00216 d->parts = newparts;
00217 bool save = d->attachsep->enableNotify(false);
00218
00220
00221 if (changedparts&InDetProjFlags::BarrelPositive) {
00222 if (newparts&InDetProjFlags::BarrelPositive) {
00223 if (!d->sep_barrel_pos)
00224 d->initPartsSep(d->barrel_posneg_z,d->sep_barrel_pos,d->barrelCylShape());
00225 d->ensureAttached(d->sep_barrel_pos);
00226 } else {
00227 d->ensureDetached(d->sep_barrel_pos);
00228 }
00229 }
00230 if (changedparts&InDetProjFlags::BarrelNegative) {
00231 if (newparts&InDetProjFlags::BarrelNegative) {
00232 if (!d->sep_barrel_neg)
00233 d->initPartsSep(-d->barrel_posneg_z,d->sep_barrel_neg,d->barrelCylShape());
00234 d->ensureAttached(d->sep_barrel_neg);
00235 } else {
00236 d->ensureDetached(d->sep_barrel_neg);
00237 }
00238 }
00239 if (changedparts&InDetProjFlags::BarrelCentral) {
00240 if (newparts&InDetProjFlags::BarrelCentral) {
00241 if (!d->sep_barrel_central)
00242 d->initPartsSep(0.0,d->sep_barrel_central,d->barrelCylShape());
00243 d->ensureAttached(d->sep_barrel_central);
00244 } else {
00245 d->ensureDetached(d->sep_barrel_central);
00246 }
00247 }
00248 if (changedparts&InDetProjFlags::EndCapInnerPositive) {
00249 if (newparts&InDetProjFlags::EndCapInnerPositive) {
00250 if (!d->sep_endcap_inner_pos)
00251 d->initPartsSep(d->endcap_surface_z,d->sep_endcap_inner_pos,d->endcapInnerShape());
00252 d->ensureAttached(d->sep_endcap_inner_pos);
00253 } else {
00254 d->ensureDetached(d->sep_endcap_inner_pos);
00255 }
00256 }
00257 if (changedparts&InDetProjFlags::EndCapOuterPositive) {
00258 if (newparts&InDetProjFlags::EndCapOuterPositive) {
00259 if (!d->sep_endcap_outer_pos)
00260 d->initPartsSep(d->endcap_surface_z,d->sep_endcap_outer_pos,d->endcapOuterShape());
00261 d->ensureAttached(d->sep_endcap_outer_pos);
00262 } else {
00263 d->ensureDetached(d->sep_endcap_outer_pos);
00264 }
00265 }
00266 if (changedparts&InDetProjFlags::EndCapInnerNegative) {
00267 if (newparts&InDetProjFlags::EndCapInnerNegative) {
00268 if (!d->sep_endcap_inner_neg)
00269 d->initPartsSep(-d->endcap_surface_z,d->sep_endcap_inner_neg,d->endcapInnerShape());
00270 d->ensureAttached(d->sep_endcap_inner_neg);
00271 } else {
00272 d->ensureDetached(d->sep_endcap_inner_neg);
00273 }
00274 }
00275 if (changedparts&InDetProjFlags::EndCapOuterNegative) {
00276 if (newparts&InDetProjFlags::EndCapOuterNegative) {
00277 if (!d->sep_endcap_outer_neg)
00278 d->initPartsSep(-d->endcap_surface_z,d->sep_endcap_outer_neg,d->endcapOuterShape());
00279 d->ensureAttached(d->sep_endcap_outer_neg);
00280 } else {
00281 d->ensureDetached(d->sep_endcap_outer_neg);
00282 }
00283 }
00284 if (changedparts&InDetProjFlags::TRT_EndCapZToRCentral) {
00285 if (newparts&InDetProjFlags::TRT_EndCapZToRCentral) {
00286 if (!d->sep_endcap_zasr_central)
00287 d->initPartsSep(0.0,d->sep_endcap_zasr_central,d->endcapZAsRCylShape());
00288 d->ensureAttached(d->sep_endcap_zasr_central);
00289 } else {
00290 d->ensureDetached(d->sep_endcap_zasr_central);
00291 }
00292 }
00293 if (changedparts&InDetProjFlags::TRT_EndCapZToRPositive) {
00294 if (newparts&InDetProjFlags::TRT_EndCapZToRPositive) {
00295 if (!d->sep_endcap_zasr_pos)
00296 d->initPartsSep(d->barrel_posneg_z,d->sep_endcap_zasr_pos,d->endcapZAsRCylShape());
00297 d->ensureAttached(d->sep_endcap_zasr_pos);
00298 } else {
00299 d->ensureDetached(d->sep_endcap_zasr_pos);
00300 }
00301 }
00302 if (changedparts&InDetProjFlags::TRT_EndCapZToRNegative) {
00303 if (newparts&InDetProjFlags::TRT_EndCapZToRNegative) {
00304 if (!d->sep_endcap_zasr_neg)
00305 d->initPartsSep(-d->barrel_posneg_z,d->sep_endcap_zasr_neg,d->endcapZAsRCylShape());
00306 d->ensureAttached(d->sep_endcap_zasr_neg);
00307 } else {
00308 d->ensureDetached(d->sep_endcap_zasr_neg);
00309 }
00310 }
00311
00313 d->attachsep->enableNotify(save);
00314 if (save)
00315 d->attachsep->touch();
00316 messageVerbose("setSurfaces - changed end");
00317 }
00318
00319
00320 void ProjectionSurfacesHelper::Imp::initPartsSep(float zpos, SoSeparator*&sep, SoShape*shape)
00321 {
00322 theclass->messageVerbose("initPartsSep begin");
00323 sep = new SoSeparator();
00324 sep->ref();
00325 if (zpos!=0.0f) {
00326 SoTranslation * t = new SoTranslation;
00327 t->translation.setValue(0.0f,0.0f,zpos);
00328 sep->addChild(t);
00329 }
00330 sep->addChild(shape);
00331 theclass->messageVerbose("initPartsSep end");
00332 }
00333
00334
00335 SoMaterial * ProjectionSurfacesHelper::material()
00336 {
00337 if (verbose())
00338 messageVerbose("material");
00339 return d->material;
00340 }
00341
00342
00343 SoShape * ProjectionSurfacesHelper::Imp::barrelCylShape()
00344 {
00345 theclass->messageVerbose("barrelCylShape");
00346 if (!barrelcylshape) {
00347 SoTubs::initClass();
00348 SoTubs * disc = new SoTubs;
00349 disc->pRMin = barrel_inner_radius;
00350 disc->pRMax = barrel_outer_radius;
00351 disc->pDz = 0.5*surfacethickness;
00352 disc->pSPhi = 0.0;
00353 disc->pDPhi = 2*M_PI;
00354 disc->pOverrideNPhi = nphi;
00355 barrelcylshape = disc;
00356 barrelcylshape->ref();
00357 }
00358 return barrelcylshape;
00359 }
00360
00361
00362 SoShape * ProjectionSurfacesHelper::Imp::endcapInnerShape()
00363 {
00364 theclass->messageVerbose("endcapInnerShape");
00365 if (!endcapinnershape) {
00366 SoTubs::initClass();
00367 SoTubs * cyl = new SoTubs;
00368 cyl->pRMax = endcap_inner_radius;
00369 cyl->pRMin = endcap_inner_radius-surfacethickness;
00370 cyl->pDz = 0.5*endcap_surface_length;
00371 cyl->pSPhi = 0.0;
00372 cyl->pDPhi = 2*M_PI;
00373 cyl->pOverrideNPhi = nphi;
00374 endcapinnershape = cyl;
00375 endcapinnershape->ref();
00376 }
00377 return endcapinnershape;
00378 }
00379
00380
00381 SoShape * ProjectionSurfacesHelper::Imp::endcapOuterShape()
00382 {
00383 theclass->messageVerbose("endcapOuterShape");
00384 if (!endcapoutershape) {
00385 SoTubs::initClass();
00386 SoTubs * cyl = new SoTubs;
00387 cyl->pRMax = endcap_outer_radius;
00388 cyl->pRMin = endcap_outer_radius-surfacethickness;
00389 cyl->pDz = 0.5*endcap_surface_length;
00390 cyl->pSPhi = 0.0;
00391 cyl->pDPhi = 2*M_PI;
00392 cyl->pOverrideNPhi = nphi;
00393 endcapoutershape = cyl;
00394 endcapoutershape->ref();
00395 }
00396 return endcapoutershape;
00397 }
00398
00399
00400 SoShape * ProjectionSurfacesHelper::Imp::endcapZAsRCylShape()
00401 {
00402 theclass->messageVerbose("endcapZAsRCylShape");
00403 if (!endcapzasrcylshape) {
00404 SoTubs::initClass();
00405 SoTubs * disc = new SoTubs;
00406 double rmin = barrel_outer_radius+endcap_zasr_disttobarrelcyl;
00407 disc->pRMin = rmin;
00408 disc->pRMax = rmin + endcap_surface_length/endcap_zasr_squeezefact;
00409 disc->pDz = 0.5*surfacethickness;
00410 disc->pSPhi = 0.0;
00411 disc->pDPhi = 2*M_PI;
00412 disc->pOverrideNPhi = nphi;
00413 endcapzasrcylshape = disc;
00414 endcapzasrcylshape->ref();
00415 }
00416 return endcapzasrcylshape;
00417 }
00418
00419
00420 void ProjectionSurfacesHelper::Imp::ensureDetached(SoSeparator*s)
00421 {
00422 if (theclass->verbose())
00423 theclass->messageVerbose("ensureDetached");
00424 if (!sep||!s)
00425 return;
00426 if (sep->findChild(s)>-1)
00427 sep->removeChild(s);
00428 }
00429
00430
00431 void ProjectionSurfacesHelper::Imp::ensureAttached(SoSeparator*s)
00432 {
00433 if (theclass->verbose())
00434 theclass->messageVerbose("ensureAttached");
00435 if (!s)
00436 return;
00437 if (!sep) {
00438 sep = new SoSeparator;
00439 sep->ref();
00440 SoPickStyle *pickStyle = new SoPickStyle;
00441 pickStyle->style=SoPickStyle::UNPICKABLE;
00442 sep->addChild(pickStyle);
00443 if (material)
00444 sep->addChild(material);
00445 attachsep->addChild(sep);
00446 }
00447 sep->addChild(s);
00448 if (theclass->verbose())
00449 theclass->messageVerbose("ensureAttached done");
00450 }