00001 #include "MessageService/MsgService.h"
00002 #include "StupidStripHandle.h"
00003 #include "StupidGeomHandle.h"
00004 #include "TMath.h"
00005
00006 ClassImp(StupidStripHandle)
00007
00008 CVSID("$Id: StupidStripHandle.cxx,v 1.7 2007/11/11 04:42:35 rhatcher Exp $");
00009
00010 Bool_t StupidStripHandle::fVetoBuilt = false;
00011 std::map<int,StupidStripHandle::stripData> StupidStripHandle::fVeto;
00012
00013 Float_t
00014 StupidStripHandle::GetHalfLength() const
00015 {
00016 if(fSEId.GetDetector()==Detector::kCalDet) return 0.5;
00017 else if(fSEId.GetDetector()==Detector::kFar) {
00018 if(fSEId.GetPlane()>528) {
00019 return fVeto[fSEId.GetPlane()*100+fSEId.GetStrip()].length;
00020 }
00021 int strip = fSEId.GetStrip();
00022 if(strip<56) return 1.750 + (float)(strip)*(0.0406586);
00023 else if(strip>136) return 9.55934 - (float)(strip)*(0.0406727);
00024 else return 4.0;
00025 } else if(fSEId.GetDetector()==Detector::kNear) {
00026
00027
00028
00029 float strip = (float)fSEId.GetStrip();
00030 if(fSEId.GetPlaneCoverage()==PlaneCoverage::kNearPartial) {
00031 if(fSEId.GetPlaneView()==PlaneView::kU) {
00032
00033 if(strip<21) return 0.99878 + 0.0205*strip;
00034 else if(strip<38) return 1.416;
00035 else return 2.19381 - 0.0206525*strip;
00036 } else {
00037
00038 if (strip<32) return 0.769 + 0.020667*strip;
00039 else if(strip<49) return 1.416;
00040 else return 2.413 - 0.0205*strip;
00041 }
00042 } else {
00043 if(fSEId.GetPlaneView()==PlaneView::kU) {
00044
00045 if(strip<32) return 1.33961 + 0.02058*strip;
00046 else if(strip<66) return 2.002;
00047 else return 4.73129 - 0.0412069*strip;
00048 } else {
00049
00050 if (strip<32) return 0.69301 + 0.0412069*strip;
00051 else if(strip<66) return 2.002;
00052 else return 3.3569 - 0.0205762*strip;
00053 }
00054 }
00055 }
00056 return 0;
00057 }
00058
00059
00060 TVector3
00061 StupidStripHandle::GlobalPos(const Float_t ,
00062 const Bool_t onWLS) const
00063 {
00064 if(onWLS) MSG("Stupid",Msg::kWarning)
00065 << "Warning: StupidStripHandle::GlobalPos doesn't know anything about WLS."
00066 << endl;
00067 TVector3 retval;
00068 if(fSEId.GetDetector()==Detector::kCalDet) {
00069
00070 retval.SetZ(0.05227 + 0.0594041*(float)(fSEId.GetPlane()));
00071 float l = -0.471625 + (float)(fSEId.GetStrip())*(0.041);
00072
00073 if(fSEId.GetPlaneView()==PlaneView::kU) {
00074 retval.SetX(l);
00075 retval.SetY(0);
00076 return retval;
00077 };
00078 if(fSEId.GetPlaneView()==PlaneView::kV) {
00079 retval.SetX(0);
00080 retval.SetY(l);
00081 return retval;
00082 };
00083
00084
00085 if(fSEId.GetPlaneView()==PlaneView::kB) {
00086 retval.SetY(-1.6);
00087 retval.SetX(-0.476625 + (float)(fSEId.GetStrip())*0.0410);
00088 switch(fSEId.GetPlane()) {
00089 case 61:
00090 retval.SetZ(0.5);
00091 return retval;
00092 break;
00093 case 62:
00094 retval.SetZ(1.5);
00095 return retval;
00096 break;
00097 case 63:
00098 retval.SetZ(2.0);
00099 return retval;
00100 break;
00101 case 64:
00102 retval.SetZ(3.0);
00103 return retval;
00104 break;
00105 };
00106 }
00107 }
00108 else if(fSEId.GetDetector()==Detector::kFar) {
00109
00110
00111
00112 if(fSEId.GetPlane()>528) {
00113
00114 retval.SetXYZ(
00115 fVeto[fSEId.GetPlane()*100+fSEId.GetStrip()].x,
00116 fVeto[fSEId.GetPlane()*100+fSEId.GetStrip()].y,
00117 fVeto[fSEId.GetPlane()*100+fSEId.GetStrip()].z );
00118
00119 return retval;
00120 }
00121
00122
00123 retval.SetZ(-0.0351982 + 0.0594*(float)(fSEId.GetPlane()));
00124
00125
00126 if(fSEId.GetPlane()>249) retval.SetZ(1.4945 + 0.0594*(float)(fSEId.GetPlane()));
00127
00128
00129 retval.SetY(- 2.7965 + 0.029130*(float)(fSEId.GetStrip()));
00130 if(fSEId.GetPlaneView()==PlaneView::kU) {
00131 retval.SetX( -2.7965 + 2.9130e-02*(float)(fSEId.GetStrip()));
00132 return retval;
00133 };
00134 if(fSEId.GetPlaneView()==PlaneView::kV) {
00135 retval.SetX( 2.7965 - 2.9130e-02*(float)(fSEId.GetStrip()));
00136 return retval;
00137 };
00138
00139 } else if(fSEId.GetDetector()==Detector::kNear) {
00140
00141
00142
00143 retval.SetZ(-0.0240 + 0.0592036*(float)(fSEId.GetPlane()) );
00144
00145 float s = fSEId.GetStrip();
00146
00147 if(fSEId.GetPlaneCoverage()==PlaneCoverage::kNearPartial) {
00148 if(fSEId.GetPlaneView()==PlaneView::kU) {
00149
00150 if(s<21) { retval.SetX(1.162+0.01550*s); retval.SetY(-1.277+0.04265*s);}
00151 else if(s<38) { retval.SetX(0.876+0.02925*s); retval.SetY(-0.999+0.02925*s);}
00152 else { retval.SetX(1.399+0.01514*s); retval.SetY(-1.518+0.04314*s);}
00153 } else {
00154
00155 if (s<32) { retval.SetX(2.4445-0.01514*s); retval.SetY(-1.4583+0.04316*s);}
00156 else if(s<49){ retval.SetX(2.8943-0.02924*s); retval.SetY(-1.0187+0.02925*s);}
00157 else { retval.SetX(2.2321-0.01550*s); retval.SetY(-1.6654+0.04265*s);}
00158 }
00159 } else {
00160 if(fSEId.GetPlaneView()==PlaneView::kU) {
00161
00162 if(s<32) { retval.SetX(-0.847+0.04365*s); retval.SetY(-0.957+0.01455*s); }
00163 else if(s<66) { retval.SetX(-0.379+0.02911*s); retval.SetY(-1.425+0.02911*s); }
00164 else { retval.SetX(-0.369+0.02915*s); retval.SetY(-1.438+0.02912*s); }
00165 } else {
00166
00167 if (s<32) { retval.SetX(2.487-0.02914*s); retval.SetY(-1.416+0.02914*s); }
00168 else if(s<66) { retval.SetX(2.475-0.02912*s); retval.SetY(-1.428+0.02912*s); }
00169 else { retval.SetX(4.432-0.04367*s); retval.SetY(-4.682+0.01456*s); }
00170 }
00171 }
00172
00173 return retval;
00174 }
00175
00176 MSG("Stupid",Msg::kWarning) << "Warning: StupidGeometryHandle::GlobalPos doesn't know about plane " << fSEId.AsString() << endl;
00177 return TVector3(0,0,0);
00178 }
00179
00180 Float_t StupidStripHandle::GetTPos() const
00181 {
00182
00183 Float_t tpos = -999999;
00184
00185 TVector3 center = GlobalPos(0.0,kFALSE);
00186
00187 const Double_t rsqrt2 = 1.0/TMath::Sqrt(2.);
00188
00189 switch (fSEId.GetPlaneView()) {
00190 case PlaneView::kX:
00191 tpos = center.Dot(TVector3(1.,0.,0.));
00192 break;
00193 case PlaneView::kY:
00194 tpos = center.Dot(TVector3(0.,1.,0.));
00195 break;
00196 case PlaneView::kU:
00197 if (fSEId.GetDetector() != Detector::kCalib) {
00198 tpos = center.Dot(TVector3(rsqrt2,rsqrt2,0.));
00199 } else {
00200
00201 tpos = center.Dot(TVector3(1.,0.,0.));
00202 }
00203 break;
00204 case PlaneView::kV:
00205 if (fSEId.GetDetector() != Detector::kCalib) {
00206 tpos = center.Dot(TVector3(-rsqrt2,rsqrt2,0.));
00207 } else {
00208
00209 tpos = center.Dot(TVector3(0.,1.,0.));
00210 }
00211 break;
00212 case PlaneView::kA:
00213 tpos = center.Dot(TVector3(0.,0.,1.));
00214 break;
00215 case PlaneView::kB:
00216 tpos = center.Dot(TVector3(1.,0.,0.));
00217 break;
00218 default:
00219 MSG("Stupid",Msg::kWarning)
00220 << "StupidStripNode::GetTPos unknown view "
00221 << PlaneView::AsString(fSEId.GetPlaneView()) << endl;
00222 }
00223
00224 return tpos;
00225 }
00226
00227
00228 Float_t StupidStripHandle::DistanceAlong(const PlexStripEndId& ) const
00229 {
00230
00231 MSG("Stupid",Msg::kFatal)
00232 << "StupidStripNode::DistanceAlong not yet implemented" << endl;
00233 return 0;
00234 }
00235
00236
00237 TVector3 StupidStripHandle::Intersection(const PlexStripEndId& ) const
00238 {
00239
00240 MSG("Stupid",Msg::kFatal)
00241 << "StupidStripNode::Intersection not yet implemented" << endl;
00242 return TVector3();
00243 }
00244
00245
00246 void StupidStripHandle::BuildVetoData()
00247 {
00248 if(fVetoBuilt) return;
00249 #include "StupidVetoCode.cinc"
00250 fVetoBuilt = true;
00251 }