Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

EventDisplay/GfxDigitList.cxx

Go to the documentation of this file.
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 //#include <Midad/Util/Util.h>
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> // part of ROOT
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 = &mp;
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     //    Bool_t validVS = (gv==GraphicsView::kUV ||
00090     //                gv==GraphicsView::kXY) &&
00091     //  (cdh->GetPlexSEIdAltL().GetPlaneView()==PlaneView::kVSTopFlat);
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 {                  // only show demuxed digits
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     // configure all GfxDigits
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 // Private methods:
00183 void GfxDigitList::ClearDigitList()
00184 {
00185     fDigits.clear();
00186     fDigitCA->Clear("C");
00187 }
00188 
00189 void GfxDigitList::ExecuteEvent(int event, int /*px*/, int /*py*/, 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: // nothing
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 }

Generated on Sat Nov 21 22:46:16 2009 for loon by  doxygen 1.3.9.1