Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

UgliScintPlnHandle.cxx

Go to the documentation of this file.
00001 
00002 // $Id: UgliScintPlnHandle.cxx,v 1.19 2008/03/28 00:43:53 schubert Exp $
00003 //
00004 // UgliScintPlnHandle
00005 //
00006 // UgliScintPlnHandle is handle to a single scint plane
00007 //
00008 // Author:  R. Hatcher 2000.11.15
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    // Default constructor
00027 
00028    MSG("Ugli",Msg::kDebug) 
00029      << "UgliScintPlnHandle created by default ctor" << endl;
00030 //   assert(0);
00031 }
00032 
00033 //_____________________________________________________________________________
00034 UgliScintPlnHandle::~UgliScintPlnHandle()
00035 {
00036    // handle deletion updates reference count
00037    // done by super-class UgliPlnHandle
00038    // don't do it here or we'll get two counts for every handle
00039 
00040    // if (fUgliScintPlnNode) fUgliScintPlnNode->DecrementRef();
00041    // if (fGeoScintPlnNode) fGeoScintPlnNode->DecrementRef();
00042 }
00043 
00044 //_____________________________________________________________________________
00045 UgliScintPlnHandle::UgliScintPlnHandle(UgliScintPlnNode* node)
00046   : UgliPlnHandle(node), fUgliScintPlnNode(node), fGeoScintPlnNode(0)
00047 {
00048    // ctor keeps reference count up-to-date
00049    // done by super-class UgliPlnHandle
00050    // don't do it here or we'll get two counts for every handle
00051 
00052    // if (fUgliScintPlnNode) fUgliScintPlnNode->IncrementRef();
00053 }
00054 
00055 //_____________________________________________________________________________
00056 UgliScintPlnHandle::UgliScintPlnHandle(GeoScintPlnNode* node)
00057   : UgliPlnHandle(node), fUgliScintPlnNode(0), fGeoScintPlnNode(node)
00058 {
00059    // ctor keeps reference count up-to-date
00060    // done by super-class UgliPlnHandle
00061    // don't do it here or we'll get two counts for every handle
00062 
00063    // if (fGeoScintPlnNode) fGeoScintPlnNode->IncrementRef();
00064 }
00065 
00066 //_____________________________________________________________________________
00067 UgliScintPlnHandle::UgliScintPlnHandle(const UgliScintPlnHandle &that)
00068    : UgliPlnHandle(that),
00069      UgliScintPlnABC(),
00070      fUgliScintPlnNode(that.fUgliScintPlnNode),
00071      fGeoScintPlnNode(that.fGeoScintPlnNode)
00072 {
00073    // copy constructor keeps reference counts up-to-date
00074    // done by super-class UgliPlnHandle
00075    // don't do it here or we'll get two counts for every handle
00076 
00077    // if (fUgliScintPlnNode) fUgliScintPlnNode->IncrementRef();
00078    // if (fGeoScintPlnNode) fGeoScintPlnNode->IncrementRef();
00079 }
00080 
00081 //_____________________________________________________________________________
00082 UgliScintPlnHandle&  UgliScintPlnHandle::operator=(const UgliScintPlnHandle& that)
00083 {
00084    // assignment keeps reference counts up-to-date
00085    // done by super-class UgliPlnHandle
00086    // don't do it here or we'll get two counts for every handle
00087 
00088    // if (fUgliScintPlnNode) fUgliScintPlnNode->DecrementRef();
00089    // fUgliScintPlnNode = that.fUgliScintPlnNode;
00090    // if (fUgliScintPlnNode) fUgliScintPlnNode->IncrementRef();
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 // inlining these causes a circular dependency
00102 
00103 //inline 
00104 UgliStripHandle UgliScintPlnHandle::GetStripHandle(PlexStripEndId seid)
00105 { if (!IsGeo()) return UgliStripHandle(fUgliScintPlnNode->GetStripNode(seid)); 
00106        else return UgliStripHandle(fGeoScintPlnNode->GetStripNode(seid));
00107 }
00108 
00109 //inline 
00110 vector<UgliStripHandle> UgliScintPlnHandle::GetStripHandleVector()
00111 {
00112 //{ return fUgliScintPlnNode->GetStripHandleVector(); }
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 //inline 
00131 vector<UgliScintMdlHandle> UgliScintPlnHandle::GetScintMdlHandleVector()
00132 {
00133 //{ return fUgliScintPlnNode->GetScintMdlHandleVector(); }
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   // return the handle to the strip in the plane with a position
00155   // closest to "tpos", orthCoord is position in orthogonal coordinate
00156 
00157   if ( !IsGeo() ) {
00158     vector<UgliStripNode*>  stripNodes = 
00159       fUgliScintPlnNode->GetStripNodePtrVector();
00160 
00161     UgliStripNode* closestNode  = 0;
00162     Float_t        closestDtpos = 999999.;
00163 
00164     // very dumb approach ... 
00165     // strips are ordered? when delta start getting larger we could possibly quit
00166     // (is this guaranteed in the vector?)
00167     // and/or a binary search might be better
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   // convert a global position into a local (volume) one
00225   // globalInXYZ determines whether result is in XYZ or UVZ
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   // convert a global position into a local (volume) one
00250   // globalInXYZ determines whether result is in XYZ or UVZ
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 

Generated on Mon Feb 15 11:07:49 2010 for loon by  doxygen 1.3.9.1