Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "DQM/DTMonitorModule/src/DTLocalTriggerSynchTask.h"
00012
00013
00014 #include "FWCore/Framework/interface/EventSetup.h"
00015 #include "FWCore/Utilities/interface/InputTag.h"
00016
00017
00018 #include "DataFormats/L1DTTrackFinder/interface/L1MuDTChambPhContainer.h"
00019 #include "DataFormats/L1DTTrackFinder/interface/L1MuDTChambThContainer.h"
00020
00021
00022 #include "DataFormats/GeometryVector/interface/Pi.h"
00023 #include "Geometry/Records/interface/MuonGeometryRecord.h"
00024 #include "Geometry/DTGeometry/interface/DTGeometry.h"
00025 #include "Geometry/DTGeometry/interface/DTLayer.h"
00026 #include "Geometry/DTGeometry/interface/DTSuperLayer.h"
00027 #include "Geometry/DTGeometry/interface/DTTopology.h"
00028
00029
00030 #include "CalibMuon/DTDigiSync/interface/DTTTrigSyncFactory.h"
00031 #include "CalibMuon/DTDigiSync/interface/DTTTrigBaseSync.h"
00032
00033
00034 #include <DataFormats/DTDigi/interface/DTDigi.h>
00035 #include <DataFormats/DTDigi/interface/DTDigiCollection.h>
00036
00037
00038
00039 #include"TH1.h"
00040 #include"TAxis.h"
00041
00042 #include <sstream>
00043 #include <iostream>
00044 #include <fstream>
00045
00046
00047 using namespace edm;
00048 using namespace std;
00049
00050 DTLocalTriggerSynchTask::DTLocalTriggerSynchTask(const edm::ParameterSet& ps) : nevents(0) {
00051
00052 edm::LogVerbatim ("DTLocalTriggerSynchTask") << "[DTLocalTriggerSynchTask]: Constructor" << endl;
00053 parameters = ps;
00054
00055 }
00056
00057
00058 DTLocalTriggerSynchTask::~DTLocalTriggerSynchTask() {
00059
00060 edm::LogVerbatim ("DTLocalTriggerSynchTask") << "[DTLocalTriggerSynchTask]: analyzed " << nevents << " events" << endl;
00061
00062 }
00063
00064
00065 void DTLocalTriggerSynchTask::beginJob(){
00066
00067 edm::LogVerbatim ("DTLocalTriggerSynchTask") << "[DTLocalTriggerSynchTask]: BeginJob" << endl;
00068
00069 bxTime = parameters.getParameter<double>("bxTimeInterval");
00070 rangeInBX = parameters.getParameter<bool>("rangeWithinBX");
00071 nBXLow = parameters.getParameter<int>("nBXLow");
00072 nBXHigh = parameters.getParameter<int>("nBXHigh");
00073 angleRange = parameters.getParameter<double>("angleRange");
00074 minHitsPhi = parameters.getParameter<int>("minHitsPhi");
00075 baseDirectory = parameters.getParameter<string>("baseDir");
00076
00077 dbe = edm::Service<DQMStore>().operator->();
00078 dbe->setCurrentFolder(baseDir());
00079 dbe->bookFloat("BXTimeSpacing")->Fill(bxTime);
00080
00081 }
00082
00083 void DTLocalTriggerSynchTask::beginRun(const Run& run, const EventSetup& context) {
00084
00085 edm::LogVerbatim ("DTLocalTriggerSynchTask") <<"[DTLocalTriggerSynchTask]: Begin Run"<<endl;
00086
00087 context.get<MuonGeometryRecord>().get(muonGeom);
00088 tTrigSync = DTTTrigSyncFactory::get()->create(parameters.getParameter<std::string>("tTrigMode"),
00089 parameters.getParameter<edm::ParameterSet>("tTrigModeConfig"));
00090 tTrigSync->setES(context);
00091
00092
00093 std::vector<DTChamber*>::const_iterator chambIt = muonGeom->chambers().begin();
00094 std::vector<DTChamber*>::const_iterator chambEnd = muonGeom->chambers().end();
00095
00096 for (; chambIt!=chambEnd; ++chambIt) {
00097 bookHistos((*chambIt)->id());
00098 triggerHistos[(*chambIt)->id().rawId()]["tTrig_SL1"]->Fill(tTrigSync->offset(DTWireId((*chambIt)->id(),1,1,2)));
00099 triggerHistos[(*chambIt)->id().rawId()]["tTrig_SL3"]->Fill(tTrigSync->offset(DTWireId((*chambIt)->id(),3,1,2)));
00100 }
00101
00102 }
00103
00104
00105 void DTLocalTriggerSynchTask::endJob() {
00106
00107 edm::LogVerbatim ("DTLocalTriggerSynchTask") << "[DTLocalTriggerSynchTask]: analyzed " << nevents << " events" << endl;
00108 dbe->rmdir(baseDir());
00109
00110 }
00111
00112
00113 void DTLocalTriggerSynchTask::analyze(const edm::Event& event, const edm::EventSetup& context){
00114
00115 nevents++;
00116
00117 InputTag inputTagDCC = parameters.getParameter<edm::InputTag>("DCCInputTag");
00118 InputTag inputTagDDU = parameters.getParameter<edm::InputTag>("DDUInputTag");
00119 InputTag inputTagSEG = parameters.getParameter<edm::InputTag>("SEGInputTag");
00120
00121 for (int i=0;i<5;++i){
00122 for (int j=0;j<6;++j){
00123 for (int k=0;k<13;++k){
00124 phCodeBestDCC[j][i][k] = -1;
00125 phCodeBestDDU[j][i][k] = -1;
00126 }
00127 }
00128 }
00129
00130
00131 edm::Handle<L1MuDTChambPhContainer> l1DTTPGPh;
00132 event.getByLabel(inputTagDCC,l1DTTPGPh);
00133 vector<L1MuDTChambPhDigi>* phTrigs = l1DTTPGPh->getContainer();
00134
00135 vector<L1MuDTChambPhDigi>::const_iterator iph = phTrigs->begin();
00136 vector<L1MuDTChambPhDigi>::const_iterator iphe = phTrigs->end();
00137 for(; iph !=iphe ; ++iph) {
00138
00139 int phwheel = iph->whNum();
00140 int phsec = iph->scNum() + 1;
00141 int phst = iph->stNum();
00142 int phcode = iph->code();
00143
00144 if(phcode>phCodeBestDCC[phwheel+3][phst][phsec] && phcode<7) {
00145 phCodeBestDCC[phwheel+3][phst][phsec]=phcode;
00146 }
00147
00148 }
00149
00150
00151 Handle<DTLocalTriggerCollection> trigsDDU;
00152 event.getByLabel(inputTagDDU,trigsDDU);
00153 DTLocalTriggerCollection::DigiRangeIterator detUnitIt;
00154
00155 for (detUnitIt=trigsDDU->begin();detUnitIt!=trigsDDU->end();++detUnitIt){
00156
00157 const DTChamberId& id = (*detUnitIt).first;
00158 const DTLocalTriggerCollection::Range& range = (*detUnitIt).second;
00159
00160 int wh = id.wheel();
00161 int sec = id.sector();
00162 int st = id.station();
00163
00164 for (DTLocalTriggerCollection::const_iterator trigIt = range.first; trigIt!=range.second;++trigIt){
00165
00166 int quality = trigIt->quality();
00167
00168 if(quality>-1 && quality<7 &&
00169 quality>phCodeBestDDU[wh+3][st][sec]) {
00170 phCodeBestDDU[wh+3][st][sec]=quality;
00171 }
00172 }
00173 }
00174
00175
00176 vector<const DTRecSegment4D*> bestSegments4D;
00177 Handle<DTRecSegment4DCollection> segments4D;
00178 event.getByLabel(inputTagSEG, segments4D);
00179 DTRecSegment4DCollection::const_iterator track;
00180 DTRecSegment4DCollection::id_iterator chambIdIt;
00181
00182 for (chambIdIt = segments4D->id_begin(); chambIdIt != segments4D->id_end(); ++chambIdIt){
00183
00184 DTRecSegment4DCollection::range range = segments4D->get(*chambIdIt);
00185 const DTRecSegment4D* best=0;
00186 int hitsBest = 0;
00187 int hits = 0;
00188
00189 for ( track = range.first; track != range.second; ++track){
00190 if( (*track).hasPhi() ) {
00191 hits = (*track).phiSegment()->degreesOfFreedom()+2;
00192 if ( hits>hitsBest ){
00193 best = &(*track);
00194 hitsBest = hits;
00195 }
00196 }
00197 }
00198 if (best) {
00199 bestSegments4D.push_back(best);
00200 }
00201 }
00202
00203
00204
00205 vector<const DTRecSegment4D*>::const_iterator bestSegIt = bestSegments4D.begin();
00206 vector<const DTRecSegment4D*>::const_iterator bestSegEnd = bestSegments4D.end();
00207 for (; bestSegIt!=bestSegEnd; ++bestSegIt ){
00208
00209 float dir = atan((*bestSegIt)->localDirection().x()/ (*bestSegIt)->localDirection().z())*180/Geom::pi();
00210 const DTRecSegment2D* seg2D = (*bestSegIt)->phiSegment();
00211 int nHitsPhi = seg2D->degreesOfFreedom()+2;
00212 DTChamberId chambId = (*bestSegIt)->chamberId();
00213 map<string, MonitorElement*> &innerME = triggerHistos[chambId.rawId()];
00214
00215 if (fabs(dir)<angleRange &&
00216 nHitsPhi>=minHitsPhi &&
00217 seg2D->ist0Valid()){
00218
00219 float t0seg = (*bestSegIt)->phiSegment()->t0();
00220 float tTrig = (tTrigSync->offset(DTWireId(chambId,1,1,2)) + tTrigSync->offset(DTWireId(chambId,3,1,2)) )/2;
00221 float time = tTrig+t0seg;
00222 float htime = rangeInBX ? time-int(time/bxTime)*bxTime : time-int(tTrig/bxTime)*bxTime;
00223
00224 int wheel = chambId.wheel();
00225 int sector = chambId.sector();
00226 int station = chambId.station();
00227 int scsector = sector>12 ? sector==13 ? 4 : 10 : sector;
00228
00229 int qualDCC = phCodeBestDCC[wheel+3][station][scsector];
00230 int qualDDU = phCodeBestDDU[wheel+3][station][scsector];
00231
00232 if (fabs(t0seg)>0.01) {
00233 innerME.find("SEG_TrackCrossingTime")->second->Fill(htime);
00234 if ( qualDCC>=0 ) innerME.find("DCC_TrackCrossingTimeAll")->second->Fill(htime);
00235 if ( qualDCC==6 ) innerME.find("DCC_TrackCrossingTimeHH")->second->Fill(htime);
00236 if ( qualDDU>=0 ) innerME.find("DDU_TrackCrossingTimeAll")->second->Fill(htime);
00237 if ( qualDDU==6 ) innerME.find("DDU_TrackCrossingTimeHH")->second->Fill(htime);
00238 }
00239
00240 }
00241 }
00242
00243 }
00244
00245 void DTLocalTriggerSynchTask::bookHistos(const DTChamberId& dtChId) {
00246
00247 stringstream wheel; wheel << dtChId.wheel();
00248 stringstream station; station << dtChId.station();
00249 stringstream sector; sector << dtChId.sector();
00250 uint32_t chRawId = dtChId.rawId();
00251
00252 dbe->setCurrentFolder(baseDir() + "/Wheel" + wheel.str() + "/Sector" + sector.str() + "/Station" + station.str() );
00253
00254
00255 string histoTag[5] = { "SEG_TrackCrossingTime", "DCC_TrackCrossingTimeAll", "DCC_TrackCrossingTimeHH", "DDU_TrackCrossingTimeAll", "DDU_TrackCrossingTimeHH" };
00256
00257 float min = rangeInBX ? 0 : nBXLow*bxTime;
00258 float max = rangeInBX ? bxTime : nBXHigh*bxTime;
00259 int nbins = static_cast<int>(ceil( rangeInBX ? bxTime : (nBXHigh-nBXLow)*bxTime));
00260
00261 for (int iHisto=0;iHisto<5;++iHisto) {
00262 string histoName = histoTag[iHisto] + (rangeInBX ? "InBX" : "") + "_W" + wheel.str() + "_Sec" + sector.str() + "_St" + station.str();
00263 edm::LogVerbatim ("DTLocalTriggerSynchTask") << "[DTLocalTriggerSynchTask]: booking "
00264 << baseDir() + "/Wheel" << wheel.str()
00265 << "/Sector" << sector.str()
00266 << "/Station"<< station.str()
00267 << "/" << histoName << endl;
00268
00269 triggerHistos[chRawId][histoTag[iHisto]] = dbe->book1D(histoName.c_str(),"Track time distribution",nbins,min,max);
00270 }
00271
00272 string floatTag[2] = { "tTrig_SL1", "tTrig_SL3" };
00273
00274 for (int iFloat=0;iFloat<2;++iFloat) {
00275 string floatName = floatTag[iFloat] + "_W" + wheel.str() + "_Sec" + sector.str() + "_St" + station.str();
00276 triggerHistos[chRawId][floatTag[iFloat]] = dbe->bookFloat(floatName);
00277 }
00278
00279 }