#include #include #include #include #include #include #include #include #include #include #include "IECALGeom.hxx" #include #include #include #include COMET::IECALGeom::IECALGeom() : IGeomBase(), fECALNodeId(-1), fECALCrystalManager(NULL), fCrystalWidth(-1), fCrystalLength(-1), fBlockWidth(-1), fBlockLength(-1), fNumberOfBlocks(0), fNumberOfCrystals(0) { fNodeIdMap.resize(0); fNodeId.resize(0); } COMET::IECALGeom::~IECALGeom() { Clear(); } void COMET::IECALGeom::Fill() { fECALCrystalManager = new COMET::IECALCrystalManager(); IECALGeomVisitor visitor(this); visitor.VisitGeometry(); // Dupulicated numbers fNumberOfCrystals = fNodeId.size() / fNumberOfBlocks; BuildNodeIdMap(); fECALCrystalManager->Init(fNodeIdMap); COMETNamedInfo("IECALGeom", "// --------------------------------------------------------------------- "); COMETNamedInfo("IECALGeom", "// ECAL geometry "); COMETNamedInfo("IECALGeom", "// --------------------------------------------------------------------- "); COMETNamedInfo("IECALGeom", "// Number of Blocks = " << GetNumberOfBlocks()); COMETNamedInfo("IECALGeom", "// Number of Crystals / Block = " << GetNumberOfCrystals()); COMETNamedInfo("IECALGeom", "// Number of Crystals = " << GetNumberOfChannels()); COMETNamedInfo("IECALGeom", "// --------------------------------------------------------------------- "); } void COMET::IECALGeom::ls(const char *opt) { std::cout << "// --------------------------------------------------------------------- " << std::endl << "// ECAL geometry " << std::endl << "// --------------------------------------------------------------------- " << std::endl << "// Number of Blocks = " << GetNumberOfBlocks() << std::endl << "// Number of Crystals / Block = " << GetNumberOfCrystals() << std::endl << "// Number of Crystals = " << GetNumberOfChannels() << std::endl << "// --------------------------------------------------------------------- " << std::endl; } void COMET::IECALGeom::Clear(void) { delete fECALCrystalManager; fECALCrystalManager = NULL; } void COMET::IECALGeom::BuildNodeIdMap() { COMETNamedVerbose("IECALGeom", "COMET::IECALGeom::BuildNodeIdMap"); std::vector tmp; tmp.resize(0); for (unsigned int ii=0; iicd(name.c_str()); // Store the home node of ECAL if (name == "/comet_1/DetectorSolenoid_0/ECAL_0") fECALGeom->fECALNodeId = gGeoManager->GetCurrentNodeId(); #define IEGIF_CONTAINS(str) ( name.find(str) != (std::string::npos) ) else if(IEGIF_CONTAINS("APD" )) ret = false; else if(IEGIF_CONTAINS("Crystal_" )){ fECALGeom->fNodeId.push_back(gGeoManager->GetCurrentNodeId()); // Get shape info. if(fECALGeom->fCrystalWidth < 0 || fECALGeom->fCrystalLength < 0){ TVector3 nodeSize = COMET::IOADatabase::Get().GeomId().NodeSize(node, COMET::IGeomIdManager::kBox); fECALGeom->fCrystalWidth = 2*nodeSize.X(); fECALGeom->fCrystalLength = 2*nodeSize.Z(); } } else if(IEGIF_CONTAINS("Crystal" ) || IEGIF_CONTAINS("BlockWrapper" )); else if(IEGIF_CONTAINS("BlockModule" )){ fECALGeom->fNumberOfBlocks++; if(fECALGeom->fBlockWidth < 0 || fECALGeom->fBlockLength < 0){ TVector3 nodeSize = COMET::IOADatabase::Get().GeomId().NodeSize(node, COMET::IGeomIdManager::kBox); fECALGeom->fBlockWidth = 2*nodeSize.X(); fECALGeom->fBlockLength = 2*nodeSize.Z(); } } // Skip the other StrECAL components if (IEGIF_CONTAINS("StrawTrk" ) || IEGIF_CONTAINS("StrECALTarget" )) ret = false; #undef IEGIF_CONTAINS COMETNamedVerbose("IECALGeomVisitor", "IECALGeomVisitor::VisitNode, " << name << " : " << (ret? "true":"false") ); return ret; } COMET::IECALCrystalMap COMET::IECALGeom::ConstructBlockMap() const { Int_t invalidBlockNo = -1; COMET::IECALCrystalMap blockMap = CreateBlockMapWith(&invalidBlockNo); // Loop for all the block/crystal COMET::IECALTrigChannelId chanId; for(Int_t block = 0; block < GetNumberOfBlocks(); block++){ chanId.SetFromGeomComponentNumber(block); COMET::IECALCrystalMap::Pointer point = blockMap.GetPointerAt(chanId); *point = block; // Assign the block number } return blockMap; }