00001
00002
00003
00004
00005 #include "reconstruction/data/RecoSiData.h"
00006
00007 #include "instrument/SiTracker.h"
00008 #include <algorithm>
00009 using namespace std;
00010
00011 class RecoSiData::Strip {
00012 private:
00013 friend class RecoSiData;
00014
00015 public:
00016 Strip () {}
00017
00018 private:
00019 Strip (Point p, Id m, unsigned int n, unsigned int t = 0)
00020 : stripIndex(n), stripType(t), pos(p), module(m)
00021 {}
00022
00023 unsigned int stripIndex;
00024 unsigned int stripType;
00025 Point pos;
00026 Id module;
00027 };
00028
00029
00030 RecoSiData::RecoSiData ()
00031 {
00032 for(int i = 0; i < SiTracker::numTrays(); i++) {
00033 xhitList.push_back(new vector<Strip>);
00034 yhitList.push_back(new vector<Strip>);
00035 }
00036 m_total_hits=0;
00037 }
00038
00039 RecoSiData::RecoSiData (unsigned int n)
00040 {
00041 for(unsigned i=0; i<n; i++) {
00042 xhitList.push_back(new vector<Strip>);
00043 yhitList.push_back(new vector<Strip>);
00044 }
00045 }
00046
00047
00048 RecoSiData::~RecoSiData ()
00049 {
00050 clear();
00051 for(unsigned i=0; i<xhitList.size(); i++) {
00052 delete xhitList[i];
00053 delete yhitList[i];
00054 }
00055
00056 }
00057
00058
00059 const SiData::Id& RecoSiData::moduleId (enum RecoSiData::Axis a,
00060 unsigned int tray,
00061 unsigned int n ) const
00062 {
00063 return a==X? (*xhitList[tray])[n].module
00064 : (*yhitList[tray])[n].module;
00065 }
00066
00067 void RecoSiData::load (const SiDetector& plane, idents::ModuleId moduleId)
00068 {
00069 static double tray_max=48.10, tray_spacing=3.20;
00070
00071 CoordTransform T
00072 = plane.localToGlobal();
00073
00074
00075 Vector a(1,0,0),b(1,0,0); a.transform(T);
00076 double rot = a*b;
00077 Axis axis = (rot>0.5)? X : Y;
00078 Point p(0,0,0); p.transform(T);
00079 double z = p.z();
00080 int tray = static_cast<int>((tray_max-z)/tray_spacing);
00081 tray = tray< 0? 0: tray;
00082 tray = tray>17? 17: tray;
00083
00084
00085 for( SiDetector::const_iterator it3=plane.begin();
00086 it3!=plane.end(); ++it3) {
00087 int wire_num = (*it3).index();
00088 int wire_typ = (*it3).noise();
00089
00090 if( wire_typ !=0 ) continue;
00091
00092 Point p = Point(SiDetector::localX(wire_num),0,0);
00093 p.transform(T);
00094 if( axis == X) {
00095 xhitList[tray]->push_back(
00096 Strip(p, moduleId, wire_num, wire_typ));
00097 } else {
00098 yhitList[tray]->push_back(
00099 Strip(p, moduleId, wire_num, wire_typ));
00100 }
00101 m_total_hits++;
00102 }
00103 }
00104
00105 void RecoSiData::clear () {
00106 for(unsigned i=0; i<xhitList.size(); i++) {
00107 xhitList[i]->clear();
00108 yhitList[i]->clear();
00109 }
00110 m_total_hits=0;
00111 }
00112
00113 int RecoSiData::nHits (enum RecoSiData::Axis a, int tray) const
00114 {
00115 return a==X? xhitList[tray]->size()
00116 : yhitList[tray]->size() ;
00117
00118 }
00119
00120 Point RecoSiData::hit (enum RecoSiData::Axis a,
00121 unsigned int tray,
00122 unsigned int n ) const
00123 {
00124 return a==X? (*xhitList[tray])[n].pos
00125 : (*yhitList[tray])[n].pos;
00126 }
00127
00128 unsigned int RecoSiData::hitId (enum RecoSiData::Axis a,
00129 unsigned int tray,
00130 unsigned int n ) const
00131 {
00132 return a==X? (*xhitList[tray])[n].stripIndex
00133 : (*yhitList[tray])[n].stripIndex;
00134 }
00135 #if 0
00136 unsigned int RecoSiData::hitType (enum RecoSiData::Axis a,
00137 unsigned int tray,
00138 unsigned int n ) const
00139 {
00140 return a==X? (*xhitList[tray])[n].stripType
00141 : (*yhitList[tray])[n].stripType;
00142 }
00143 #endif
00144 int RecoSiData::totalHits () const
00145 {
00146 return m_total_hits;
00147 }
00148
00149 void RecoSiData::readData (istream& in)
00150 {
00151 int x, y, Z;
00152
00153 int numLayers;
00154 in>> numLayers;
00155 if( in.eof() )
00156 return;
00157
00158 for(int i=0; i<numLayers; i++) {
00159 int numX;
00160 in>>numX;
00161 unsigned int mod;
00162 unsigned st, type;
00163 int j;
00164 for( j=0; j<numX; j++) {
00165 in>>mod>>st>>type>>x>>y>>Z;
00166 xhitList[i]->push_back(
00167 Strip(Point(x/1e3, y/1e3, Z/1e3), idents::ModuleId(mod), st, type));
00168 }
00169 int numY;
00170 in>>numY;
00171 for(j=0; j<numY; j++) {
00172 in>>mod>>st>>type>>x>>y>>Z;
00173 yhitList[i]->push_back(
00174 Strip(Point(x/1e3, y/1e3, Z/1e3), idents::ModuleId(mod), st, type));
00175 }
00176 }
00177 }
00178
00179 void RecoSiData::writeData (ostream& out)
00180 {
00181 int numLayers = xhitList.size();
00182
00183 out<<numLayers<<'\n';
00184
00185 for(int i=0; i<numLayers; i++) {
00186 int numX = nHits(X, i);
00187 out<<numX<<'\n';
00188 int j;
00189 for(j=0; j<numX; j++) {
00190 out<<moduleId(X, i, j)
00191 <<' '<<hitId(X, i, j) <<' '
00192
00193 <<int(1e3*hit(X, i, j).x())<<' '
00194 <<int(1e3*hit(X, i, j).y())<<' '
00195 <<int(1e3*hit(X, i, j).z())<<'\n';
00196 }
00197 int numY = nHits(Y, i);
00198 out<<numY<<'\n';
00199 for(j=0; j<numY; j++) {
00200 out<<moduleId(Y, i, j)
00201 <<' '<<hitId(Y, i, j)<<' '
00202
00203 <<int(1e3*hit(Y, i, j).x())<<' '
00204 <<int(1e3*hit(Y, i, j).y())<<' '
00205 <<int(1e3*hit(Y, i, j).z())<<'\n';
00206 }
00207 }
00208 }
00209
00210 void RecoSiData::printOn (ostream& cout) const
00211 {
00212 unsigned tray, i;
00213 cout << "\nRecoSiData:\n";
00214 for(tray=0; tray < xhitList.size() && tray < yhitList.size(); tray++)
00215 {
00216 unsigned nx= nHits(X,tray),
00217 ny= nHits(Y,tray);
00218 if( nx==0 && ny==0 ) continue;
00219 cout << tray << "X";
00220 for( i =0; i<nx; i++)
00221 cout << '\t'<< hit(X,tray,i)
00222
00223 << '\n';
00224 cout << tray << "Y";
00225 for( i =0; i<ny; i++)
00226 cout << '\t'<< hit(Y,tray,i)
00227
00228 << '\n';
00229 }
00230 return;
00231 }
00232
00233
00234
00235
00236
00237