00001 #include "StiMasterDetectorBuilder.h"
00002 #include "TGeoManager.h"
00003 #include "StiDetector.h"
00004 #include "StMaker.h"
00005 StiMasterDetectorBuilder::StiMasterDetectorBuilder(bool active)
00006 : StiDetectorBuilder("MasterDetectorBuilder",active,"none")
00007 {}
00008
00009 StiMasterDetectorBuilder::~StiMasterDetectorBuilder()
00010 {}
00011
00016 void StiMasterDetectorBuilder::reset()
00017 {
00018 clear();
00019 }
00020
00023 void StiMasterDetectorBuilder::build(StMaker&source)
00024 {
00025 TGeoManager *gGeoManagerSV = gGeoManager; gGeoManager = 0;
00026 if (StMaker::GetChain()) {
00027 cout << "StiMasterDetectorBuilder::build() -I- Create clone of VmcGeometry by reinitialization for recontruction" <<endl;
00028 TDataSet *set = StMaker::GetChain()->GetDataBase("VmcGeometry/Geometry", &StMaker::GetChain()->StMaker::GetDBTime());
00029 delete set;
00030 }
00031 cout << "StiMasterDetectorBuilder::build() -I- Started"<<endl;
00032 vector<StiDetectorBuilder*>::iterator iter;
00033 unsigned int nRows=0;
00034 for (iter=begin();
00035 iter!=end();
00036 iter++)
00037 {
00038 cout << "StiMasterDetectorBuilder::build() -I- Calling Group Builder named:" << (*iter)->getName()<<endl;
00039 if (!*iter) cout <<" pointer is corrupted!!!!!!!!!!!!!!!!!!!"<<endl;
00040 (*iter)->build(source);
00041 nRows+=(*iter)->getNRows();
00042 }
00043 cout << "StiMasterDetectorBuilder::build() -I- Will build local array"<<endl;
00044 setNRows(nRows);
00045 unsigned int row=0;
00046 for (iter=begin();
00047 iter!=end();
00048 iter++)
00049 {
00050 cout << "StiMasterDetectorBuilder::build() -I- Builder:"<<(*iter)->getName()<<endl;
00051 for (unsigned int i=0;i<(*iter)->getNRows();i++)
00052 {
00053 cout << "StiMasterDetectorBuilder::build() -I- row:"<<row;
00054 unsigned int nSectors = (*iter)->getNSectors(i);
00055 setNSectors(row,nSectors);
00056 Int_t ifrow = 0;
00057 for (unsigned int sector=0;sector<nSectors;sector++)
00058 {
00059 StiDetector *detector = (*iter)->getDetector(i,sector);
00060 if (!ifrow && detector) {cout << "\t" << detector->getName(); ifrow++;}
00061 setDetector(row,sector,detector);
00062 }
00063 cout << endl;
00064 row++;
00065 }
00066 }
00067 if (gGeoManagerSV) {
00068
00069 gGeoManager = gGeoManagerSV;
00070 }
00071 cout << "StiMasterDetectorBuilder::build() -I- Done"<<endl;
00072 }
00073
00076 bool StiMasterDetectorBuilder::hasMore() const
00077 {
00078
00079 vector<StiDetectorBuilder*>::const_iterator iter;
00080 for (iter=begin();
00081 iter!=end();
00082 iter++)
00083 {
00084
00085 if((*iter)->hasMore()) return true;
00086 }
00087 return false;
00088 }
00089
00093 StiDetector * StiMasterDetectorBuilder::next()
00094 {
00095
00096 vector<StiDetectorBuilder*>::const_iterator iter;
00097 for (iter=begin();
00098 iter!=end();
00099 iter++)
00100 {
00101 if((*iter)->hasMore()) return (*iter)->next();
00102 }
00103 return 0;
00104 }
00105
00106 void StiMasterDetectorBuilder::add(StiDetectorBuilder *builder)
00107 {
00108 push_back(builder);
00109 }
00110
00111 StiDetectorBuilder * StiMasterDetectorBuilder::get(const string & name)
00112 {
00113
00114 vector<StiDetectorBuilder*>::const_iterator iter;
00115 for (iter=begin();
00116 iter!=end();
00117 iter++)
00118 {
00119
00120 if((*iter)->isName(name)) return *iter;
00121 }
00122 throw runtime_error("StiMasterDetectorBuilder::get(const string & name) -E- Requested object not found");
00123 }