00001
00002
00003
00004
00005
00006 #include <vector>
00007 #include <string>
00008 #include <cstdio>
00009 #include <sstream>
00010
00011 #include "DataFormats/HcalDetId/interface/HcalGenericDetId.h"
00012 #include "DataFormats/HcalDetId/interface/HcalElectronicsId.h"
00013 #include "DataFormats/HcalDetId/interface/HcalDcsDetId.h"
00014 #include "CalibFormats/HcalObjects/interface/HcalText2DetIdConverter.h"
00015
00016 #include "CondFormats/HcalObjects/interface/AllObjects.h"
00017 #include "CalibCalorimetry/HcalAlgos/interface/HcalDbASCIIIO.h"
00018 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00019
00020 namespace {
00021 class DetIdLess {
00022 public:
00023 bool operator () (DetId fFirst, DetId fSecond) const {
00024 HcalGenericDetId first (fFirst);
00025 HcalGenericDetId second (fSecond);
00026 if (first.genericSubdet () != second.genericSubdet ()) return first.genericSubdet () < second.genericSubdet ();
00027 if (first.isHcalDetId ()) {
00028 HcalDetId f1 (first);
00029 HcalDetId s1 (second);
00030 return f1.zside () != s1.zside () ? f1.zside () < s1.zside () :
00031 f1.iphi () != s1.iphi () ? f1.iphi () < s1.iphi () :
00032 f1.ietaAbs () != s1.ietaAbs () ? f1.ietaAbs () < s1.ietaAbs () :
00033 f1.depth () < s1.depth ();
00034 }
00035 else {
00036 return first.rawId() < second.rawId();
00037 }
00038 }
00039 };
00040 class HcalElectronicsIdLess {
00041 public:
00042 bool operator () (HcalElectronicsId first, HcalElectronicsId second) const {
00043 return
00044 first.readoutVMECrateId () != second.readoutVMECrateId () ? first.readoutVMECrateId () < second.readoutVMECrateId () :
00045 first.htrSlot () != second.htrSlot () ? first.htrSlot () < second.htrSlot () :
00046 first.htrTopBottom () != second.htrTopBottom () ? first.htrTopBottom () < second.htrTopBottom () :
00047 first.fiberIndex () != second.fiberIndex () ? first.fiberIndex () < second.fiberIndex () :
00048 first.fiberChanId () < second.fiberChanId ();
00049 }
00050 };
00051 }
00052
00053
00054
00055 std::vector <std::string> splitString (const std::string& fLine) {
00056 std::vector <std::string> result;
00057 int start = 0;
00058 bool empty = true;
00059 for (unsigned i = 0; i <= fLine.size (); i++) {
00060 if (fLine [i] == ' ' || i == fLine.size ()) {
00061 if (!empty) {
00062 std::string item (fLine, start, i-start);
00063 result.push_back (item);
00064 empty = true;
00065 }
00066 start = i+1;
00067 }
00068 else {
00069 if (empty) empty = false;
00070 }
00071 }
00072 return result;
00073 }
00074
00075 std::vector <unsigned int> splitStringToIntByComma (const std::string& fLine) {
00076 std::vector <unsigned int> result;
00077 int start = 0;
00078 bool empty = true;
00079 for (unsigned i = 0; i <= fLine.size (); i++) {
00080 if (fLine [i] == ',' || i == fLine.size ()) {
00081 if (!empty) {
00082 std::string itemString (fLine, start, i-start);
00083 result.push_back (atoi (itemString.c_str()) );
00084 empty = true;
00085 }
00086 start = i+1;
00087 }
00088 else {
00089 if (empty) empty = false;
00090 }
00091 }
00092 return result;
00093 }
00094
00095 std::vector <float> splitStringToFloatByComma (const std::string& fLine) {
00096 std::vector <float> result;
00097 int start = 0;
00098 bool empty = true;
00099 for (unsigned i = 0; i <= fLine.size (); i++) {
00100 if (fLine [i] == ',' || i == fLine.size ()) {
00101 if (!empty) {
00102 std::string itemString (fLine, start, i-start);
00103 result.push_back (atof (itemString.c_str()) );
00104 empty = true;
00105 }
00106 start = i+1;
00107 }
00108 else {
00109 if (empty) empty = false;
00110 }
00111 }
00112 return result;
00113 }
00114
00115 std::vector <double> splitStringToDoubleByComma (const std::string& fLine) {
00116 std::vector <double> result;
00117 int start = 0;
00118 bool empty = true;
00119 for (unsigned i = 0; i <= fLine.size (); i++) {
00120 if (fLine [i] == ',' || i == fLine.size ()) {
00121 if (!empty) {
00122 std::string itemString (fLine, start, i-start);
00123 result.push_back (atof (itemString.c_str()) );
00124 empty = true;
00125 }
00126 start = i+1;
00127 }
00128 else {
00129 if (empty) empty = false;
00130 }
00131 }
00132 return result;
00133 }
00134
00135 DetId HcalDbASCIIIO::getId (const std::vector <std::string> & items) {
00136 HcalText2DetIdConverter converter (items [3], items [0], items [1], items [2]);
00137 return converter.getId ();
00138 }
00139
00140 void HcalDbASCIIIO::dumpId (std::ostream& fOutput, DetId id) {
00141 HcalText2DetIdConverter converter (id);
00142 char buffer [1024];
00143 sprintf (buffer, " %15s %15s %15s %15s",
00144 converter.getField1 ().c_str (), converter.getField2 ().c_str (), converter.getField3 ().c_str (),converter.getFlavor ().c_str ());
00145 fOutput << buffer;
00146 }
00147
00148
00149
00150 template<class T>
00151 bool from_string(T& t, const std::string& s, std::ios_base& (*f)(std::ios_base&)) {
00152 std::istringstream iss(s);
00153 return !(iss >> f >> t).fail();
00154 }
00155
00156 template <class T,class S>
00157 bool getHcalObject (std::istream& fInput, T* fObject, S* fCondObject) {
00158 if (!fObject) fObject = new T;
00159 char buffer [1024];
00160 while (fInput.getline(buffer, 1024)) {
00161 if (buffer [0] == '#') continue;
00162 std::vector <std::string> items = splitString (std::string (buffer));
00163 if (items.size()==0) continue;
00164 if (items.size () < 8) {
00165 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 8 items: eta, phi, depth, subdet, 4x values" << std::endl;
00166 continue;
00167 }
00168 DetId id = HcalDbASCIIIO::getId (items);
00169
00170
00171
00172
00173
00174 fCondObject = new S(id, atof (items [4].c_str()), atof (items [5].c_str()),
00175 atof (items [6].c_str()), atof (items [7].c_str()));
00176 fObject->addValues(*fCondObject);
00177 delete fCondObject;
00178
00179 }
00180
00181 return true;
00182 }
00183
00184 template <class T>
00185 bool dumpHcalObject (std::ostream& fOutput, const T& fObject) {
00186 char buffer [1024];
00187 sprintf (buffer, "# %15s %15s %15s %15s %8s %8s %8s %8s %10s\n", "eta", "phi", "dep", "det", "cap0", "cap1", "cap2", "cap3", "DetId");
00188 fOutput << buffer;
00189 std::vector<DetId> channels = fObject.getAllChannels ();
00190 std::sort (channels.begin(), channels.end(), DetIdLess ());
00191 for (std::vector<DetId>::iterator channel = channels.begin ();
00192 channel != channels.end ();
00193 channel++) {
00194 const float* values = fObject.getValues (*channel)->getValues ();
00195 if (values) {
00196 HcalDbASCIIIO::dumpId (fOutput, *channel);
00197 sprintf (buffer, " %8.5f %8.5f %8.5f %8.5f %10X\n",
00198 values[0], values[1], values[2], values[3], channel->rawId ());
00199 fOutput << buffer;
00200 }
00201 }
00202 return true;
00203 }
00204
00205 template <class T,class S>
00206 bool getHcalSingleFloatObject (std::istream& fInput, T* fObject, S* fCondObject) {
00207 if (!fObject) fObject = new T;
00208 char buffer [1024];
00209 while (fInput.getline(buffer, 1024)) {
00210 if (buffer [0] == '#') continue;
00211 std::vector <std::string> items = splitString (std::string (buffer));
00212 if (items.size()==0) continue;
00213 if (items.size () < 5) {
00214 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 5 items: eta, phi, depth, subdet, value" << std::endl;
00215 continue;
00216 }
00217 DetId id = HcalDbASCIIIO::getId (items);
00218
00219
00220
00221
00222
00223 fCondObject = new S(id, atof (items [4].c_str()) );
00224 fObject->addValues(*fCondObject);
00225 delete fCondObject;
00226
00227 }
00228 return true;
00229 }
00230
00231 template <class T>
00232 bool dumpHcalSingleFloatObject (std::ostream& fOutput, const T& fObject) {
00233 char buffer [1024];
00234 sprintf (buffer, "# %15s %15s %15s %15s %8s %10s\n", "eta", "phi", "dep", "det", "value", "DetId");
00235 fOutput << buffer;
00236 std::vector<DetId> channels = fObject.getAllChannels ();
00237 std::sort (channels.begin(), channels.end(), DetIdLess ());
00238 for (std::vector<DetId>::iterator channel = channels.begin ();
00239 channel != channels.end ();
00240 channel++) {
00241 const float value = fObject.getValues (*channel)->getValue ();
00242 HcalDbASCIIIO::dumpId (fOutput, *channel);
00243 sprintf (buffer, " %8.5f %10X\n",
00244 value, channel->rawId ());
00245 fOutput << buffer;
00246 }
00247 return true;
00248 }
00249
00250 template <class T,class S>
00251 bool getHcalSingleIntObject (std::istream& fInput, T* fObject, S* fCondObject) {
00252 if (!fObject) fObject = new T;
00253 char buffer [1024];
00254 while (fInput.getline(buffer, 1024)) {
00255 if (buffer [0] == '#') continue;
00256 std::vector <std::string> items = splitString (std::string (buffer));
00257 if (items.size()==0) continue;
00258 if (items.size () < 5) {
00259 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 5 items: eta, phi, depth, subdet, value" << std::endl;
00260 continue;
00261 }
00262 DetId id = HcalDbASCIIIO::getId (items);
00263
00264
00265
00266
00267
00268 fCondObject = new S(id, atoi (items [4].c_str()) );
00269 fObject->addValues(*fCondObject);
00270 delete fCondObject;
00271
00272 }
00273 return true;
00274 }
00275
00276 template <class T>
00277 bool dumpHcalSingleIntObject (std::ostream& fOutput, const T& fObject) {
00278 char buffer [1024];
00279 sprintf (buffer, "# %15s %15s %15s %15s %8s %10s\n", "eta", "phi", "dep", "det", "value", "DetId");
00280 fOutput << buffer;
00281 std::vector<DetId> channels = fObject.getAllChannels ();
00282 std::sort (channels.begin(), channels.end(), DetIdLess ());
00283 for (std::vector<DetId>::iterator channel = channels.begin ();
00284 channel != channels.end ();
00285 channel++) {
00286 const int value = fObject.getValues (*channel)->getValue ();
00287 HcalDbASCIIIO::dumpId (fOutput, *channel);
00288 sprintf (buffer, " %15d %10X\n",
00289 value, channel->rawId ());
00290 fOutput << buffer;
00291 }
00292 return true;
00293 }
00294
00295 template <class T,class S>
00296 bool getHcalMatrixObject (std::istream& fInput, T* fObject, S* fCondObject) {
00297 if (!fObject) fObject = new T;
00298 char buffer [1024];
00299 while (fInput.getline(buffer, 1024)) {
00300 if (buffer [0] == '#') continue;
00301 std::vector <std::string> items = splitString (std::string (buffer));
00302 if (items.size()==0) continue;
00303 DetId firstid = HcalDbASCIIIO::getId (items);
00304 fCondObject = new S(firstid.rawId());
00305 for(int j = 0; j != 10; j++) fCondObject->setValue(atoi(items[4].c_str()), 0, j, atof(items[j+5].c_str()));
00306 for(int i = 1; i != 40; i++){
00307 fInput.getline(buffer, 1024);
00308 items = splitString (std::string (buffer));
00309 DetId id = HcalDbASCIIIO::getId (items);
00310 if(id.rawId() != firstid.rawId()) break;
00311 for(int j = 0; j != 10; j++) fCondObject->setValue(atoi(items[4].c_str()), i%10, j, atof(items[j+5].c_str()));
00312 }
00313 fObject->addValues(*fCondObject);
00314 delete fCondObject;
00315 }
00316 return true;
00317 }
00318
00319 template <class T>
00320 bool dumpHcalMatrixObject (std::ostream& fOutput, const T& fObject) {
00321 char buffer [1024];
00322 sprintf (buffer, "# %5s %5s %5s %5s %5s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s %10s\n",
00323 "eta", "phi", "dep", "det", "capid","c0", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "DetId");
00324 fOutput << buffer;
00325 std::vector<DetId> channels = fObject.getAllChannels ();
00326 std::sort (channels.begin(), channels.end(), DetIdLess ());
00327 for (std::vector<DetId>::iterator channel = channels.begin ();
00328 channel != channels.end ();
00329 channel++) {
00330 float thisline[10];
00331 for(int m = 0; m != 4; m++){
00332 for(int i = 0; i != 10; i++){
00333 for(int j = 0; j != 10; j++){
00334
00335 thisline[j] = fObject.getValues(*channel)->getValue(m,i,j);
00336
00337 }
00338 HcalDbASCIIIO::dumpId (fOutput, *channel);
00339 sprintf(buffer, " %5i %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %10X\n",
00340 m, thisline[0], thisline[1], thisline[2], thisline[3], thisline[4], thisline[5], thisline[6], thisline[7],
00341 thisline[8], thisline[9], channel->rawId());
00342 fOutput << buffer;
00343 }
00344 }
00345 }
00346
00347 return true;
00348 }
00349
00350
00351
00352 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalGains* fObject) {return getHcalObject (fInput, fObject, new HcalGain);}
00353 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalGains& fObject) {return dumpHcalObject (fOutput, fObject);}
00354 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalGainWidths* fObject) {return getHcalObject (fInput, fObject, new HcalGainWidth);}
00355 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalGainWidths& fObject) {return dumpHcalObject (fOutput, fObject);}
00356
00357 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalRespCorrs* fObject) {return getHcalSingleFloatObject (fInput, fObject, new HcalRespCorr); }
00358 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalRespCorrs& fObject) {return dumpHcalSingleFloatObject (fOutput, fObject); }
00359
00360 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalLUTCorrs* fObject) {return getHcalSingleFloatObject (fInput, fObject, new HcalLUTCorr); }
00361 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalLUTCorrs& fObject) {return dumpHcalSingleFloatObject (fOutput, fObject); }
00362
00363 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalPFCorrs* fObject) {return getHcalSingleFloatObject (fInput, fObject, new HcalPFCorr); }
00364 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalPFCorrs& fObject) {return dumpHcalSingleFloatObject (fOutput, fObject); }
00365
00366 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalTimeCorrs* fObject) {return getHcalSingleFloatObject (fInput, fObject, new HcalTimeCorr); }
00367 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalTimeCorrs& fObject) {return dumpHcalSingleFloatObject (fOutput, fObject); }
00368
00369 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalZSThresholds* fObject) {return getHcalSingleIntObject (fInput, fObject, new HcalZSThreshold); }
00370 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalZSThresholds& fObject) {return dumpHcalSingleIntObject (fOutput, fObject); }
00371
00372 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalValidationCorrs* fObject) {return getHcalSingleFloatObject (fInput, fObject, new HcalValidationCorr); }
00373 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalValidationCorrs& fObject) {return dumpHcalSingleFloatObject (fOutput, fObject); }
00374 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalCholeskyMatrices* fObject) {return getHcalMatrixObject (fInput, fObject, new HcalCholeskyMatrix); }
00375 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalCholeskyMatrices& fObject) {return dumpHcalMatrixObject (fOutput, fObject); }
00376 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalCovarianceMatrices* fObject) {return getHcalMatrixObject (fInput, fObject, new HcalCovarianceMatrix); }
00377 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalCovarianceMatrices& fObject) {return dumpHcalMatrixObject (fOutput, fObject); }
00378
00379
00380
00381 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalRecoParams* fObject)
00382 {
00383 if (!fObject) fObject = new HcalRecoParams();
00384 char buffer [1024];
00385 while (fInput.getline(buffer, 1024)) {
00386 if (buffer [0] == '#') continue;
00387 std::vector <std::string> items = splitString (std::string (buffer));
00388 if (items.size()==0) continue;
00389 if (items.size () < 6) {
00390 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 6 items: eta, phi, depth, subdet, firstSample, samplesToAdd" << std::endl;
00391 continue;
00392 }
00393 DetId id = HcalDbASCIIIO::getId (items);
00394
00395 HcalRecoParam* fCondObject = new HcalRecoParam(id, atoi (items [4].c_str()), atoi (items [5].c_str()) );
00396 fObject->addValues(*fCondObject);
00397 delete fCondObject;
00398 }
00399 return true;
00400 }
00401 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalRecoParams& fObject)
00402 {
00403 char buffer [1024];
00404 sprintf (buffer, "# %15s %15s %15s %15s %18s %15s %10s\n", "eta", "phi", "dep", "det", "firstSample", "samplesToAdd", "DetId");
00405 fOutput << buffer;
00406 std::vector<DetId> channels = fObject.getAllChannels ();
00407 std::sort (channels.begin(), channels.end(), DetIdLess ());
00408 for (std::vector<DetId>::iterator channel = channels.begin ();
00409 channel != channels.end ();
00410 channel++) {
00411 HcalDbASCIIIO::dumpId (fOutput, *channel);
00412 sprintf (buffer, " %15d %15d %16X\n",
00413 fObject.getValues (*channel)->firstSample(), fObject.getValues (*channel)->samplesToAdd(), channel->rawId ());
00414 fOutput << buffer;
00415 }
00416 return true;
00417 }
00418
00419 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalLongRecoParams* fObject)
00420 {
00421 if (!fObject) fObject = new HcalLongRecoParams();
00422 char buffer [1024];
00423 while (fInput.getline(buffer, 1024)) {
00424 if (buffer [0] == '#') continue;
00425 std::vector <std::string> items = splitString (std::string (buffer));
00426 if (items.size()==0) continue;
00427 if (items.size() < 5) {
00428 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 6 items: eta, phi, depth, subdet, signalTSs, noiseTSs" << std::endl;
00429 continue;
00430 }
00431 if (items.size() > 7) {
00432 edm::LogWarning("Format Problem ?") << "Check line: " << buffer << "\n line must contain 6 items: eta, phi, depth, subdet, signalTSs, noiseTSs. "
00433 << "\n ! signalTS and noiseTS must be of format <ts1,ts2,ts3,...> withOUT spaces. Ignoring line for safety" << std::endl;
00434 continue;
00435 }
00436 DetId id = HcalDbASCIIIO::getId (items);
00437
00438 std::vector<unsigned int> mySignalTS = splitStringToIntByComma(items[4]);
00439 std::vector<unsigned int> myNoiseTS = splitStringToIntByComma(items[5]);
00440
00441 HcalLongRecoParam* fCondObject = new HcalLongRecoParam(id, mySignalTS, myNoiseTS );
00442 fObject->addValues(*fCondObject);
00443 delete fCondObject;
00444 }
00445 return true;
00446 }
00447 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalLongRecoParams& fObject)
00448 {
00449 char buffer [1024];
00450 sprintf (buffer, "# %15s %15s %15s %15s %10s %10s %10s\n", "eta", "phi", "dep", "det", "signalTSs", "noiseTSs", "DetId");
00451 fOutput << buffer;
00452 std::vector<DetId> channels = fObject.getAllChannels ();
00453 std::sort (channels.begin(), channels.end(), DetIdLess ());
00454 for (std::vector<DetId>::iterator channel = channels.begin ();
00455 channel != channels.end ();
00456 channel++) {
00457 HcalGenericDetId fId(*channel);
00458 if (fId.isHcalZDCDetId())
00459 {
00460 std::vector<unsigned int> vSignalTS = fObject.getValues (*channel)->signalTS();
00461 std::vector<unsigned int> vNoiseTS = fObject.getValues (*channel)->noiseTS();
00462 HcalDbASCIIIO::dumpId (fOutput, *channel);
00463 sprintf (buffer, " ");
00464 fOutput << buffer;
00465 for (unsigned int i=0; i<vSignalTS.size(); i++)
00466 {
00467 if (i>0) {sprintf (buffer, ","); fOutput << buffer;}
00468 sprintf (buffer, "%u", vSignalTS.at(i));
00469 fOutput << buffer;
00470 }
00471 sprintf (buffer, " ");
00472 fOutput << buffer;
00473 for (unsigned int i=0; i<vNoiseTS.size(); i++)
00474 {
00475 if (i>0) { sprintf (buffer, ","); fOutput << buffer;}
00476 sprintf (buffer, "%u", vNoiseTS.at(i));
00477 fOutput << buffer;
00478 }
00479 sprintf (buffer, " %10X\n", channel->rawId ());
00480 fOutput << buffer;
00481 }
00482 }
00483 return true;
00484 }
00485
00486 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalMCParams* fObject)
00487 {
00488 if (!fObject) fObject = new HcalMCParams();
00489 char buffer [1024];
00490 while (fInput.getline(buffer, 1024)) {
00491 if (buffer [0] == '#') continue;
00492 std::vector <std::string> items = splitString (std::string (buffer));
00493 if (items.size()==0) continue;
00494 if (items.size () < 5) {
00495 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 5 items: eta, phi, depth, subdet, signalShape" << std::endl;
00496 continue;
00497 }
00498 DetId id = HcalDbASCIIIO::getId (items);
00499
00500 HcalMCParam* fCondObject = new HcalMCParam(id, atoi (items [4].c_str()) );
00501 fObject->addValues(*fCondObject);
00502 delete fCondObject;
00503 }
00504 return true;
00505 }
00506 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalMCParams& fObject)
00507 {
00508 char buffer [1024];
00509 sprintf (buffer, "# %15s %15s %15s %15s %14s %10s\n", "eta", "phi", "dep", "det", "signalShape", "DetId");
00510 fOutput << buffer;
00511 std::vector<DetId> channels = fObject.getAllChannels ();
00512 std::sort (channels.begin(), channels.end(), DetIdLess ());
00513 for (std::vector<DetId>::iterator channel = channels.begin ();
00514 channel != channels.end ();
00515 channel++) {
00516 const int value = fObject.getValues (*channel)->signalShape();
00517 HcalDbASCIIIO::dumpId (fOutput, *channel);
00518 sprintf (buffer, " %10d %17X\n",
00519 value, channel->rawId ());
00520 fOutput << buffer;
00521 }
00522 return true;
00523 }
00524
00525 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalPedestals* fObject) {
00526 if (!fObject) fObject = new HcalPedestals(false);
00527 char buffer [1024];
00528
00529 while (fInput.getline(buffer, 1024)) {
00530 std::vector <std::string> items = splitString (std::string (buffer));
00531 if (items.size()==0) continue;
00532 else {
00533 if (items[0] == "#U")
00534 {
00535 if (items[1] == (std::string)"ADC") fObject->setUnitADC(true);
00536 else if (items[1] == (std::string)"fC") fObject->setUnitADC(false);
00537 else
00538 {
00539 edm::LogWarning("Pedestal Unit Error") << "Unrecognized unit for pedestals. Assuming fC." << std::endl;
00540 fObject->setUnitADC(false);
00541 }
00542 break;
00543 }
00544 else
00545 {
00546 edm::LogWarning("Pedestal Unit Missing") << "The unit for the pedestals is missing in the txt file." << std::endl;
00547 return false;
00548 }
00549 }
00550 }
00551 while (fInput.getline(buffer, 1024)) {
00552 if (buffer [0] == '#') continue;
00553 std::vector <std::string> items = splitString (std::string (buffer));
00554 if (items.size()==0) continue;
00555 if (items.size () < 8) {
00556 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 8 items: eta, phi, depth, subdet, 4x values"
00557 << " or 12 items: eta, phi, depth, subdet, 4x values for mean, 4x values for width"
00558 << std::endl;
00559 continue;
00560 }
00561 DetId id = getId (items);
00562
00563
00564
00565
00566
00567
00568 if (items.size() < 12)
00569 {
00570 HcalPedestal* fCondObject = new HcalPedestal(id, atof (items [4].c_str()), atof (items [5].c_str()),
00571 atof (items [6].c_str()), atof (items [7].c_str()),
00572 0., 0., 0., 0. );
00573 fObject->addValues(*fCondObject);
00574 delete fCondObject;
00575 }
00576 else
00577 {
00578 HcalPedestal* fCondObject = new HcalPedestal(id, atof (items [4].c_str()), atof (items [5].c_str()),
00579 atof (items [6].c_str()), atof (items [7].c_str()),
00580 atof (items [8].c_str()), atof (items [9].c_str()),
00581 atof (items [10].c_str()), atof (items [11].c_str()) );
00582 fObject->addValues(*fCondObject);
00583 delete fCondObject;
00584 }
00585
00586
00587 }
00588 return true;
00589 }
00590
00591
00592 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalPedestals& fObject) {
00593 char buffer [1024];
00594 if (fObject.isADC() ) sprintf (buffer, "#U ADC << this is the unit \n");
00595 else sprintf (buffer, "#U fC << this is the unit \n");
00596 fOutput << buffer;
00597
00598 sprintf (buffer, "# %15s %15s %15s %15s %8s %8s %8s %8s %8s %8s %8s %8s %10s\n", "eta", "phi", "dep", "det", "cap0", "cap1", "cap2", "cap3", "widthcap0", "widthcap1", "widthcap2", "widthcap3", "DetId");
00599 fOutput << buffer;
00600
00601 std::vector<DetId> channels = fObject.getAllChannels ();
00602 std::sort (channels.begin(), channels.end(), DetIdLess ());
00603 for (std::vector<DetId>::iterator channel = channels.begin ();
00604 channel != channels.end ();
00605 channel++) {
00606 const float* values = fObject.getValues (*channel)->getValues ();
00607 if (values) {
00608 dumpId (fOutput, *channel);
00609 sprintf (buffer, " %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %10X\n",
00610 values[0], values[1], values[2], values[3], values[4], values[5], values[6], values[7], channel->rawId ());
00611 fOutput << buffer;
00612 }
00613 }
00614 return true;
00615 }
00616
00617
00618
00619 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalChannelQuality* fObject)
00620 {
00621 if (!fObject) fObject = new HcalChannelQuality;
00622 char buffer [1024];
00623 while (fInput.getline(buffer, 1024)) {
00624 if (buffer [0] == '#') continue;
00625 std::vector <std::string> items = splitString (std::string (buffer));
00626 if (items.size()==0) continue;
00627 if (items.size () < 6) {
00628 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 6 items: eta, phi, depth, subdet, base - either (hex) or (dec), value" << std::endl;
00629 continue;
00630 }
00631 DetId id = getId (items);
00632
00633
00634
00635
00636
00637 uint32_t mystatus;
00638 if (items[4] == "(hex)")
00639 sscanf(items[5].c_str(),"%X", &mystatus);
00640 else if (items[4] == "(dec)")
00641 sscanf(items[5].c_str(),"%u", &mystatus);
00642 else
00643 {
00644 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n value field must contain the base: one of (hex), (dec)" << std::endl;
00645 continue;
00646 }
00647
00648 HcalChannelStatus* fCondObject = new HcalChannelStatus(id, mystatus);
00649 fObject->addValues(*fCondObject);
00650 delete fCondObject;
00651
00652 }
00653 return true;
00654 }
00655
00656
00657 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalChannelQuality& fObject) {
00658 char buffer [1024];
00659 sprintf (buffer, "# %15s %15s %15s %15s %15s %10s\n", "eta", "phi", "dep", "det", "(base) value", "DetId");
00660 fOutput << buffer;
00661 std::vector<DetId> channels = fObject.getAllChannels ();
00662 std::sort (channels.begin(), channels.end(), DetIdLess ());
00663 for (std::vector<DetId>::iterator channel = channels.begin ();
00664 channel != channels.end ();
00665 channel++) {
00666 const int value = fObject.getValues (*channel)->getValue ();
00667 dumpId (fOutput, *channel);
00668 sprintf (buffer, "%6s %15X %10X\n", "(hex)",
00669 value, channel->rawId ());
00670 fOutput << buffer;
00671 }
00672 return true;
00673 }
00674
00675
00676
00677 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalL1TriggerObjects* fObject)
00678 {
00679 if (!fObject) fObject = new HcalL1TriggerObjects;
00680 char buffer [1024];
00681
00682 while (fInput.getline(buffer, 1024)) {
00683 if (buffer [0] == '#')
00684 {
00685 if (buffer [1] == 'T')
00686 {
00687 std::vector <std::string> items = splitString (std::string (buffer) );
00688 fObject->setTagString(items[1]);
00689 continue;
00690 }
00691 if (buffer [1] == 'A')
00692 {
00693 std::vector <std::string> items = splitString (std::string (buffer) );
00694 fObject->setAlgoString(items[1]);
00695 continue;
00696 }
00697 else continue;
00698 }
00699 std::vector <std::string> items = splitString (std::string (buffer));
00700 if (items.size()==0) continue;
00701 if (items.size () < 7) {
00702 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 7 items: eta, phi, depth, subdet, pedestal, resp.corr.gain, flag" << std::endl;
00703 continue;
00704 }
00705 DetId id = getId (items);
00706
00707 HcalL1TriggerObject* fCondObject = new HcalL1TriggerObject(id, atof(items[4].c_str()), atof(items[5].c_str()), atoi(items[6].c_str()) );
00708
00709 fObject->addValues(*fCondObject);
00710 delete fCondObject;
00711 }
00712 return true;
00713 }
00714
00715 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalL1TriggerObjects& fObject)
00716 {
00717 char buffer [1024];
00718
00719 sprintf (buffer, "#T %s << this is the tag name \n", fObject.getTagString().c_str() );
00720 fOutput << buffer;
00721 sprintf (buffer, "#A %s << this is the algorithm name \n", fObject.getAlgoString().c_str() );
00722 fOutput << buffer;
00723
00724
00725 sprintf (buffer, "# %15s %15s %15s %15s %8s %13s %8s %10s\n",
00726 "eta", "phi", "dep", "det", "ped", "respcorrgain", "flag",
00727 "DetId");
00728 fOutput << buffer;
00729 std::vector<DetId> channels = fObject.getAllChannels ();
00730
00731 for (std::vector<DetId>::iterator channel = channels.begin ();
00732 channel != channels.end ();
00733 channel++) {
00734 const HcalL1TriggerObject* item = fObject.getValues (*channel);
00735 if (item) {
00736 dumpId (fOutput, *channel);
00737 sprintf (buffer, " %10.7f %10.7f %12d %10X\n",
00738 item->getPedestal(), item->getRespGain(), item->getFlag(), channel->rawId ());
00739 fOutput << buffer;
00740 }
00741 }
00742 return true;
00743
00744 }
00745
00746
00747
00748 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalPedestalWidths* fObject) {
00749 if (!fObject) fObject = new HcalPedestalWidths(false);
00750 char buffer [1024];
00751 int linecounter = 0;
00752
00753 while (fInput.getline(buffer, 1024)) {
00754 linecounter++;
00755 std::vector <std::string> items = splitString (std::string (buffer));
00756 if (items.size()==0) continue;
00757 else {
00758 if (items[0] == (std::string)"#U")
00759 {
00760 if (items[1] == (std::string)"ADC") fObject->setUnitADC(true);
00761 else if (items[1] == (std::string)"fC") fObject->setUnitADC(false);
00762 else
00763 {
00764 edm::LogWarning("Pedestal Width Unit Error") << "Unrecognized unit for pedestal widths. Assuming fC." << std::endl;
00765 fObject->setUnitADC(false);
00766 }
00767 break;
00768 }
00769 else
00770 {
00771 edm::LogWarning("Pedestal Width Unit Missing") << "The unit for the pedestal widths is missing in the txt file." << std::endl;
00772 return false;
00773 }
00774 }
00775 }
00776
00777 while (fInput.getline(buffer, 1024)) {
00778 linecounter++;
00779 if (buffer [0] == '#') continue;
00780 std::vector <std::string> items = splitString (std::string (buffer));
00781 if (items.size()==0) continue;
00782 if (items.size () < 14) {
00783 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line number: " << linecounter << "\n line must contain 14 items: eta, phi, depth, subdet, 10x correlations"
00784 << " or 20 items: eta, phi, depth, subdet, 16x correlations"
00785 << std::endl;
00786 continue;
00787 }
00788 DetId id = getId (items);
00789
00790
00791
00792
00793
00794
00795 if (items.size() < 20)
00796 {
00797 HcalPedestalWidth values(id);
00798 values.setSigma (0, 0, atof (items [4].c_str()));
00799 values.setSigma (1, 0, atof (items [5].c_str()));
00800 values.setSigma (1, 1, atof (items [6].c_str()));
00801 values.setSigma (2, 0, atof (items [7].c_str()));
00802 values.setSigma (2, 1, atof (items [8].c_str()));
00803 values.setSigma (2, 2, atof (items [9].c_str()));
00804 values.setSigma (3, 0, atof (items [10].c_str()));
00805 values.setSigma (3, 1, atof (items [11].c_str()));
00806 values.setSigma (3, 2, atof (items [12].c_str()));
00807 values.setSigma (3, 3, atof (items [13].c_str()));
00808 values.setSigma (0, 1, 0.);
00809 values.setSigma (0, 2, 0.);
00810 values.setSigma (0, 3, 0.);
00811 values.setSigma (1, 2, 0.);
00812 values.setSigma (1, 3, 0.);
00813 values.setSigma (2, 3, 0.);
00814 fObject->addValues(values);
00815 }
00816 else
00817 {
00818 HcalPedestalWidth values(id);
00819 values.setSigma (0, 0, atof (items [4].c_str()) );
00820 values.setSigma (0, 1, atof (items [5].c_str()) );
00821 values.setSigma (0, 2, atof (items [6].c_str()) );
00822 values.setSigma (0, 3, atof (items [7].c_str()) );
00823 values.setSigma (1, 0, atof (items [8].c_str()) );
00824 values.setSigma (1, 1, atof (items [9].c_str()) );
00825 values.setSigma (1, 2, atof (items [10].c_str()) );
00826 values.setSigma (1, 3, atof (items [11].c_str()) );
00827 values.setSigma (2, 0, atof (items [12].c_str()) );
00828 values.setSigma (2, 1, atof (items [13].c_str()) );
00829 values.setSigma (2, 2, atof (items [14].c_str()) );
00830 values.setSigma (2, 3, atof (items [15].c_str()) );
00831 values.setSigma (3, 0, atof (items [16].c_str()) );
00832 values.setSigma (3, 1, atof (items [17].c_str()) );
00833 values.setSigma (3, 2, atof (items [18].c_str()) );
00834 values.setSigma (3, 3, atof (items [19].c_str()) );
00835 fObject->addValues(values);
00836 }
00837
00838
00839 }
00840 return true;
00841 }
00842
00843 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalPedestalWidths& fObject) {
00844 char buffer [1024];
00845 if (fObject.isADC() ) sprintf (buffer, "#U ADC << this is the unit \n");
00846 else sprintf (buffer, "#U fC << this is the unit \n");
00847 fOutput << buffer;
00848
00849 sprintf (buffer, "# %15s %15s %15s %15s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s %10s\n",
00850 "eta", "phi", "dep", "det",
00851 "cov_0_0", "cov_0_1", "cov_0_2", "cov_0_3", "cov_1_0", "cov_1_1", "cov_1_2", "cov_1_3", "cov_2_0", "cov_2_1", "cov_2_2", "cov_2_3", "cov_3_0", "cov_3_1", "cov_3_2", "cov_3_3",
00852 "DetId");
00853 fOutput << buffer;
00854 std::vector<DetId> channels = fObject.getAllChannels ();
00855 std::sort (channels.begin(), channels.end(), DetIdLess ());
00856 for (std::vector<DetId>::iterator channel = channels.begin ();
00857 channel != channels.end ();
00858 channel++) {
00859 const HcalPedestalWidth* item = fObject.getValues (*channel);
00860 if (item) {
00861 dumpId (fOutput, *channel);
00862 sprintf (buffer, " %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %10X\n",
00863 item->getSigma (0,0), item->getSigma (0,1), item->getSigma (0,2), item->getSigma (0,3),
00864 item->getSigma (1,0), item->getSigma (1,1), item->getSigma (1,2), item->getSigma (1,3),
00865 item->getSigma (2,0), item->getSigma (2,1), item->getSigma (2,2), item->getSigma (2,3),
00866 item->getSigma (3,0), item->getSigma (3,1), item->getSigma (3,2), item->getSigma (3,3), channel->rawId ());
00867 fOutput << buffer;
00868 }
00869 }
00870 return true;
00871 }
00872
00873
00874
00875 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalQIEData* fObject) {
00876 char buffer [1024];
00877 while (fInput.getline(buffer, 1024)) {
00878 if (buffer [0] == '#') continue;
00879 std::vector <std::string> items = splitString (std::string (buffer));
00880 if (items.size()<1) continue;
00881 if (items [0] == "SHAPE") {
00882 if (items.size () < 33) {
00883 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 33 items: SHAPE 32 x low QIE edges for first 32 bins" << std::endl;
00884 continue;
00885 }
00886 float lowEdges [32];
00887 int i = 32;
00888 while (--i >= 0) lowEdges [i] = atof (items [i+1].c_str ());
00889
00890 }
00891 else {
00892 if (items.size () < 36) {
00893 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 36 items: eta, phi, depth, subdet, 4 capId x 4 Ranges x offsets, 4 capId x 4 Ranges x slopes" << std::endl;
00894 continue;
00895 }
00896 DetId id = getId (items);
00897 fObject->sort ();
00898
00899
00900
00901
00902
00903 HcalQIECoder coder (id.rawId ());
00904 int index = 4;
00905 for (unsigned capid = 0; capid < 4; capid++) {
00906 for (unsigned range = 0; range < 4; range++) {
00907 coder.setOffset (capid, range, atof (items [index++].c_str ()));
00908 }
00909 }
00910 for (unsigned capid = 0; capid < 4; capid++) {
00911 for (unsigned range = 0; range < 4; range++) {
00912 coder.setSlope (capid, range, atof (items [index++].c_str ()));
00913 }
00914 }
00915 fObject->addCoder (coder);
00916
00917 }
00918 }
00919 fObject->sort ();
00920 return true;
00921 }
00922
00923 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalQIEData& fObject) {
00924 char buffer [1024];
00925 fOutput << "# QIE basic shape: SHAPE 32 x low edge values for first 32 channels" << std::endl;
00926 sprintf (buffer, "SHAPE ");
00927 fOutput << buffer;
00928 for (unsigned bin = 0; bin < 32; bin++) {
00929 sprintf (buffer, " %8.5f", fObject.getShape ().lowEdge (bin));
00930 fOutput << buffer;
00931 }
00932 fOutput << std::endl;
00933
00934 fOutput << "# QIE data" << std::endl;
00935 sprintf (buffer, "# %15s %15s %15s %15s %36s %36s %36s %36s %36s %36s %36s %36s\n",
00936 "eta", "phi", "dep", "det",
00937 "4 x offsets cap0", "4 x offsets cap1", "4 x offsets cap2", "4 x offsets cap3",
00938 "4 x slopes cap0", "4 x slopes cap1", "4 x slopes cap2", "4 x slopes cap3");
00939 fOutput << buffer;
00940 std::vector<DetId> channels = fObject.getAllChannels ();
00941 std::sort (channels.begin(), channels.end(), DetIdLess ());
00942 for (std::vector<DetId>::iterator channel = channels.begin ();
00943 channel != channels.end ();
00944 channel++) {
00945 const HcalQIECoder* coder = fObject.getCoder (*channel);
00946 dumpId (fOutput, *channel);
00947 for (unsigned capid = 0; capid < 4; capid++) {
00948 for (unsigned range = 0; range < 4; range++) {
00949 sprintf (buffer, " %8.5f", coder->offset (capid, range));
00950 fOutput << buffer;
00951 }
00952 }
00953 for (unsigned capid = 0; capid < 4; capid++) {
00954 for (unsigned range = 0; range < 4; range++) {
00955 sprintf (buffer, " %8.5f", coder->slope (capid, range));
00956 fOutput << buffer;
00957 }
00958 }
00959 fOutput << std::endl;
00960 }
00961 return true;
00962 }
00963
00964
00965 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalCalibrationQIEData* fObject) {
00966 char buffer [1024];
00967 while (fInput.getline(buffer, 1024)) {
00968 if (buffer [0] == '#') continue;
00969 std::vector <std::string> items = splitString (std::string (buffer));
00970 if (items.size () < 36) {
00971 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 36 items: eta, phi, depth, subdet, 32 bin values" << std::endl;
00972 continue;
00973 }
00974 DetId id = getId (items);
00975 fObject->sort ();
00976
00977
00978
00979
00980
00981 HcalCalibrationQIECoder coder (id.rawId ());
00982 int index = 4;
00983 float values [32];
00984 for (unsigned bin = 0; bin < 32; bin++) {
00985 values[bin] = atof (items [index++].c_str ());
00986 }
00987 coder.setMinCharges (values);
00988 fObject->addCoder (coder);
00989
00990 }
00991 fObject->sort ();
00992 return true;
00993 }
00994
00995 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalCalibrationQIEData& fObject) {
00996 char buffer [1024];
00997 fOutput << "# QIE data in calibration mode" << std::endl;
00998 sprintf (buffer, "# %15s %15s %15s %15s %288s\n",
00999 "eta", "phi", "dep", "det", "32 x charges");
01000 fOutput << buffer;
01001 std::vector<DetId> channels = fObject.getAllChannels ();
01002 std::sort (channels.begin(), channels.end(), DetIdLess ());
01003 for (std::vector<DetId>::iterator channel = channels.begin ();
01004 channel != channels.end ();
01005 channel++) {
01006 const HcalCalibrationQIECoder* coder = fObject.getCoder (*channel);
01007 if (coder) {
01008 dumpId (fOutput, *channel);
01009 const float* lowEdge = coder->minCharges ();
01010 for (unsigned bin = 0; bin < 32; bin++) {
01011 sprintf (buffer, " %8.5f", lowEdge [bin]);
01012 fOutput << buffer;
01013 }
01014 fOutput << std::endl;
01015 }
01016 }
01017 return true;
01018 }
01019
01020
01021
01022 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalElectronicsMap* fObject) {
01023 char buffer [1024];
01024 while (fInput.getline(buffer, 1024)) {
01025 if (buffer [0] == '#') continue;
01026 std::vector <std::string> items = splitString (std::string (buffer));
01027 if (items.size () < 12) {
01028 if (items.size()==0) continue;
01029 if (items.size()<9) {
01030 edm::LogError("MapFormat") << "HcalElectronicsMap-> line too short: " << buffer;
01031 continue;
01032 }
01033 if (items[8]=="NA" || items[8]=="NT") {
01034 while (items.size()<12) items.push_back("");
01035 } else if (items[8]=="HT") {
01036 if (items.size()==11) items.push_back("");
01037 else {
01038 edm::LogError("MapFormat") << "HcalElectronicsMap-> Bad line: " << buffer
01039 << "\n HT line must contain at least 11 items: i cr sl tb dcc spigot fiber fiberchan subdet=HT ieta iphi";
01040 continue;
01041 }
01042 } else {
01043 edm::LogError("MapFormat") << "HcalElectronicsMap-> Bad line: " << buffer
01044 << "\n line must contain 12 items: i cr sl tb dcc spigot fiber fiberchan subdet ieta iphi depth";
01045 continue;
01046 }
01047 }
01048
01049 int crate = atoi (items [1].c_str());
01050 int slot = atoi (items [2].c_str());
01051 int top = 1;
01052 if (items [3] == "b") top = 0;
01053 int dcc = atoi (items [4].c_str());
01054 int spigot = atoi (items [5].c_str());
01055 HcalElectronicsId elId;
01056 if (items[8] == "HT" || items[8] == "NT") {
01057 int slb = atoi (items [6].c_str());
01058 int slbCh = atoi (items [7].c_str());
01059 elId=HcalElectronicsId(slbCh, slb, spigot, dcc,crate,slot,top);
01060 } else {
01061 int fiber = atoi (items [6].c_str());
01062 int fiberCh = atoi (items [7].c_str());
01063
01064 elId=HcalElectronicsId(fiberCh, fiber, spigot, dcc);
01065 elId.setHTR (crate, slot, top);
01066 }
01067
01068
01069 if (items [8] == "NA") {
01070 fObject->mapEId2chId (elId, DetId (HcalDetId::Undefined));
01071 } else if (items [8] == "NT") {
01072 fObject->mapEId2tId (elId, DetId (HcalTrigTowerDetId::Undefined));
01073 } else {
01074 HcalText2DetIdConverter converter (items [8], items [9], items [10], items [11]);
01075 if (converter.isHcalDetId ()) {
01076 fObject->mapEId2chId (elId, converter.getId ());
01077 }
01078 else if (converter.isHcalTrigTowerDetId ()) {
01079 fObject->mapEId2tId (elId, converter.getId ());
01080 }
01081 else if (converter.isHcalCalibDetId ()) {
01082 fObject->mapEId2chId (elId, converter.getId ());
01083 }
01084 else if (converter.isHcalZDCDetId ()) {
01085 fObject->mapEId2chId (elId, converter.getId ());
01086 }
01087 else {
01088 edm::LogWarning("Format Error") << "HcalElectronicsMap-> Unknown subdetector: "
01089 << items [8] << '/' << items [9] << '/' << items [10] << '/' << items [11] << std::endl;
01090 }
01091 }
01092 }
01093 fObject->sort ();
01094 return true;
01095 }
01096
01097 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalElectronicsMap& fObject) {
01098 std::vector<HcalElectronicsId> eids = fObject.allElectronicsId ();
01099 char buf [1024];
01100
01101
01102 sprintf (buf, "# %7s %3s %3s %3s %4s %7s %10s %14s %7s %5s %5s %6s",
01103 "i", "cr", "sl", "tb", "dcc", "spigot", "fiber/slb", "fibcha/slbcha", "subdet", "ieta", "iphi", "depth");
01104 fOutput << buf << std::endl;
01105
01106 for (unsigned i = 0; i < eids.size (); i++) {
01107 HcalElectronicsId eid = eids[i];
01108 if (eid.isTriggerChainId()) {
01109 DetId trigger = fObject.lookupTrigger (eid);
01110 if (trigger.rawId ()) {
01111 HcalText2DetIdConverter converter (trigger);
01112
01113
01114 sprintf (buf, " %7X %3d %3d %3c %4d %7d %10d %14d %7s %5s %5s %6s",
01115
01116 converter.getId().rawId(),
01117
01118
01119 eid.readoutVMECrateId(), eid.htrSlot(), eid.htrTopBottom()>0?'t':'b', eid.dccid(), eid.spigot(), eid.slbSiteNumber(), eid.slbChannelIndex(),
01120 converter.getFlavor ().c_str (), converter.getField1 ().c_str (), converter.getField2 ().c_str (), converter.getField3 ().c_str ()
01121 );
01122 fOutput << buf << std::endl;
01123 }
01124 } else {
01125 DetId channel = fObject.lookup (eid);
01126 if (channel.rawId()) {
01127 HcalText2DetIdConverter converter (channel);
01128
01129
01130 sprintf (buf, " %7X %3d %3d %3c %4d %7d %10d %14d %7s %5s %5s %6s",
01131
01132 converter.getId().rawId(),
01133 eid.readoutVMECrateId(), eid.htrSlot(), eid.htrTopBottom()>0?'t':'b', eid.dccid(), eid.spigot(), eid.fiberIndex(), eid.fiberChanId(),
01134 converter.getFlavor ().c_str (), converter.getField1 ().c_str (), converter.getField2 ().c_str (), converter.getField3 ().c_str ()
01135 );
01136 fOutput << buf << std::endl;
01137 }
01138 }
01139 }
01140 return true;
01141 }
01142
01143
01144 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalLutMetadata* fObject){
01145 if (!fObject) fObject = new HcalLutMetadata;
01146 char buffer [1024];
01147 while (fInput.getline(buffer, 1024)) {
01148 if (buffer [0] == '#') continue;
01149 std::vector <std::string> items = splitString (std::string (buffer));
01150 if (items.size()==0) continue;
01151
01152 if (items.size() > 1 &&
01153 items[0].find("RctLsb")!=std::string::npos){
01154 fObject->setRctLsb( atof( items[1].c_str() ) );
01155 continue;
01156 }
01157 if (items.size() > 1 &&
01158 items[0].find("Gain")!=std::string::npos){
01159 fObject->setNominalGain( atof( items[1].c_str() ) );
01160 continue;
01161 }
01162
01163 if (items.size () < 7) {
01164 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 7 items: eta, phi, depth, subdet, Rcalib, LutGranularity, OutputLutThreshold" << std::endl;
01165 continue;
01166 }
01167 DetId id = getId (items);
01168
01169 HcalLutMetadatum * fCondObject = new HcalLutMetadatum(id,
01170 atof (items [4].c_str()),
01171 atoi (items [5].c_str()),
01172 atoi (items [6].c_str()));
01173 fObject->addValues(*fCondObject);
01174 delete fCondObject;
01175 }
01176 return true;
01177 }
01178
01179
01180 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalLutMetadata& fObject){
01181 char buffer [1024];
01182 const float _rctLsb = fObject.getRctLsb();
01183 const float _gain = fObject.getNominalGain();
01184 sprintf (buffer, "# %20s\n", "Non-channel data");
01185 fOutput << buffer;
01186 sprintf (buffer, "%8s %8.5f\n", "RctLsb", _rctLsb);
01187 fOutput << buffer;
01188 sprintf (buffer, "%8s %8.5f\n", "Gain", _gain);
01189 fOutput << buffer;
01190 sprintf (buffer, "# %15s %15s %15s %15s %8s %15s %19s %10s\n", "eta", "phi", "dep", "det", "Rcalib", "LutGranularity", "OutputLutThreshold", "DetId");
01191 fOutput << buffer;
01192 std::vector<DetId> channels = fObject.getAllChannels ();
01193 std::sort (channels.begin(), channels.end(), DetIdLess ());
01194 for (std::vector<DetId>::iterator channel = channels.begin ();
01195 channel != channels.end ();
01196 channel++) {
01197 const float _rCalib = fObject.getValues (*channel)->getRCalib();
01198 const uint8_t _lutGranularity = fObject.getValues (*channel)->getLutGranularity();
01199 const uint8_t _outputLutThreshold = fObject.getValues (*channel)->getOutputLutThreshold();
01200 dumpId (fOutput, *channel);
01201 sprintf (buffer, " %8.5f %15d %19d %10X\n",
01202 _rCalib,
01203 _lutGranularity,
01204 _outputLutThreshold,
01205 channel->rawId ());
01206 fOutput << buffer;
01207 }
01208 return true;
01209 }
01210
01211
01212 bool HcalDbASCIIIO::getObject(std::istream& fInput, HcalDcsValues * fObject) {
01213 if (!fObject) fObject = new HcalDcsValues;
01214 std::string buffer;
01215 while (getline(fInput, buffer)) {
01216 if (buffer.at(0) == '#') continue;
01217 std::vector <std::string> items = splitString (buffer);
01218 if (items.size()==0) continue;
01219
01220 if (items.size() < 9) {
01221 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 9 items: subDet, side_ring, slice, type, subChannel, LS, Value, UpperLimit, LowerLimit" << std::endl;
01222 continue;
01223 }
01224
01225 HcalOtherSubdetector subd;
01226 int sidering;
01227 unsigned int slice, subchan;
01228 switch (items[0].at(1)) {
01229 case 'B':
01230 subd = HcalDcsBarrel;
01231 break;
01232 case 'E':
01233 subd = HcalDcsEndcap;
01234 break;
01235 case 'F':
01236 subd = HcalDcsForward;
01237 break;
01238 case 'O':
01239 subd = HcalDcsOuter;
01240 break;
01241 default:
01242 continue;
01243 }
01244
01245 from_string<int>(sidering, items[1], std::dec);
01246 from_string<unsigned int>(slice, items[2], std::dec);
01247
01248 from_string<unsigned int>(subchan, items[4], std::dec);
01249
01250 HcalDcsDetId newId(subd, sidering, slice,
01251 HcalDcsDetId::DcsTypeFromString(items[3]), subchan);
01252
01253 int LS;
01254 float val,upper,lower;
01255 from_string<int>(LS, items[5], std::dec);
01256 from_string<float>(val, items[6], std::dec);
01257 from_string<float>(upper, items[7], std::dec);
01258 from_string<float>(lower, items[8], std::dec);
01259
01260 HcalDcsValue newVal(newId.rawId(),LS,val,upper,lower);
01261
01262
01263
01264
01265
01266 if (!(fObject->addValue(newVal))) {
01267 edm::LogWarning("Data Error") << "Data from line " << buffer
01268 << "\nwas not added to the HcalDcsValues object." << std::endl;
01269 }
01270
01271 }
01272 fObject->sortAll();
01273 return true;
01274 }
01275
01276 bool HcalDbASCIIIO::dumpObject(std::ostream& fOutput,
01277 HcalDcsValues const& fObject) {
01278 fOutput << "# subDet side_ring slice type subChan LS Value UpperLimit LowerLimit DcsId\n";
01279 for(int subd = HcalDcsValues::HcalHB;
01280 subd <= HcalDcsValues::HcalHF; ++subd) {
01281
01282 HcalDcsValues::DcsSet const & vals=
01283 fObject.getAllSubdetValues(HcalDcsValues::DcsSubDet(subd));
01284 for (HcalDcsValues::DcsSet::const_iterator val = vals.begin();
01285 val != vals.end(); ++val) {
01286 HcalDcsDetId valId(val->DcsId());
01287
01288 switch (valId.subdet()) {
01289 case HcalDcsBarrel:
01290 fOutput << "HB ";
01291 break;
01292 case HcalDcsEndcap:
01293 fOutput << "HE ";
01294 break;
01295 case HcalDcsOuter:
01296 fOutput << "HO ";
01297 break;
01298 case HcalDcsForward:
01299 fOutput << "HF ";
01300 break;
01301 default :
01302 fOutput << valId.subdet() << ' ';
01303 }
01304
01305 if (valId.subdet() == HcalDcsOuter)
01306 fOutput << valId.ring() << ' ';
01307 else
01308 fOutput << valId.zside() << ' ';
01309
01310 fOutput << valId.slice() << ' '
01311 << valId.typeString(valId.type()) << ' '
01312 << valId.subchannel() << ' ';
01313 fOutput << val->LS() << ' '
01314 << val->getValue() << ' '
01315 << val->getUpperLimit() << ' '
01316 << val->getLowerLimit() << ' ';
01317 fOutput << std::hex << val->DcsId() << std::dec << '\n';
01318
01319
01320
01321
01322
01323
01324 }
01325 }
01326
01327 return true;
01328 }
01329
01330
01331
01332
01333
01334 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalDcsMap* fObject) {
01335 char buffer [1024];
01336 while (fInput.getline(buffer, 1024)) {
01337 if (buffer [0] == '#') continue;
01338 std::vector <std::string> items = splitString (std::string (buffer));
01339 if (items.size () < 8) {
01340 if (items.size()==0) continue;
01341 else {
01342 edm::LogError("MapFormat") << "HcalDcsMap-> Bad line: " << buffer
01343 << "\n line must contain 8 items: line side_ring slice subchannel subdet ieta iphi depth";
01344 continue;
01345 }
01346 }
01347
01348
01349 int ring = atoi(items[1].c_str());
01350 unsigned int slice = atoi (items [2].c_str());
01351 unsigned int subchannel = atoi (items [3].c_str());
01352 HcalDcsDetId::DcsType type = HcalDcsDetId::DCSUNKNOWN;
01353
01354
01355
01356
01357
01358
01359
01360
01361
01362
01363
01364
01365
01366
01367
01368
01369
01370
01371
01372
01373
01374
01375
01376
01377
01378
01379
01380
01381
01382
01383
01384
01385
01386
01387
01388
01389
01390
01391
01392
01393
01394
01395
01396 HcalOtherSubdetector subdet = HcalOtherEmpty;
01397 if (items[4].find("CALIB")!=std::string::npos){
01398 subdet = HcalCalibration;
01399 }
01400 else if (items[4].find("HB")!=std::string::npos){
01401 subdet = HcalDcsBarrel;
01402 }
01403 else if (items[4].find("HE")!=std::string::npos){
01404 subdet = HcalDcsEndcap;
01405 }
01406 else if (items[4].find("HO")!=std::string::npos){
01407 subdet = HcalDcsOuter;
01408 }
01409 else if (items[4].find("HF")!=std::string::npos){
01410 subdet = HcalDcsForward;
01411 }
01412 else{
01413 edm::LogError("MapFormat") << "HcalDcsMap-> Unknown subdetector, line is not accepted: " << items[5];
01414 continue;
01415 }
01416 HcalDcsDetId dcsId(subdet, ring, slice, type, subchannel);
01417 HcalText2DetIdConverter converter (items [4], items [5], items [6], items [7]);
01418 HcalDetId id(0);
01419 if (converter.isHcalDetId()){
01420 id = converter.getId();
01421 }
01422 else{
01423 edm::LogWarning("Invalid HCAL channel") << "HcalDcsMap-> invalid channel: "
01424 << items [4] << '/'
01425 << items [5] << '/'
01426 << items [6] << '/'
01427 << items [7] << std::endl;
01428 continue;
01429 }
01430 fObject->mapGeomId2DcsId(id, dcsId);
01431 }
01432 fObject->sort ();
01433 return true;
01434 }
01435
01436
01437
01438
01439 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalDcsMap& fObject) {
01440 char buf [1024];
01441 sprintf (buf, "# %7s %10s %6s %8s %7s %5s %5s %6s",
01442 "i", "side_ring", "slice", "subchan", "subdet", "ieta", "iphi", "depth");
01443 fOutput << buf << std::endl;
01444 HcalDcsMap::const_iterator _line;
01445 unsigned int line_counter = 0;
01446 for (_line = fObject.beginById();
01447 _line != fObject.endById();
01448 ++_line) {
01449 HcalDcsDetId dcsId = _line.getHcalDcsDetId();
01450
01451 HcalText2DetIdConverter _converter(_line.getHcalDetId());
01452 sprintf (buf, " %8X %10d %6d %8d %7s %5s %5s %6s",
01453 line_counter,
01454 dcsId.ring(),
01455 dcsId.slice(),
01456 dcsId.subchannel(),
01457 _converter.getFlavor().c_str(),
01458 _converter.getField1().c_str(),
01459 _converter.getField2().c_str(),
01460 _converter.getField3().c_str()
01461 );
01462 fOutput << buf << std::endl;
01463 ++line_counter;
01464 }
01465 return true;
01466 }
01467
01468
01469 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalFlagHFDigiTimeParams* fObject)
01470 {
01471
01472 if (!fObject) fObject = new HcalFlagHFDigiTimeParams();
01473 char buffer [1024];
01474 while (fInput.getline(buffer, 1024)) {
01475 if (buffer [0] == '#') continue;
01476 std::vector <std::string> items = splitString (std::string (buffer));
01477 if (items.size()==0) continue;
01478 if (items.size () != 9) {
01479 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain at 9 least items: eta, phi, depth, subdet, firstSample, samplesToAdd, ExpectedPeak, MinEnergy, and a set of comma-separated coefficients" << std::endl;
01480 continue;
01481 }
01482
01483 DetId id = HcalDbASCIIIO::getId (items);
01484 std::vector<double> coef= splitStringToDoubleByComma(items[8].c_str());
01485
01486 HcalFlagHFDigiTimeParam* fCondObject = new HcalFlagHFDigiTimeParam(id,
01487 atoi (items [4].c_str()),
01488 atoi (items [5].c_str()),
01489 atoi (items [6].c_str()),
01490 atof (items [7].c_str()),
01491 coef
01492 );
01493 fObject->addValues(*fCondObject);
01494 delete fCondObject;
01495 }
01496 return true;
01497 }
01498
01499 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalFlagHFDigiTimeParams& fObject)
01500 {
01501 char buffer [1024];
01502 sprintf (buffer, "# %15s %15s %15s %15s %15s %15s %15s %15s %30s\n", "eta", "phi", "dep", "det", "FirstSample", "SamplesToAdd", "ExpectedPeak","MinEnergy","Coefficients");
01503 fOutput << buffer;
01504 std::vector<DetId> channels = fObject.getAllChannels ();
01505 std::sort (channels.begin(), channels.end(), DetIdLess ());
01506 for (std::vector<DetId>::iterator channel = channels.begin ();
01507 channel != channels.end ();
01508 channel++) {
01509
01510 HcalDbASCIIIO::dumpId (fOutput, *channel);
01511
01512 sprintf (buffer, " %15u %15u %15u %15f",
01513 fObject.getValues (*channel)->HFdigiflagFirstSample(),
01514 fObject.getValues (*channel)->HFdigiflagSamplesToAdd(),
01515 fObject.getValues (*channel)->HFdigiflagExpectedPeak(),
01516 fObject.getValues (*channel)->HFdigiflagMinEThreshold()
01517 );
01518
01519 std::vector<double> coef=fObject.getValues(*channel)->HFdigiflagCoefficients();
01520 for (std::vector<double>::size_type x=0;x<coef.size();++x)
01521 sprintf(buffer, "%f,",coef[x]);
01522 sprintf(buffer,"\n");
01523 fOutput << buffer;
01524 }
01525 return true;
01526 }
01527
01528