00001 00002 // $Id: UgliScintPlnHandle.h,v 1.17 2005/09/01 08:07:08 rhatcher Exp $ 00003 // 00004 // UgliScintPlnHandle 00005 // 00006 // UgliScintPlnHandle is the handle to a single scint plane 00007 // 00008 // Author: R. Hatcher 2000.11.15 00009 // 00011 00012 #ifndef UGLISCINTPLNHANDLE_H 00013 #define UGLISCINTPLNHANDLE_H 00014 class UgliScintPlnHandle; 00015 class UgliPlnHandle; 00016 class UgliScintPlnABC; 00017 00018 #include "GeoGeometry/GeoGeometry.h" // IsFrozen 00019 #include "GeoGeometry/GeoScintPlnNode.h" 00020 00021 #include "UgliGeometry/UgliScintPlnABC.h" 00022 #include "UgliGeometry/UgliPlnHandle.h" 00023 #include "UgliGeometry/UgliGeomHandle.h" 00024 #include "UgliGeometry/UgliScintPlnNode.h" 00025 #include "UgliGeometry/UgliStripHandle.h" 00026 #include "UgliGeometry/UgliScintMdlHandle.h" 00027 00028 class GeoScintPlnNode; 00029 00030 #include <vector> 00031 #include "TVector3.h" 00032 00033 class UgliScintPlnHandle : public UgliPlnHandle, public UgliScintPlnABC { 00034 00035 public: 00036 00037 // Create handles from the actual node object, copy and assignment 00038 UgliScintPlnHandle(UgliScintPlnNode* scintNode); 00039 UgliScintPlnHandle(GeoScintPlnNode* scintNode); 00040 UgliScintPlnHandle(const UgliScintPlnHandle& that); 00041 UgliScintPlnHandle& operator=(const UgliScintPlnHandle& that); 00042 00043 // One should avoid creating UgliScintPlnHandle without a reference 00044 // (be sure to test IsValid()) 00045 UgliScintPlnHandle(); 00046 00047 virtual ~UgliScintPlnHandle(); 00048 00049 virtual Bool_t IsValid() const; 00050 virtual Bool_t IsFrozen() const; 00051 00052 virtual Int_t NumberOfStrips() const; 00053 00054 virtual UgliStripHandle GetStripHandle(PlexStripEndId seid); 00055 00056 std::vector<UgliStripHandle> GetStripHandleVector(); 00057 std::vector<UgliScintMdlHandle> GetScintMdlHandleVector(); 00058 00059 UgliStripHandle GetClosestStrip(Float_t tpos, 00060 Float_t orthCoord=9999.); 00061 00062 // convert between world and scint plane coordinates 00063 virtual TVector3 GlobalToLocal(const TVector3& global, 00064 const Bool_t globalInXYZ=true) const; 00065 virtual TVector3 LocalToGlobal(const TVector3& local, 00066 const Bool_t globalInXYZ=true) const; 00067 00068 Float_t GetZRotRelSteelRad() const; 00069 Float_t GetX0RelSteel() const; 00070 Float_t GetY0RelSteel() const; 00071 00072 // these are only allowed if the copy is modifiable 00073 Bool_t AttemptSet(const char* what="?") const; 00074 void SetZRotRelSteelRad(Float_t radians); 00075 void SetXY0RelSteel(Float_t x0, Float_t y0); 00076 void RotateRelSteelBy(Float_t deltaRadians); 00077 void ShiftXY0RelSteelBy(Float_t dx, Float_t dy); 00078 00079 protected: 00080 00081 // The actual node being referenced 00082 // duplicates UgliPlnNode* in UgliPlnHandle but avoids recasting 00083 UgliScintPlnNode* fUgliScintPlnNode; 00084 GeoScintPlnNode* fGeoScintPlnNode; 00085 00086 private: 00087 00088 ClassDef(UgliScintPlnHandle,2) 00089 00090 }; 00091 00092 #ifndef __CINT__ 00093 //============================================================================= 00094 // Implementation details -- inlines need to be hidden from CINT 00095 //============================================================================= 00096 00097 inline Bool_t UgliScintPlnHandle::IsValid() const 00098 { if ( !IsGeo() ) return (fUgliScintPlnNode) ? kTRUE : kFALSE; 00099 else return (fGeoScintPlnNode) ? kTRUE : kFALSE; } 00100 00101 inline Bool_t UgliScintPlnHandle::IsFrozen() const 00102 { if ( !IsGeo() ) return fUgliScintPlnNode->GetUgliGeometry()->IsFrozen(); 00103 else return fGeoScintPlnNode->GetGeoGeometry()->IsFrozen(); } 00104 00105 inline Int_t UgliScintPlnHandle::NumberOfStrips() const 00106 { if ( !IsGeo() ) return fUgliScintPlnNode->NumberOfStrips(); 00107 else return fGeoScintPlnNode->NumberOfStrips(); } 00108 00109 inline Float_t UgliScintPlnHandle::GetZRotRelSteelRad() const 00110 { if ( !IsGeo() ) return fUgliScintPlnNode->GetZRotRelSteelRad(); 00111 else return fGeoScintPlnNode->GetZRotRelSteelRad(); } 00112 00113 inline Float_t UgliScintPlnHandle::GetX0RelSteel() const 00114 { if ( !IsGeo() ) return fUgliScintPlnNode->GetX0RelSteel(); 00115 else return (fGeoScintPlnNode->GetX0RelSteel())*Munits::cm; } 00116 00117 inline Float_t UgliScintPlnHandle::GetY0RelSteel() const 00118 { if ( !IsGeo() ) return fUgliScintPlnNode->GetY0RelSteel(); 00119 else return (fGeoScintPlnNode->GetY0RelSteel())*Munits::cm; } 00120 00121 inline void UgliScintPlnHandle::RotateRelSteelBy(Float_t deltaRadians) 00122 { SetZRotRelSteelRad(GetZRotRelSteelRad()+deltaRadians); } 00123 00124 inline void UgliScintPlnHandle::ShiftXY0RelSteelBy(Float_t dx, Float_t dy) 00125 { SetXY0RelSteel((GetX0RelSteel()+dx)/Munits::cm, 00126 (GetY0RelSteel()+dy)/Munits::cm); } 00127 00128 #endif /* __CINT__ */ 00129 #endif // UGLISCINTPLNHANDLE_H
1.3.9.1