--- /dev/null
+// $Id$
+// Category: geometry
+//
+// Author: I. Hrivnacova
+//
+// Class AliDetSwitchVector
+// ---------------------------
+// See the class description in the header file.
+
+#include "AliDetSwitchVector.h"
+#include "AliDetSwitch.h"
+#include "AliGlobals.h"
+#include "AliFiles.h"
+
+//_____________________________________________________________________________
+AliDetSwitchVector::AliDetSwitchVector()
+ : fMessenger(this)
+{
+//
+}
+
+//_____________________________________________________________________________
+AliDetSwitchVector::AliDetSwitchVector(const AliDetSwitchVector& right)
+ : fMessenger(this)
+{
+//
+ AliGlobals::Exception("AliDetSwitchVector is protected from copying.");
+}
+
+//_____________________________________________________________________________
+AliDetSwitchVector::~AliDetSwitchVector() {
+//
+ // destroy det switch vector
+ DetSwitchIterator it;
+ for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++)
+ delete *it;
+}
+
+// operators
+
+//_____________________________________________________________________________
+AliDetSwitchVector&
+AliDetSwitchVector::operator=(const AliDetSwitchVector& right)
+{
+ // check assignement to self
+ if (this == &right) return *this;
+
+ AliGlobals::Exception("AliDetSwitchVector is protected from assigning.");
+
+ return *this;
+}
+
+// protected methods
+
+//_____________________________________________________________________________
+AliDetSwitch*
+AliDetSwitchVector::GetDetSwitch(const G4String& moduleName) const
+{
+// Returns the detector switch with given detector name.
+// ---
+
+ DetSwitchConstIterator it;
+ for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++)
+ if ((*it)->GetDetName() == moduleName) return *it;
+
+ G4String text = "AliDetSwitchVector::GetDetSwitch:\n";
+ text = text + "Wrong detector name for " + moduleName;
+ AliGlobals::Exception(text);
+ return 0;
+}
+
+// public methods
+
+//_____________________________________________________________________________
+void AliDetSwitchVector::Add(AliDetSwitch* detSwitch)
+{
+// Adds detSwitch to the detSwitch vector.
+// ---
+
+ fDetSwitchVector.push_back(detSwitch);
+ fMessenger.SetCandidates();
+}
+
+//_____________________________________________________________________________
+void AliDetSwitchVector::SwitchDetOn(const G4String& moduleNameVer)
+{
+// Switchs on module specified by name and version.
+// ---
+
+ DetSwitchIterator it;
+
+ if (moduleNameVer == "ALL") {
+ for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++)
+ (*it)->SwitchOnDefault();
+ }
+ else if (moduleNameVer == "NONE") {
+ for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++)
+ (*it)->SwitchOff();
+ }
+ else {
+ // get version number
+ G4int len = moduleNameVer.length();
+ G4String moduleName = moduleNameVer.substr(0, len-1);
+ G4String version = moduleNameVer.substr(len-1, 1);
+ G4int iVersion = AliGlobals::StringToInt(version);
+
+ if (iVersion < 0) {
+ // in case the version number is not provided
+ // the default one is set
+ SwitchDetOnDefault(moduleNameVer);
+ }
+ else
+ SwitchDetOn(moduleName, iVersion);
+ }
+}
+
+//_____________________________________________________________________________
+void AliDetSwitchVector::SwitchDetOn(const G4String& moduleName,
+ G4int version)
+{
+// Switchs on module specified by name and version.
+// ---
+
+ GetDetSwitch(moduleName)->SwitchOn(version);
+}
+
+//_____________________________________________________________________________
+void AliDetSwitchVector::SwitchDetOnDefault(const G4String& moduleName)
+{
+// Switchs on module specified by name with default version.
+// ---
+
+ GetDetSwitch(moduleName)->SwitchOnDefault();
+}
+
+//_____________________________________________________________________________
+void AliDetSwitchVector::SwitchDetOff(const G4String& moduleName)
+{
+// Switchs off module specified by name.
+// ---
+
+ if (moduleName == "ALL") {
+ DetSwitchIterator it;
+ for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++)
+ (*it)->SwitchOff();
+ }
+ else
+ GetDetSwitch(moduleName)->SwitchOff();
+}
+
+//_____________________________________________________________________________
+void AliDetSwitchVector::PrintSwitchedDets() const
+{
+// Lists switched detectors.
+// ---
+
+ G4String svList = GetSwitchedDetsList();
+
+ G4cout << "Switched Alice detectors: " << G4endl;
+ G4cout << "--------------------------" << G4endl;
+ G4cout << svList << G4endl;
+}
+
+//_____________________________________________________________________________
+void AliDetSwitchVector::PrintAvailableDets() const
+{
+// Lists available detectors.
+// ---
+
+ G4String avList = GetAvailableDetsList();
+
+ G4cout << "Available Alice detectors: " << G4endl;
+ G4cout << "---------------------------" << G4endl;
+ G4cout << avList << G4endl;
+}
+
+//_____________________________________________________________________________
+G4String AliDetSwitchVector::GetSwitchedDetsList() const
+{
+// Returns list of switched detectors.
+// ---
+
+ G4String svList = "";
+ G4int nofSwitchedDets = 0;
+ DetSwitchConstIterator it;
+
+ for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++) {
+ G4int iVersion = (*it)->GetSwitchedVersion();
+ if (iVersion > -1) {
+ nofSwitchedDets++;
+ G4String moduleNameVer = (*it)->GetDetName();
+ AliGlobals::AppendNumberToString(moduleNameVer, iVersion);
+ svList += moduleNameVer;
+ svList += " ";
+ }
+ }
+
+ if (nofSwitchedDets == fDetSwitchVector.size()) svList = "ALL: " + svList;
+ if (nofSwitchedDets == 0) svList = "NONE";
+
+ return svList;
+}
+
+//_____________________________________________________________________________
+G4String AliDetSwitchVector::GetAvailableDetsList() const
+{
+// Returns list of available detectors.
+// ---
+
+ G4String svList = "";
+ DetSwitchConstIterator it;
+
+ for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++)
+ for (G4int iv=0; iv<(*it)->GetNofVersions(); iv++) {
+ G4String moduleNameVer = (*it)->GetDetName();
+ AliGlobals::AppendNumberToString(moduleNameVer, iv);
+ svList += moduleNameVer;
+ svList += " ";
+ }
+
+ return svList;
+}
+
+//_____________________________________________________________________________
+G4String AliDetSwitchVector::GetAvailableDetsListWithCommas() const
+{
+// Returns list of available detectors with commas.
+// ---
+
+ G4String svList = "";
+ G4int id =0;
+ DetSwitchConstIterator it;
+
+ for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++)
+ for (G4int iv=0; iv<(*it)->GetNofVersions(); iv++) {
+ G4String moduleNameVer = (*it)->GetDetName();
+ AliGlobals::AppendNumberToString(moduleNameVer, iv);
+ svList += moduleNameVer;
+ if (iv < (*it)->GetNofVersions()-1) svList += "/";
+ else if (id++ < fDetSwitchVector.size()-1) svList += ", ";
+ }
+
+ return svList;
+}
+
+//_____________________________________________________________________________
+G4String AliDetSwitchVector::GetDetNamesList() const
+{
+// Returns list of detector names.
+// ---
+
+ G4String svList = "";
+ DetSwitchConstIterator it;
+
+ for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++) {
+ svList += (*it)->GetDetName();
+ svList += " ";
+ }
+
+ return svList;
+}
+
+//_____________________________________________________________________________
+G4String AliDetSwitchVector::GetDetNamesListWithCommas() const
+{
+// Returns list of detector names with commas.
+// ---
+
+ G4String svList = "";
+ G4int id =0;
+ DetSwitchConstIterator it;
+
+ for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++) {
+ svList += (*it)->GetDetName();
+ if (id++ < fDetSwitchVector.size()-1) svList += ", ";
+ }
+
+ return svList;
+}
+
--- /dev/null
+// $Id$
+// Category: geometry
+//
+// Author: I. Hrivnacova
+//
+// Class AliDetSwitchVector
+// ---------------------------
+// The class contains a vector of detector switches
+// and provides methods for their interactive setting.
+
+#ifndef ALI_DET_SWITCH_VECTOR_H
+#define ALI_DET_SWITCH_VECTOR_H
+
+#include "AliDetSwitchVectorMessenger.h"
+
+#include <globals.hh>
+#include <g4std/vector>
+
+class AliDetSwitch;
+
+class AliDetSwitchVector
+{
+ typedef G4std::vector<AliDetSwitch*> DetSwitchVector;
+ typedef DetSwitchVector::iterator DetSwitchIterator;
+ typedef DetSwitchVector::const_iterator DetSwitchConstIterator;
+
+ public:
+ AliDetSwitchVector();
+ // --> protected
+ // AliDetSwitchVector(const AliDetSwitchVector& right);
+ virtual ~AliDetSwitchVector();
+
+ // methods
+ void Add(AliDetSwitch* detSwitch);
+ void SwitchDetOn(const G4String& moduleNameVer);
+ void SwitchDetOn(const G4String& moduleName, G4int version);
+ void SwitchDetOnDefault(const G4String& moduleName);
+ void SwitchDetOff(const G4String& moduleName);
+ void PrintSwitchedDets() const;
+ void PrintAvailableDets() const;
+
+ // get methods
+ G4int GetSize() const;
+ AliDetSwitch* GetDetSwitch(G4int i) const;
+ AliDetSwitch* GetDetSwitch(const G4String& moduleName) const;
+ G4String GetSwitchedDetsList() const;
+ G4String GetAvailableDetsList() const;
+ G4String GetAvailableDetsListWithCommas() const;
+ G4String GetDetNamesList() const;
+ G4String GetDetNamesListWithCommas() const;
+
+ protected:
+ AliDetSwitchVector(const AliDetSwitchVector& right);
+
+ // operators
+ AliDetSwitchVector& operator=(const AliDetSwitchVector& right);
+
+ private:
+ // data members
+ AliDetSwitchVectorMessenger fMessenger; //messenger
+ DetSwitchVector fDetSwitchVector; //vector of AliDetSwitch
+};
+
+// inline methods
+
+inline G4int AliDetSwitchVector::GetSize() const
+{ return fDetSwitchVector.size(); }
+
+inline AliDetSwitch* AliDetSwitchVector::GetDetSwitch(G4int i) const
+{ return fDetSwitchVector[i]; }
+
+#endif //ALI_DET_SWITCH_VECTOR_H
+
--- /dev/null
+// $Id$
+// Category: geometry
+//
+// Author: I. Hrivnacova
+//
+// Class AliDetSwitchVectorMessenger
+// ------------------------------------
+// See the class description in the header file.
+
+#include "AliDetSwitchVectorMessenger.h"
+#include "AliDetSwitchVector.h"
+#include "AliGlobals.h"
+
+#include <G4UIdirectory.hh>
+#include <G4UIcmdWithAString.hh>
+#include <G4UIcmdWithoutParameter.hh>
+
+//_____________________________________________________________________________
+AliDetSwitchVectorMessenger::AliDetSwitchVectorMessenger(
+ AliDetSwitchVector* switchVector)
+ : fDetSwitchVector(switchVector)
+{
+//
+ fSwitchOnCmd = new G4UIcmdWithAString("/aliDet/switchOn", this);
+ fSwitchOnCmd->SetGuidance("Define the module to be built.");
+ fSwitchOnCmd->SetGuidance("Available modules:");
+ G4String listAvailableDets = "NONE, ALL, ";
+ listAvailableDets
+ = listAvailableDets + fDetSwitchVector->GetAvailableDetsListWithCommas();
+ fSwitchOnCmd->SetGuidance(listAvailableDets);
+ fSwitchOnCmd->SetParameterName("module", false);
+ fSwitchOnCmd->AvailableForStates(PreInit);;
+
+ fSwitchOffCmd = new G4UIcmdWithAString("/aliDet/switchOff", this);
+ fSwitchOffCmd->SetGuidance("Define the module not to be built.");
+ fSwitchOffCmd->SetGuidance("Available modules:");
+ G4String listDetsNames = "ALL, ";
+ listDetsNames
+ = listDetsNames + fDetSwitchVector->GetDetNamesListWithCommas();
+ fSwitchOffCmd->SetGuidance(listDetsNames);
+ fSwitchOffCmd->SetParameterName("module", false);
+ fSwitchOffCmd->AvailableForStates(PreInit);;
+
+ fListCmd
+ = new G4UIcmdWithoutParameter("/aliDet/list", this);
+ fListCmd->SetGuidance("List the currently switched modules.");
+ fListCmd
+ ->AvailableForStates(PreInit, Init, Idle, GeomClosed, EventProc);
+
+ fListAvailableCmd
+ = new G4UIcmdWithoutParameter("/aliDet/listAvailable", this);
+ fListAvailableCmd->SetGuidance("List all available modules.");
+ fListAvailableCmd
+ ->AvailableForStates(PreInit, Init, Idle, GeomClosed, EventProc);
+
+ // set candidates list
+ SetCandidates();
+
+ // set default values to a detector
+ fDetSwitchVector->SwitchDetOn("NONE");
+}
+
+//_____________________________________________________________________________
+AliDetSwitchVectorMessenger::AliDetSwitchVectorMessenger() {
+//
+}
+
+//_____________________________________________________________________________
+AliDetSwitchVectorMessenger::AliDetSwitchVectorMessenger(
+ const AliDetSwitchVectorMessenger& right)
+{
+//
+ AliGlobals::Exception(
+ "AliDetSwitchVectorMessenger is protected from copying.");
+}
+
+//_____________________________________________________________________________
+AliDetSwitchVectorMessenger::~AliDetSwitchVectorMessenger() {
+//
+ delete fSwitchOnCmd;
+ delete fSwitchOffCmd;
+ delete fListCmd;
+ delete fListAvailableCmd;
+}
+
+// operators
+
+//_____________________________________________________________________________
+AliDetSwitchVectorMessenger&
+AliDetSwitchVectorMessenger::operator=(const AliDetSwitchVectorMessenger& right)
+{
+ // check assignement to self
+ if (this == &right) return *this;
+
+ AliGlobals::Exception(
+ "AliDetSwitchVectorMessenger is protected from assigning.");
+
+ return *this;
+}
+
+// public methods
+
+//_____________________________________________________________________________
+void AliDetSwitchVectorMessenger::SetNewValue(G4UIcommand* command,
+ G4String newValues)
+{
+// Applies command to the associated object.
+// ---
+
+ if (command == fSwitchOnCmd) {
+ fDetSwitchVector->SwitchDetOn(newValues);
+ }
+ else if (command == fSwitchOffCmd) {
+ fDetSwitchVector->SwitchDetOff(newValues);
+ }
+ else if (command == fListCmd) {
+ fDetSwitchVector->PrintSwitchedDets();
+ }
+ else if (command == fListAvailableCmd) {
+ fDetSwitchVector->PrintAvailableDets();
+ }
+}
+
+//_____________________________________________________________________________
+void AliDetSwitchVectorMessenger::SetCandidates()
+{
+// Builds candidates list.
+// ---
+
+ G4String candidatesList = "NONE ALL ";
+ candidatesList += fDetSwitchVector->GetDetNamesList();;
+ candidatesList += fDetSwitchVector->GetAvailableDetsList();
+ fSwitchOnCmd->SetCandidates(candidatesList);
+
+ candidatesList = "ALL ";
+ candidatesList += fDetSwitchVector->GetDetNamesList();;
+ fSwitchOffCmd->SetCandidates(candidatesList);
+}
--- /dev/null
+// $Id$
+// Category: geometry
+//
+// Author: I. Hrivnacova
+//
+// Class AliDetSwitchVectorMessenger
+// ------------------------------------
+// Messenger class that defines commands for AliDetSwitchVector.
+
+#ifndef ALI_DET_SWITCH_VECTOR_MESSENGER_H
+#define ALI_DET_SWITCH_VECTOR_MESSENGER_H
+
+#include <G4UImessenger.hh>
+#include <globals.hh>
+
+class AliDetSwitchVector;
+
+class G4UIcommand;
+class G4UIdirectory;
+class G4UIcmdWithAString;
+class G4UIcmdWithoutParameter;
+
+class AliDetSwitchVectorMessenger: public G4UImessenger
+{
+ public:
+ AliDetSwitchVectorMessenger(AliDetSwitchVector* detSwitchVector);
+ // --> protected
+ // AliDetSwitchVectorMessenger();
+ // AliDetSwitchVectorMessenger(const AliDetSwitchVectorMessenger& right);
+ virtual ~AliDetSwitchVectorMessenger();
+
+ // methods
+ virtual void SetNewValue(G4UIcommand* command, G4String newValues);
+ void SetCandidates();
+
+ protected:
+ AliDetSwitchVectorMessenger();
+ AliDetSwitchVectorMessenger(const AliDetSwitchVectorMessenger& right);
+
+ // operators
+ AliDetSwitchVectorMessenger&
+ operator=(const AliDetSwitchVectorMessenger &right);
+
+ private:
+ AliDetSwitchVector* fDetSwitchVector; //associated class
+
+ // commands data members
+ G4UIcmdWithAString* fSwitchOnCmd; //command: switchOn
+ G4UIcmdWithAString* fSwitchOffCmd; //command: switchOn
+ G4UIcmdWithoutParameter* fListCmd; //command: list
+ G4UIcmdWithoutParameter* fListAvailableCmd;//command: listAvailable
+};
+
+#endif //ALI_DET_SWITCH_VECTOR_MESSENGER_H
+
--- /dev/null
+// $Id$
+// Category: geometry
+//
+// Author: I. Hrivnacova
+//
+// Class AliLVTree
+// ---------------------------
+// See the class description in the header file.
+
+#include "AliLVTree.h"
+#include "AliGlobals.h"
+#include "AliLVStructure.h"
+#include "AliModule.h"
+#ifdef ALICE_VISUALIZE
+#include "AliColourStore.h"
+#endif
+
+#include "TG4GeometryServices.h"
+
+#include <G4LogicalVolumeStore.hh>
+#include <G4LogicalVolume.hh>
+#ifdef ALICE_VISUALIZE
+#include <G4Colour.hh>
+#include <G4VisAttributes.hh>
+#endif
+
+AliLVTree* AliLVTree::fgInstance = 0;
+
+//_____________________________________________________________________________
+AliLVTree* AliLVTree::Instance()
+{
+// Static singleton access method.
+// ---
+
+ if (!fgInstance) new AliLVTree();
+
+ return fgInstance;
+}
+
+//_____________________________________________________________________________
+AliLVTree::AliLVTree()
+ : fMessenger(this)
+{
+// Protected singleton constructor.
+// ---
+
+ fgInstance = this;
+}
+
+//_____________________________________________________________________________
+AliLVTree::AliLVTree(const AliLVTree& right)
+ : fMessenger(this)
+{
+// Protected singleton copy constructor.
+// ---
+//
+ AliGlobals::Exception(
+ "Attempt to copy AliLVTree singleton.");
+}
+
+//_____________________________________________________________________________
+AliLVTree::~AliLVTree() {
+//
+}
+
+// operators
+
+//_____________________________________________________________________________
+AliLVTree& AliLVTree::operator=(const AliLVTree& right)
+{
+ // check assignement to self
+ if (this == &right) return *this;
+
+ AliGlobals::Exception(
+ "Attempt to assign AliLVTree singleton.");
+
+ return *this;
+
+}
+
+// protected methods
+
+//_____________________________________________________________________________
+void AliLVTree::RegisterLogicalVolume(G4LogicalVolume* lv, const G4String& path,
+ AliLVStructure& lvStructure) const
+{
+// Registers logical volume lv in the structure.
+// ---
+
+ lvStructure.AddNewVolume(lv, path);
+
+ // register daughters
+ G4int nofDaughters = lv->GetNoDaughters();
+ if (nofDaughters>0) {
+ G4String previousName = "";
+ for (G4int i=0; i<nofDaughters; i++) {
+ G4LogicalVolume* lvd = lv->GetDaughter(i)->GetLogicalVolume();
+ G4String currentName = lvd->GetName();
+ if (currentName != lv->GetName() && currentName != previousName) {
+ G4String newPath = path + lv->GetName() +"/";
+ RegisterLogicalVolume(lvd, newPath, lvStructure);
+ previousName = currentName;
+ }
+ }
+ }
+}
+
+//_____________________________________________________________________________
+void AliLVTree::Warn(const G4String& where, const G4String& lvName) const
+{
+// Prints warning "volume not found".
+// ---
+
+ G4String text("AliLVTree::" + where + ": " + lvName + " volume not found.");
+ AliGlobals::Warning(text);
+}
+
+//_____________________________________________________________________________
+void AliLVTree::Warn(const G4String& where) const
+{
+// Prints warning "volume not specified".
+// ---
+
+ G4String text("AliLVTree::" + where + ": " + " volume not specified.");
+ AliGlobals::Warning(text);
+}
+
+// public methods
+
+//_____________________________________________________________________________
+void AliLVTree::List(const G4String& lvName) const
+{
+// Lists logical volumes tree (daughters) of the logical volume
+// with specified lvName.
+// ----
+
+ G4LogicalVolume* lv
+ = TG4GeometryServices::Instance()->FindLogicalVolume(lvName);
+
+ if (lv) {
+ G4String path = "";
+ AliLVStructure lvStructure(path);
+ RegisterLogicalVolume(lv, path, lvStructure);
+ lvStructure.ListTree();
+ }
+ else
+ Warn("List", lvName);
+}
+
+//_____________________________________________________________________________
+void AliLVTree::List(G4LogicalVolume* lv) const
+{
+// Lists logical volumes tree of the given lv.
+// ----
+
+ if (!lv) {
+ Warn("List");
+ return;
+ }
+
+ List(lv->GetName());
+}
+
+//_____________________________________________________________________________
+void AliLVTree::ListLong(const G4String& lvName) const
+{
+// Lists logical volumes tree (daughters) of the logical volume
+// with specified lvName with numbers of daughters (physical volumes).
+// ----
+
+ G4LogicalVolume* lv
+ = TG4GeometryServices::Instance()->FindLogicalVolume(lvName);
+
+ if (lv) {
+ G4String path = "";
+ AliLVStructure lvStructure(path);
+ RegisterLogicalVolume(lv, path, lvStructure);
+ lvStructure.ListTreeLong();
+ }
+ else
+ Warn("ListLong", lvName);
+}
+
+//_____________________________________________________________________________
+void AliLVTree::ListLong(G4LogicalVolume* lv) const
+{
+// Lists logical volumes tree with numbers of daughters
+// (physical volumes) of the given lv.
+// ----
+
+ if (!lv) {
+ Warn("ListLong");
+ return;
+ }
+
+ ListLong(lv->GetName());
+}
+
+#ifdef G4VIS_USE
+
+//_____________________________________________________________________________
+void AliLVTree::SetLVTreeVisibility(G4LogicalVolume* lv,
+ G4bool visibility) const
+{
+// Sets visibility to the logical volumes tree (daughters) of
+// the logical volume lv.
+// ---
+
+ if (!lv) {
+ Warn("SetLVTreeVisibility");
+ return;
+ }
+
+ G4String path = "";
+ AliLVStructure lvStructure(path);
+ RegisterLogicalVolume(lv, path, lvStructure);
+ lvStructure.SetTreeVisibility(visibility);
+}
+
+//_____________________________________________________________________________
+void AliLVTree::SetVolumeVisibility(G4LogicalVolume* lv,
+ G4bool visibility) const
+{
+// Sets visibility to the specified logical volume.
+// ---
+
+ if (!lv) {
+ Warn("SetVolumeVisibility");
+ return;
+ }
+
+ const G4VisAttributes* kpVisAttributes = lv->GetVisAttributes ();
+ G4VisAttributes* newVisAttributes;
+ if (kpVisAttributes) {
+ G4Colour oldColour = kpVisAttributes->GetColour();
+ newVisAttributes = new G4VisAttributes(oldColour);
+ }
+ else
+ newVisAttributes = new G4VisAttributes();
+ delete kpVisAttributes;
+
+ newVisAttributes->SetVisibility(visibility);
+
+ lv->SetVisAttributes(newVisAttributes);
+}
+
+//_____________________________________________________________________________
+void AliLVTree::SetLVTreeColour(G4LogicalVolume* lv,
+ const G4String& colName) const
+{
+// Sets colour to the logical volumes tree (daughters) of
+// the logical volume lv.
+// ---
+
+ if (!lv) {
+ Warn("SetLVTreeColour");
+ return;
+ }
+
+ G4String path = "";
+ AliLVStructure lvStructure(path);
+ RegisterLogicalVolume(lv, path, lvStructure);
+ lvStructure.SetTreeVisibility(true);
+ lvStructure.SetTreeColour(colName);
+}
+
+//_____________________________________________________________________________
+void AliLVTree::SetVolumeColour(G4LogicalVolume* lv,
+ const G4String& colName) const
+{
+// Sets colour to the specified logical volume.
+// ---
+
+ if (!lv) {
+ Warn("SetVolumeColour");
+ return;
+ }
+
+ const G4VisAttributes* kpVisAttributes = lv->GetVisAttributes ();
+ delete kpVisAttributes;
+
+ G4VisAttributes* newVisAttributes = new G4VisAttributes();
+
+ AliColourStore* pColours = AliColourStore::Instance();
+ const G4Colour kColour = pColours->GetColour(colName);
+ newVisAttributes->SetVisibility(true);
+ newVisAttributes->SetColour(kColour);
+
+ lv->SetVisAttributes(newVisAttributes);
+}
+
+#endif //G4VIS_USE
+
--- /dev/null
+// $Id$
+// Category: geometry
+//
+// Author: I. Hrivnacova
+//
+// Class AliLVTree
+// ---------------------------
+// Class provides methods for browsing volumes trees,
+// and setting their visualization attributes.
+
+#ifndef ALI_LV_TREE_H
+#define ALI_LV_TREE_H
+
+#include "AliLVTreeMessenger.h"
+
+#include <globals.hh>
+
+class AliLVStructure;
+
+class G4LogicalVolume;
+#ifdef G4VIS_USE
+class G4Colour;
+#endif
+
+class AliLVTree
+{
+ public:
+ // --> protected
+ // AliLVTree();
+ // AliLVTree(const AliLVTree& right);
+ virtual ~AliLVTree();
+
+ // static methods
+ static AliLVTree* Instance();
+
+ // methods
+ void List(const G4String& lvName) const;
+ void List(G4LogicalVolume* lv) const;
+ void ListLong(const G4String& lvName) const;
+ void ListLong(G4LogicalVolume* lv) const;
+
+#ifdef G4VIS_USE
+ void SetLVTreeVisibility(G4LogicalVolume* lv, G4bool visibility) const;
+ void SetVolumeVisibility(G4LogicalVolume* lv, G4bool visibility) const;
+ void SetLVTreeColour(G4LogicalVolume* lv, const G4String& colName) const;
+ void SetVolumeColour(G4LogicalVolume* lv, const G4String& colName) const;
+#endif
+
+ protected:
+ AliLVTree();
+ AliLVTree(const AliLVTree& right);
+
+ // operators
+ AliLVTree& operator=(const AliLVTree &right);
+
+ private:
+ // methods
+ void RegisterLogicalVolume(G4LogicalVolume* lv, const G4String& path,
+ AliLVStructure& lvStructure) const;
+ void Warn(const G4String& where, const G4String& lvName) const;
+ void Warn(const G4String& where) const;
+
+ // static data members
+ static AliLVTree* fgInstance;
+
+ // data members
+ AliLVTreeMessenger fMessenger; //messenger
+};
+
+// inline methods
+
+#endif //ALI_LV_TREE_H
+
--- /dev/null
+// $Id$
+// Category: geometry
+//
+// Author: I. Hrivnacova
+//
+// Class AliLVTreeMessenger
+// ------------------------------------
+// See the class description in the header file.
+
+#include "AliLVTreeMessenger.h"
+#include "AliLVTree.h"
+#include "AliGlobals.h"
+#ifdef ALICE_VISUALIZE
+#include "AliColourStore.h"
+#endif
+
+#include "TG4GeometryServices.h"
+
+#include <G4UIdirectory.hh>
+#include <G4UIcmdWithABool.hh>
+#include <G4UIcmdWithAString.hh>
+#include <G4UIcmdWithoutParameter.hh>
+
+//_____________________________________________________________________________
+AliLVTreeMessenger::AliLVTreeMessenger(AliLVTree* lvTree)
+ : fLVTree(lvTree),
+ fCurrentVolume(0)
+{
+//
+ G4String dirName = "/aliTree/";
+ fDirectory = new G4UIdirectory(dirName);
+ fDirectory->SetGuidance("LV tree control commands.");
+
+ G4String commandPath = dirName + "setVolume";
+ fSetCurrentLVCmd = new G4UIcmdWithAString(commandPath, this);
+ fSetCurrentLVCmd->SetGuidance("Set the current logical volume.");
+ fSetCurrentLVCmd->SetParameterName("curVolume", false);
+ fSetCurrentLVCmd->AvailableForStates(PreInit,Idle);
+
+ commandPath = dirName + "list";
+ fListCmd = new G4UIcmdWithoutParameter(commandPath, this);
+ G4String guidance = "List LV tree of the current volume. ";
+ fListCmd->SetGuidance(guidance);
+ fListCmd->AvailableForStates(PreInit,Idle);
+
+ commandPath = dirName + "listLong";
+ fListLongCmd = new G4UIcmdWithoutParameter(commandPath, this);
+ guidance = "List LV tree of the current volume \n";
+ guidance = guidance + "including number of its daughters.";
+ fListLongCmd->SetGuidance(guidance);
+ fListLongCmd->AvailableForStates(PreInit,Idle);
+
+#ifdef G4VIS_USE
+ commandPath = dirName + "setLVTreeVisibility";
+ fSetLVTreeVisibilityCmd = new G4UIcmdWithABool(commandPath, this);
+ fSetLVTreeVisibilityCmd
+ ->SetGuidance("Make current volume tree visible/invisible.");
+ fSetLVTreeVisibilityCmd->SetParameterName("lvtreeVisibility", false);
+ fSetLVTreeVisibilityCmd->AvailableForStates(PreInit,Idle);
+
+ commandPath = dirName + "setVolVisibility";
+ fSetVolVisibilityCmd = new G4UIcmdWithABool(commandPath, this);
+ fSetVolVisibilityCmd
+ ->SetGuidance("Make current volume visible/invisible.");
+ fSetVolVisibilityCmd->SetParameterName("volVisibility", false);
+ fSetVolVisibilityCmd->AvailableForStates(PreInit,Idle);
+
+ commandPath = dirName + "setLVTreeColour";
+ fSetLVTreeColourCmd = new G4UIcmdWithAString(commandPath, this);
+ fSetLVTreeColourCmd->SetGuidance("Set colour for the current volume tree.");
+ fSetLVTreeColourCmd->SetGuidance("Available colours:");
+ guidance = AliColourStore::Instance()->GetColoursListWithCommas();
+ fSetLVTreeColourCmd->SetGuidance(guidance);
+ fSetLVTreeColourCmd->SetParameterName("lvtreeColour", false);
+ G4String candidatesList = AliColourStore::Instance()->GetColoursList();
+ fSetLVTreeColourCmd->SetCandidates(candidatesList);
+ fSetLVTreeColourCmd->AvailableForStates(PreInit,Idle);
+
+ commandPath = dirName + "setVolColour";
+ fSetVolColourCmd = new G4UIcmdWithAString(commandPath, this);
+ fSetVolColourCmd->SetGuidance("Set colour for the current volume.");
+ fSetVolColourCmd->SetGuidance("Available colours:");
+ guidance = AliColourStore::Instance()->GetColoursListWithCommas();
+ fSetVolColourCmd->SetGuidance(guidance);
+ fSetVolColourCmd->SetParameterName("volColour", false);
+ candidatesList = AliColourStore::Instance()->GetColoursList();
+ fSetVolColourCmd->SetCandidates(candidatesList);
+ fSetVolColourCmd->AvailableForStates(PreInit,Idle);
+#endif //G4VIS_USE
+}
+
+//_____________________________________________________________________________
+AliLVTreeMessenger::AliLVTreeMessenger() {
+//
+}
+
+//_____________________________________________________________________________
+AliLVTreeMessenger::AliLVTreeMessenger(const AliLVTreeMessenger& right)
+{
+//
+ AliGlobals::Exception(
+ "AliLVTreeMessenger is protected from copying.");
+}
+
+//_____________________________________________________________________________
+AliLVTreeMessenger::~AliLVTreeMessenger()
+{
+//
+ delete fDirectory;
+ delete fSetCurrentLVCmd;
+ delete fListCmd;
+ delete fListLongCmd;
+#ifdef G4VIS_USE
+ delete fSetLVTreeVisibilityCmd;
+ delete fSetVolVisibilityCmd;
+ delete fSetLVTreeColourCmd;
+ delete fSetVolColourCmd;
+#endif //G4VIS_USE
+}
+
+// operators
+
+//_____________________________________________________________________________
+AliLVTreeMessenger&
+AliLVTreeMessenger::operator=(const AliLVTreeMessenger& right)
+{
+ // check assignement to self
+ if (this == &right) return *this;
+
+ AliGlobals::Exception(
+ "AliLVTreeMessenger is protected from assigning.");
+
+ return *this;
+}
+
+// public methods
+
+//_____________________________________________________________________________
+void AliLVTreeMessenger::SetNewValue(G4UIcommand* command,
+ G4String newValues)
+{
+// Applies command to the associated object.
+// ---
+
+ G4String dirName = "/aliTree/";
+ fDirectory = new G4UIdirectory(dirName);
+ G4String guidance = "LV tree control commands ";
+ fDirectory->SetGuidance(guidance);
+
+ if (command == fSetCurrentLVCmd) {
+ fCurrentVolume
+ = TG4GeometryServices::Instance()->FindLogicalVolume(newValues);
+ }
+ else if (command == fListCmd) {
+ fLVTree->List(fCurrentVolume);
+ }
+ else if (command == fListLongCmd) {
+ fLVTree->ListLong(fCurrentVolume);
+ }
+#ifdef G4VIS_USE
+ if (command == fSetLVTreeVisibilityCmd) {
+ fLVTree
+ ->SetLVTreeVisibility(fCurrentVolume,
+ fSetVolVisibilityCmd->GetNewBoolValue(newValues));
+ }
+ else if (command == fSetVolVisibilityCmd) {
+ fLVTree
+ ->SetVolumeVisibility(fCurrentVolume,
+ fSetVolVisibilityCmd->GetNewBoolValue(newValues));
+ }
+ else if (command == fSetLVTreeColourCmd) {
+ fLVTree
+ ->SetLVTreeColour(fCurrentVolume, newValues);
+ }
+ else if (command == fSetVolColourCmd) {
+ fLVTree
+ ->SetVolumeColour(fCurrentVolume, newValues);
+ }
+#endif //G4VIS_USE
+}
+
--- /dev/null
+// $Id$
+// Category: geometry
+//
+// Author: I. Hrivnacova
+//
+// Class AliLVTreeMessenger
+// ------------------------------------
+// Messenger class that defines commands for AliLVTree.
+
+#ifndef ALI_LV_TREE_MESSENGER_H
+#define ALI_LV_TREE_MESSENGER_H
+
+#include <G4UImessenger.hh>
+#include <globals.hh>
+
+class AliLVTree;
+
+class G4UIdirectory;
+class G4UIcmdWithABool;
+class G4UIcmdWithAString;
+class G4UIcmdWithoutParameter;
+class G4LogicalVolume;
+
+class AliLVTreeMessenger: public G4UImessenger
+{
+ public:
+ AliLVTreeMessenger(AliLVTree* lvTree);
+ // --> protected
+ // AliLVTreeMessenger();
+ // AliLVTreeMessenger(const AliLVTreeMessenger& right);
+ virtual ~AliLVTreeMessenger();
+
+ // methods
+ virtual void SetNewValue(G4UIcommand* command, G4String newValues);
+
+ protected:
+ AliLVTreeMessenger();
+ AliLVTreeMessenger(const AliLVTreeMessenger& right);
+
+ // operators
+ AliLVTreeMessenger& operator=(const AliLVTreeMessenger &right);
+
+ private:
+ // data members
+ AliLVTree* fLVTree; //associated class
+ G4LogicalVolume* fCurrentVolume; //current logical volume
+ G4UIdirectory* fDirectory; //command directory
+ G4UIcmdWithAString* fSetCurrentLVCmd; //command: setVolume
+ G4UIcmdWithoutParameter* fListCmd; //command: list
+ G4UIcmdWithoutParameter* fListLongCmd; //command: listLong
+ G4UIcmdWithAString* fListDaughtersCmd; //command: listDaughters
+ G4UIcmdWithAString* fListLongDaughtersCmd; //command: listLongDaughters
+
+#ifdef G4VIS_USE
+ G4UIcmdWithABool* fSetLVTreeVisibilityCmd; //command: setLVTreeVisibility
+ G4UIcmdWithABool* fSetVolVisibilityCmd; //command: setVolVisibility
+ G4UIcmdWithAString* fSetLVTreeColourCmd; //command: setLVTreeColour
+ G4UIcmdWithAString* fSetVolColourCmd; //command: setVolColour
+#endif //G4VIS_USE
+};
+
+#endif //ALI_LV_TREE_MESSENGER_H
+