00001 #include <stdlib.h>
00002 #include <vector>
00003 #include <map>
00004 #include <string>
00005 #include <sstream>
00006 #include <fstream>
00007 #include <iostream>
00008
00009 #include "CondFormats/HcalObjects/interface/HcalPedestals.h"
00010 #include "CondFormats/HcalObjects/interface/HcalPedestalWidths.h"
00011 #include "CondTools/Hcal/interface/HcalDbOnline.h"
00012 #include "CalibCalorimetry/HcalAlgos/interface/HcalDbASCIIIO.h"
00013 #include "CalibCalorimetry/HcalAlgos/interface/HcalPedestalAnalysis.h"
00014
00015 namespace {
00016 bool defaultsFile (const std::string fParam) {
00017 return fParam == "defaults";
00018 }
00019
00020 bool asciiFile (const std::string fParam) {
00021 return fParam.find (':') == std::string::npos && std::string (fParam, fParam.length () - 4) == ".txt";
00022 }
00023
00024 bool xmlFile (const std::string fParam) {
00025 return fParam.find (':') == std::string::npos && std::string (fParam, fParam.length () - 4) == ".xml";
00026 }
00027
00028 bool dbFile (const std::string fParam) {
00029 return fParam.find (':') != std::string::npos;
00030 }
00031
00032 bool masterDb (const std::string fParam) {
00033 return fParam.find ('@') != std::string::npos;
00034 }
00035
00036 template <class T>
00037 bool getObject (T* fObject, const std::string& fDb, const std::string& fTag, int fRun) {
00038 if (!fObject) return false;
00039 if (fDb.empty ()) return false;
00040 if (asciiFile (fDb)) {
00041 std::ifstream stream (fDb.c_str ());
00042 HcalDbASCIIIO::getObject (stream, fObject);
00043 return true;
00044 }
00045 else if (masterDb (fDb)) {
00046 std::cout << "HcalPedestalValidator-> Use input: MasterDB " << fDb << std::endl;
00047 HcalDbOnline masterDb (fDb);
00048 return masterDb.getObject (fObject, fTag, fRun);
00049 }
00050 else {
00051 return false;
00052 }
00053 }
00054
00055 template <class T>
00056 bool putObject (T** fObject, const std::string& fDb, const std::string& fTag, int fRun) {
00057 if (!fObject || !*fObject) return false;
00058 if (fDb.empty ()) return false;
00059 if (asciiFile (fDb)) {
00060 std::ofstream stream (fDb.c_str ());
00061 HcalDbASCIIIO::dumpObject (stream, **fObject);
00062 return true;
00063 }
00064 else {
00065 return false;
00066 }
00067 }
00068 }
00069
00070
00071 class Args {
00072 public:
00073 Args () {};
00074 ~Args () {};
00075 void defineOption (const std::string& fOption, const std::string& fComment = "");
00076 void defineParameter (const std::string& fParameter, const std::string& fComment = "");
00077 void parse (int nArgs, char* fArgs []);
00078 void printOptionsHelp () const;
00079 std::string command () const;
00080 std::vector<std::string> arguments () const;
00081 bool optionIsSet (const std::string& fOption) const;
00082 std::string getParameter (const std::string& fKey);
00083 private:
00084 std::string mProgramName;
00085 std::vector <std::string> mOptions;
00086 std::vector <std::string> mParameters;
00087 std::vector <std::string> mArgs;
00088 std::map <std::string, std::string> mParsed;
00089 std::map <std::string, std::string> mComments;
00090 };
00091
00092 int main (int argn, char* argv []) {
00093
00094
00095 const char* foo1 = "CORAL_AUTH_USER=blaaah";
00096 const char* foo2 = "CORAL_AUTH_PASSWORD=blaaah";
00097 if (!::getenv("CORAL_AUTH_USER")) ::putenv(const_cast<char*>(foo1));
00098 if (!::getenv("CORAL_AUTH_PASSWORD")) ::putenv(const_cast<char*>(foo2));
00099
00100 Args args;
00101 args.defineParameter ("-p", "raw pedestals");
00102 args.defineParameter ("-w", "raw widths");
00103 args.defineParameter ("-run", "current run number <0>");
00104 args.defineParameter ("-ptag", "raw pedestal tag <NULL>");
00105 args.defineParameter ("-wtag", "raw width tag <ptag>");
00106 args.defineParameter ("-pref", "reference pedestals");
00107 args.defineParameter ("-wref", "reference widths");
00108 args.defineParameter ("-ptagref", "reference pedestal tag <NULL>");
00109 args.defineParameter ("-wtagref", "reference width tag <ptagref>");
00110 args.defineParameter ("-pval", "validated pedestals");
00111 args.defineParameter ("-wval", "validated widths");
00112 args.defineOption ("-help", "this help");
00113
00114 args.parse (argn, argv);
00115 std::vector<std::string> arguments = args.arguments ();
00116 if (args.optionIsSet ("-help")) {
00117 args.printOptionsHelp ();
00118 return -1;
00119 }
00120
00121
00122 std::string RawPedSource = args.getParameter("-p");
00123 std::string RawPedWidSource = args.getParameter("-w");
00124 std::string RawPedTag = args.getParameter("-ptag").empty() ? "" : args.getParameter("-ptag");
00125 std::string RawPedWidTag = args.getParameter("-wtag").empty() ? RawPedTag : args.getParameter("-wtag");
00126 int RawPedRun = args.getParameter("-run").empty() ? 0 : (int)strtoll (args.getParameter("-run").c_str(),0,0);
00127 int RawPedWidRun = RawPedRun;
00128 std::string RefPedSource = args.getParameter("-pref");
00129 std::string RefPedWidSource = args.getParameter("-wref");
00130 std::string RefPedTag = args.getParameter("-ptagref").empty() ? "" : args.getParameter("-ptagref");
00131 std::string RefPedWidTag = args.getParameter("-wtagref").empty() ? RefPedTag : args.getParameter("-wtagref");
00132 int RefPedRun = RawPedRun;
00133 int RefPedWidRun = RefPedRun;
00134 std::string outputPedDest = args.getParameter("-pval");
00135 std::string outputPedWidDest = args.getParameter("-wval");
00136 std::string outputPedTag = "";
00137 std::string outputPedWidTag = "";
00138 int outputPedRun = RawPedRun;
00139 int outputPedWidRun = outputPedRun;
00140
00141
00142 HcalPedestals* RefPeds = 0;
00143 RefPeds = new HcalPedestals ();
00144 if (!getObject (RefPeds, RefPedSource, RefPedTag, RefPedRun)) {
00145 std::cerr << "HcalPedestalValidator-> Failed to get reference Pedestals" << std::endl;
00146 return 1;
00147 }
00148 HcalPedestalWidths* RefPedWids = 0;
00149 RefPedWids = new HcalPedestalWidths ();
00150 if (!getObject (RefPedWids, RefPedWidSource, RefPedWidTag, RefPedWidRun)) {
00151 std::cerr << "HcalPedestalValidator-> Failed to get reference PedestalWidths" << std::endl;
00152 return 2;
00153 }
00154
00155
00156 HcalPedestals* RawPeds = 0;
00157 RawPeds = new HcalPedestals ();
00158 if (!getObject (RawPeds, RawPedSource, RawPedTag, RawPedRun)) {
00159 std::cerr << "HcalPedestalValidator-> Failed to get raw Pedestals" << std::endl;
00160 return 3;
00161 }
00162 HcalPedestalWidths* RawPedWids = 0;
00163 RawPedWids = new HcalPedestalWidths ();
00164 if (!getObject (RawPedWids, RawPedWidSource, RawPedWidTag, RawPedWidRun)) {
00165 std::cerr << "HcalPedestalValidator-> Failed to get raw PedestalWidths" << std::endl;
00166 return 4;
00167 }
00168
00169
00170 HcalPedestals* outputPeds = 0;
00171 outputPeds = new HcalPedestals ();
00172 HcalPedestalWidths* outputPedWids = 0;
00173 outputPedWids = new HcalPedestalWidths ();
00174
00175
00176 int nstat[4]={2500,2500,2500,2500};
00177 int Flag=HcalPedestalAnalysis::HcalPedVal(nstat,RefPeds,RefPedWids,RawPeds,RawPedWids,outputPeds,outputPedWids);
00178
00179 delete RefPeds;
00180 delete RefPedWids;
00181 delete RawPeds;
00182 delete RawPedWids;
00183
00184
00185
00186 if (Flag%100000>0) {
00187 if (outputPeds) {
00188 if (!putObject (&outputPeds, outputPedDest, outputPedTag, outputPedRun)) {
00189 std::cerr << "HcalPedestalAnalyzer-> Failed to put output Pedestals" << std::endl;
00190 return 5;
00191 }
00192 }
00193 if (outputPedWids) {
00194 if (!putObject (&outputPedWids, outputPedWidDest, outputPedWidTag, outputPedWidRun)) {
00195 std::cerr << "HcalPedestalAnalyzer-> Failed to put output PedestalWidths" << std::endl;
00196 return 6;
00197 }
00198 }
00199 }
00200 delete outputPeds;
00201 delete outputPedWids;
00202
00203 return 0;
00204 }
00205
00206
00207 void Args::defineOption (const std::string& fOption, const std::string& fComment) {
00208 mOptions.push_back (fOption);
00209 mComments [fOption] = fComment;
00210 }
00211
00212 void Args::defineParameter (const std::string& fParameter, const std::string& fComment) { mParameters.push_back (fParameter);
00213 mComments [fParameter] = fComment;
00214 }
00215
00216 void Args::parse (int nArgs, char* fArgs []) {
00217 if (nArgs <= 0) return;
00218 mProgramName = std::string (fArgs [0]);
00219 int iarg = 0;
00220 while (++iarg < nArgs) {
00221 std::string arg (fArgs [iarg]);
00222 if (arg [0] != '-') mArgs.push_back (arg);
00223 else {
00224 if (std::find (mOptions.begin(), mOptions.end (), arg) != mOptions.end ()) {
00225 mParsed [arg] = "";
00226 }
00227 if (std::find (mParameters.begin(), mParameters.end (), arg) != mParameters.end ()) {
00228 if (iarg >= nArgs) {
00229 std::cerr << "ERROR: Parameter " << arg << " has no value specified. Ignore parameter." << std::endl;
00230 }
00231 else {
00232 mParsed [arg] = std::string (fArgs [++iarg]);
00233 }
00234 }
00235 }
00236 }
00237 }
00238
00239 void Args::printOptionsHelp () const {
00240 char buffer [1024];
00241 std::cout << "Parameters:" << std::endl;
00242 for (unsigned i = 0; i < mParameters.size (); i++) {
00243 std::map<std::string, std::string>::const_iterator it = mComments.find (mParameters [i]);
00244 std::string comment = it != mComments.end () ? it->second : "uncommented";
00245 sprintf (buffer, " %-8s <value> : %s", (mParameters [i]).c_str(), comment.c_str());
00246 std::cout << buffer << std::endl;
00247 }
00248 std::cout << "Options:" << std::endl;
00249 for (unsigned i = 0; i < mOptions.size (); i++) {
00250 std::map<std::string, std::string>::const_iterator it = mComments.find (mOptions [i]);
00251 std::string comment = it != mComments.end () ? it->second : "uncommented";
00252 sprintf (buffer, " %-8s : %s", (mOptions [i]).c_str(), comment.c_str());
00253 std::cout << buffer << std::endl;
00254 }
00255 }
00256
00257 std::string Args::command () const {
00258 int ipos = mProgramName.rfind ('/');
00259 return std::string (mProgramName, ipos+1);
00260 }
00261
00262 std::vector<std::string> Args::arguments () const {return mArgs;}
00263
00264 bool Args::optionIsSet (const std::string& fOption) const {
00265 return mParsed.find (fOption) != mParsed.end ();
00266 }
00267
00268 std::string Args::getParameter (const std::string& fKey) {
00269 if (optionIsSet (fKey)) return mParsed [fKey];
00270 return "";
00271 }
00272