00001
00002
00003
00004
00005
00006
00007 #include <memory>
00008 #include <iostream>
00009
00010 #include "FWCore/Framework/interface/ValidityInterval.h"
00011 #include "DataFormats/HcalDetId/interface/HcalZDCDetId.h"
00012 #include "DataFormats/HcalDetId/interface/HcalDetId.h"
00013 #include "DataFormats/HcalDetId/interface/HcalGenericDetId.h"
00014 #include "CalibCalorimetry/HcalAlgos/interface/HcalDbHardcode.h"
00015
00016 #include "CondFormats/DataRecord/interface/HcalAllRcds.h"
00017
00018 #include "Geometry/ForwardGeometry/interface/ZdcTopology.h"
00019 #include "Geometry/CaloTopology/interface/HcalTopology.h"
00020 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00021
00022 #include "HcalHardcodeCalibrations.h"
00023
00024
00025
00026
00027 using namespace cms;
00028
00029 namespace {
00030
00031 std::vector<HcalGenericDetId> allCells (bool h2_mode) {
00032 static std::vector<HcalGenericDetId> result;
00033 if (result.size () <= 0) {
00034 HcalTopology hcaltopology(h2_mode);
00035 for (int eta = -50; eta < 50; eta++) {
00036 for (int phi = 0; phi < 100; phi++) {
00037 for (int depth = 1; depth < 5; depth++) {
00038 for (int det = 1; det < 5; det++) {
00039 HcalDetId cell ((HcalSubdetector) det, eta, phi, depth);
00040 if (hcaltopology.valid(cell)) result.push_back (cell);
00041 }
00042 }
00043 }
00044 }
00045 ZdcTopology zdctopology;
00046 HcalZDCDetId zcell;
00047 HcalZDCDetId::Section section = HcalZDCDetId::EM;
00048 for(int depth= 1; depth < 6; depth++){
00049 zcell = HcalZDCDetId(section, true, depth);
00050 if(zdctopology.valid(zcell)) result.push_back(zcell);
00051 zcell = HcalZDCDetId(section, false, depth);
00052 if(zdctopology.valid(zcell)) result.push_back(zcell);
00053 }
00054 section = HcalZDCDetId::HAD;
00055 for(int depth= 1; depth < 5; depth++){
00056 zcell = HcalZDCDetId(section, true, depth);
00057 if(zdctopology.valid(zcell)) result.push_back(zcell);
00058 zcell = HcalZDCDetId(section, false, depth);
00059 if(zdctopology.valid(zcell)) result.push_back(zcell);
00060 }
00061 section = HcalZDCDetId::LUM;
00062 for(int depth= 1; depth < 3; depth++){
00063 zcell = HcalZDCDetId(section, true, depth);
00064 if(zdctopology.valid(zcell)) result.push_back(zcell);
00065 zcell = HcalZDCDetId(section, false, depth);
00066 if(zdctopology.valid(zcell)) result.push_back(zcell);
00067 }
00068 }
00069 return result;
00070 }
00071
00072 }
00073
00074 HcalHardcodeCalibrations::HcalHardcodeCalibrations ( const edm::ParameterSet& iConfig )
00075
00076 {
00077 edm::LogInfo("HCAL") << "HcalHardcodeCalibrations::HcalHardcodeCalibrations->...";
00078
00079 h2mode_=iConfig.getUntrackedParameter<bool>("H2Mode",false);
00080 std::vector <std::string> toGet = iConfig.getUntrackedParameter <std::vector <std::string> > ("toGet");
00081 for(std::vector <std::string>::iterator objectName = toGet.begin(); objectName != toGet.end(); ++objectName ) {
00082 bool all = *objectName == "all";
00083 if ((*objectName == "Pedestals") || all) {
00084 setWhatProduced (this, &HcalHardcodeCalibrations::producePedestals);
00085 findingRecord <HcalPedestalsRcd> ();
00086 }
00087 if ((*objectName == "PedestalWidths") || all) {
00088 setWhatProduced (this, &HcalHardcodeCalibrations::producePedestalWidths);
00089 findingRecord <HcalPedestalWidthsRcd> ();
00090 }
00091 if ((*objectName == "Gains") || all) {
00092 setWhatProduced (this, &HcalHardcodeCalibrations::produceGains);
00093 findingRecord <HcalGainsRcd> ();
00094 }
00095 if ((*objectName == "GainWidths") || all) {
00096 setWhatProduced (this, &HcalHardcodeCalibrations::produceGainWidths);
00097 findingRecord <HcalGainWidthsRcd> ();
00098 }
00099 if ((*objectName == "QIEData") || all) {
00100 setWhatProduced (this, &HcalHardcodeCalibrations::produceQIEData);
00101 findingRecord <HcalQIEDataRcd> ();
00102 }
00103 if ((*objectName == "ChannelQuality") || (*objectName == "channelQuality") || all) {
00104 setWhatProduced (this, &HcalHardcodeCalibrations::produceChannelQuality);
00105 findingRecord <HcalChannelQualityRcd> ();
00106 }
00107 if ((*objectName == "ElectronicsMap") || (*objectName == "electronicsMap") || all) {
00108 setWhatProduced (this, &HcalHardcodeCalibrations::produceElectronicsMap);
00109 findingRecord <HcalElectronicsMapRcd> ();
00110 }
00111 if ((*objectName == "ZSThresholds") || (*objectName == "zsThresholds") || all) {
00112 setWhatProduced (this, &HcalHardcodeCalibrations::produceZSThresholds);
00113 findingRecord <HcalZSThresholdsRcd> ();
00114 }
00115 if ((*objectName == "RespCorrs") || (*objectName == "ResponseCorrection") || all) {
00116 setWhatProduced (this, &HcalHardcodeCalibrations::produceRespCorrs);
00117 findingRecord <HcalRespCorrsRcd> ();
00118 }
00119 if ((*objectName == "LUTCorrs") || (*objectName == "LUTCorrection") || all) {
00120 setWhatProduced (this, &HcalHardcodeCalibrations::produceLUTCorrs);
00121 findingRecord <HcalLUTCorrsRcd> ();
00122 }
00123 if ((*objectName == "PFCorrs") || (*objectName == "PFCorrection") || all) {
00124 setWhatProduced (this, &HcalHardcodeCalibrations::producePFCorrs);
00125 findingRecord <HcalPFCorrsRcd> ();
00126 }
00127 if ((*objectName == "TimeCorrs") || (*objectName == "TimeCorrection") || all) {
00128 setWhatProduced (this, &HcalHardcodeCalibrations::produceTimeCorrs);
00129 findingRecord <HcalTimeCorrsRcd> ();
00130 }
00131 if ((*objectName == "L1TriggerObjects") || (*objectName == "L1Trigger") || all) {
00132 setWhatProduced (this, &HcalHardcodeCalibrations::produceL1TriggerObjects);
00133 findingRecord <HcalL1TriggerObjectsRcd> ();
00134 }
00135 if ((*objectName == "ValidationCorrs") || (*objectName == "ValidationCorrection") || all) {
00136 setWhatProduced (this, &HcalHardcodeCalibrations::produceValidationCorrs);
00137 findingRecord <HcalValidationCorrsRcd> ();
00138 }
00139 if ((*objectName == "LutMetadata") || (*objectName == "lutMetadata") || all) {
00140 setWhatProduced (this, &HcalHardcodeCalibrations::produceLutMetadata);
00141 findingRecord <HcalLutMetadataRcd> ();
00142 }
00143 if ((*objectName == "DcsValues") || all) {
00144 setWhatProduced (this, &HcalHardcodeCalibrations::produceDcsValues);
00145 findingRecord <HcalDcsRcd> ();
00146 }
00147 if ((*objectName == "DcsMap") || (*objectName == "dcsMap") || all) {
00148 setWhatProduced (this, &HcalHardcodeCalibrations::produceDcsMap);
00149 findingRecord <HcalDcsMapRcd> ();
00150 }
00151 if ((*objectName == "RecoParams") || all) {
00152 setWhatProduced (this, &HcalHardcodeCalibrations::produceRecoParams);
00153 findingRecord <HcalRecoParamsRcd> ();
00154 }
00155 if ((*objectName == "LongRecoParams") || all) {
00156 setWhatProduced (this, &HcalHardcodeCalibrations::produceLongRecoParams);
00157 findingRecord <HcalLongRecoParamsRcd> ();
00158 }
00159 if ((*objectName == "MCParams") || all) {
00160 setWhatProduced (this, &HcalHardcodeCalibrations::produceMCParams);
00161 findingRecord <HcalMCParamsRcd> ();
00162 }
00163 if ((*objectName == "FlagHFDigiTimeParams") || all) {
00164 setWhatProduced (this, &HcalHardcodeCalibrations::produceFlagHFDigiTimeParams);
00165 findingRecord <HcalFlagHFDigiTimeParamsRcd> ();
00166 }
00167 }
00168 }
00169
00170
00171 HcalHardcodeCalibrations::~HcalHardcodeCalibrations()
00172 {
00173 }
00174
00175
00176
00177
00178
00179 void
00180 HcalHardcodeCalibrations::setIntervalFor( const edm::eventsetup::EventSetupRecordKey& iKey, const edm::IOVSyncValue& iTime, edm::ValidityInterval& oInterval ) {
00181 std::string record = iKey.name ();
00182 edm::LogInfo("HCAL") << "HcalHardcodeCalibrations::setIntervalFor-> key: " << record << " time: " << iTime.eventID() << '/' << iTime.time ().value ();
00183 oInterval = edm::ValidityInterval (edm::IOVSyncValue::beginOfTime(), edm::IOVSyncValue::endOfTime());
00184 }
00185
00186 std::auto_ptr<HcalPedestals> HcalHardcodeCalibrations::producePedestals (const HcalPedestalsRcd&) {
00187 edm::LogInfo("HCAL") << "HcalHardcodeCalibrations::producePedestals-> ...";
00188 std::auto_ptr<HcalPedestals> result (new HcalPedestals (false));
00189 std::vector <HcalGenericDetId> cells = allCells(h2mode_);
00190 for (std::vector <HcalGenericDetId>::const_iterator cell = cells.begin (); cell != cells.end (); cell++) {
00191 HcalPedestal item = HcalDbHardcode::makePedestal (*cell);
00192 result->addValues(item,h2mode_);
00193 }
00194 return result;
00195 }
00196
00197 std::auto_ptr<HcalPedestalWidths> HcalHardcodeCalibrations::producePedestalWidths (const HcalPedestalWidthsRcd&) {
00198 edm::LogInfo("HCAL") << "HcalHardcodeCalibrations::producePedestalWidths-> ...";
00199 std::auto_ptr<HcalPedestalWidths> result (new HcalPedestalWidths (false));
00200 std::vector <HcalGenericDetId> cells = allCells(h2mode_);
00201 for (std::vector <HcalGenericDetId>::const_iterator cell = cells.begin (); cell != cells.end (); cell++) {
00202 HcalPedestalWidth item = HcalDbHardcode::makePedestalWidth (*cell);
00203 result->addValues(item,h2mode_);
00204 }
00205 return result;
00206 }
00207
00208 std::auto_ptr<HcalGains> HcalHardcodeCalibrations::produceGains (const HcalGainsRcd&) {
00209 edm::LogInfo("HCAL") << "HcalHardcodeCalibrations::produceGains-> ...";
00210 std::auto_ptr<HcalGains> result (new HcalGains ());
00211 std::vector <HcalGenericDetId> cells = allCells(h2mode_);
00212 for (std::vector <HcalGenericDetId>::const_iterator cell = cells.begin (); cell != cells.end (); cell++) {
00213 HcalGain item = HcalDbHardcode::makeGain (*cell);
00214 result->addValues(item,h2mode_);
00215 }
00216 return result;
00217 }
00218
00219 std::auto_ptr<HcalGainWidths> HcalHardcodeCalibrations::produceGainWidths (const HcalGainWidthsRcd&) {
00220 edm::LogInfo("HCAL") << "HcalHardcodeCalibrations::produceGainWidths-> ...";
00221 std::auto_ptr<HcalGainWidths> result (new HcalGainWidths ());
00222 std::vector <HcalGenericDetId> cells = allCells(h2mode_);
00223 for (std::vector <HcalGenericDetId>::const_iterator cell = cells.begin (); cell != cells.end (); cell++) {
00224 HcalGainWidth item = HcalDbHardcode::makeGainWidth (*cell);
00225 result->addValues(item,h2mode_);
00226 }
00227 return result;
00228 }
00229
00230 std::auto_ptr<HcalQIEData> HcalHardcodeCalibrations::produceQIEData (const HcalQIEDataRcd& rcd) {
00231 edm::LogInfo("HCAL") << "HcalHardcodeCalibrations::produceQIEData-> ...";
00232 std::auto_ptr<HcalQIEData> result (new HcalQIEData ());
00233 std::vector <HcalGenericDetId> cells = allCells(h2mode_);
00234 for (std::vector <HcalGenericDetId>::const_iterator cell = cells.begin (); cell != cells.end (); cell++) {
00235 HcalQIECoder coder = HcalDbHardcode::makeQIECoder (*cell);
00236 result->addCoder (coder,h2mode_);
00237 }
00238 return result;
00239 }
00240
00241 std::auto_ptr<HcalChannelQuality> HcalHardcodeCalibrations::produceChannelQuality (const HcalChannelQualityRcd& rcd) {
00242 edm::LogInfo("HCAL") << "HcalHardcodeCalibrations::produceChannelQuality-> ...";
00243 std::auto_ptr<HcalChannelQuality> result (new HcalChannelQuality ());
00244 std::vector <HcalGenericDetId> cells = allCells(h2mode_);
00245 for (std::vector <HcalGenericDetId>::const_iterator cell = cells.begin (); cell != cells.end (); cell++) {
00246 HcalChannelStatus item(cell->rawId(),0);
00247 result->addValues(item,h2mode_);
00248 }
00249 return result;
00250 }
00251
00252
00253 std::auto_ptr<HcalRespCorrs> HcalHardcodeCalibrations::produceRespCorrs (const HcalRespCorrsRcd& rcd) {
00254 edm::LogInfo("HCAL") << "HcalHardcodeCalibrations::produceRespCorrs-> ...";
00255 std::auto_ptr<HcalRespCorrs> result (new HcalRespCorrs ());
00256 std::vector <HcalGenericDetId> cells = allCells(h2mode_);
00257 for (std::vector <HcalGenericDetId>::const_iterator cell = cells.begin (); cell != cells.end (); cell++) {
00258 HcalRespCorr item(cell->rawId(),1.0);
00259 result->addValues(item,h2mode_);
00260 }
00261 return result;
00262 }
00263
00264 std::auto_ptr<HcalLUTCorrs> HcalHardcodeCalibrations::produceLUTCorrs (const HcalLUTCorrsRcd& rcd) {
00265 edm::LogInfo("HCAL") << "HcalHardcodeCalibrations::produceLUTCorrs-> ...";
00266 std::auto_ptr<HcalLUTCorrs> result (new HcalLUTCorrs ());
00267 std::vector <HcalGenericDetId> cells = allCells(h2mode_);
00268 for (std::vector <HcalGenericDetId>::const_iterator cell = cells.begin (); cell != cells.end (); cell++) {
00269 HcalLUTCorr item(cell->rawId(),1.0);
00270 result->addValues(item,h2mode_);
00271 }
00272 return result;
00273 }
00274
00275 std::auto_ptr<HcalPFCorrs> HcalHardcodeCalibrations::producePFCorrs (const HcalPFCorrsRcd& rcd) {
00276 edm::LogInfo("HCAL") << "HcalHardcodeCalibrations::producePFCorrs-> ...";
00277 std::auto_ptr<HcalPFCorrs> result (new HcalPFCorrs ());
00278 std::vector <HcalGenericDetId> cells = allCells(h2mode_);
00279 for (std::vector <HcalGenericDetId>::const_iterator cell = cells.begin (); cell != cells.end (); cell++) {
00280 HcalPFCorr item(cell->rawId(),1.0);
00281 result->addValues(item,h2mode_);
00282 }
00283 return result;
00284 }
00285
00286 std::auto_ptr<HcalTimeCorrs> HcalHardcodeCalibrations::produceTimeCorrs (const HcalTimeCorrsRcd& rcd) {
00287 edm::LogInfo("HCAL") << "HcalHardcodeCalibrations::produceTimeCorrs-> ...";
00288 std::auto_ptr<HcalTimeCorrs> result (new HcalTimeCorrs ());
00289 std::vector <HcalGenericDetId> cells = allCells(h2mode_);
00290 for (std::vector <HcalGenericDetId>::const_iterator cell = cells.begin (); cell != cells.end (); cell++) {
00291 HcalTimeCorr item(cell->rawId(),0.0);
00292 result->addValues(item,h2mode_);
00293 }
00294 return result;
00295 }
00296
00297 std::auto_ptr<HcalZSThresholds> HcalHardcodeCalibrations::produceZSThresholds (const HcalZSThresholdsRcd& rcd) {
00298 edm::LogInfo("HCAL") << "HcalHardcodeCalibrations::produceZSThresholds-> ...";
00299 std::auto_ptr<HcalZSThresholds> result (new HcalZSThresholds ());
00300 std::vector <HcalGenericDetId> cells = allCells(h2mode_);
00301 for (std::vector <HcalGenericDetId>::const_iterator cell = cells.begin (); cell != cells.end (); cell++) {
00302 HcalZSThreshold item(cell->rawId(),0);
00303 result->addValues(item,h2mode_);
00304 }
00305 return result;
00306 }
00307
00308
00309 std::auto_ptr<HcalL1TriggerObjects> HcalHardcodeCalibrations::produceL1TriggerObjects (const HcalL1TriggerObjectsRcd& rcd) {
00310 edm::LogInfo("HCAL") << "HcalHardcodeCalibrations::produceL1TriggerObjects-> ...";
00311 std::auto_ptr<HcalL1TriggerObjects> result (new HcalL1TriggerObjects ());
00312 std::vector <HcalGenericDetId> cells = allCells(h2mode_);
00313 for (std::vector <HcalGenericDetId>::const_iterator cell = cells.begin (); cell != cells.end (); cell++) {
00314 HcalL1TriggerObject item(cell->rawId(),0., 1., 0);
00315 result->addValues(item,h2mode_);
00316 }
00317
00318 result->setTagString("hardcoded");
00319 result->setAlgoString("hardcoded");
00320 return result;
00321 }
00322
00323
00324
00325
00326 std::auto_ptr<HcalElectronicsMap> HcalHardcodeCalibrations::produceElectronicsMap (const HcalElectronicsMapRcd& rcd) {
00327 edm::LogInfo("HCAL") << "HcalHardcodeCalibrations::produceElectronicsMap-> ...";
00328
00329 std::auto_ptr<HcalElectronicsMap> result (new HcalElectronicsMap ());
00330 HcalDbHardcode::makeHardcodeMap(*result);
00331 return result;
00332 }
00333
00334 std::auto_ptr<HcalValidationCorrs> HcalHardcodeCalibrations::produceValidationCorrs (const HcalValidationCorrsRcd& rcd) {
00335 edm::LogInfo("HCAL") << "HcalHardcodeCalibrations::produceValidationCorrs-> ...";
00336 std::auto_ptr<HcalValidationCorrs> result (new HcalValidationCorrs ());
00337 std::vector <HcalGenericDetId> cells = allCells(h2mode_);
00338 for (std::vector <HcalGenericDetId>::const_iterator cell = cells.begin (); cell != cells.end (); cell++) {
00339 HcalValidationCorr item(cell->rawId(),1.0);
00340 result->addValues(item,h2mode_);
00341 }
00342 return result;
00343 }
00344
00345 std::auto_ptr<HcalLutMetadata> HcalHardcodeCalibrations::produceLutMetadata (const HcalLutMetadataRcd& rcd) {
00346 edm::LogInfo("HCAL") << "HcalHardcodeCalibrations::produceLutMetadata-> ...";
00347 std::auto_ptr<HcalLutMetadata> result (new HcalLutMetadata ());
00348
00349 result->setRctLsb( 0.25 );
00350 result->setNominalGain( 0.177 );
00351
00352 std::vector <HcalGenericDetId> cells = allCells(h2mode_);
00353 for (std::vector <HcalGenericDetId>::const_iterator cell = cells.begin (); cell != cells.end (); cell++) {
00354 HcalLutMetadatum item(cell->rawId(),1.0,1,1);
00355 result->addValues(item,h2mode_);
00356 }
00357 return result;
00358 }
00359
00360 std::auto_ptr<HcalDcsValues>
00361 HcalHardcodeCalibrations::produceDcsValues (const HcalDcsRcd& rcd) {
00362 edm::LogInfo("HCAL") << "HcalHardcodeCalibrations::produceDcsValues-> ...";
00363 std::auto_ptr<HcalDcsValues> result(new HcalDcsValues);
00364 return result;
00365 }
00366
00367 std::auto_ptr<HcalDcsMap> HcalHardcodeCalibrations::produceDcsMap (const HcalDcsMapRcd& rcd) {
00368 edm::LogInfo("HCAL") << "HcalHardcodeCalibrations::produceDcsMap-> ...";
00369
00370 std::auto_ptr<HcalDcsMap> result (new HcalDcsMap ());
00371 HcalDbHardcode::makeHardcodeDcsMap(*result);
00372 return result;
00373 }
00374
00375 std::auto_ptr<HcalRecoParams> HcalHardcodeCalibrations::produceRecoParams (const HcalRecoParamsRcd&) {
00376 edm::LogInfo("HCAL") << "HcalHardcodeCalibrations::produceRecoParams-> ...";
00377 std::auto_ptr<HcalRecoParams> result (new HcalRecoParams ());
00378 std::vector <HcalGenericDetId> cells = allCells(h2mode_);
00379 for (std::vector <HcalGenericDetId>::const_iterator cell = cells.begin (); cell != cells.end (); cell++) {
00380 HcalRecoParam item = HcalDbHardcode::makeRecoParam (*cell);
00381 result->addValues(item,h2mode_);
00382 }
00383 return result;
00384 }
00385
00386 std::auto_ptr<HcalLongRecoParams> HcalHardcodeCalibrations::produceLongRecoParams (const HcalLongRecoParamsRcd&) {
00387 edm::LogInfo("HCAL") << "HcalHardcodeCalibrations::produceLongRecoParams-> ...";
00388 std::auto_ptr<HcalLongRecoParams> result (new HcalLongRecoParams ());
00389 std::vector <HcalGenericDetId> cells = allCells(h2mode_);
00390 std::vector <unsigned int> mSignal;
00391 mSignal.push_back(4);
00392 mSignal.push_back(5);
00393 mSignal.push_back(6);
00394 std::vector <unsigned int> mNoise;
00395 mNoise.push_back(1);
00396 mNoise.push_back(2);
00397 mNoise.push_back(3);
00398 for (std::vector <HcalGenericDetId>::const_iterator cell = cells.begin (); cell != cells.end (); cell++) {
00399 if (cell->isHcalZDCDetId())
00400 {
00401 HcalLongRecoParam item(cell->rawId(),mSignal,mNoise);
00402 result->addValues(item,h2mode_);
00403 }
00404 }
00405 return result;
00406 }
00407
00408 std::auto_ptr<HcalMCParams> HcalHardcodeCalibrations::produceMCParams (const HcalMCParamsRcd&) {
00409 edm::LogInfo("HCAL") << "HcalHardcodeCalibrations::produceMCParams-> ...";
00410 std::auto_ptr<HcalMCParams> result (new HcalMCParams ());
00411 std::vector <HcalGenericDetId> cells = allCells(h2mode_);
00412 for (std::vector <HcalGenericDetId>::const_iterator cell = cells.begin (); cell != cells.end (); cell++) {
00413 HcalMCParam item(cell->rawId(),0);
00414 result->addValues(item,h2mode_);
00415 }
00416 return result;
00417 }
00418
00419
00420 std::auto_ptr<HcalFlagHFDigiTimeParams> HcalHardcodeCalibrations::produceFlagHFDigiTimeParams (const HcalFlagHFDigiTimeParamsRcd&) {
00421 edm::LogInfo("HCAL") << "HcalHardcodeCalibrations::produceFlagHFDigiTimeParams-> ...";
00422 std::auto_ptr<HcalFlagHFDigiTimeParams> result (new HcalFlagHFDigiTimeParams ());
00423 std::vector <HcalGenericDetId> cells = allCells(h2mode_);
00424
00425 std::vector<double> coef;
00426 coef.push_back(0.93);
00427 coef.push_back(-0.38275);
00428 coef.push_back(-0.012667);
00429
00430 for (std::vector <HcalGenericDetId>::const_iterator cell = cells.begin (); cell != cells.end (); cell++) {
00431 HcalFlagHFDigiTimeParam item(cell->rawId(),
00432 1,
00433 3,
00434 2,
00435 40.,
00436 coef
00437 );
00438 result->addValues(item,h2mode_);
00439 }
00440 return result;
00441 }