00001
00002
00003
00004
00005
00006
00007
00008
00009
00011
00012 #ifndef UGLISTRIPHANDLE_H
00013 #define UGLISTRIPHANDLE_H
00014 class UgliStripHandle;
00015 class UgliStripABC;
00016
00017 #include "GeoGeometry/GeoStripNode.h"
00018 #include "GeoGeometry/GeoGeometry.h"
00019 #include "UgliGeometry/UgliStripABC.h"
00020 #include "UgliGeometry/UgliGeomHandle.h"
00021 #include "UgliGeometry/UgliStripNode.h"
00022 #include "UgliGeometry/UgliScintMdlHandle.h"
00023 #include "UgliGeometry/UgliScintPlnHandle.h"
00024
00025 class UgliStripHandle : public UgliStripABC {
00026
00027 public:
00028
00029
00030 UgliStripHandle(UgliStripNode* stripNode);
00031 UgliStripHandle(GeoStripNode* stripNode);
00032 UgliStripHandle(const UgliStripHandle& that);
00033 UgliStripHandle& operator=(const UgliStripHandle& that);
00034
00035
00036
00037 UgliStripHandle();
00038
00039 virtual ~UgliStripHandle();
00040
00041 virtual Bool_t IsGeo() const { return (fGeoStripNode != 0); }
00042 virtual Bool_t IsValid() const;
00043 virtual Bool_t IsFrozen() const;
00044
00045 virtual PlexStripEndId GetSEId() const;
00046
00047 virtual Float_t GetHalfLength() const;
00048 virtual Float_t GetHalfThickness() const;
00049 virtual Float_t GetHalfWidth() const;
00050
00051 virtual Float_t GetTPos(Float_t orthCoord=9999.) const;
00052
00053 virtual Float_t PartialLength(const StripEnd::StripEnd_t end) const;
00054 virtual Bool_t IsMirrored(const StripEnd::StripEnd_t end) const;
00055 virtual Float_t WlsPigtail(const StripEnd::StripEnd_t end) const;
00056 virtual Float_t WlsBypass() const;
00057 virtual Float_t ClearFiber(const StripEnd::StripEnd_t end) const;
00058 virtual Float_t TotalAttenuation(const StripEnd::StripEnd_t end,
00059 const Float_t alongLength) const;
00060
00061
00062 virtual TVector3 GlobalPos(const Float_t alongLength,
00063 const Bool_t onWLS=false,
00064 const Bool_t globalInXYZ=true) const;
00065
00066 virtual TVector3 GlobalToLocal(const TVector3& global,
00067 const Bool_t globalInXYZ=true) const;
00068 virtual TVector3 LocalToGlobal(const TVector3& local,
00069 const Bool_t globalInXYZ=true) const;
00070
00071
00072 virtual Float_t DistanceAlong(const PlexStripEndId& orthogonalStrip) const;
00073 virtual TVector3 Intersection(const PlexStripEndId& orthogonalStrip) const;
00074
00075
00076 UgliScintMdlHandle GetScintMdlHandle() const;
00077 UgliScintPlnHandle GetScintPlnHandle() const;
00078
00079 Float_t GetZRotRelMdlRad() const;
00080 Float_t GetLPosRelMdl() const;
00081 Float_t GetTPosRelMdl() const;
00082
00083
00084 Bool_t AttemptSet(const char* what="?") const;
00085 void SetZRotRelMdlRad(Float_t radians);
00086 void SetLTPosRelMdl(Float_t lpos, Float_t tpos);
00087 void RotateRelMdlBy(Float_t deltaRadians);
00088 void ShiftLTPosRelMdlBy(Float_t dlpos, Float_t dtpos);
00089
00090 protected:
00091
00092
00093 UgliStripNode* fUgliStripNode;
00094 GeoStripNode* fGeoStripNode;
00095
00096 private:
00097
00098 ClassDef(UgliStripHandle,2)
00099
00100 };
00101
00102 #ifndef __CINT__
00103
00104
00105
00106
00107 inline Bool_t UgliStripHandle::IsValid() const
00108 { if ( !IsGeo() ) return (fUgliStripNode) ? kTRUE : kFALSE;
00109 else return (fGeoStripNode) ? kTRUE : kFALSE; }
00110
00111 inline Bool_t UgliStripHandle::IsFrozen() const
00112 { if ( !IsGeo() ) return fUgliStripNode->GetUgliGeometry()->IsFrozen();
00113 else return fGeoStripNode->GetGeoGeometry()->IsFrozen();}
00114
00115 inline PlexStripEndId UgliStripHandle::GetSEId() const
00116 { if ( !IsGeo() ) return fUgliStripNode->GetSEId();
00117 else return fGeoStripNode->GetSEId(); }
00118
00119 inline Float_t UgliStripHandle::GetHalfLength() const
00120 { if ( !IsGeo() ) return fUgliStripNode->GetHalfLength();
00121 else return (fGeoStripNode->GetHalfLength())*Munits::cm; }
00122
00123 inline Float_t UgliStripHandle::GetHalfThickness() const
00124 { if ( !IsGeo() ) return fUgliStripNode->GetHalfThickness();
00125 else return (fGeoStripNode->GetHalfThickness())*Munits::cm; }
00126
00127 inline Float_t UgliStripHandle::GetHalfWidth() const
00128 { if ( !IsGeo() ) return fUgliStripNode->GetHalfWidth();
00129 else return (fGeoStripNode->GetHalfWidth())*Munits::cm; }
00130
00131 inline Float_t UgliStripHandle::GetTPos(Float_t orthCoord) const
00132 { if ( !IsGeo() ) return fUgliStripNode->GetTPos(orthCoord);
00133 else return (fGeoStripNode->GetTPos(orthCoord/Munits::cm))*Munits::cm; }
00134
00135 inline Float_t UgliStripHandle::PartialLength(const StripEnd::StripEnd_t end) const
00136 { if ( !IsGeo() ) return fUgliStripNode->PartialLength(end);
00137 else return (fGeoStripNode->PartialLength(end))*Munits::cm; }
00138
00139 inline Bool_t UgliStripHandle::IsMirrored(const StripEnd::StripEnd_t end) const
00140 { if ( !IsGeo() ) return fUgliStripNode->IsMirrored(end);
00141 else return fGeoStripNode->IsMirrored(end); }
00142
00143 inline Float_t UgliStripHandle::WlsPigtail(const StripEnd::StripEnd_t end) const
00144 { if ( !IsGeo() ) return fUgliStripNode->WlsPigtail(end);
00145 else return (fGeoStripNode->WlsPigtail(end))*Munits::cm; }
00146
00147 inline Float_t UgliStripHandle::WlsBypass() const
00148 { if ( !IsGeo() ) return fUgliStripNode->WlsBypass();
00149 else return (fGeoStripNode->WlsBypass())*Munits::cm; }
00150
00151 inline Float_t UgliStripHandle::ClearFiber(const StripEnd::StripEnd_t end) const
00152 { if ( !IsGeo() ) return fUgliStripNode->ClearFiber(end);
00153 else return (fGeoStripNode->ClearFiber(end))*Munits::cm; }
00154
00155 inline Float_t UgliStripHandle::TotalAttenuation(const StripEnd::StripEnd_t end, const Float_t alongLength) const
00156 { if ( !IsGeo() ) return fUgliStripNode->TotalAttenuation(end,alongLength);
00157 else return fGeoStripNode->TotalAttenuation(end,
00158 alongLength/Munits::cm); }
00159
00160 inline Float_t UgliStripHandle::DistanceAlong(const PlexStripEndId& orthogonalStrip) const
00161 { if ( !IsGeo() ) return fUgliStripNode->DistanceAlong(orthogonalStrip);
00162 else return (fGeoStripNode->DistanceAlong(orthogonalStrip)*Munits::cm); }
00163
00164 inline TVector3 UgliStripHandle::Intersection(const PlexStripEndId& orthogonalStrip) const
00165 { if ( !IsGeo() ) return fUgliStripNode->Intersection(orthogonalStrip);
00166 else {
00167 return (fGeoStripNode->Intersection(orthogonalStrip) *= Munits::cm);
00168 }
00169 }
00170
00171 inline Float_t UgliStripHandle::GetZRotRelMdlRad() const
00172 { if ( !IsGeo() ) return fUgliStripNode->GetZRotRelMdlRad();
00173 else return fGeoStripNode->GetZRotRelMdlRad(); }
00174
00175 inline Float_t UgliStripHandle::GetLPosRelMdl() const
00176 { if ( !IsGeo() ) return fUgliStripNode->GetLPosRelMdl();
00177 else return (fGeoStripNode->GetLPosRelMdl())*Munits::cm; }
00178
00179 inline Float_t UgliStripHandle::GetTPosRelMdl() const
00180 { if ( !IsGeo() ) return fUgliStripNode->GetTPosRelMdl();
00181 else return (fGeoStripNode->GetTPosRelMdl())*Munits::cm; }
00182
00183 inline void UgliStripHandle::RotateRelMdlBy(Float_t deltaRadians)
00184 { SetZRotRelMdlRad(GetZRotRelMdlRad()+deltaRadians); }
00185
00186 inline void UgliStripHandle::ShiftLTPosRelMdlBy(Float_t dlpos, Float_t dtpos)
00187 { SetLTPosRelMdl((GetLPosRelMdl()+dlpos)/Munits::cm,
00188 (GetTPosRelMdl()+dtpos)/Munits::cm); }
00189
00190 #endif
00191 #endif // UGLISTRIPHANDLE_H