00001 #include "Stiostream.h"
00002 #include <cmath>
00003 #include <stdio.h>
00004 #include "StiSvtLayerLadder.h"
00005 #include "StEventTypes.h"
00006 #include "StEvent.h"
00007 #include "Sti/Base/Factory.h"
00008 #include "StiSvt/StiSvtHitLoader.h"
00009 #include "Sti/StiHit.h"
00010 #include "Sti/StiTrack.h"
00011 #include "Sti/StiHitContainer.h"
00012 #include "Sti/StiDetectorBuilder.h"
00013 #include "Sti/StiDetector.h"
00014 #include "Sti/StiHitTest.h"
00015
00016 StiSvtHitLoader::StiSvtHitLoader()
00017 : StiHitLoader<StEvent,StiDetectorBuilder>("SvtHitLoader")
00018 {}
00019
00020 StiSvtHitLoader::StiSvtHitLoader(StiHitContainer* hitContainer,
00021 Factory<StiHit>*hitFactory,
00022 StiDetectorBuilder*detector)
00023 : StiHitLoader<StEvent,StiDetectorBuilder>("SvtHitLoader",hitContainer,hitFactory,detector)
00024 {}
00025
00026 StiSvtHitLoader::~StiSvtHitLoader()
00027 {}
00028
00029 void StiSvtHitLoader::loadHits(StEvent* source,
00030 Filter<StiTrack> * trackFilter,
00031 Filter<StiHit> * hitFilter)
00032 {
00033 cout <<"StiSvtHitLoader::loadHits() - Started"<<endl;
00034 if (!source) throw runtime_error("StiSvtHitLoader::loadHits() -F- source==0 ");
00035 StSvtHitCollection* svthits = source->svtHitCollection();
00036 if (!svthits)
00037 {
00038 cout << "StiSvtHitLoader::loadHits(StEvent* source) -W- NO SVT hits"<<endl;
00039 return;
00040 }
00041 StSvtHit* hit;
00042 StiHit* stiHit;
00043 StiDetector* detector;
00044 if (!_hitContainer) throw runtime_error("StiSvtHitLoader::loadHits() -F- _hitContainer==0 ");
00045 int hitCounter = 0;
00046 for (unsigned int barrel=0; barrel<svthits->numberOfBarrels(); ++barrel)
00047 {
00048 StSvtBarrelHitCollection* barrelhits = svthits->barrel(barrel);
00049 if (!barrelhits) continue;
00050 for (unsigned int ladder=0; ladder<barrelhits->numberOfLadders(); ++ladder)
00051 {
00052 StSvtLadderHitCollection* ladderhits = barrelhits->ladder(ladder);
00053 if (!ladderhits) continue;
00054 for (unsigned int wafer=0; wafer<ladderhits->numberOfWafers(); ++wafer)
00055 {
00056 StSvtWaferHitCollection* waferhits = ladderhits->wafer(wafer);
00057 if (!waferhits) continue;
00058 const StSPtrVecSvtHit& hits = waferhits->hits();
00059 StiHitTest hitTest;
00060 for (const_StSvtHitIterator it=hits.begin(); it!=hits.end(); ++it)
00061 {
00062 if (!*it) throw runtime_error("StiSvtHitLoader::loadHits() -W- *it==0!");
00063 hit = static_cast<StSvtHit*>(*it);
00064 if (!hit) throw runtime_error("StiSvtHitLoader::loadHits() -W- hit==0!");
00065 int svtLayer = hit->layer();
00066 int svtLadder = hit->ladder();
00067 int stilayer = getLayer(svtLayer);
00068 int stiladder = getLadder(svtLayer,svtLadder);
00069 detector = _detector->getDetector(stilayer,stiladder);
00070 if (!detector) throw runtime_error("StiSvtHitLoader::loadHits() -W- detector==0!");
00071 if (hit->flag()>=4) continue;
00072 if (hit->flag()< 0) continue;
00073 stiHit = _hitFactory->getInstance();
00074 stiHit->setGlobal(detector,hit,hit->position().x(),hit->position().y(),hit->position().z(),hit->charge() );
00075 hitTest.add(stiHit->x(),stiHit->y(),stiHit->z());
00076 _hitContainer->add( stiHit );
00077 hitCounter++;
00078 }
00079 if (hitTest.getN()< 10) continue;
00080 double w=hitTest.width();
00081 double dx = detector->getPlacement()->getNormalRadius()-hitTest.center()[0];;
00082 double ay = hitTest.yAngle()*180/3.1415;
00083 double az = hitTest.zAngle()*180/3.1415;
00084
00085 if (w< 0.1 && fabs(dx)<1 && fabs(ay)<1 && fabs(az)<1) continue;
00086 printf("**** SVT geom problem: barrel=%d ladder%d wafer%d\n",barrel,ladder,wafer);
00087 printf("**** SVT dX=%g aY=%g aZ=%g\n\n",dx,ay,az);
00088 }
00089 }
00090 }
00091 cout <<"StiSvtHitLoader::loadHits() -I- SVT Hits added:"<<hitCounter<<endl;
00092 cout <<"StiSvtHitLoader::loadHits() -I- Hit Container size:"<<_hitContainer->size()<<endl;
00093 cout <<"StiSvtHitLoader::loadHits() -I- Done"<<endl;
00094 }
00095
00096 #if 0
00097 int StiSvtHitLoader::getLayer(int svtLayer) const
00098 {
00099 int layer;
00100 switch (svtLayer)
00101 {
00102 case 1: layer = 0; break;
00103 case 2: layer = 1; break;
00104 case 3: layer = 2; break;
00105 case 4: layer = 3; break;
00106 case 5: layer = 4; break;
00107 case 6: layer = 5; break;
00108 default: throw runtime_error("StiSvtHitLoader:getLayer() -E- invalid argument");
00109 }
00110 return layer;
00111 }
00112
00113 int StiSvtHitLoader::getLadder(int svtLayer,int svtLadder) const
00114 {
00115 int layer;
00116 int ladder;
00117 switch (svtLayer)
00118 {
00119 case 1:
00120 switch (svtLadder)
00121 {
00122 case 2: layer = 0; ladder = 0;break;
00123 case 4: layer = 0; ladder = 1;break;
00124 case 6: layer = 0; ladder = 2;break;
00125 case 8: layer = 0; ladder = 3;break;
00126 default: throw runtime_error("StiSvtHitLoader:loadHits() -E- 1");
00127 }
00128 break;
00129 case 2:
00130 switch (svtLadder)
00131 {
00132 case 1: layer = 1; ladder = 0;break;
00133 case 3: layer = 1; ladder = 1;break;
00134 case 5: layer = 1; ladder = 2;break;
00135 case 7: layer = 1; ladder = 3;break;
00136 default: throw runtime_error("StiSvtHitLoader:loadHits() -E- 2");
00137 }
00138 break;
00139 case 3:
00140 switch (svtLadder)
00141 {
00142 case 2: layer = 2; ladder = 0;break;
00143 case 4: layer = 2; ladder = 1;break;
00144 case 6: layer = 2; ladder = 2;break;
00145 case 8: layer = 2; ladder = 3;break;
00146 case 10: layer = 2; ladder = 4;break;
00147 case 12: layer = 2; ladder = 5;break;
00148 default: throw runtime_error("StiSvtHitLoader:loadHits() -E- 3");
00149 }
00150 break;
00151 case 4:
00152 switch (svtLadder)
00153 {
00154 case 1: layer = 3; ladder = 0;break;
00155 case 3: layer = 3; ladder = 1;break;
00156 case 5: layer = 3; ladder = 2;break;
00157 case 7: layer = 3; ladder = 3;break;
00158 case 9: layer = 3; ladder = 4;break;
00159 case 11: layer = 3; ladder = 5;break;
00160 default: throw runtime_error("StiSvtHitLoader:loadHits() -E- 4");
00161 }
00162 break;
00163 case 5:
00164 switch (svtLadder)
00165 {
00166 case 2: layer = 4; ladder = 0;break;
00167 case 4: layer = 4; ladder = 1;break;
00168 case 6: layer = 4; ladder = 2;break;
00169 case 8: layer = 4; ladder = 3;break;
00170 case 10: layer = 4; ladder = 4;break;
00171 case 12: layer = 4; ladder = 5;break;
00172 case 14: layer = 4; ladder = 6;break;
00173 case 16: layer = 4; ladder = 7;break;
00174 default: throw runtime_error("StiSvtHitLoader:loadHits() -E- 5");
00175 }
00176 break;
00177 case 6:
00178 switch (svtLadder)
00179 {
00180 case 1: layer = 5; ladder = 0;break;
00181 case 3: layer = 5; ladder = 1;break;
00182 case 5: layer = 5; ladder = 2;break;
00183 case 7: layer = 5; ladder = 3;break;
00184 case 9: layer = 5; ladder = 4;break;
00185 case 11: layer = 5; ladder = 5;break;
00186 case 13: layer = 5; ladder = 6;break;
00187 case 15: layer = 5; ladder = 7;break;
00188 default: throw runtime_error("StiSvtHitLoader:loadHits() -E- 6");
00189 }
00190 break;
00191 }
00192 return ladder;
00193 }
00194 #endif