Go to the documentation of this file.00001 #include "CalibTracker/SiStripCommon/interface/SiStripDCSStatus.h"
00002 #include "FWCore/Framework/interface/Event.h"
00003 #include "FWCore/Framework/interface/EventSetup.h"
00004 #include "FWCore/Framework/interface/ESHandle.h"
00005
00006 #include "DataFormats/Common/interface/Handle.h"
00007 #include "DataFormats/Scalers/interface/DcsStatus.h"
00008
00009 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
00010 #include "DataFormats/FEDRawData/interface/FEDRawData.h"
00011 #include "DataFormats/FEDRawData/interface/FEDNumbering.h"
00012
00013
00014 #include "CondFormats/DataRecord/interface/SiStripCondDataRecords.h"
00015 #include "CondFormats/SiStripObjects/interface/SiStripFedCabling.h"
00016
00017 #include "DataFormats/SiStripDetId/interface/StripSubdetector.h"
00018 #include "DataFormats/TrackerCommon/interface/TrackerTopology.h"
00019 #include "Geometry/Records/interface/IdealGeometryRecord.h"
00020
00021 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00022 #include <iostream>
00023
00024
00025
00026
00027 SiStripDCSStatus::SiStripDCSStatus() :
00028 TIBTIDinDAQ(false),
00029 TOBinDAQ(false),
00030 TECFinDAQ(false),
00031 TECBinDAQ(false),
00032 trackerAbsent(false),
00033 rawdataAbsent(true),
00034 initialised(false) {
00035 }
00036
00037
00038
00039 SiStripDCSStatus::~SiStripDCSStatus() {
00040 }
00041
00042
00043
00044 bool SiStripDCSStatus::getStatus(edm::Event const& e, edm::EventSetup const& eSetup){
00045
00046 bool retVal = true;
00047 if (!initialised) initialise(e, eSetup);
00048
00049 edm::Handle<DcsStatusCollection> dcsStatus;
00050 e.getByLabel("scalersRawToDigi", dcsStatus);
00051 if ( trackerAbsent || !dcsStatus.isValid()) return retVal;
00052 if ((*dcsStatus).size() == 0) return retVal;
00053
00054 statusTIBTID = true;
00055 statusTOB = true;
00056 statusTECF = true;
00057 statusTECB = true;
00058
00059 bool dcsTIBTID = ((*dcsStatus)[0].ready(DcsStatus::TIBTID));
00060 bool dcsTOB = ((*dcsStatus)[0].ready(DcsStatus::TOB));
00061 bool dcsTECF = ((*dcsStatus)[0].ready(DcsStatus::TECp));
00062 bool dcsTECB = ((*dcsStatus)[0].ready(DcsStatus::TECm));
00063 if (rawdataAbsent) {
00064 statusTIBTID = dcsTIBTID;
00065 statusTOB = dcsTOB;
00066 statusTECF = dcsTECF;
00067 statusTECB = dcsTECB;
00068 } else {
00069 if ( TIBTIDinDAQ && !dcsTIBTID ) statusTIBTID = false;
00070 if ( TOBinDAQ && !dcsTOB ) statusTOB = false;
00071 if ( TECFinDAQ && !dcsTECF ) statusTECF = false;
00072 if ( TECBinDAQ && !dcsTECB ) statusTECB = false;
00073 }
00074
00075 LogDebug("SiStripDCSStatus") << " SiStripDCSStatus :: Detectors in DAQ (TIBTID, TOB, TEC+ TEC-)"
00076 << TIBTIDinDAQ << " "
00077 << TOBinDAQ << " "
00078 << TECFinDAQ << " "
00079 << TECBinDAQ << std::endl;
00080 LogDebug("SiStripDCSStatus") << " SiStripDCSStatus :: Detectors in ON (TIBTID, TOB, TEC+ TEC-)"
00081 << dcsTIBTID << " "
00082 << dcsTOB << " "
00083 << dcsTECF << " "
00084 << dcsTECB << std::endl;
00085
00086 LogDebug("SiStripDCSStatus") << " SiStripDCSStatus :: Final Flags (TIBTID, TOB, TEC+ TEC-)"
00087 << statusTIBTID << " "
00088 << statusTOB << " "
00089 << statusTECF << " "
00090 << statusTECB << std::endl;
00091 if (statusTIBTID && statusTOB && statusTECF && statusTECB) retVal = true;
00092 else retVal = false;
00093 LogDebug("SiStripDCSStatus") << " Return Value " << retVal ;
00094 return retVal;
00095 }
00096
00097
00098
00099 void SiStripDCSStatus::initialise(edm::Event const& e, edm::EventSetup const& eSetup) {
00100
00101 edm::ESHandle<TrackerTopology> tTopoHandle;
00102 eSetup.get<IdealGeometryRecord>().get(tTopoHandle);
00103 const TrackerTopology* const tTopo = tTopoHandle.product();
00104
00105 edm::ESHandle< SiStripFedCabling > fedCabling_;
00106 eSetup.get<SiStripFedCablingRcd>().get(fedCabling_);
00107 const std::vector<uint16_t>& connectedFEDs = fedCabling_->feds();
00108
00109 edm::Handle<FEDRawDataCollection> rawDataHandle;
00110 e.getByLabel("source", rawDataHandle);
00111
00112 if ( !rawDataHandle.isValid() ) {
00113 rawdataAbsent = true;
00114 return;
00115 }
00116
00117 rawdataAbsent = false;
00118 const FEDRawDataCollection& rawDataCollection = *rawDataHandle;
00119 for(std::vector<unsigned short>::const_iterator ifed = connectedFEDs.begin(); ifed != connectedFEDs.end(); ifed++){
00120 const std::vector<FedChannelConnection> fedChannels = fedCabling_->connections( *ifed );
00121 if (!(rawDataCollection.FEDData(*ifed).size()) || !(rawDataCollection.FEDData(*ifed).data()) ) continue;
00122
00123 for (std::vector<FedChannelConnection>::const_iterator iconn = fedChannels.begin();
00124 iconn < fedChannels.end(); iconn++){
00125 if (!iconn->isConnected()) continue;
00126 uint32_t detId = iconn->detId();
00127 StripSubdetector subdet(detId);
00128 if ( (subdet.subdetId() == StripSubdetector::TIB) || (subdet.subdetId() == StripSubdetector::TID)) {
00129 TIBTIDinDAQ = true;
00130 break;
00131 } else if (subdet.subdetId() == StripSubdetector::TOB) {
00132 TOBinDAQ = true;
00133 break;
00134 } else if (subdet.subdetId() == StripSubdetector::TEC) {
00135 if (tTopo->tecSide(detId) == 2) TECFinDAQ = true;
00136 else if (tTopo->tecSide(detId) == 1) TECBinDAQ = true;
00137 break;
00138 }
00139 }
00140 if (TIBTIDinDAQ && TOBinDAQ && TECFinDAQ && TECBinDAQ) break;
00141 }
00142 initialised = true;
00143 if (!TIBTIDinDAQ && !TOBinDAQ && !TECFinDAQ && !TECBinDAQ) trackerAbsent = true;
00144 }