Go to the documentation of this file.00001 #include "DetectorDescription/Core/src/Specific.h"
00002 #include "DetectorDescription/Core/interface/DDCompactView.h"
00003
00004
00005 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00006
00007 #include <assert.h>
00008
00009 namespace DDI {
00010
00011 Specific::Specific(const std::vector<std::string>& selections,
00012 const DDsvalues_type & specs,
00013 bool doRegex)
00014 : specifics_(specs),
00015 partSelections_(0),
00016 valid_(false),
00017 doRegex_(doRegex)
00018 {
00019 std::vector<std::string>::const_iterator it = selections.begin();
00020 for(; it != selections.end(); ++it) {
00021 createPartSelections(*it);
00022 }
00023 }
00024
00025 Specific::Specific(const std::vector<DDPartSelection> & selections,
00026 const DDsvalues_type & specs)
00027 : specifics_(specs), partSelections_(selections), valid_(false), doRegex_(false)
00028 { }
00029
00030 void Specific::createPartSelections(const std::string & selString)
00031 {
00032
00033 std::vector<DDPartSelRegExpLevel> regv;
00034 std::vector<DDPartSelection> temp;
00035 DDTokenize2(selString,regv);
00036
00037 if (!regv.size()) throw cms::Exception("DDException") << "Could not evaluate the selection-std::string ->" << selString << "<-";
00038 std::vector<DDPartSelRegExpLevel>::const_iterator it = regv.begin();
00039 std::pair<bool,std::string> res;
00040 for (; it != regv.end(); ++it) {
00041 std::vector<DDLogicalPart> lpv;
00042 res = DDIsValid(it->ns_,it->nm_,lpv,doRegex_);
00043 if (!res.first) {
00044 std::string msg("Could not process q-name of a DDLogicalPart, reason:\n"+res.second);
00045 msg+="\nSpecPar selection is:\n" + selString + "\n";
00046
00047 edm::LogError("Specific") << msg;
00048 break;
00049 }
00050
00051 addSelectionLevel(lpv,it->copyno_,it->selectionType_,temp);
00052 }
00053 if ( res.first ) {
00054 std::vector<DDPartSelection>::const_iterator iit = temp.begin();
00055 partSelections_.reserve(temp.size() + partSelections_.size());
00056 for (; iit != temp.end(); ++iit) {
00057 partSelections_.push_back(*iit);
00058
00059 }
00060 }
00061 }
00062
00063
00064
00065 void Specific::addSelectionLevel(std::vector<DDLogicalPart> & lpv, int copyno, ddselection_type st,
00066 std::vector<DDPartSelection> & selv)
00067 {
00068
00069
00070
00071 if (!selv.size()) {
00072 selv.push_back(DDPartSelection());
00073 }
00074 typedef std::vector<DDLogicalPart>::size_type lpv_sizetype;
00075 typedef std::vector<DDPartSelection>::size_type ps_sizetype;
00076 ps_sizetype ps_sz = selv.size();
00077 lpv_sizetype lpv_sz = lpv.size();
00078
00079 lpv_sizetype lpv_i = 0;
00080 std::vector<DDPartSelection> result;
00081 for (; lpv_i < lpv_sz; ++lpv_i) {
00082 std::vector<DDPartSelection>::const_iterator ps_it = selv.begin();
00083 for (; ps_it != selv.end(); ++ps_it) {
00084 result.push_back(*ps_it);
00085 }
00086 }
00087
00088
00089 ps_sizetype ps_i = 0;
00090 for(lpv_i=0; lpv_i < lpv_sz; ++lpv_i) {
00091 for(ps_i = ps_sz*lpv_i; ps_i < ps_sz*(lpv_i+1); ++ps_i) {
00092 result[ps_i].push_back(DDPartSelectionLevel(lpv[lpv_i],copyno,st));
00093 }
00094 }
00095 selv = result;
00096 }
00097
00098 const std::vector<DDPartSelection> & Specific::selection() const
00099 {
00100 return partSelections_;
00101 }
00102
00103
00104 void Specific::stream(std::ostream & os) const
00105 {
00106
00107 os << " Size: " << specifics_.size() << std::endl;
00108 os << "\tSelections:" << std::endl;
00109 partsel_type::const_iterator pit(partSelections_.begin()), pend(partSelections_.end());
00110 for (;pit!=pend;++pit) {
00111 os << *pit << std::endl;
00112 }
00113
00114 DDsvalues_type::const_iterator vit(specifics_.begin()), ved(specifics_.end());
00115 for (;vit!=ved;++vit) {
00116 const DDValue & v = vit->second;
00117 os << "\tParameter name= \"" << v.name() << "\" " << std::endl;
00118 os << "\t\t Value pairs: " << std::endl;
00119 size_t s=v.size();
00120 size_t i=0;
00121 if ( v.isEvaluated() ) {
00122 for (; i<s; ++i) {
00123 os << "\t\t\t\"" << v[i].first << "\"" << ", " << v[i].second << std::endl;
00124 }
00125 } else {
00126 const std::vector<std::string>& vs = v.strings();
00127 for (; i<s; ++i) {
00128 os << "\t\t\t\"" << vs[i] << "\"" << ", not evaluated" << std::endl;
00129 }
00130 }
00131 }
00132 }
00133
00134 void Specific::updateLogicalPart(std::vector<std::pair<DDLogicalPart, std::pair<DDPartSelection*,DDsvalues_type*> > >& result) const
00135 {
00136 if (partSelections_.size()) {
00137 partsel_type::const_iterator it = partSelections_.begin();
00138 DDsvalues_type* sv = const_cast<DDsvalues_type*>(&specifics_);
00139 for (; it != partSelections_.end(); ++it) {
00140 DDLogicalPart logp = it->back().lp_;
00141
00142
00143
00144 DDPartSelection * ps = const_cast<DDPartSelection*>(&(*it));
00145 assert(ps);
00146 assert(sv);
00147 std::pair<DDPartSelection*,DDsvalues_type*> pssv(ps,sv);
00148 result.push_back(std::make_pair(logp,pssv));
00149 }
00150 }
00151 }
00152
00161 std::pair<bool,DDExpandedView> Specific::node() const
00162 {
00163 DDCompactView c;
00164 DDExpandedView e(c);
00165
00166 if (partSelections_.size() != 1) {
00167 edm::LogError("Specific") << " >> more or less than one part-selector, currently NOT SUPPORTED! <<" << std::endl;
00168 return std::make_pair(false,e);
00169 }
00170 const DDPartSelection & ps = partSelections_[0];
00171
00172 DDPartSelection::const_iterator it = ps.begin();
00173 DDPartSelection::const_iterator ed = ps.end();
00174 if ( (it != ed) && ( it->selectionType_ != ddanyposp) ) {
00175 edm::LogError("Specific") << " >> part-selector must start with //Name[no] ! << " << std::endl;
00176 return std::make_pair(false,e);
00177 }
00178 ++it;
00179 for (; it != ps.end(); ++it) {
00180 if ( it->selectionType_ != ddchildposp ) {
00181 edm::LogError("Specific") << " >> part-selector must be a concatenation of direct children\n"
00182 << " including their copy-number only, CURRENT LIMITATION! <<" << std::endl;
00183 return std::make_pair(false,e);
00184 }
00185 }
00186
00187 it = ps.begin();
00188 bool result = true;
00189 for (; it != ed; ++it) {
00190 while(result) {
00191 if( (it->copyno_ == e.copyno()) && (it->lp_ == e.logicalPart())) {
00192 break;
00193 }
00194 else {
00195 result = e.nextSibling();
00196 }
00197 }
00198 if ((ed-it)>1) {
00199 result = e.firstChild();
00200 }
00201 }
00202 return std::make_pair(result,e);
00203 }
00204
00205
00206 Specific::~Specific()
00207 {
00208
00209
00210
00211
00212 }
00213
00214 }