00001
00002
00003
00004 #include <cmath>
00005 #include <iostream>
00006
00007
00008 #include "TDirectory.h"
00009 #include "TCanvas.h"
00010 #include "TH1F.h"
00011 #include "TH2F.h"
00012 #include "TGraph.h"
00013
00014
00015 #include "DrawUtil.h"
00016 #include "PhysicsNtuple/Factory.h"
00017 #include "EventHitTab.h"
00018
00019 REGISTER_ANP_OBJECT(EventTab,EventHitTab)
00020
00021 using namespace std;
00022
00023
00024 Anp::EventHitTab::EventHitTab()
00025 :fInit(false),
00026 fDraw(true),
00027 fCanvas(0),
00028 fPadU(0),
00029 fPadV(0),
00030 f2hU(0),
00031 f2hV(0),
00032 fgShwU(0),
00033 fgShwV(0),
00034 fgTrk1U(0),
00035 fgTrk1V(0),
00036 fgTrk2U(0),
00037 fgTrk2V(0)
00038 {
00039 }
00040
00041
00042 Anp::EventHitTab::~EventHitTab()
00043 {
00044 for(std::vector<TObject *>::iterator it = fObjVec.begin(); it != fObjVec.begin(); ++it)
00045 {
00046 TObject *obj = *it;
00047 delete obj;
00048 }
00049 }
00050
00051
00052 void Anp::EventHitTab::Set(const Event& event, const Record& record)
00053 {
00054 if(!fInit)
00055 {
00056 Init(record);
00057 }
00058 else
00059 {
00060 Reset();
00061 }
00062
00063 fSpan.FindSpan(event, record);
00064
00065 SetShowers(event, record);
00066
00067 const TrackVec tvec = GetTrack(event, record);
00068 for(TrackVec::const_iterator it = tvec.begin(); it != tvec.end(); ++it)
00069 {
00070 SetTrack(*(*it), record, std::distance(tvec.begin(), it));
00071 }
00072 }
00073
00074
00075 void Anp::EventHitTab::SetTrack(const Track &track, const Record &record, const short index)
00076 {
00077 TGraph *ug = 0;
00078 TGraph *vg = 0;
00079
00080 if(index == 0)
00081 {
00082 ug = fgTrk1U;
00083 vg = fgTrk1V;
00084 }
00085 else if(index == 1)
00086 {
00087 ug = fgTrk2U;
00088 vg = fgTrk2V;
00089 }
00090
00091 if(!ug || !vg)
00092 {
00093 return;
00094 }
00095
00096 const StripVec uvec = GetStrip(track, record, "U");
00097 const StripVec vvec = GetStrip(track, record, "V");
00098
00099 if(uvec.empty() || vvec.empty())
00100 {
00101 cerr << "EventHitTab::SetTrack() - no strips matching a track" << endl;
00102 return;
00103 }
00104
00105 ug -> Set(uvec.size());
00106 vg -> Set(vvec.size());
00107
00108 for(Draw::SIter sit = uvec.begin(); sit != uvec.end(); ++sit)
00109 {
00110 ug -> SetPoint(std::distance(uvec.begin(), sit), (*sit) -> ZPos(), (*sit) -> TPos());
00111 }
00112
00113 for(Draw::SIter sit = vvec.begin(); sit != vvec.end(); ++sit)
00114 {
00115 vg -> SetPoint(std::distance(vvec.begin(), sit), (*sit) -> ZPos(), (*sit) -> TPos());
00116 }
00117 }
00118
00119
00120
00121 void Anp::EventHitTab::SetShowers(const Event &event, const Record &record)
00122 {
00123 if(!fgShwU || !fgShwV)
00124 {
00125 return;
00126 }
00127
00128 if(event.GetNShowers() < 1)
00129 {
00130 return;
00131 }
00132
00133 const ShowerVec shw_vec = GetShower(event, record);
00134
00135 StripVec uvec, vvec;
00136
00137 for(ShowerVec::const_iterator it = shw_vec.begin(); it != shw_vec.end(); ++it)
00138 {
00139 const Shower &shower = *(*it);
00140
00141 const StripVec suvec = GetStrip(shower, record, "U");
00142 const StripVec svvec = GetStrip(shower, record, "V");
00143
00144 uvec.insert(uvec.end(), suvec.begin(), suvec.end());
00145 vvec.insert(vvec.end(), svvec.begin(), svvec.end());
00146 }
00147
00148 if(uvec.empty() || vvec.empty())
00149 {
00150 cerr << "EventHitTab::SetShower() - no strips matching a shower" << endl;
00151 return;
00152 }
00153
00154 fgShwU -> Set(uvec.size());
00155 fgShwV -> Set(vvec.size());
00156
00157 for(Draw::SIterator sit = uvec.begin(); sit != uvec.end(); ++sit)
00158 {
00159 fgShwU -> SetPoint(std::distance(uvec.begin(), sit), (*sit) -> ZPos(), (*sit) -> TPos());
00160 }
00161
00162 for(Draw::SIterator sit = vvec.begin(); sit != vvec.end(); ++sit)
00163 {
00164 fgShwV -> SetPoint(std::distance(vvec.begin(), sit), (*sit) -> ZPos(), (*sit) -> TPos());
00165 }
00166 }
00167
00168
00169 void Anp::EventHitTab::Init(TCanvas *canvas)
00170 {
00171 if(!canvas)
00172 {
00173 cerr << "EventHitTab::Expose(): null TCanvas pointer" << endl;
00174 return;
00175 }
00176 if(fPadU || fPadV || fCanvas)
00177 {
00178 cerr << "EventHitTab::Expose(): pads have been already initialized" << endl;
00179 return;
00180 }
00181
00182 fCanvas = canvas;
00183
00184 fCanvas -> Divide(0, 2);
00185
00186 fPadU = dynamic_cast<TPad *> (canvas -> cd(1));
00187 fPadV = dynamic_cast<TPad *> (canvas -> cd(2));
00188
00189 if(!fPadU || !fPadV)
00190 {
00191 cerr << "EventHitTab::Expose(): failed to create new pads" << endl;
00192 fCanvas = 0;
00193 fPadU = 0;
00194 fPadV = 0;
00195 return;
00196 }
00197
00198 Draw::Config(fPadU, "", fConfig);
00199 Draw::Config(fPadV, "", fConfig);
00200 }
00201
00202
00203 void Anp::EventHitTab::Expose()
00204 {
00205 if(!fInit)
00206 {
00207 return;
00208 }
00209
00210 if(!fPadU || !fPadV)
00211 {
00212 return;
00213 }
00214
00215 if(fDraw)
00216 {
00217 fPadU -> cd();
00218 f2hU -> Draw("");
00219 if(fgShwU -> GetN() > 0) fgShwU -> Draw("p");
00220 if(fgTrk1U -> GetN() > 0) fgTrk1U -> Draw("p");
00221 if(fgTrk2U -> GetN() > 0) fgTrk2U -> Draw("p");
00222
00223
00224 fPadV -> cd();
00225 f2hV -> Draw("");
00226 if(fgShwV -> GetN() > 0) fgShwV -> Draw("p");
00227 if(fgTrk1V -> GetN() > 0) fgTrk1V -> Draw("p");
00228 if(fgTrk2V -> GetN() > 0) fgTrk2V -> Draw("p");
00229
00230 fDraw = false;
00231 }
00232
00233 fCanvas -> cd();
00234 fCanvas -> Modified();
00235 fCanvas -> Update();
00236 }
00237
00238
00239 void Anp::EventHitTab::Config(const Registry ®)
00240 {
00241 fConfig.UnLockValues();
00242 fConfig.Merge(reg);
00243 fConfig.LockValues();
00244 }
00245
00246
00247 bool Anp::EventHitTab::Init(const Record &record)
00248 {
00249 if(fInit)
00250 {
00251 cerr << "EventHitTab is already initialized" << endl;
00252 return false;
00253 }
00254
00255 fInit = true;
00256
00257 f2hU = Draw::CreateTH2("Uview", fConfig, record.GetHeader());
00258 f2hV = Draw::CreateTH2("Vview", fConfig, record.GetHeader());
00259
00260 fgShwU = Draw::CreateTGraph("Shower", fConfig);
00261 fgShwV = Draw::CreateTGraph("Shower", fConfig);
00262
00263 fgTrk1U = Draw::CreateTGraph("Track1", fConfig);
00264 fgTrk1V = Draw::CreateTGraph("Track1", fConfig);
00265
00266 fgTrk2U = Draw::CreateTGraph("Track2", fConfig);
00267 fgTrk2V = Draw::CreateTGraph("Track2", fConfig);
00268
00269 fObjVec.push_back(f2hU);
00270 fObjVec.push_back(f2hV);
00271 fObjVec.push_back(fgTrk1U);
00272 fObjVec.push_back(fgTrk1V);
00273 fObjVec.push_back(fgTrk2U);
00274 fObjVec.push_back(fgTrk2V);
00275
00276 return true;
00277 }
00278
00279
00280 void Anp::EventHitTab::Reset()
00281 {
00282 fDraw = true;
00283
00284 fSpan.Reset();
00285
00286 if(fgShwU)
00287 {
00288 fgShwU -> Set(0);
00289 }
00290 if(fgShwV)
00291 {
00292 fgShwV -> Set(0);
00293 }
00294 if(fgTrk1U)
00295 {
00296 fgTrk1U -> Set(0);
00297 }
00298 if(fgTrk1V)
00299 {
00300 fgTrk1V -> Set(0);
00301 }
00302 if(fgTrk2U)
00303 {
00304 fgTrk2U -> Set(0);
00305 }
00306 if(fgTrk2V)
00307 {
00308 fgTrk2V -> Set(0);
00309 }
00310 }
00311
00312
00313
00314 void Anp::EventHitTab::ZoomIn()
00315 {
00316 fDraw = true;
00317
00318 static double ZoomBorderScale = 1.2;
00319 static double ZoomBorderWidth = 0.1;
00320
00321 static bool init = false;
00322 if(!init)
00323 {
00324 init = true;
00325 ZoomBorderScale = Draw::Read("ZoomBorderScale", ZoomBorderScale, fConfig);
00326 ZoomBorderWidth = Draw::Read("ZoomBorderWidth", ZoomBorderWidth, fConfig);
00327
00328 if(ZoomBorderScale < 1.0) ZoomBorderScale = 1.2;
00329 if(ZoomBorderWidth < 0.0) ZoomBorderWidth = 0.1;
00330 }
00331
00332 if(fSpan.InitU())
00333 {
00334 fSpan.SetRangeU(f2hU -> GetYaxis(), ZoomBorderScale, ZoomBorderWidth);
00335 }
00336 if(fSpan.InitZ())
00337 {
00338 fSpan.SetRangeZ(f2hU -> GetXaxis(), ZoomBorderScale, ZoomBorderWidth);
00339 }
00340 if(fSpan.InitV())
00341 {
00342 fSpan.SetRangeV(f2hV -> GetYaxis(), ZoomBorderScale, ZoomBorderWidth);
00343 }
00344 if(fSpan.InitZ())
00345 {
00346 fSpan.SetRangeZ(f2hV -> GetXaxis(), ZoomBorderScale, ZoomBorderWidth);
00347 }
00348 }
00349
00350
00351 void Anp::EventHitTab::ZoomOut()
00352 {
00353 fDraw = true;
00354
00355 f2hU -> GetXaxis() -> UnZoom();
00356 f2hU -> GetYaxis() -> UnZoom();
00357
00358 f2hV -> GetXaxis() -> UnZoom();
00359 f2hV -> GetYaxis() -> UnZoom();
00360 }