Main Page   Namespace List   Class Hierarchy   Compound List   File List   Compound Members   File Members  

RecoSiData.cxx

Go to the documentation of this file.
00001 // $Id: RecoSiData.cxx,v 1.2 2000/12/11 16:38:45 burnett Exp $
00002 //
00003 // Implement access to Silicon strip data
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(); // for converting the coords following
00073     
00074     // figure out which tray this is from the transform
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     // final loop over hits
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         //************** remove noise  *********************
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() )  // this is the first one
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 //                <<hitType(X, i, j)<<' '
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 //                <<hitType(Y, i, j)<<' '
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 //            <<"\t " << hitType(X,tray,i) 
00223             << '\n';
00224         cout <<  tray << "Y";
00225         for( i =0; i<ny; i++)
00226             cout << '\t'<< hit(Y,tray,i)  
00227 //            <<"\t " << hitType(Y,tray,i) 
00228             << '\n';
00229     }
00230     return;
00231 }
00232 
00233 // Class RecoSiData_Hit
00234 
00235 
00236 
00237 

Generated at Wed Nov 21 12:20:45 2001 by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000