00001
00002
00003
00004
00005 #include "Stiostream.h"
00006 #include <stdio.h>
00007 #include <dirent.h>
00008 #include <sys/stat.h>
00009 #include <stdexcept>
00010 #include "StiDetector.h"
00011 #include "StiPlacement.h"
00012 #include "StiCompositeTreeNode.h"
00013 #include "StiDetectorBuilder.h"
00014 #include "StiDetectorTreeBuilder.h"
00015 #include "StlUtilities.h"
00016 #include "StiToolkit.h"
00017
00018 ostream& operator<<(ostream&, const StiDetector&);
00019
00020 StiDetectorTreeBuilder::StiDetectorTreeBuilder()
00021 : mroot(0),
00022 mnodefactory(StiToolkit::instance()->getDetectorNodeFactory()),
00023 mregion(0)
00024 {
00025 cout <<"StiDetectorTreeBuilder::StiDetectorTreeBuilder() -I- Started/Done"<<endl;
00026 }
00027
00028 StiDetectorTreeBuilder::~StiDetectorTreeBuilder()
00029 {}
00030
00031 StiDetectorNode* StiDetectorTreeBuilder::build(StiDetectorBuilder * builder)
00032 {
00033 cout <<"StiDetectorTreeBuilder::build() - Started"<<endl;
00034 if (mroot)
00035 {
00036 cout << "StiDetectorTreeBuilder::build()\tError!\troot tree already built"<<endl;
00037 throw logic_error("StiDetectorTreeBuilder::build() - ERROR - Attempting to build on top of an existing detector");
00038 }
00039 if (!builder) throw logic_error("StiDetectorTreeBuilder::build() - ERROR - no builder provided");
00040 if (!mnodefactory) throw logic_error("StiDetectorTreeBuilder::build() - ERROR - no Factory<StiDetectorNode> provided");
00041 mDetectorBuilder = builder;
00042 cout <<"StiDetectorTreeBuilder::build() -I- Build root"<<endl;
00043
00044 buildRoot();
00045 loopOnDetectors();
00046 cout <<"StiDetectorTreeBuilder::build() -I- Sort Tree"<<endl;
00047
00048 SortDaughters<StiDetector> mysorter;
00049
00050 mysorter(mroot);
00051
00052 cout <<"StiDetectorTreeBuilder::build() -I- Index Tree"<<endl;
00053 IndexDaughters<StiDetector> myindexer;
00054 myindexer(mroot);
00055
00056 cout <<"StiDetectorTreeBuilder::build() -I- Done"<<endl;
00057 return mroot;
00058 }
00059
00060 void StiDetectorTreeBuilder::buildRoot()
00061 {
00062 mroot = mnodefactory->getInstance();
00063 mroot->setName("star");
00064
00065 StiDetectorNode* mid = mnodefactory->getInstance();
00066 StiDetectorNode* fwd = mnodefactory->getInstance();
00067 StiDetectorNode* bwd = mnodefactory->getInstance();
00068
00069 mid->setName("midrapidity");
00070 fwd->setName("forwardrapidity");
00071 bwd->setName("backwardrapidity");
00072
00073 StiOrderKey midKey;
00074 midKey.key = static_cast<double>(StiPlacement::kMidRapidity);
00075 StiOrderKey fwdKey;
00076 fwdKey.key = static_cast<double>(StiPlacement::kForwardRapidity);
00077 StiOrderKey bwdKey;
00078 bwdKey.key = static_cast<double>(StiPlacement::kBackwardRapidity);
00079
00080 mid->setOrderKey(midKey);
00081 fwd->setOrderKey(fwdKey);
00082 bwd->setOrderKey(bwdKey);
00083
00084 mroot->add(mid);
00085 mroot->add(fwd);
00086 mroot->add(bwd);
00087
00088 mregion = mid;
00089 }
00090
00091
00092 void StiDetectorTreeBuilder::addToTree(StiDetector* layer)
00093 {
00094
00095
00096 StiPlacement* placement = layer->getPlacement();
00097 SameOrderKey<StiDetector> mySameOrderKey;
00098 StiOrderKey tempOrderKey;
00099 tempOrderKey.key = static_cast<double>( placement->getRegion() );
00100 mySameOrderKey.morderKey = tempOrderKey;
00101 StiDetectorNodeVector::iterator where = find_if(mroot->begin(), mroot->end(), mySameOrderKey);
00102
00103 if (where==mroot->end()) {
00104
00105 cout <<"StiDetectorContainer::build() - ERROR - mid-rapidity region not found - where==0"<<endl;
00106 abort();
00107 }
00108
00109
00110 mregion = (*where);
00111
00112
00113 StiPlacement::StiRegion theRegion = layer->getPlacement()->getRegion();
00114
00115 StiOrderKey radius;
00116 string radstring;
00117
00118 if ( theRegion == StiPlacement::kMidRapidity ) {
00119 radius.key = layer->getPlacement()->getLayerRadius();
00120 radstring = "_radius";
00121 }
00122 else if ( theRegion==StiPlacement::kForwardRapidity) {
00123 radius.key = layer->getPlacement()->getZcenter();
00124 radstring = "_zcenter";
00125 }
00126 else if ( theRegion==StiPlacement::kBackwardRapidity ) {
00127
00128 radius.key = -1.* layer->getPlacement()->getZcenter();
00129 }
00130 else {
00131 cout <<"StiDetectorBuiler::addToTree(). unkown region:\t"<<theRegion
00132 <<"\tfrom detector:\t"<<layer->getName()<<"\tabort"<<endl;
00133 abort();
00134 }
00135
00136 StiDetectorNode* radialnode = hangWhere(mregion, radius, radstring);
00137
00138
00139 StiOrderKey refAngle;
00140 refAngle.key = layer->getPlacement()->getLayerAngle();
00141 string phistring = "_refAngle";
00142 StiDetectorNode* phinode = hangWhere(radialnode, refAngle, phistring);
00143
00144 if (!phinode) cout << "StiDetectorTreeBuilder::addToTree() -E- phinode==0" << endl;
00145
00146
00147
00148
00149
00150
00151 phinode->setData(layer);
00152 layer->setTreeNode(phinode);
00153 }
00154
00155
00156
00157 StiDetectorNode* StiDetectorTreeBuilder::hangWhere(StiDetectorNode* parent, const StiOrderKey& order,
00158 string& keystring)
00159 {
00160 SameOrderKey<StiDetector> mySameOrderKey;
00161 mySameOrderKey.morderKey = order;
00162
00163 StiDetectorNodeVector::iterator where = find_if(parent->begin(), parent->end(), mySameOrderKey);
00164
00165 if (where == parent->end()) {
00166
00167 StiDetectorNode* temp = mnodefactory->getInstance();
00168 char* tempname = new char[100];
00169 sprintf(tempname,"_%f", order.key);
00170 keystring.append(tempname);
00171 string newname = parent->getName();
00172 newname.append(keystring);
00173
00174 temp->setName(newname);
00175 temp->setOrderKey(order);
00176 parent->add(temp);
00177 delete [] tempname;
00178 return temp;
00179 }
00180 else {
00181 return (*where);
00182 }
00183 }
00184
00185 void StiDetectorTreeBuilder::loopOnDetectors()
00186 {
00187
00188 while(mDetectorBuilder->hasMore())
00189 {
00190
00191
00192 StiDetector* detector = mDetectorBuilder->next();
00193 if (!detector) throw runtime_error("StiDetectorTreeBuilder::loopOnDetectors() - ERROR - detector==0");
00194 detector->build();
00195 addToTree(detector);
00196
00197 }
00198
00199 return;
00200 }