#ifndef Geom1_WSTube_H
#define Geom1_WSTube_H
#include <Glasses/WSSeed.h>
#include <TLorentzVector.h>
#include <TRandom.h>
#include <TMatrixD.h>
class WSTube : public WSSeed
{
MAC_RNR_FRIENDS(WSTube);
public:
enum ConnState_e { CS_Disconnected, CS_Connecting,
CS_Connected, CS_Disconnecting };
enum TransSource_e { TS_Links, TS_Transes };
struct Traveler {
ZNode* fNode;
Float_t fPosition;
Float_t fVelocity;
void* fUserData;
Bool_t fShown;
Traveler() : fNode(0) {}
Traveler(ZNode* n, Float_t p, Float_t v, void* ud=0) :
fNode(n), fPosition(p), fVelocity(v), fUserData(0), fShown(false) {}
virtual ~Traveler() {}
ClassDef(Traveler, 1);
};
private:
void _init();
protected:
TransSource_e mTransSource;
ZLink<ZNode> mNodeA;
ZLink<ZNode> mNodeB;
ZTrans mTransA;
ZTrans mTransB;
Bool_t bWeakConnect;
Float_t mDefWidth;
Float_t mDefSpread;
Float_t mDefTension;
TLorentzVector mVecA;
TLorentzVector mSgmA;
TLorentzVector mVecB;
TLorentzVector mSgmB;
TRandom mRnd;
void define_direction(ZTrans& t, TVector3& dr,
TLorentzVector& vec, TLorentzVector& sgm);
public:
WSTube(const Text_t* n="WSTube", const Text_t* t=0) :
WSSeed(n,t) { _init(); }
virtual ~WSTube();
virtual void AdEnlightenment();
virtual void AdEndarkenment();
protected:
Float_t mDefVelocity;
Float_t mMinWaitTime;
ConnState_e mConnectionStauts;
Float_t m_conn_time;
Float_t m_conn_vel;
TMatrixD* m_conn_cof;
void connect(WSPoint*& ap, WSPoint*& bp);
void disconnect();
void assert_disconnect(const Exc_t& eh);
void conn_travel(WSPoint* p, Double_t t);
public:
void Connect();
void Disconnect();
void AnimateConnect(Float_t velocity=0);
void AnimateDisconnect(Float_t velocity=0, Bool_t delay_p=false);
protected:
list<Traveler> m_traveler_list;
ZLink<AList> mTravelers;
public:
void TravelAtoB() { MakeTraveler( mDefVelocity); }
void TravelBtoA() { MakeTraveler(-mDefVelocity); }
void MakeTraveler(Float_t velocity=0, Float_t wait_time=0);
virtual void TimeTick(Double_t t, Double_t dt);
#include "WSTube.h7"
ClassDef(WSTube, 1);
};
#endif