00001
00002
00003
00004
00005
00006
00007
00008
00009
00011
00012 #include "UgliGeometry/UgliPlnNode.h"
00013
00014 #include "UgliGeometry/UgliGeometry.h"
00015 #include "UgliGeometry/TGeometryX.h"
00016
00017 #include "TBRIK.h"
00018 #include "TXTRU.h"
00019
00020 #include "MessageService/MsgService.h"
00021 CVSID("$Id: UgliPlnNode.cxx,v 1.4 2003/10/29 19:28:02 rhatcher Exp $");
00022
00023 #include <cassert>
00024
00025 ClassImp(UgliPlnNode)
00026
00027
00028 UgliPlnNode::UgliPlnNode()
00029 : fUgliGeometry(0)
00030 {
00031
00032 }
00033
00034
00035 UgliPlnNode::UgliPlnNode(UgliGeometry *ugliGeometry,
00036 const PlexPlaneId& planeid)
00037 : TNodeX(planeid.AsString("p"),planeid.AsString("p"),"noshape"),
00038 fUgliGeometry(ugliGeometry), fPlaneId(planeid)
00039 {
00040
00041 }
00042
00043
00044 UgliPlnNode::~UgliPlnNode()
00045 {
00046
00047 if (CountRef()) {
00048 MSG("Ugli",Msg::kWarning)
00049 << "~UgliPlnNode " << GetPlexPlaneId()
00050 << " still had " << CountRef()
00051 << " outstanding references " << endl;
00052 }
00053 }
00054
00055
00056
00057 void UgliPlnNode::IncrementRef()
00058 {
00059 fRef++;
00060 fUgliGeometry->IncrementRef();
00061 SetVisibility(1);
00062 }
00063
00064 void UgliPlnNode::DecrementRef()
00065 {
00066 fRef--;
00067 fUgliGeometry->DecrementRef();
00068 if (!fRef) SetVisibility(0);
00069 }
00070
00071
00072 Float_t UgliPlnNode::GetHalfThickness() const
00073 {
00074
00075 TBRIK *brik = dynamic_cast<TBRIK*>(fShape);
00076 if (brik) return brik->GetDz();
00077
00078 TXTRU *xtru = dynamic_cast<TXTRU*>(fShape);
00079 if (xtru) {
00080 Int_t nz = xtru->GetNz();
00081 Float_t* fz = xtru->GetZ();
00082 return 0.5*TMath::Abs(fz[0]-fz[nz-1]);
00083 }
00084
00085 MSG("Ugli",Msg::kError) <<
00086 "UgliPlnNode::GetHalfThickness: not a BRIK or TXTRU" << endl;
00087
00088 return 0;
00089 }
00090
00091
00092 void UgliPlnNode::TransformLocal2Global(Double_t *lxyz, Double_t *gxyz) const
00093 {
00094
00095 UgliPlnNode* self = const_cast<UgliPlnNode*>(this);
00096 self->cd();
00097 self->UpdateMatrix();
00098 self->Local2Master(lxyz,gxyz);
00099 }
00100
00101
00102 TVector3 UgliPlnNode::GetCenter() const
00103 {
00104 Double_t lxyz[3] = {0., 0., 0.};
00105 Double_t gxyz[3];
00106
00107 TransformLocal2Global(lxyz,gxyz);
00108 return TVector3(gxyz[0],gxyz[1],gxyz[2]);
00109 }
00110
00111
00112 Float_t UgliPlnNode::GetX0() const
00113 {
00114 Double_t lxyz[3] = {0., 0., 0.};
00115 Double_t gxyz[3];
00116
00117 TransformLocal2Global(lxyz,gxyz);
00118 return gxyz[0];
00119 }
00120
00121
00122 Float_t UgliPlnNode::GetY0() const
00123 {
00124 Double_t lxyz[3] = {0., 0., 0.};
00125 Double_t gxyz[3];
00126
00127 TransformLocal2Global(lxyz,gxyz);
00128 return gxyz[1];
00129 }
00130
00131
00132 Float_t UgliPlnNode::GetZ0() const
00133 {
00134 Double_t lxyz[3] = {0., 0., 0.};
00135 Double_t gxyz[3];
00136
00137 TransformLocal2Global(lxyz,gxyz);
00138 return gxyz[2];
00139 }
00140
00141