00001
00030 #include <iostream>
00031 #include <ostream>
00032
00033 #include "TList.h"
00034
00035 #include "StMuDSTMaker/COMMON/StMuEvent.h"
00036 #include "StMuDSTMaker/COMMON/StMuTrack.h"
00037
00038 #include "EEmcTower.h"
00039 #include "EEmcTTMatch.h"
00040
00041 #if !defined(ST_NO_NAMESPACES)
00042 using std::ostream;
00043 #endif
00044
00045
00046 ClassImp(EEmcTTMatch);
00047
00048
00050 EEmcTTMatch::EEmcTTMatch()
00051 {
00052 mTower = NULL;
00053 mTracks = new TList();
00054 }
00055
00056
00058 EEmcTTMatch::~EEmcTTMatch()
00059 {
00060 if(mTracks) {
00061 mTracks->Clear();
00062 delete mTracks;
00063 }
00064 }
00065
00066
00068 void
00069 EEmcTTMatch::Clear(Option_t *opt)
00070 {
00071 mTower = NULL;
00072 mTracks->Clear();
00073 }
00074
00075
00077 void
00078 EEmcTTMatch::Add(EEmcTower *t)
00079 {
00080 mTower = t;
00081 }
00082
00083
00085 void
00086 EEmcTTMatch::Add(StMuTrack *t)
00087 {
00088 mTracks->Add(t);
00089 }
00090
00091
00092
00094 Int_t
00095 EEmcTTMatch::Matches()
00096 {
00097 return mTracks->GetSize();
00098 }
00099
00100
00101
00103 Bool_t
00104 EEmcTTMatch::ExtrapolateToZ(const StMuTrack *track, const double z, TVector3 &r)
00105 {
00106 const double kMinDipAngle = 1.0e-13;
00107
00108 StPhysicalHelixD helix = track->helix();
00109 double dipAng = helix.dipAngle();
00110 double z0 = helix.origin().z();
00111 if(dipAng<kMinDipAngle) return kFALSE;
00112 double s = ( z - z0 ) / sin(dipAng) ;
00113 StThreeVectorD hit = helix.at(s);
00114 r.SetXYZ(hit.x(),hit.y(),hit.z());
00115 return kTRUE;
00116 }
00117
00118
00119
00121 ostream&
00122 EEmcTTMatch::Out(ostream &out ) const
00123 {
00124 out << *mTower ;
00125 StMuTrack *track;
00126 TIter nextTrack(mTracks);
00127 while((track=(StMuTrack *)nextTrack())) out << *track;
00128 return out;
00129 }
00130
00131
00132
00133
00134
00135 ostream& operator<<(ostream &out, const StMuTrack &t ) {
00136 out << "<StMuTrack";
00137 out << " ORIGIN=\"" << t.helix().origin() << "\"";
00138 out << " MOMENTUM=\"" << t.momentum() << "\"";
00139 out << "/>\n";
00140 return out;
00141 }
00142
00143 ostream& operator<<(ostream &out, const EEmcTTMatch &m ) {
00144 return m.Out(out);
00145 }