00001 #include "CondTools/Hcal/interface/HcalQIEDataCheck.h"
00002
00003 HcalQIEDataCheck::HcalQIEDataCheck(edm::ParameterSet const& ps)
00004 {
00005 outfile = ps.getUntrackedParameter<std::string>("outFile","null");
00006 dumprefs = ps.getUntrackedParameter<std::string>("dumpRefQIEsTo","null");
00007 dumpupdate = ps.getUntrackedParameter<std::string>("dumpUpdateQIEsTo","null");
00008 checkemapflag = ps.getUntrackedParameter<bool>("checkEmap",false);
00009 validateflag = ps.getUntrackedParameter<bool>("validateQIEs",false);
00010
00011 }
00012
00013 HcalQIEDataCheck::~HcalQIEDataCheck() {}
00014
00015 void HcalQIEDataCheck::analyze(const edm::Event& ev, const edm::EventSetup& es)
00016 {
00017 using namespace edm::eventsetup;
00018
00019 edm::ESHandle<HcalQIEData> newQIEs;
00020 es.get<HcalQIEDataRcd>().get("update",newQIEs);
00021 const HcalQIEData* myNewQIEs = newQIEs.product();
00022
00023 edm::ESHandle<HcalQIEData> refQIEs;
00024 es.get<HcalQIEDataRcd>().get("reference",refQIEs);
00025 const HcalQIEData* myRefQIEs = refQIEs.product();
00026
00027 edm::ESHandle<HcalElectronicsMap> refEMap;
00028 es.get<HcalElectronicsMapRcd>().get("reference",refEMap);
00029 const HcalElectronicsMap* myRefEMap = refEMap.product();
00030
00031 if(dumpupdate.compare("null")!=0){
00032 std::ofstream outStream(dumpupdate.c_str());
00033 std::cout << "--- Dumping QIEs - update ---" << std::endl;
00034 HcalDbASCIIIO::dumpObject (outStream, (*myNewQIEs) );
00035 }
00036 if(dumprefs.compare("null")!=0){
00037 std::ofstream outStream2(dumprefs.c_str());
00038 std::cout << "--- Dumping QIEs - reference ---" << std::endl;
00039 HcalDbASCIIIO::dumpObject (outStream2, (*myRefQIEs) );
00040 }
00041
00042
00043 std::vector<DetId> listNewChan = myNewQIEs->getAllChannels();
00044
00045 HcalQIEData *resultQIEs = new HcalQIEData(myRefQIEs->topo());
00046 std::vector<DetId> listRefChan = myRefQIEs->getAllChannels();
00047 std::vector<DetId>::iterator cell;
00048
00049 if(validateflag){
00050 for (std::vector<DetId>::iterator it = listRefChan.begin(); it != listRefChan.end(); it++)
00051 {
00052 DetId mydetid = *it;
00053 cell = std::find(listNewChan.begin(), listNewChan.end(), mydetid);
00054 if (cell == listNewChan.end())
00055 {
00056 throw cms::Exception("DataDoesNotMatch") << "Value not found in reference" << std::endl;
00057 }
00058 else
00059 {
00060
00061 const HcalQIECoder* first = myNewQIEs->getCoder( mydetid );
00062 const HcalQIECoder* second = myRefQIEs->getCoder( mydetid );
00063 {
00064 bool failflag = false;
00065 if(first->offset(0,0) != second->offset(0,0)) failflag = true;
00066 if(first->offset(0,1) != second->offset(0,1)) failflag = true;
00067 if(first->offset(0,2) != second->offset(0,2)) failflag = true;
00068 if(first->offset(0,3) != second->offset(0,3)) failflag = true;
00069 if(first->offset(1,0) != second->offset(1,0)) failflag = true;
00070 if(first->offset(1,1) != second->offset(1,1)) failflag = true;
00071 if(first->offset(1,2) != second->offset(1,2)) failflag = true;
00072 if(first->offset(1,3) != second->offset(1,3)) failflag = true;
00073 if(first->offset(2,0) != second->offset(2,0)) failflag = true;
00074 if(first->offset(2,1) != second->offset(2,1)) failflag = true;
00075 if(first->offset(2,2) != second->offset(2,2)) failflag = true;
00076 if(first->offset(2,3) != second->offset(2,3)) failflag = true;
00077 if(first->offset(3,0) != second->offset(3,0)) failflag = true;
00078 if(first->offset(3,1) != second->offset(3,1)) failflag = true;
00079 if(first->offset(3,2) != second->offset(3,2)) failflag = true;
00080 if(first->offset(3,3) != second->offset(3,3)) failflag = true;
00081 if(first->slope(0,0) != second->slope(0,0)) failflag = true;
00082 if(first->slope(0,1) != second->slope(0,1)) failflag = true;
00083 if(first->slope(0,2) != second->slope(0,2)) failflag = true;
00084 if(first->slope(0,3) != second->slope(0,3)) failflag = true;
00085 if(first->slope(1,0) != second->slope(1,0)) failflag = true;
00086 if(first->slope(1,1) != second->slope(1,1)) failflag = true;
00087 if(first->slope(1,2) != second->slope(1,2)) failflag = true;
00088 if(first->slope(1,3) != second->slope(1,3)) failflag = true;
00089 if(first->slope(2,0) != second->slope(2,0)) failflag = true;
00090 if(first->slope(2,1) != second->slope(2,1)) failflag = true;
00091 if(first->slope(2,2) != second->slope(2,2)) failflag = true;
00092 if(first->slope(2,3) != second->slope(2,3)) failflag = true;
00093 if(first->slope(3,0) != second->slope(3,0)) failflag = true;
00094 if(first->slope(3,1) != second->slope(3,1)) failflag = true;
00095 if(first->slope(3,2) != second->slope(3,2)) failflag = true;
00096 if(first->slope(3,3) != second->slope(3,3)) failflag = true;
00097 if(failflag) throw cms::Exception("DataDoesNotMatch") << "Values are do not match";
00098 }
00099 listNewChan.erase(cell);
00100 }
00101 }
00102 std::cout << "These are identical" << std::endl;
00103 }
00104
00105
00106
00107
00108
00109
00110
00111 if(outfile.compare("null")!=0){
00112 for (std::vector<DetId>::iterator it = listRefChan.begin(); it != listRefChan.end(); it++)
00113 {
00114 DetId mydetid = *it;
00115 cell = std::find(listNewChan.begin(), listNewChan.end(), mydetid);
00116 if (cell == listNewChan.end())
00117 {
00118 const HcalQIECoder* myCoder = myRefQIEs->getCoder( mydetid );
00119 std::cout << "o";
00120 resultQIEs->addCoder( *myCoder );
00121 }
00122 else
00123 {
00124 const HcalQIECoder* myCoder = myNewQIEs->getCoder( mydetid );
00125 std::cout << "n";
00126 resultQIEs->addCoder( *myCoder );
00127 listNewChan.erase(cell);
00128 }
00129 }
00130 for (std::vector<DetId>::iterator it = listNewChan.begin(); it != listNewChan.end(); it++)
00131 {
00132 DetId mydetid = *it;
00133 const HcalQIECoder* myCoder = myNewQIEs->getCoder( mydetid );
00134 std::cout << "N";
00135 resultQIEs->addCoder( *myCoder );
00136 }
00137
00138 std::ofstream outStream3(outfile.c_str());
00139 std::cout << "--- Dumping QIEs - the combined ones ---" << std::endl;
00140 resultQIEs->sort();
00141 HcalDbASCIIIO::dumpObject (outStream3, (*resultQIEs) );
00142 }
00143
00144 std::cout << std::endl;
00145 if(checkemapflag){
00146 std::vector<DetId> listResult = resultQIEs->getAllChannels();
00147
00148 std::vector<HcalGenericDetId> listEMap = myRefEMap->allPrecisionId();
00149 for (std::vector<HcalGenericDetId>::const_iterator it = listEMap.begin(); it != listEMap.end(); it++)
00150 {
00151 DetId mydetid = DetId(it->rawId());
00152 if (std::find(listResult.begin(), listResult.end(), mydetid ) == listResult.end() )
00153 {
00154 std::cout << "Conditions not found for DetId = " << HcalGenericDetId(it->rawId()) << std::endl;
00155 }
00156 }
00157 }
00158
00159 }
00160
00161 DEFINE_FWK_MODULE(HcalQIEDataCheck);