00001 #include "GfxDigitList.h"
00002 #include "GfxDigitListCfg.h"
00003 #include "GfxProxy.h"
00004 #include "GfxDigitListMenu.h"
00005 #include "EVD.h"
00006 #include "ViewState.h"
00007 #include <JobControl/JobC.h>
00008 #include <DataUtil/TruthHelper.h>
00009 #include <Midad/Base/PageDisplay.h>
00010 #include <Midad/Base/Mint.h>
00011 #include <Midad/Base/Rainbow.h>
00012 #include <Midad/Base/DigitText.h>
00013 #include <Midad/Util/Range.h>
00014 #include <Midad/Gui/GuiSlider.h>
00015
00016 #include <Record/SimSnarlRecord.h>
00017 #include <Record/SimSnarlHeader.h>
00018 #include <Conventions/Munits.h>
00019
00020 #include <DataUtil/CDL2STL.h>
00021 using namespace DataUtil;
00022
00023 #include <CandDigit/CandDigitHandle.h>
00024 #include <CandDigit/CandDigitListHandle.h>
00025
00026 #include <Conventions/PlaneView.h>
00027
00028 #include <Plex/PlexSEIdAltL.h>
00029 #include <Plex/PlexSEIdAltLItem.h>
00030 #include <Plex/PlexStripEndId.h>
00031
00032 #include <MessageService/MsgService.h>
00033 CVSID("$Id: GfxDigitList.cxx,v 1.13 2004/08/31 13:29:05 musser Exp $");
00034
00035 #include <Buttons.h>
00036 #include <TClonesArray.h>
00037 #include <Record/RecArrayAllocator.h>
00038 #include <sigc++/sigc++.h>
00039 #include <sigc++/class_slot.h>
00040 using namespace SigC;
00041
00042 #include <iostream>
00043 #include <string>
00044 using namespace std;
00045
00046 GfxProxy<GfxDigitList>
00047 gsGfxDigitListProxy("DigitList", new GfxDigitListMenu());
00048
00049
00054 GfxDigitList::GfxDigitList()
00055 : fCfg(0)
00056 , fColorRange(0)
00057 , fEVD(0)
00058 , fMint(0)
00059 , fHideDigits(false)
00060 {
00061 fCfg = new GfxDigitListCfg();
00062 fCfg->modified_signal.connect
00063 (SigC::slot_class(*this,&GfxDigitList::ReConfigure));
00064 RecArrayAllocator& a = RecArrayAllocator::Instance();
00065 fDigitCA = a.GetArray("GfxDigit");
00066 }
00067
00068 GfxDigitList::~GfxDigitList()
00069 {
00070 RecArrayAllocator& a = RecArrayAllocator::Instance();
00071 if (fDigitCA) {a.ReleaseArray(fDigitCA); fDigitCA = 0;}
00072 }
00073
00074 void GfxDigitList::Init(PageDisplay& pd, EVD& mp)
00075 {
00076 fColorRange = &mp.GetColorRangeControl(this->GetPlaneView()).GetRange();
00077 ViewState* vs = this->GetViewState();
00078 vs->color_semantic.connect(slot_class(*this,&GfxDigitList::ReConfigure));
00079 vs->spatial_metric.connect(slot_class(*this,&GfxDigitList::ReConfigure));
00080 fPageDisplay = &pd;
00081 fEVD = ∓
00082 }
00083
00084 static bool select_digit(const CandDigitHandle* cdh,
00085 PlaneView::PlaneView_t view,
00086 RangeDouble* time_range)
00087 {
00088 if (!cdh) return false;
00089
00090
00091
00092
00093 return (cdh->GetPlexSEIdAltL().GetPlaneView() == view ||
00094 cdh->GetPlexSEIdAltL().IsVetoShield())
00095 && time_range->InRange(cdh->GetPlexSEIdAltL().GetBestItem().GetTime());
00096 }
00097
00098 void GfxDigitList::Configure(Mint& mint)
00099 {
00100
00101 fMint = &mint;
00102 this->ClearDigitList();
00103 if (fHideDigits) return;
00104 const CandDigitListHandle* cslh = mint.GetDigits();
00105 if (!cslh) return;
00106
00107 RangeDouble& time_range =
00108 fPageDisplay->GetTimeSlider().GetRangeCtrl().GetRange();
00109
00110 Mint::DigitVector_t sv = CDL2STLvector<const CandDigitHandle>(*cslh);
00111
00112 Mint::DigitVector_t::iterator it, first = sv.begin(), middle, last = sv.end();
00113
00114 Slot1<bool,const CandDigitHandle*> s =
00115 bind(slot(select_digit),this->GetPlaneView(),&time_range);
00116 middle = std::partition(first,last,s);
00117
00118 bool show_mux = this->GetViewState()->ShowMultiplex();
00119 int count = 0;
00120 for (it = first; it != middle; ++it) {
00121 const PlexSEIdAltL& altl = (*it)->GetPlexSEIdAltL();
00122 if(((GetGraphicsView()!=GraphicsView::kUV && GetGraphicsView()!=GraphicsView::kXY)&& !altl.IsVetoShield()) ||
00123 ((GetGraphicsView()==GraphicsView::kUV || GetGraphicsView()==GraphicsView::kXY) && altl.IsVetoShield())){
00124 if (show_mux || altl.IsVetoShield() ) {
00125 int siz = altl.size();
00126 for (int ind = 0; ind < siz; ++ind) {
00127 int last = fDigitCA->GetLast()+1;
00128 new ((*fDigitCA)[last]) GfxDigit(**it,altl[ind],*this);
00129 GfxDigit* gs = dynamic_cast<GfxDigit*>(fDigitCA->UncheckedAt(last));
00130 fDigits.push_back(gs);
00131 count++;
00132 }
00133 }
00134 else {
00135 const PlexSEIdAltLItem& item = altl.GetBestItem();
00136 if (item.IsZeroWeight() && altl.size()>1) continue;
00137 int last = fDigitCA->GetLast()+1;
00138 new ((*fDigitCA)[last]) GfxDigit(**it,item,*this);
00139 GfxDigit* gs = dynamic_cast<GfxDigit*>(fDigitCA->UncheckedAt(last));
00140 fDigits.push_back(gs);
00141 count++;
00142 }
00143 }
00144 }
00145 MSG("Midad",Msg::kVerbose) << "Configure: Count = " << count << endl;
00146 this->ReConfigure();
00147 }
00148
00149 void GfxDigitList::ReConfigure(void)
00150 {
00151 if (!fMint) return;
00152 if (fHideDigits) return;
00153
00154
00155 int count = 0;
00156 GfxDigitVector_t::iterator it, done = fDigits.end();
00157 for (it = fDigits.begin(); it != done; ++it) {
00158 (*it)->Configure();
00159 count++;
00160 }
00161 }
00162
00163 void GfxDigitList::Draw(Option_t *option)
00164 {
00165
00167 GfxDigitVector_t::iterator it, done = fDigits.end();
00168 Int_t ndig=0;
00169 for (it = fDigits.begin(); it != done; ++it) {
00170 if(GetEVD()->GetDrawAll() || GetEVD()->GetDrawGhosts() || (*it)->GetColor()!=GetEVD()->GetGhostColor() ){
00171
00172 if((*it)->GetDigit().GetPlexSEIdAltL().IsVetoShield()){
00173 (*it)->Draw("f");
00174 }
00175 (*it)->Draw(option);
00176 }
00177 ndig++;
00178 }
00179 }
00180
00181
00182
00183 void GfxDigitList::ClearDigitList()
00184 {
00185 fDigits.clear();
00186 fDigitCA->Clear("C");
00187 }
00188
00189 void GfxDigitList::ExecuteEvent(int event, int , int , GfxDigit* gfx_digit)
00190 {
00191 switch (event) {
00192 case kMouseEnter: {
00193 PlexStripEndId seid;
00194 const PlexSEIdAltLItem* itm;
00195 const CandDigitHandle& cdh = gfx_digit->GetDigit();
00196 const PlexSEIdAltLItem& item = gfx_digit->GetItem();
00197
00198 itm = &item;
00199 if (itm) {
00200 seid = itm->GetSEId();
00201 }
00202 else {
00203 const PlexSEIdAltL& altl = cdh.GetPlexSEIdAltL();
00204 PlexStripEndId best = altl.GetBestSEId();
00205
00206 altl.SetFirst();
00207 while(altl.IsValid()) {
00208 seid = altl.GetCurrentSEId();
00209 if (seid == best) {
00210 const PlexSEIdAltLItem& curr = altl.GetCurrentItem();
00211 itm = &curr;
00212 }
00213 altl.Next();
00214 }
00215 }
00216 const char* s;
00217 SimSnarlRecord *ssr =
00218 dynamic_cast<SimSnarlRecord*>(fMint->GetJobC().Mom.GetFragment("SimSnarlRecord"));
00219 if (ssr){
00220 TruthHelper truthHelp(&(fMint->GetJobC().Mom));
00221 s = Form("Digit: (%s) strip=%d, plane=%d, charge=%.1f (PEs), t=%.1f ns best nue ID=%d",
00222 seid.AsString(),
00223 seid.GetStrip(),
00224 seid.GetPlane(),
00225 itm->GetPE(),
00226 itm->GetTime()*1e9,truthHelp.GetBestNeuMatch(cdh) );
00227
00228
00229 }
00230 else{
00231 if(fEVD->GetDisplayOptions()->ChargeType()==CalDigitType::kNone){
00232
00233
00234 s = Form("Digit: strip=%d, plane=%d, charge=%.1f (Raw), t=%.1f ns (%s)",
00235 seid.GetStrip(),
00236 seid.GetPlane(),
00237 cdh.GetCharge(),
00238 itm->GetTime()*1e9, seid.AsString());
00239 }
00240 else if(fEVD->GetDisplayOptions()->ChargeType()==CalDigitType::kPE){
00241 s = Form("Digit: strip=%d, plane=%d, charge=%.1f (PEs), t=%.1f ns (%s)",
00242 seid.GetStrip(),
00243 seid.GetPlane(),
00244 itm->GetPE(),
00245 itm->GetTime()*1e9, seid.AsString());
00246 }
00247 else if(fEVD->GetDisplayOptions()->ChargeType()==CalDigitType::kSigLin){
00248 s = Form("Digit: strip=%d, plane=%d, charge=%.1f (SigLin), t=%.1f ns (%s)",
00249 seid.GetStrip(),
00250 seid.GetPlane(),
00251 itm->GetSigLin(),
00252 itm->GetTime()*1e9, seid.AsString());
00253 }
00254 else if(fEVD->GetDisplayOptions()->ChargeType()==CalDigitType::kSigCorr){
00255 s = Form("Digit: strip=%d, plane=%d, charge=%.1f (SigCorr), t=%.1f ns (%s)",
00256 seid.GetStrip(),
00257 seid.GetPlane(),
00258 itm->GetSigCorr(),
00259 itm->GetTime()*1e9, seid.AsString());
00260 }
00261 }
00262
00263 text_info.emit(s);
00264
00265 DigitText* dt = fPageDisplay->GetDigitText();
00266 if (dt) {
00267 dt->Clear();
00268 dt->AddCandDigitText(cdh);
00269 }
00270
00271 if (fMint) {
00272 fMint->SetPickedDigit(cdh);
00273 }
00274
00275 DigitText* JAMdt = fEVD->GetDigitText();
00276 if (JAMdt) {
00277 JAMdt->Clear();
00278 JAMdt->AddCandDigitText(cdh);
00279 }
00280
00281
00282 break;
00283 }
00284 default:
00285 break;
00286 }
00287 }
00288
00289 bool GfxDigitList::DigitMasked(const CandDigitHandle& cdh) const
00290 {
00291 if (!fColorRange) return false;
00292 const PlexSEIdAltLItem& itm = cdh.GetPlexSEIdAltL().GetBestItem();
00293 double val=0;
00294 bool ret;
00295 switch (this->GetViewState()->GetColorSemantic()) {
00296 case ViewState::color_is_time:
00297 val = cdh.GetTime()-fMint->GetTimeRange().Min();
00298 ret = fColorRange->InRange(val);
00299 return !ret;
00300 case ViewState::color_is_charge:
00301 val =cdh.GetCharge();
00302 if(fEVD->GetDisplayOptions()->ChargeType()==CalDigitType::kPE)val=itm.GetPE();
00303 if(fEVD->GetDisplayOptions()->ChargeType()==CalDigitType::kSigLin)val=itm.GetSigLin();
00304 if(fEVD->GetDisplayOptions()->ChargeType()==CalDigitType::kSigCorr)val=itm.GetSigCorr();
00305 ret = val>fColorRange->Min();
00306 return !ret;
00307 default:
00308 return false;
00309 break;
00310 }
00311 }
00312
00313 bool GfxDigitList::DigitMasked(const CandDigitHandle& cdh,
00314 const PlexSEIdAltLItem& itm) const
00315 {
00316 if (!fColorRange) return false;
00317
00318 double val=0;
00319 bool ret;
00320 switch (this->GetViewState()->GetColorSemantic()) {
00321 case ViewState::color_is_time:
00322 val = itm.GetTime()-fMint->GetTimeRange().Min();
00323 ret = fColorRange->InRange(val);
00324 return !ret;
00325 case ViewState::color_is_charge:
00326 val =cdh.GetCharge();
00327 if(fEVD->GetDisplayOptions()->ChargeType()==CalDigitType::kPE)
00328 val=itm.GetPE();
00329 if(fEVD->GetDisplayOptions()->ChargeType()==CalDigitType::kSigLin)
00330 val=itm.GetSigLin();
00331 if(fEVD->GetDisplayOptions()->ChargeType()==CalDigitType::kSigCorr)
00332 val=itm.GetSigCorr();
00333 ret = val>fColorRange->Min();
00334 return !ret;
00335 default:
00336 return false;
00337 break;
00338 }
00339 }
00340
00341 int GfxDigitList::GetDigitColor(const CandDigitHandle& cdh) const
00342 {
00343 if (!fColorRange) return false;
00344 const PlexSEIdAltL & alist = cdh.GetPlexSEIdAltL();
00345 const PlexSEIdAltLItem& itm = alist.GetBestItem();
00346 static Rainbow rainbow;
00347
00348 if (this->DigitMasked(cdh)) return 0;
00349
00350 double val=0;
00351 switch (this->GetViewState()->GetColorSemantic()) {
00352 case ViewState::color_is_time:
00353 val = cdh.GetTime()-fMint->GetTimeRange().Min();
00354 break;
00355 case ViewState::color_is_charge:
00356 val =cdh.GetCharge();
00357
00358 if(fEVD->GetDisplayOptions()->ChargeType()==CalDigitType::kPE) val=itm.GetPE();
00359 if(fEVD->GetDisplayOptions()->ChargeType()==CalDigitType::kSigLin) val=itm.GetSigLin();
00360 if(fEVD->GetDisplayOptions()->ChargeType()==CalDigitType::kSigCorr) val=itm.GetSigCorr();
00361 break;
00362 default:
00363 return 0;
00364 break;
00365 }
00366
00367 return rainbow.GetRelativeColor(fColorRange->Relative(val));
00368 }
00369
00370 int GfxDigitList::GetDigitColor(const CandDigitHandle& cdh,
00371 const PlexSEIdAltLItem& itm) const
00372 {
00373 if (!fColorRange) return false;
00374
00375 static Rainbow rainbow;
00376
00377 if (this->DigitMasked(cdh,itm)) return 0;
00378
00379 double val=0;
00380 switch (this->GetViewState()->GetColorSemantic()) {
00381 case ViewState::color_is_time:
00382 val = itm.GetTime()-fMint->GetTimeRange().Min();
00383 break;
00384 case ViewState::color_is_charge:
00385 val =cdh.GetCharge();
00386 if(fEVD->GetDisplayOptions()->ChargeType()==CalDigitType::kPE)
00387 val=itm.GetPE();
00388 if(fEVD->GetDisplayOptions()->ChargeType()==CalDigitType::kSigLin)
00389 val=itm.GetSigLin();
00390 if(fEVD->GetDisplayOptions()->ChargeType()==CalDigitType::kSigCorr)
00391 val=itm.GetSigCorr();
00392 break;
00393 default:
00394 return 0;
00395 break;
00396 }
00397
00398 return rainbow.GetRelativeColor(fColorRange->Relative(val));
00399 }
00400 void GfxDigitList::HideDigits(bool hide)
00401 {
00402 fHideDigits = hide;
00403 this->ReConfigure();
00404 if(GetGraphicsView()==GraphicsView::kVZ)fEVD->UpdateCanvas();
00405 }