00001
00002
00003
00004
00005
00006
00007
00008
00009
00011
00012 #include "GeoGeometry/GeoScintPlnNode.h"
00013 #include "UgliGeometry/UgliScintPlnHandle.h"
00014
00015 #include "MessageService/MsgService.h"
00016 CVSID("$Id: UgliScintPlnHandle.cxx,v 1.19 2008/03/28 00:43:53 schubert Exp $");
00017
00018 #include <cassert>
00019
00020 ClassImp(UgliScintPlnHandle)
00021
00022
00023 UgliScintPlnHandle::UgliScintPlnHandle()
00024 : UgliPlnHandle((UgliPlnNode*)0), fUgliScintPlnNode(0), fGeoScintPlnNode(0)
00025 {
00026
00027
00028 MSG("Ugli",Msg::kDebug)
00029 << "UgliScintPlnHandle created by default ctor" << endl;
00030
00031 }
00032
00033
00034 UgliScintPlnHandle::~UgliScintPlnHandle()
00035 {
00036
00037
00038
00039
00040
00041
00042 }
00043
00044
00045 UgliScintPlnHandle::UgliScintPlnHandle(UgliScintPlnNode* node)
00046 : UgliPlnHandle(node), fUgliScintPlnNode(node), fGeoScintPlnNode(0)
00047 {
00048
00049
00050
00051
00052
00053 }
00054
00055
00056 UgliScintPlnHandle::UgliScintPlnHandle(GeoScintPlnNode* node)
00057 : UgliPlnHandle(node), fUgliScintPlnNode(0), fGeoScintPlnNode(node)
00058 {
00059
00060
00061
00062
00063
00064 }
00065
00066
00067 UgliScintPlnHandle::UgliScintPlnHandle(const UgliScintPlnHandle &that)
00068 : UgliPlnHandle(that),
00069 UgliScintPlnABC(),
00070 fUgliScintPlnNode(that.fUgliScintPlnNode),
00071 fGeoScintPlnNode(that.fGeoScintPlnNode)
00072 {
00073
00074
00075
00076
00077
00078
00079 }
00080
00081
00082 UgliScintPlnHandle& UgliScintPlnHandle::operator=(const UgliScintPlnHandle& that)
00083 {
00084
00085
00086
00087
00088
00089
00090
00091
00092 if ( this != &that ) {
00093 UgliPlnHandle::operator=(that);
00094 fUgliScintPlnNode = that.fUgliScintPlnNode;
00095 fGeoScintPlnNode = that.fGeoScintPlnNode;
00096 }
00097 return *this;
00098 }
00099
00100
00101
00102
00103
00104 UgliStripHandle UgliScintPlnHandle::GetStripHandle(PlexStripEndId seid)
00105 { if (!IsGeo()) return UgliStripHandle(fUgliScintPlnNode->GetStripNode(seid));
00106 else return UgliStripHandle(fGeoScintPlnNode->GetStripNode(seid));
00107 }
00108
00109
00110 vector<UgliStripHandle> UgliScintPlnHandle::GetStripHandleVector()
00111 {
00112
00113 vector<UgliStripHandle> stripHandles;
00114 if ( !IsGeo() ) {
00115 vector<UgliStripNode*> stripNodes =
00116 fUgliScintPlnNode->GetStripNodePtrVector();
00117 for (unsigned int i=0; i<stripNodes.size(); ++i)
00118 stripHandles.push_back(UgliStripHandle(stripNodes[i]));
00119 }
00120 else {
00121 vector<GeoStripNode*> stripNodes =
00122 fGeoScintPlnNode->GetStripNodePtrVector();
00123 for (unsigned int i=0; i<stripNodes.size(); ++i)
00124 stripHandles.push_back(UgliStripHandle(stripNodes[i]));
00125 }
00126
00127 return stripHandles;
00128 }
00129
00130
00131 vector<UgliScintMdlHandle> UgliScintPlnHandle::GetScintMdlHandleVector()
00132 {
00133
00134 vector<UgliScintMdlHandle> scintMdlHandles;
00135 if ( !IsGeo() ) {
00136 vector<UgliScintMdlNode*> scintMdlNodes =
00137 fUgliScintPlnNode->GetScintMdlNodePtrVector();
00138 for (unsigned int i=0; i<scintMdlNodes.size(); ++i)
00139 scintMdlHandles.push_back(UgliScintMdlHandle(scintMdlNodes[i]));
00140 }
00141 else {
00142 vector<GeoScintMdlNode*> scintMdlNodes =
00143 fGeoScintPlnNode->GetScintMdlNodePtrVector();
00144 for (unsigned int i=0; i<scintMdlNodes.size(); ++i)
00145 scintMdlHandles.push_back(UgliScintMdlHandle(scintMdlNodes[i]));
00146 }
00147
00148 return scintMdlHandles;
00149 }
00150
00151
00152 UgliStripHandle UgliScintPlnHandle::GetClosestStrip(Float_t tpos, Float_t orthCoord)
00153 {
00154
00155
00156
00157 if ( !IsGeo() ) {
00158 vector<UgliStripNode*> stripNodes =
00159 fUgliScintPlnNode->GetStripNodePtrVector();
00160
00161 UgliStripNode* closestNode = 0;
00162 Float_t closestDtpos = 999999.;
00163
00164
00165
00166
00167
00168 for (unsigned int i=0; i<stripNodes.size(); ++i) {
00169 Float_t strip_tpos = stripNodes[i]->GetTPos(orthCoord);
00170 Float_t dtpos = TMath::Abs(strip_tpos-tpos);
00171 if ( dtpos < closestDtpos ) {
00172 closestNode = stripNodes[i];
00173 closestDtpos = dtpos;
00174 }
00175 }
00176 return UgliStripHandle(closestNode);
00177 }
00178 else {
00179 return UgliStripHandle(fGeoScintPlnNode -> GetClosestStrip(
00180 tpos/Munits::cm,orthCoord/Munits::cm));
00181 }
00182
00183 }
00184
00185
00186 Bool_t UgliScintPlnHandle::AttemptSet(const char* what) const
00187 {
00188 if (!IsFrozen()) return true;
00189
00190 MSG("Ugli",Msg::kError)
00191 << "AttemptSet " << what << " on Frozen "
00192 << GetPlexPlaneId() << " twarted!" << endl;
00193 return false;
00194 }
00195
00196 void UgliScintPlnHandle::SetZRotRelSteelRad(Float_t radians)
00197 {
00198 if (!AttemptSet("ZRotRelSteelRad")) return;
00199 if ( !IsGeo() ) fUgliScintPlnNode->SetZRotRelSteelRad(radians);
00200 else fGeoScintPlnNode->SetZRotRelSteelRad(radians);
00201
00202 }
00203
00204 void UgliScintPlnHandle::SetXY0RelSteel(Float_t x0, Float_t y0)
00205 {
00206 if (!AttemptSet("XY0RelPln")) return;
00207 if ( !IsGeo() ) fUgliScintPlnNode->SetPosition(x0,y0);
00208 else fGeoScintPlnNode->SetXY0RelSteel(x0/Munits::cm,y0/Munits::cm);
00209
00210 }
00211
00212
00213 TVector3 UgliScintPlnHandle::GlobalToLocal(const TVector3& global,
00214 const Bool_t globalInXYZ) const
00215 {
00216
00217 if ( !IsValid() ) {
00218 MSG("Ugli",Msg::kWarning) << "UgliScintPlnHandle::GlobalToLocal "
00219 << "called for InValid scint pln." << endl;
00220 TVector3 dummy;
00221 return dummy;
00222 }
00223
00224
00225
00226 TVector3 globalXYZ = (globalInXYZ) ?
00227 global : Ugli::uvz2xyz(GetPlexPlaneId().GetDetector(),global);
00228
00229 if ( !IsGeo() )
00230 return fUgliScintPlnNode->GlobalToLocal(global);
00231 else {
00232 TVector3 scaledglobal(global); scaledglobal *= 1./Munits::cm;
00233 return (fGeoScintPlnNode->GlobalToLocal(scaledglobal) *= Munits::cm);
00234 }
00235 }
00236
00237
00238 TVector3 UgliScintPlnHandle::LocalToGlobal(const TVector3& local,
00239 const Bool_t globalInXYZ) const
00240 {
00241
00242 if ( !IsValid() ) {
00243 MSG("Ugli",Msg::kWarning) << "UgliScintPlnHandle::LocalToGlobal "
00244 << "called for InValid scint pln." << endl;
00245 TVector3 dummy;
00246 return dummy;
00247 }
00248
00249
00250
00251 TVector3 globalXYZ;
00252 if ( !IsGeo() )
00253 globalXYZ = fUgliScintPlnNode->LocalToGlobal(local);
00254 else {
00255 TVector3 scaledlocal(local); scaledlocal *= 1./Munits::cm;
00256 globalXYZ = (fGeoScintPlnNode->LocalToGlobal(scaledlocal) *= Munits::cm);
00257 }
00258
00259 if (globalInXYZ ) return globalXYZ;
00260 else return Ugli::xyz2uvz(GetPlexPlaneId().GetDetector(),
00261 globalXYZ);
00262 }
00263
00264
00265