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

UgliStripHandle.h

Go to the documentation of this file.
00001 
00002 // $Id: UgliStripHandle.h,v 1.14 2006/04/07 18:03:14 kordosky Exp $
00003 //
00004 // UgliStripHandle
00005 //
00006 // UgliStripHandle is the handle to a single strip
00007 //
00008 // Author:  R. Hatcher 2000.11.15
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    // Create handles from the actual node object, copy and assignment
00030    UgliStripHandle(UgliStripNode* stripNode);
00031    UgliStripHandle(GeoStripNode* stripNode);
00032    UgliStripHandle(const UgliStripHandle& that);
00033    UgliStripHandle& operator=(const UgliStripHandle& that);
00034 
00035    // One should avoid creating UgliStripHandle without a reference 
00036    // (be sure to test IsValid())
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    // world coordinate for point along centerline or WLS fiber
00062    virtual TVector3       GlobalPos(const Float_t alongLength, 
00063                                     const Bool_t onWLS=false,
00064                                     const Bool_t globalInXYZ=true) const;
00065    // convert between world and nominal cell (box) coordinates
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    // use position of orthogonal strip to calculate an intersection point
00072    virtual Float_t        DistanceAlong(const PlexStripEndId& orthogonalStrip) const;
00073    virtual TVector3       Intersection(const PlexStripEndId& orthogonalStrip) const;
00074 
00075    // return the Scint. Module/Plane in which this strip is located.
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    // these are only allowed if the copy is modifiable
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    // The actual node being referenced
00093    UgliStripNode* fUgliStripNode;
00094    GeoStripNode*  fGeoStripNode;
00095    
00096  private:
00097 
00098    ClassDef(UgliStripHandle,2)
00099 
00100 };
00101 
00102 #ifndef __CINT__
00103 //=============================================================================
00104 // Implementation details -- inlines need to be hidden from CINT
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 /* __CINT__ */
00191 #endif // UGLISTRIPHANDLE_H

Generated on Sat Nov 21 22:48:02 2009 for loon by  doxygen 1.3.9.1