ATLAS Offline Software
Loading...
Searching...
No Matches
VP1CaloCellSystem.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
14
15#include <QBuffer>
16#include <QByteArray>
17#include <QString>
18#include <QMessageBox>
19
20#include <Inventor/SoPath.h>
21#include <Inventor/nodes/SoSeparator.h>
22#include <Inventor/nodes/SoMaterial.h>
23
24#include "CaloDetDescr/CaloDetDescrElement.h"
26
31
32
36
37#include <map>
38#include <vector>
39#include <sstream>
40
41#include "GaudiKernel/ISvcLocator.h"
42#include "GaudiKernel/Bootstrap.h"
43#include "GaudiKernel/IToolSvc.h"
52
53// MBTS
57#include <stdexcept>
58
59
60// -------------------- Clockwork -------------------------------
62{
63public:
64 Clockwork();
65 ~Clockwork();
66 Clockwork(const Clockwork&) = delete;
67 Clockwork& operator=(const Clockwork&) = delete;
68
69 // -------------- Methods ------------------
70 // Called at the beginning of every event
71 // Creates new manager objects and stores them into
72 void BuildCellManagers();
73
74 // Called at the beginning of every event after BuildCellManagers().
75 // Iterates over Calo Cells in the SG container, builds VP1CC objects
76 // and stores the pointers into appropriate Manager(s)
77 void FillManagers();
78
79 // Special situation with Tile Raw Channel keys in SG. They have to be searched in a special order
80 // The order is hardwired unfortunately and may vary in time...
81 std::string SearchTileRawchanKeys(const std::vector<std::string>& inputKeys);
82
83 // -------------- Data members ----------------
85
86 //--------------------------------------------------------------
87 //
88 // Section: Flags
89 //
90
91 bool noCalo{false}; // If Calo has been switched off don't show anything
92 bool noLArDigitsGlobal{false}; // Are we able to show LAr digits at all?
93 bool noLArDigitsEvent{false}; // Are we able to show LAr digits for this event?
94 bool noTileDigitsGlobal{false}; // Are we able to show Tile digits at all?
95 bool noTileDigitsEvent{false}; // Are we able to show Tile digits for this event?
96
97 bool modeSimple{true}; // Which mode (simple/expert) is used for LAr
98
99 //--------------------------------------------------------------
100 //
101 // Section: DetStore objects: managers, ID helpers
102 //
103
104 // Manager
106
107 // ID helpers
108 const CaloCell_ID* calo_id{nullptr};
109 const TileID* tile_id{nullptr};
110 const TileHWID* tile_hw_id{nullptr};
111
112 //--------------------------------------------------------------
113 //
114 // Section: Tools, Services
115 //
116
117 const TileInfo* tile_info{nullptr};
119 const LArOnlineID* lar_onlineID{nullptr};
121
122 //--------------------------------------------------------------
123 //
124 // Section: StoreGate containers
125 //
126
131
132 //--------------------------------------------------------------
133 //
134 // Section: Maps of VP1CaloCellManager-s
135 //
136
138
139 //--------------------------------------------------------------
140 //
141 // Section: MBTS
142 //
143
145
146 //--------------------------------------------------------------
147 //
148 // Section: Maps
149 //
150
151 // Map of VP1CaloCell objects by their 3D objects
153
154 // Separator helper map
156
157 // Set of keys for the above map
159};
160
180
185
187{
188 // Populate cell_managers map
190 controller->energyModeEt(),controller->scale(),
191 controller->showVolumeOutLines(),controller->globalCuts());
193 controller->energyModeEt(),controller->scale(),
194 controller->showVolumeOutLines(),controller->globalCuts());
196 controller->energyModeEt(),controller->scale(),
197 controller->showVolumeOutLines(),controller->globalCuts());
199 controller->energyModeEt(),controller->scale(),
200 controller->showVolumeOutLines(),controller->globalCuts());
202 controller->energyModeEt(),controller->scale(),
203 controller->showVolumeOutLines(),controller->globalCuts());
205 controller->energyModeEt(),controller->scale(),
206 controller->showVolumeOutLines(),controller->globalCuts());
208 controller->energyModeEt(),controller->scale(),
209 controller->showVolumeOutLines(),controller->globalCuts());
211 controller->energyModeEt(),controller->scale(),
212 controller->showVolumeOutLines(),controller->globalCuts());
214 controller->energyModeEt(),controller->scale(),
215 controller->showVolumeOutLines(),controller->globalCuts());
217 controller->energyModeEt(),controller->scale(),
218 controller->showVolumeOutLines(),controller->globalCuts());
220 controller->energyModeEt(),controller->scale(),
221 controller->showVolumeOutLines(),controller->globalCuts());
223 controller->energyModeEt(),controller->scale(),
224 controller->showVolumeOutLines(),controller->globalCuts());
226 controller->energyModeEt(),controller->scale(),
227 controller->showVolumeOutLines(),controller->globalCuts());
229 controller->energyModeEt(),controller->scale(),
230 controller->showVolumeOutLines(),controller->globalCuts());
232 controller->energyModeEt(),controller->scale(),
233 controller->showVolumeOutLines(),controller->globalCuts());
235 controller->energyModeEt(),controller->scale(),
236 controller->showVolumeOutLines(),controller->globalCuts());
238 controller->energyModeEt(),controller->scale(),
239 controller->showVolumeOutLines(),controller->globalCuts());
241 controller->energyModeEt(),controller->scale(),
242 controller->showVolumeOutLines(),controller->globalCuts());
243
244 // Connect controller signals to manager slots
245 for(VP1CCManagerContainer::iterator it=cell_managers.begin(); it!=cell_managers.end(); ++it) {
246 connect(controller,SIGNAL(selectionIntervalsChanged(VP1CCIntervalMap)),
247 it->second,SLOT(selectionUpdated(VP1CCIntervalMap)));
248 connect(controller,SIGNAL(scaleChanged(QPair<bool,double>)),
249 it->second,SLOT(scaleUpdated(QPair<bool,double>)));
250 connect(controller,SIGNAL(showVolumeOutLinesChanged(bool)),
251 it->second,SLOT(outlineUpdated(bool)));
252 connect(controller,SIGNAL(globalCutsChanged(VP1CC_GlobalCuts)),
253 it->second,SLOT(globalCutsUpdated(VP1CC_GlobalCuts)));
254 connect(controller->customTourEditor(),SIGNAL(clipVolumeRadiusChanged(double)),
255 it->second,SLOT(clipVolumeRadiusChanged(double)));
256 }
257}
258
260{
261 // For events with no Calo Cells do nothing
262 if(!calocells) return;
263
264 for(const CaloCell* cell : *calocells) {
265
266 // for each cell:
267 // 1. determine its type
268 // 2. build VP1CaloCell of appropriate type
269 // 3. add it to the appropriate manager
270 try {
271 if(calo_id->is_em_barrel(cell->ID())) {
272 // ------- EMB ----------
273 VP1CC_LArEMB* embCC = new VP1CC_LArEMB(cell,&sepHelperMap);
274
275 switch(calo_id->sampling(cell->ID())) {
276 case 0: {
277 cell_managers[VP1CC_SelTypeEMB0]->add(embCC);
278 break;
279 }
280 case 1: {
281 cell_managers[VP1CC_SelTypeEMB1]->add(embCC);
282 break;
283 }
284 case 2: {
285 cell_managers[VP1CC_SelTypeEMB2]->add(embCC);
286 break;
287 }
288 case 3: {
289 cell_managers[VP1CC_SelTypeEMB3]->add(embCC);
290 break;
291 }
292 default: { //unknown case, tidy up
293 delete embCC; embCC=nullptr;
294 break;
295 }
296 }
297 // ------- EMB ----------
298 }
299 else if(calo_id->is_em_endcap(cell->ID()) || calo_id->is_hec(cell->ID())) {
301
302 if(calo_id->is_em_endcap(cell->ID())) {
303 // ------- EMEC ----------
304 switch(calo_id->sampling(cell->ID())) {
305 case 0: {
306 cell_managers[VP1CC_SelTypeEMEC0]->add(emechecCC);
307 break;
308 }
309 case 1: {
310 cell_managers[VP1CC_SelTypeEMEC1]->add(emechecCC);
311 break;
312 }
313 case 2: {
314 cell_managers[VP1CC_SelTypeEMEC2]->add(emechecCC);
315 break;
316 }
317 case 3: {
318 cell_managers[VP1CC_SelTypeEMEC3]->add(emechecCC);
319 break;
320 }
321 default: { //unknown case, tidy up
322 delete emechecCC; emechecCC=nullptr;
323 break;
324 }
325 }
326 // ------- EMEC ----------
327 } else {
328 // ------- HEC ----------
329 switch(calo_id->sampling(cell->ID())) {
330 case 0: {
331 cell_managers[VP1CC_SelTypeHEC0]->add(emechecCC);
332 break;
333 }
334 case 1: {
335 cell_managers[VP1CC_SelTypeHEC1]->add(emechecCC);
336 break;
337 }
338 case 2: {
339 cell_managers[VP1CC_SelTypeHEC2]->add(emechecCC);
340 break;
341 }
342 case 3: {
343 cell_managers[VP1CC_SelTypeHEC3]->add(emechecCC);
344 break;
345 }
346 default: { //unknown case, tidy up
347 delete emechecCC; emechecCC=nullptr;
348 break;
349 }
350 }
351 // ------- EMEC ----------
352 }
353 }
354 else if(calo_id->is_fcal(cell->ID())) {
355 // ------- FCAL ----------
356 VP1CC_LArFCAL* fcalCC = new VP1CC_LArFCAL(cell,&sepHelperMap);
357
358 switch(calo_id->sampling(cell->ID())) {
359 case 1: {
360 cell_managers[VP1CC_SelTypeFCAL1]->add(fcalCC);
361 break;
362 }
363 case 2: {
364 cell_managers[VP1CC_SelTypeFCAL2]->add(fcalCC);
365 break;
366 }
367 case 3: {
368 cell_managers[VP1CC_SelTypeFCAL3]->add(fcalCC);
369 break;
370 }
371 default: { //unknown case, tidy up
372 delete fcalCC; fcalCC=nullptr;
373 break;
374 }
375 }
376 // ------- FCAL ----------
377 }
378 else if(!calo_id->is_tile_gapscin(cell->ID())) {
379 // ------- Tile Barrel EC ----------
381
382 if(calo_id->is_tile_barrel(cell->ID()))
383 cell_managers[VP1CC_SelTypeTileB]->add(tileCC);
384 else
386 }
387 else if(calo_id->is_tile_gapscin(cell->ID())) {
388 // ------- Tile Crack ----------
389 VP1CC_TileCrack* tilecrackCC = new VP1CC_TileCrack(cell,tile_id,&sepHelperMap);
390
391 cell_managers[VP1CC_SelTypeTileCrack]->add(tilecrackCC);
392 }
393 }
394 catch(std::runtime_error& err) {
395 // --- do nothing for now
396 std::cout << "RunTime exception caught! --> " << err.what() << std::endl;
397 }
398 } // iterate over cells
399}
400
401std::string VP1CaloCellSystem::Clockwork::SearchTileRawchanKeys(const std::vector<std::string>& inputKeys)
402{
403 // Search order
404 std::vector<std::string> searchOrder;
405 searchOrder.push_back("TileRawChannelOpt2");
406 searchOrder.push_back("TileRawChannelOpt");
407 searchOrder.push_back("TileRawChannelFixed");
408 searchOrder.push_back("TileRawChannelFitCool");
409 searchOrder.push_back("TileRawChannelFit");
410 searchOrder.push_back("TileRawChannelCnt");
411 searchOrder.push_back("TileRawChannelFlt");
412
413 for(size_t i=0; i<searchOrder.size(); ++i) {
414 std::string searchString = searchOrder[i];
415 for(size_t ii=0; ii<inputKeys.size(); ++ii)
416 if(inputKeys[ii]==searchString)
417 return searchString;
418 }
419 // No keys found from Search Order, return empty string
420 return std::string("");
421}
422
423// -------------------- Clockwork -------------------------------
424
425
426
427// ---------------------- System ----------------------------
428
430:IVP13DSystemSimple("Cells","Display energy of CaloCell objects","tsulaia@mail.cern.ch or rbianchi@cern.ch"),
432{
433}
434
439
441{
442 // Standard stuff
443 m_clockwork->controller = new VP1CaloCellController(this);
444
445 // Connect controller signals to various slots
446 // Energy mode
447 connect(m_clockwork->controller,SIGNAL(energyModeEtChanged(bool)),
448 this,SLOT(energyMode()));
449
450 // Mbts
451 m_clockwork->mbtsHelper->setController(m_clockwork->controller);
452 connect(m_clockwork->controller,SIGNAL(selectionMbtsChanged(VP1Interval)),
453 m_clockwork->mbtsHelper,SLOT(selectionUpdated(VP1Interval)));
454 connect(m_clockwork->controller,SIGNAL(showVolumeOutLinesChanged(bool)),
455 m_clockwork->mbtsHelper,SLOT(outlineUpdate(bool)));
456 if (m_clockwork->controller->customTourEditor()){
457 std::cout <<" Connecting to CVRC" <<std::endl;
458 connect(m_clockwork->controller->customTourEditor(),SIGNAL(clipVolumeRadiusChanged(double)),
459 m_clockwork->mbtsHelper,SLOT(clipVolumeRadiusChanged(double)));
460 }
461 return m_clockwork->controller;
462}
463
465{
466 // Make sure we can use required custom 3D objects:
468
469 // ------------- DD Managers and ID Helpers -------------
470 StatusCode status = detstore->retrieve(m_clockwork->tile_dd_man);
471 if(status.isFailure() || m_clockwork->tile_dd_man==nullptr) {
472 m_clockwork->noCalo = true;
473 messageDebug("Unable to retrieve Tile DD Manager");
474 return;
475 }
476
477 status = detstore->retrieve(m_clockwork->calo_id,"CaloCell_ID");
478 if(status.isFailure() || m_clockwork->calo_id==nullptr) {
479 m_clockwork->noCalo = true;
480 messageDebug("0 pointer to Calo ID Helper");
481 return;
482 }
483
484 m_clockwork->tile_id = m_clockwork->tile_dd_man->get_id();
485 if(m_clockwork->tile_id ==nullptr) {
486 m_clockwork->noCalo = true;
487 messageDebug("0 pointer to Tile ID Helper");
488 return;
489 }
490
491 status = detstore->retrieve(m_clockwork->tile_hw_id);
492 if(status.isFailure() || m_clockwork->tile_hw_id==nullptr) {
493 messageDebug("Unable to retrieve Tile HWID");
494 m_clockwork->tile_hw_id = nullptr;
495 m_clockwork->noTileDigitsGlobal = true;
496 }
497 // ------------- DD Managers and ID Helpers -------------
498
499
500 // ------------- Tools/Services -------------
501 status = detstore->retrieve(m_clockwork->tile_info,"TileInfo");
502 if(status.isFailure() || m_clockwork->tile_info==nullptr) {
503 messageDebug("Unable to retrieve Tile Info");
504 m_clockwork->tile_info = nullptr;
505 m_clockwork->noTileDigitsGlobal = true;
506 }
507
509 if(m_clockwork->tile_cabling==nullptr) {
510 messageDebug("0 pointer to TileCabling");
511 m_clockwork->noTileDigitsGlobal = true;
512 }
513
514 status = detstore->retrieve(m_clockwork->lar_onlineID,"LArOnlineID");
515 if (status.isFailure() || m_clockwork->lar_onlineID == nullptr) {
516 messageDebug("Failed to retrieve LAr online ID");
517 m_clockwork->lar_onlineID = nullptr;
518 }
519
520
521 status = toolSvc()->retrieveTool("CaloBadChanTool",m_clockwork->calo_badchannel);
522 if (status.isFailure() || m_clockwork->calo_badchannel == nullptr) {
523 messageDebug("Failed to locate Calo Bad Channel Tool");
524 m_clockwork->calo_badchannel = nullptr;
525 }
526
527 // Pass retrieved pointers to the controller (for Tile Pulse display)
528 m_clockwork->controller->initTilePulse(m_clockwork->tile_hw_id,
529 m_clockwork->tile_info,
530 m_clockwork->tile_cabling);
531 // ------------- Tools/Services -------------
532
533
534 // -------------- MBTS ----------------
535 try {
536 m_clockwork->mbtsHelper->systemcreate(detstore);
537 } catch(std::runtime_error& err) {
538 message (err.what());
539 }
540 // -------------- MBTS ----------------
541}
542
544{
545 // Clear node 2 CC map
546 m_clockwork->node2ccMap.clear();
547
548 // Delete Cell Managers and clear the map
549 VP1CCManagerContainer::iterator it = m_clockwork->cell_managers.begin();
550 for(; it!=m_clockwork->cell_managers.end(); ++it)
551 if(it->second) delete it->second;
552
553 m_clockwork->cell_managers.clear();
554 m_clockwork->calocells = 0;
555
556 // delete separator helpers and clear the separator helper map
557 VP1CC_SeparatorMap::iterator itSepHelper = m_clockwork->sepHelperMap.begin();
558 for(; itSepHelper!= m_clockwork->sepHelperMap.end(); ++itSepHelper)
559 if(itSepHelper->second) delete itSepHelper->second;
560 m_clockwork->sepHelperMap.clear();
561
562 // MBTS
563 m_clockwork->mbtsHelper->systemerase();
564}
565
567{
568 messageDebug("VP1CaloCellSystem::systemuncreate()...");
569 m_clockwork->controller->DeleteDigitForms();
570}
571
573{
574 if(m_clockwork->noCalo) return;
575
576 root->addChild(m_clockwork->controller->drawOptions());
577
578 // Iterators for SG keys
579 std::vector<std::string>::const_iterator firstKey, lastKey;
580
581 // ---------------- Retrieve calo cells from SG ---------------------
582 // Check for SG keys
583 std::vector<std::string> strCaloCellKeys;
584 sg->keys<CaloCellContainer>(strCaloCellKeys);
585 firstKey = strCaloCellKeys.begin();
586 lastKey = strCaloCellKeys.end();
587
588
589 if(firstKey!=lastKey) {
590 // Some keys found
591 std::string keyCaloCell = *firstKey;
592 StatusCode status = sg->retrieve(m_clockwork->calocells,keyCaloCell);
593 if(status.isSuccess() && m_clockwork->calocells!=0) {
594 // Build a basis for the scene graph
595 // 1. Create one Separator and one Material for each member of VP1CC_SeparatorTypes
596 // 2. Also create Separator Helper objects
597 VP1CC_SeparatorTypesSet::iterator itSepType=m_clockwork->sepTypes.begin();
598 for(; itSepType!=m_clockwork->sepTypes.end(); ++itSepType) {
599 SoSeparator* childSep = new SoSeparator();
600 VP1ExtraSepLayerHelper* sepHelper = new VP1ExtraSepLayerHelper(childSep);
601
602 root->addChild(m_clockwork->controller->GetMaterial(*itSepType));
603 root->addChild(childSep);
604
605 m_clockwork->sepHelperMap[*itSepType] = sepHelper;
606 }
607
609
610 } else
611 message("Unable to retrieve Calo Cells from Store Gate for this event");
612
613 while(++firstKey!=lastKey)
614 messageDebug("Another Calo Cell collection found in the SG with key = " + QString((*firstKey).c_str()));
615 } else
616 message("No Calo Cells in Store Gate for this event"); // No keys found
617
618 // ---------------- Retrieve calo cells from SG ---------------------
619
620 // -------------------------- Digits ---------------------------------
621 m_clockwork->controller->ClearHideDigitForms();
622 m_clockwork->controller->EnableDigitsCheckbox(false);
623 m_clockwork->noLArDigitsEvent = m_clockwork->noLArDigitsGlobal;
624 m_clockwork->noTileDigitsEvent = m_clockwork->noTileDigitsGlobal;
625
626
627 /*
628 if(m_clockwork->calo_badchannel == 0)
629 m_clockwork->mainController->chbxEnableBadChannels->setEnabled(false);
630 else
631 m_clockwork->mainController->chbxEnableBadChannels->setEnabled(true);
632 */
633
634 if(!m_clockwork->noLArDigitsEvent) {
635 // Get keys for LArDigitContainers in the Store Gate
636 // If we have more than one container then it means we have All and/or Thinned and/or IIC -> use All if available, otherwise use Thinned
637 std::vector<std::string> strLArDigitKeys;
638 sg->keys<LArDigitContainer>(strLArDigitKeys);
639 firstKey = strLArDigitKeys.begin();
640 lastKey = strLArDigitKeys.end();
641
642 if(firstKey==lastKey){
643 message("No LAr Digits in Store Gate for this event");
644 m_clockwork->noLArDigitsEvent = true;
645 } else {
646 std::string strLArDigitKeys(""), tagThinned(""), tagIIC(""), tagFirstOther("");
647
648 for(;firstKey!=lastKey;++firstKey) {
649 if((*firstKey).find("Thinned")!=std::string::npos)
650 tagThinned = *firstKey;
651 else if((*firstKey).find("IIC")!=std::string::npos)
652 tagIIC = *firstKey;
653 else if(tagFirstOther=="")
654 tagFirstOther = *firstKey;
655 }
656
657 if(tagFirstOther!="")
658 strLArDigitKeys = tagFirstOther;
659 else if(tagThinned!="")
660 strLArDigitKeys = tagThinned;
661 else
662 strLArDigitKeys = tagIIC;
663
664 QString mess = QString("Retrieving LArDigitContainer with the key ") + QString(strLArDigitKeys.c_str());
665 messageDebug(mess);
666
667 StatusCode status = sg->retrieve(m_clockwork->lar_digits,strLArDigitKeys);
668
669 if(status.isSuccess() && m_clockwork->lar_digits != 0) {
670 m_clockwork->controller->EnableDigitsCheckbox(true);
671 std::ostringstream numLarDigits;
672 numLarDigits << m_clockwork->lar_digits->size();
673 message("Number of LAr digits for this event " + QString(numLarDigits.str().c_str()));
674 } else {
675 message("Unable to retrieve LAr digits from Store Gate for this event");
676 m_clockwork->lar_digits = 0;
677 m_clockwork->noLArDigitsEvent = true;
678 }
679 } // LArDigits found in the SG
680 }
681
682 if(!m_clockwork->noTileDigitsEvent) {
683 // Get keys for TileDigitContainers in the Store Gate
684 // If we have more than one container then use the first one and issue a warning message
685 std::vector<std::string> strTileDigitKeys;
686 sg->keys<TileDigitsContainer>(strTileDigitKeys);
687 firstKey = strTileDigitKeys.begin();
688 lastKey = strTileDigitKeys.end();
689
690 if(firstKey==lastKey){
691 message("No Tile Digits in Store Gate for this event");
692 m_clockwork->noTileDigitsEvent = true;
693 } else {
694 std::string keyTileDigits = *firstKey;
695 StatusCode status = sg->retrieve(m_clockwork->tile_digits,keyTileDigits);
696
697 if(status.isFailure() || m_clockwork->tile_digits==0){
698 message("Unable to retrieve Tile digits from Store Gate for this event");
699 m_clockwork->tile_digits = 0;
700 m_clockwork->noTileDigitsEvent = true;
701 } else {
702 m_clockwork->controller->EnableDigitsCheckbox(true);
703
704 // ------------ Tile Raw Channels (pulses) ------------------
705 std::vector<std::string> strTileRawchanKeys;
706 sg->keys<TileRawChannelContainer>(strTileRawchanKeys);
707 firstKey = strTileRawchanKeys.begin();
708 lastKey = strTileRawchanKeys.end();
709
710 if(firstKey==lastKey) {
711 message("No Tile Raw Channels in Store Gate for this event");
712 m_clockwork->noTileDigitsEvent = true;
713 } else {
714 std::string keyTileRawChan = m_clockwork->SearchTileRawchanKeys(strTileRawchanKeys);
715
716 // If no keys found from the specified order then just try the fisr one
717 if(keyTileRawChan=="")
718 keyTileRawChan = *firstKey;
719
720 QString mess = QString("Retrieving Tile Raw Channels with the key ") + QString(keyTileRawChan.c_str());
721 messageDebug(mess);
722
723 status = sg->retrieve(m_clockwork->tile_rawchannel,keyTileRawChan);
724 if(status.isFailure() || m_clockwork->tile_rawchannel==0) {
725 message("Unable to retrieve Tile raw channels from Store Gate for this event");
726 m_clockwork->tile_rawchannel = 0;
727 }
728 }
729 } // Digits retrieved successfully
730 } // Digit container keys found in SG
731 } // Tile digits
732
733 // -------------------------- Digits ---------------------------------
734
735 // -------------------------- MBTS ---------------------------------
736 // -- material
737 root->addChild(m_clockwork->controller->GetMaterial(VP1CC_SepMBTS));
738
739 // -- separator
740 SoSeparator* mbtsSeparator = new SoSeparator;
741 root->addChild(mbtsSeparator);
742 try {
743 m_clockwork->mbtsHelper->buildEventSceneGraph(sg,mbtsSeparator);
744 m_clockwork->mbtsHelper->refreshGraph(m_clockwork->controller->selectionMbts());
745 } catch(std::runtime_error& err) {
746 message (err.what());
747 }
748 // -------------------------- MBTS ---------------------------------
749 messageDebug("end of buildEventSceneGraph()");
750}
751
752void VP1CaloCellSystem::userPickedNode(SoNode* pickedNode, SoPath *pickedPath)
753{
754 messageDebug("VP1CaloCellSystem::userPickedNode()");
755
756 SoNode* tail = pickedPath->getTail();
757
758 // Find the VP1CC object which correspond to the selected 3D object
759 VP1CC_SoNode2CCMap::iterator itNode2CC = m_clockwork->node2ccMap.find(tail);
760
761 if(itNode2CC!=m_clockwork->node2ccMap.end()){
762 // VP1CC object found.
763
764 SG::ReadCondHandleKey<LArOnOffIdMapping> cablingKey ("LArOnOffIdMap");
765 cablingKey.initialize().ignore();
766 SG::ReadCondHandle<LArOnOffIdMapping> cabling (cablingKey);
767
768 std::string channel_string = "";
769 if ( cabling.isValid() && m_clockwork->lar_onlineID ) {
770 VP1CC_LAr* larCC = dynamic_cast<VP1CC_LAr*>((*itNode2CC).second);
771 if(larCC) {
772 Identifier cellOffline = larCC->getID();
773
774 std::ostringstream idstring;
775 if ( m_clockwork->calo_id->is_em(cellOffline) || m_clockwork->calo_id->is_hec(cellOffline) ) {
776 idstring <<"(b_ec=" << m_clockwork->calo_id->pos_neg(cellOffline) << ", samp="
777 << m_clockwork->calo_id->sampling(cellOffline) << ", reg="
778 << m_clockwork->calo_id->region(cellOffline) << ", eta="
779 << m_clockwork->calo_id->eta(cellOffline) << ", phi="
780 << m_clockwork->calo_id->phi(cellOffline) << ") ";
781 }
782 else if ( m_clockwork->calo_id->is_fcal(cellOffline) ) {
783 idstring <<"(pos_neg=" << m_clockwork->calo_id->pos_neg(cellOffline) << ",mod="
784 << m_clockwork->calo_id->sampling(cellOffline) << ",eta="
785 << m_clockwork->calo_id->eta(cellOffline) << ",phi="
786 << m_clockwork->calo_id->phi(cellOffline) << ") ";
787 }
788 channel_string = idstring.str();
789
790 HWIdentifier hwId;
791 try {
792 hwId = cabling->createSignalChannelID(cellOffline);
793 } catch(LArID_Exception&) {
794 message("LArID Exception caught while creating signal channel id");
795 m_clockwork->controller->ClearHideDigitForms();
796 return;
797 }
798 channel_string += m_clockwork->lar_onlineID->channel_name(hwId);
799 }
800 }
801
802 // Print information to the log window
803 std::vector<std::string> msg;
804 try {
805 msg = (*itNode2CC).second->ToString(m_clockwork->calo_id, channel_string);
806 } catch(std::runtime_error& err) {
807 message(err.what());
808 return;
809 }
810
811 for(unsigned int ii=0; ii<msg.size(); ++ii)
812 message((msg[ii]).c_str());
813
814 // Digits
815 if(m_clockwork->controller->showDigits()) {
816
817 messageDebug("showDigits() is checked...");
818
819
820 // ---------------------- LAr -------------------------
821 VP1CC_LAr* larCC = dynamic_cast<VP1CC_LAr*>((*itNode2CC).second);
822 if(larCC) {
823 messageDebug("LAr node selected");
824 if(!m_clockwork->noLArDigitsEvent) {
825 Identifier cellOffline = larCC->getID();
826 HWIdentifier hwId;
827 try {
828 hwId = cabling->createSignalChannelID(cellOffline);
829 } catch(LArID_Exception& e) {
830 message("EXCEPTION!! LArIDException caught while creating signal channel id!!");
831 m_clockwork->controller->ClearHideDigitForms();
832 return;
833 }
834
835 LArDigitContainer::const_iterator itLArDig=m_clockwork->lar_digits->begin();
836 for(;itLArDig!=m_clockwork->lar_digits->end(); ++itLArDig) {
837 if((*itLArDig)->hardwareID()==hwId) {
838
839 message("displaying LAr digits...");
840
841 try {
842 m_clockwork->controller->displayLArDigits( (*itLArDig)->nsamples(),
843 (*itLArDig)->samples(),
844 msg);
845 } catch (std::exception& e) {
846 message("Exception caught!!");
847 std::cout << "ERROR!!! Exception caught! --> " << e.what() << std::endl;
848 QString title = "ERROR!!! Exception caught!";
849 QString mex = "While displaying LAr digits, an exception has been caught!\n\nException details:\n\n" + QString::fromStdString(e.what());
850 messageDebug("Clearing the DigitForm and returning...");
851 m_clockwork->controller->ClearHideDigitForms();
852 messageDebug("Displaying the QMessageBox...");
853 QWidget* widget = 0; // the message box will be parentless
854 QMessageBox::warning( widget, title,
855 mex,
856 QMessageBox::Ok,
857 QMessageBox::Ok
858 );
859 messageDebug("Box shown. Returning...");
860 return;
861 }
862 messageDebug("Ok. Returning...");
863 return;
864 } // we found the digit container
865 } // loop over digit containers
866
867 // if not found the right cell and thus if not returning, we arrive here...
868 message("Unable to find digits for the selected cell");
869 } else {
870 message("LAr digit display not available");
871 }
872
873 // Since we are here, hide digits widgets
874 messageDebug("LAr. Clearing digits form...");
875 m_clockwork->controller->ClearHideDigitForms();
876 messageDebug("Cleared. Returning...");
877 return;
878 }// we are in LAr CC
879
880
881 // ------------- Tile Barrel & End Cap ------------------
882 VP1CC_TileBarEc* tileCC = dynamic_cast<VP1CC_TileBarEc*>((*itNode2CC).second);
883 if(tileCC) {
884 messageDebug("Tile Barrel & End Cap");
885 if(!m_clockwork->noTileDigitsEvent) {
886 int frag1, channel1, frag2, channel2;
887 if((tileCC->GetFragChannel(m_clockwork->tile_hw_id,false,frag1,channel1)==0) &&
888 (tileCC->GetFragChannel(m_clockwork->tile_hw_id,true,frag2,channel2)==0)) {
889
890 // ----------------- Plot digits -------------------
891 const TileDigits* digits1 = 0;
892 TileDigitsContainer::const_iterator itTileDig = m_clockwork->tile_digits->begin();
893
894 // loop over Tile digits
895 for(;itTileDig!=m_clockwork->tile_digits->end();++itTileDig) {
896 if((*itTileDig)->size() >0 && (*itTileDig)->identify()==frag1) {
897 messageDebug("Baa");
898 digits1 = (**itTileDig)[channel1];
899
900 // search for another container when we are in D0
901 const TileDigits* digits2 = 0;
902 if(channel2==channel1) {
903 itTileDig = m_clockwork->tile_digits->begin();
904
905 for(;itTileDig!=m_clockwork->tile_digits->end();++itTileDig) {
906 if((*itTileDig)->size() >0 && (*itTileDig)->identify()==frag2) {
907 digits2 = (**itTileDig)[channel2];
908 break;
909 }
910 }
911 } else { // D0
912 messageDebug("CCC");
913 digits2 = (**itTileDig)[channel2];
914 }
915
916 if(digits2==0) {
917 messageDebug("DDD");
918 message("Unable to find digits for the PMT 1");
919 m_clockwork->controller->ClearHideDigitForms();
920 return;
921 }
922 messageDebug("Displaying Tile digits...");
923 m_clockwork->controller->displayTileDigits(digits1->NtimeSamples(),
924 digits1->samples(),
925 digits2->samples(),
926 msg);
927 break;
928 } // found digits 1
929 } // loop over tile digits
930
931
932 if(digits1==0) {
933 message("Unable to find digits for the PMT 0");
934 m_clockwork->controller->ClearHideDigitForms();
935 return;
936 }
937 // ----------------- Plot digits -------------------
938
939 // ---------------- Plot pulse --------------------
940 messageDebug("Tile BB & EC plot pulse");
941 TileRawChannelContainer::const_iterator itTileRawCh = m_clockwork->tile_rawchannel->begin();
942 const TileRawChannel* rawchannel1 = 0;
943 // loop over Tile channels
944 for(;itTileRawCh!=m_clockwork->tile_rawchannel->end();++itTileRawCh) {
945
946 if((*itTileRawCh)->size()>0 && (*itTileRawCh)->identify()==frag1) {
947 rawchannel1 = (**itTileRawCh)[channel1];
948
949 // find Raw Channel 2
950 const TileRawChannel* rawchannel2 = 0;
951 if(channel2==channel1) {
952 messageDebug("channel2==_channel1");
953 // D0
954 itTileRawCh = m_clockwork->tile_rawchannel->begin();
955 for(;itTileRawCh!=m_clockwork->tile_rawchannel->end();++itTileRawCh)
956 if((*itTileRawCh)->size()>0 && (*itTileRawCh)->identify()==frag2) {
957 messageDebug("Get channel2...");
958 //the following value is never used, gets immediately overwritten after the
959 // break from loop
960 //rawchannel2 = (**itTileRawCh)[channel2];
961 break;
962 }
963 } else{
964 messageDebug("channel2!=_channel1. Get channel2...");
965 }
966 rawchannel2 = (**itTileRawCh)[channel2];
967
968 if(rawchannel2==0) {
969 message("Unable to get raw channel for PMT1");
970 break;
971 }
972
973 messageDebug("Displaying Tile pulse...");
974 std::cout << "debug vars :" << rawchannel1 << " - " << rawchannel2 << std::endl;
975 std::cout << m_clockwork->tile_rawchannel << std::endl;
976 std::cout << digits1->samples().size() << std::endl;
977
978 // note: the controller is the VP1CaloCellController class
979 try {
980 m_clockwork->controller->displayTilePulse(rawchannel1,rawchannel2,m_clockwork->tile_rawchannel,digits1->samples().size());
981 } catch (TileCalib::InvalidRawChanUnit& e) {
982 message("Exception caught!!");
983 std::cout << "ERROR!!! Exception caught from Tile! --> " << e.what() << std::endl;
984 QString title = "ERROR!!! Exception caught!";
985 QString mex = "While displaying Tile Pulse, an exception has been caught!\n\nException details:\n\n" + QString::fromStdString(e.what());
986 messageDebug("Clearing the DigitForm and returning...");
987 m_clockwork->controller->ClearHideDigitForms();
988 messageDebug("Displaying the QMessageBox...");
989 QWidget* widget = 0; // the message box will be parentless
990 QMessageBox::warning( widget, title,
991 mex,
992 QMessageBox::Ok,
993 // | QMessageBox::Discard
994 // | QMessageBox::Cancel,
995 QMessageBox::Ok
996 );
997 messageDebug("Returning...");
998 return;
999 }
1000 messageDebug("Displayed Tile pulse.");
1001 break;
1002 }
1003 }
1004
1005 if(rawchannel1==0) {
1006 message("Unable to get raw channel for PMT0");
1007 }
1008 // ---------------- Plot pulse --------------------
1009 messageDebug("Returning...");
1010 return;
1011 }
1012 message("Unable to get drawer and channel IDs");
1013 } else
1014 message("Tile digit display not available");
1015
1016
1017 messageDebug("clearing...");
1018 m_clockwork->controller->ClearHideDigitForms();
1019 messageDebug("cleared. Return...");
1020 return;
1021 }
1022
1023 // -------------------------- Tile Crack ------------------------------
1024
1025 VP1CC_TileCrack* tileCrack = dynamic_cast<VP1CC_TileCrack*>((*itNode2CC).second);
1026 if(tileCrack) {
1027 messageDebug("Tile Crack");
1028 if(!m_clockwork->noTileDigitsEvent) {
1029 int frag, channel;
1030 if(tileCrack->GetFragChannel(m_clockwork->tile_hw_id,false,frag,channel)==0) {
1031 // ----------------- Plot digits -------------------
1032 const TileDigits* digits = 0;
1033 TileDigitsContainer::const_iterator itTileDig = m_clockwork->tile_digits->begin();
1034 for(;itTileDig!=m_clockwork->tile_digits->end();++itTileDig) {
1035 if((*itTileDig)->size() >0 && (*itTileDig)->identify()==frag) {
1036 digits = (**itTileDig)[channel];
1037
1038 m_clockwork->controller->displayTileDigits(digits->NtimeSamples(),
1039 digits->samples(),
1040 msg);
1041 break;
1042 }
1043 }
1044 if(digits==0) {
1045 message("Unable to find digits");
1046 m_clockwork->controller->ClearHideDigitForms();
1047 return;
1048 }
1049 // ----------------- Plot digits -------------------
1050
1051 // ---------------- Plot pulse --------------------
1052 TileRawChannelContainer::const_iterator itTileRawCh = m_clockwork->tile_rawchannel->begin();
1053 const TileRawChannel* rawchannel = 0;
1054 for(;itTileRawCh!=m_clockwork->tile_rawchannel->end();++itTileRawCh) {
1055 messageDebug("Tile Crack plot pulse");
1056 if((*itTileRawCh)->size()>0 && (*itTileRawCh)->identify()==frag) {
1057 rawchannel = (**itTileRawCh)[channel];
1058 m_clockwork->controller->displayTilePulse(rawchannel,m_clockwork->tile_rawchannel,digits->samples().size());
1059 }
1060 }
1061 if(rawchannel==0)
1062 message("Unable to get raw channel");
1063 // ---------------- Plot pulse --------------------
1064 return;
1065 }
1066 message("Unable to get drawer and channel ID");
1067 } else
1068 message("Tile digit display not available");
1069
1070 m_clockwork->controller->ClearHideDigitForms();
1071
1072 return;
1073 }
1074
1075 }// show digits
1076 return;
1077 }// Find node in the VP1CC map
1078
1079 messageDebug("out of the big loop on nodes...");
1080
1081 // Maybe MBTS has been selected?
1082 std::vector<std::string> msg = m_clockwork->mbtsHelper->userPickedNode(pickedNode);
1083 for(unsigned int ii=0; ii<msg.size(); ++ii)
1084 message((msg[ii]).c_str());
1085}
1086
1088{
1089 VP1Serialise serialise(0/*version*/,this);
1090 serialise.save(IVP13DSystemSimple::saveState());
1091
1093
1094 serialise.save(m_clockwork->controller->saveSettings());
1095
1096 serialise.disableUnsavedChecks();
1097 return serialise.result();
1098}
1099
1101{
1102 VP1Deserialise state(ba,this);
1103
1104 if (state.version()!=0) {
1105 message("Warning: State data in .vp1 file is in wrong format - ignoring!");
1106 return;
1107 }
1109
1110 IVP13DSystemSimple::restoreFromState(state.restoreByteArray());
1111
1112 m_clockwork->controller->restoreSettings(state.restoreByteArray());
1113
1114 state.disableUnrestoredChecks();
1115}
1116
1118{
1119 // Remove objects from 3D scene
1120 while(m_clockwork->node2ccMap.begin()!=m_clockwork->node2ccMap.end()) {
1121 VP1CC_SoNode2CCMap::iterator it_node2cc = m_clockwork->node2ccMap.begin();
1122 it_node2cc->second->remove3DObjects(&m_clockwork->node2ccMap);
1123 }
1124
1125 // Clear node 2 CC map
1126 m_clockwork->node2ccMap.clear();
1127
1128 // Delete Cell Managers and clear the map
1129 VP1CCManagerContainer::iterator it_ccman = m_clockwork->cell_managers.begin();
1130 for(; it_ccman!=m_clockwork->cell_managers.end(); ++it_ccman)
1131 if(it_ccman->second) delete it_ccman->second;
1132
1133 m_clockwork->cell_managers.clear();
1134
1135 // Setup new managers from scratch in the new energy mode
1137}
1138
1140{
1141 // Prepare Separator Helpers for large changes
1142 VP1CC_SeparatorMap::iterator itSepHelp = m_clockwork->sepHelperMap.begin();
1143 for(;itSepHelp != m_clockwork->sepHelperMap.end(); ++itSepHelp)
1144 itSepHelp->second->largeChangesBegin();
1145
1146 // Create Managers
1147 m_clockwork->BuildCellManagers();
1148
1149 // Assign Cells to Managers
1150 m_clockwork->FillManagers();
1151
1152 // Update scene with initial values of controller objects
1153 const VP1CCIntervalMap& intervals = m_clockwork->controller->selectionIntervals();
1154 VP1CCManagerContainer::iterator it = m_clockwork->cell_managers.begin();
1155 for(; it!=m_clockwork->cell_managers.end(); ++it)
1156 it->second->selectionUpdated(intervals);
1157
1158 // Large changes over
1159 itSepHelp = m_clockwork->sepHelperMap.begin();
1160 for(;itSepHelp != m_clockwork->sepHelperMap.end(); ++itSepHelp)
1161 itSepHelp->second->largeChangesEnd();
1162
1163 updateGUI();
1164}
std::map< VP1CC_SelectionTypes, VP1CaloCellManager *, std::less< VP1CC_SelectionTypes > > VP1CCManagerContainer
@ VP1CC_SepTileNegativeDown
@ VP1CC_SepTilePositiveDown
@ VP1CC_SepLArEMBPos
@ VP1CC_SepLArHECNeg
@ VP1CC_SepLArFCALPos
@ VP1CC_SepLArEMECPos
@ VP1CC_SepMBTS
@ VP1CC_SepTilePositiveNeg
@ VP1CC_SepLArEMECNeg
@ VP1CC_SepTilePositiveUp
@ VP1CC_SepLArEMBNeg
@ VP1CC_SepLArHECPos
@ VP1CC_SepTileNegativePos
@ VP1CC_SepTileNegativeUp
@ VP1CC_SepLArFCALNeg
std::map< VP1CC_SeparatorTypes, VP1ExtraSepLayerHelper *, std::less< VP1CC_SeparatorTypes > > VP1CC_SeparatorMap
QMap< VP1CC_SelectionTypes, VP1CCIntervalPair > VP1CCIntervalMap
@ VP1CC_SelTypeEMB2
@ VP1CC_SelTypeEMEC1
@ VP1CC_SelTypeFCAL3
@ VP1CC_SelTypeTileB
@ VP1CC_SelTypeEMEC3
@ VP1CC_SelTypeFCAL1
@ VP1CC_SelTypeHEC0
@ VP1CC_SelTypeHEC2
@ VP1CC_SelTypeTileEC
@ VP1CC_SelTypeEMB3
@ VP1CC_SelTypeEMEC0
@ VP1CC_SelTypeEMB0
@ VP1CC_SelTypeFCAL2
@ VP1CC_SelTypeEMB1
@ VP1CC_SelTypeEMEC2
@ VP1CC_SelTypeHEC3
@ VP1CC_SelTypeHEC1
@ VP1CC_SelTypeTileCrack
std::map< SoNode *, VP1CaloCell *, std::less< SoNode * > > VP1CC_SoNode2CCMap
std::set< VP1CC_SeparatorTypes > VP1CC_SeparatorTypesSet
Container class for CaloCell.
Helper class for offline cell identifiers.
Definition CaloCell_ID.h:34
Data object for each calorimeter readout cell.
Definition CaloCell.h:57
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
IVP13DSystemSimple(const QString &name, const QString &information, const QString &contact_info)
IToolSvc * toolSvc() const
virtual void restoreFromState(QByteArray)
void messageDebug(const QString &) const
State state() const
void message(const QString &) const
IVP1ChannelWidget * channel() const
virtual QByteArray saveState()
Container class for LArDigit.
Exception class for LAr Identifiers.
StatusCode initialize(bool used=true)
static void initClass()
The Athena Transient Store API.
StatusCode retrieve(const T *&ptr) const
Retrieve the default object into a const T*.
void keys(std::vector< std::string > &vkeys, bool includeAlias=false, bool onlyValid=true) const
provide list of all StoreGate keys associated with an object.
static const TileCablingService * getInstance()
get pointer to service instance
int NtimeSamples(void) const
Definition TileDigits.h:62
const std::vector< float > & samples() const
Definition TileDigits.h:58
Helper class for TileCal online (hardware) identifiers.
Definition TileHWID.h:49
Helper class for TileCal offline identifiers.
Definition TileID.h:67
int GetFragChannel(const TileHWID *tile_hw_id, bool up, int &frag, int &channel)
int GetFragChannel(const TileHWID *tile_hw_id, bool up, int &frag, int &channel)
std::string SearchTileRawchanKeys(const std::vector< std::string > &inputKeys)
Clockwork(const Clockwork &)=delete
const CaloCellContainer * calocells
VP1CC_SeparatorTypesSet sepTypes
VP1CCManagerContainer cell_managers
Clockwork & operator=(const Clockwork &)=delete
const TileDigitsContainer * tile_digits
const LArDigitContainer * lar_digits
const TileRawChannelContainer * tile_rawchannel
const TileDetDescrManager * tile_dd_man
const TileCablingService * tile_cabling
VP1CaloCellController * controller
const ICaloBadChanTool * calo_badchannel
void buildEventSceneGraph(StoreGateSvc *sg, SoSeparator *root)
void userPickedNode(SoNode *pickedNode, SoPath *pickedPath)
void systemcreate(StoreGateSvc *detstore)
void restoreFromState(QByteArray ba)
Identifier getID()
std::string tail(std::string s, const std::string &pattern)
tail of a string
MsgStream & msg
Definition testRead.cxx:32