00001
00002
00003
00004
00005
00006
00007
00008
00009
00011
00012 #include "UgliGeometry/UgliScintMdlHandle.h"
00013 #include "UgliGeometry/UgliScintMdlNode.h"
00014 #include "GeoGeometry/GeoScintMdlNode.h"
00015
00016
00017 #include "MessageService/MsgService.h"
00018 CVSID("$Id: UgliScintMdlHandle.cxx,v 1.8 2005/09/01 08:07:08 rhatcher Exp $");
00019
00020 #include <cassert>
00021
00022 ClassImp(UgliScintMdlHandle)
00023
00024
00025 UgliScintMdlHandle::UgliScintMdlHandle()
00026 : fUgliScintMdlNode(0),fGeoScintMdlNode(0)
00027 {
00028
00029
00030 MSG("Ugli",Msg::kFatal) <<
00031 "UgliScintMdlHandle created by default ctor" << endl;
00032
00033 }
00034
00035
00036 UgliScintMdlHandle::~UgliScintMdlHandle()
00037 {
00038
00039 if (fUgliScintMdlNode) fUgliScintMdlNode->DecrementRef();
00040 if (fGeoScintMdlNode) fGeoScintMdlNode->DecrementRef();
00041 }
00042
00043
00044 UgliScintMdlHandle::UgliScintMdlHandle(UgliScintMdlNode* node)
00045 : fUgliScintMdlNode(node),fGeoScintMdlNode(0)
00046 {
00047
00048
00049 if (fUgliScintMdlNode) fUgliScintMdlNode->IncrementRef();
00050 }
00051
00052
00053 UgliScintMdlHandle::UgliScintMdlHandle(GeoScintMdlNode* node)
00054 : fUgliScintMdlNode(0),fGeoScintMdlNode(node)
00055 {
00056
00057
00058 if (fGeoScintMdlNode) fGeoScintMdlNode->IncrementRef();
00059 }
00060
00061
00062
00063 UgliScintMdlHandle::UgliScintMdlHandle(const UgliScintMdlHandle &that)
00064 : UgliScintMdlABC(),
00065 fUgliScintMdlNode(that.fUgliScintMdlNode),
00066 fGeoScintMdlNode(that.fGeoScintMdlNode)
00067 {
00068
00069
00070 if (fUgliScintMdlNode) fUgliScintMdlNode->IncrementRef();
00071 if (fGeoScintMdlNode) fGeoScintMdlNode->IncrementRef();
00072 }
00073
00074
00075 UgliScintMdlHandle& UgliScintMdlHandle::operator=(const UgliScintMdlHandle& that)
00076 {
00077
00078
00079 if (fUgliScintMdlNode) fUgliScintMdlNode->DecrementRef();
00080 if (fGeoScintMdlNode) fGeoScintMdlNode->DecrementRef();
00081
00082 fUgliScintMdlNode = that.fUgliScintMdlNode;
00083 fGeoScintMdlNode = that.fGeoScintMdlNode;
00084
00085 if (fUgliScintMdlNode) fUgliScintMdlNode->IncrementRef();
00086 if (fGeoScintMdlNode) fGeoScintMdlNode->IncrementRef();
00087
00088 return *this;
00089 }
00090
00091
00092
00093
00094
00095 UgliScintPlnHandle UgliScintMdlHandle::GetScintPlnHandle(void) const
00096 { if (!IsGeo())
00097 return UgliScintPlnHandle(fUgliScintMdlNode->GetScintPlnNode());
00098 else
00099 return UgliScintPlnHandle(fGeoScintMdlNode->GetScintPlnNode());
00100 }
00101
00102
00103 Bool_t UgliScintMdlHandle::AttemptSet(const char* what) const
00104 {
00105 if (!IsFrozen()) return true;
00106
00107 MSG("Ugli",Msg::kError)
00108 << "AttemptSet " << what << " on Frozen "
00109 << GetPlexScintMdlId() << " twarted!" << endl;
00110 return false;
00111 }
00112
00113 void UgliScintMdlHandle::SetZRotRelPlnRad(Float_t radians)
00114 {
00115 if (!AttemptSet("ZRotRelPlnRad")) return;
00116 if (!IsGeo())fUgliScintMdlNode->SetZRotRelPlnRad(radians);
00117 else fGeoScintMdlNode->SetZRotRelPlnRad(radians);
00118
00119 }
00120
00121 void UgliScintMdlHandle::SetLTPosRelPln(Float_t lpos, Float_t tpos)
00122 {
00123 if (!AttemptSet("LTPosRelPln")) return;
00124 if (!IsGeo())fUgliScintMdlNode->SetLTPosRelPln(lpos,tpos);
00125 else {
00126 lpos *= 1./Munits::cm;
00127 tpos *= 1./Munits::cm;
00128 fGeoScintMdlNode->SetLTPosRelPln(lpos,tpos);
00129 }
00130
00131 }
00132
00133
00134 TVector3 UgliScintMdlHandle::GlobalToLocal(const TVector3& global,
00135 const Bool_t globalInXYZ) const
00136 {
00137
00138
00139 TVector3 globalXYZ = (globalInXYZ) ?
00140 global : Ugli::uvz2xyz(GetPlexScintMdlId().GetDetector(),global);
00141
00142 if ( !IsGeo() )
00143 return fUgliScintMdlNode->GlobalToLocal(globalXYZ);
00144 else {
00145 TVector3 scaledglobal(globalXYZ); scaledglobal *= 1./Munits::cm;
00146 return (fGeoScintMdlNode->GlobalToLocal(scaledglobal) *= Munits::cm);
00147 }
00148 }
00149
00150
00151 TVector3 UgliScintMdlHandle::LocalToGlobal(const TVector3& local,
00152 const Bool_t globalInXYZ) const
00153 {
00154
00155
00156 TVector3 globalXYZ;
00157 if ( !IsGeo() )
00158 globalXYZ = fUgliScintMdlNode->LocalToGlobal(local);
00159 else {
00160 TVector3 scaledlocal(local); scaledlocal *= 1./Munits::cm;
00161 globalXYZ = (fGeoScintMdlNode ->LocalToGlobal(scaledlocal) *= Munits::cm);
00162 }
00163
00164 if (globalInXYZ ) return globalXYZ;
00165 else return Ugli::xyz2uvz(GetPlexScintMdlId().GetDetector(),
00166 globalXYZ);
00167 }
00168
00169
00170