00001
00002
00003
00004
00005
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "DQM/SiPixelMonitorCluster/interface/SiPixelClusterSource.h"
00022
00023 #include "FWCore/ServiceRegistry/interface/Service.h"
00024 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00025
00026 #include "DQM/SiPixelCommon/interface/SiPixelFolderOrganizer.h"
00027 #include "DQMServices/Core/interface/DQMStore.h"
00028
00029 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
00030 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
00031 #include "Geometry/TrackerGeometryBuilder/interface/PixelGeomDetUnit.h"
00032 #include "Geometry/CommonTopologies/interface/PixelTopology.h"
00033
00034 #include "DataFormats/DetId/interface/DetId.h"
00035 #include "DataFormats/SiPixelDetId/interface/PixelSubdetector.h"
00036 #include "DataFormats/SiPixelDetId/interface/PixelBarrelName.h"
00037 #include "DataFormats/SiPixelDetId/interface/PixelEndcapName.h"
00038
00039 #include <string>
00040 #include <stdlib.h>
00041
00042 using namespace std;
00043 using namespace edm;
00044
00045 SiPixelClusterSource::SiPixelClusterSource(const edm::ParameterSet& iConfig) :
00046 conf_(iConfig),
00047 src_( conf_.getParameter<edm::InputTag>( "src" ) ),
00048 saveFile( conf_.getUntrackedParameter<bool>("saveFile",false) ),
00049 isPIB( conf_.getUntrackedParameter<bool>("isPIB",false) ),
00050 slowDown( conf_.getUntrackedParameter<bool>("slowDown",false) ),
00051 modOn( conf_.getUntrackedParameter<bool>("modOn",true) ),
00052 twoDimOn( conf_.getUntrackedParameter<bool>("twoDimOn",true) ),
00053 reducedSet( conf_.getUntrackedParameter<bool>("reducedSet",false) ),
00054 ladOn( conf_.getUntrackedParameter<bool>("ladOn",false) ),
00055 layOn( conf_.getUntrackedParameter<bool>("layOn",false) ),
00056 phiOn( conf_.getUntrackedParameter<bool>("phiOn",false) ),
00057 ringOn( conf_.getUntrackedParameter<bool>("ringOn",false) ),
00058 bladeOn( conf_.getUntrackedParameter<bool>("bladeOn",false) ),
00059 diskOn( conf_.getUntrackedParameter<bool>("diskOn",false) ),
00060 smileyOn(conf_.getUntrackedParameter<bool>("smileyOn",false) ),
00061 bigEventSize( conf_.getUntrackedParameter<int>("bigEventSize",100) )
00062 {
00063 theDMBE = edm::Service<DQMStore>().operator->();
00064 LogInfo ("PixelDQM") << "SiPixelClusterSource::SiPixelClusterSource: Got DQM BackEnd interface"<<endl;
00065 }
00066
00067
00068 SiPixelClusterSource::~SiPixelClusterSource()
00069 {
00070
00071
00072 LogInfo ("PixelDQM") << "SiPixelClusterSource::~SiPixelClusterSource: Destructor"<<endl;
00073
00074 std::map<uint32_t,SiPixelClusterModule*>::iterator struct_iter;
00075 for (struct_iter = thePixelStructure.begin() ; struct_iter != thePixelStructure.end() ; struct_iter++){
00076 delete struct_iter->second;
00077 struct_iter->second = 0;
00078 }
00079 }
00080
00081
00082 void SiPixelClusterSource::beginJob(){
00083 firstRun = true;
00084 }
00085
00086 void SiPixelClusterSource::beginRun(const edm::Run& r, const edm::EventSetup& iSetup){
00087
00088 LogInfo ("PixelDQM") << " SiPixelClusterSource::beginJob - Initialisation ... " << std::endl;
00089 LogInfo ("PixelDQM") << "Mod/Lad/Lay/Phi " << modOn << "/" << ladOn << "/"
00090 << layOn << "/" << phiOn << std::endl;
00091 LogInfo ("PixelDQM") << "Blade/Disk/Ring" << bladeOn << "/" << diskOn << "/"
00092 << ringOn << std::endl;
00093 LogInfo ("PixelDQM") << "2DIM IS " << twoDimOn << "\n";
00094 LogInfo ("PixelDQM") << "Smiley (Cluster sizeY vs. Cluster eta) is " << smileyOn << "\n";
00095
00096 if(firstRun){
00097 eventNo = 0;
00098 lumSec = 0;
00099 nLumiSecs = 0;
00100 nBigEvents = 0;
00101
00102 buildStructure(iSetup);
00103
00104 bookMEs();
00105
00106 theDMBE->setCurrentFolder("Pixel/Clusters/OffTrack");
00107
00108 meClPosLayer1 = theDMBE->book2D("position_siPixelClusters_Layer_1","Clusters Layer1;Global Z (cm);Global #phi",200,-30.,30.,128,-3.2,3.2);
00109 meClPosLayer2 = theDMBE->book2D("position_siPixelClusters_Layer_2","Clusters Layer2;Global Z (cm);Global #phi",200,-30.,30.,128,-3.2,3.2);
00110 meClPosLayer3 = theDMBE->book2D("position_siPixelClusters_Layer_3","Clusters Layer3;Global Z (cm);Global #phi",200,-30.,30.,128,-3.2,3.2);
00111
00112 meClPosDisk1pz = theDMBE->book2D("position_siPixelClusters_pz_Disk_1","Clusters +Z Disk1;Global X (cm);Global Y (cm)",80,-20.,20.,80,-20.,20.);
00113 meClPosDisk2pz = theDMBE->book2D("position_siPixelClusters_pz_Disk_2","Clusters +Z Disk2;Global X (cm);Global Y (cm)",80,-20.,20.,80,-20.,20.);
00114 meClPosDisk1mz = theDMBE->book2D("position_siPixelClusters_mz_Disk_1","Clusters -Z Disk1;Global X (cm);Global Y (cm)",80,-20.,20.,80,-20.,20.);
00115 meClPosDisk2mz = theDMBE->book2D("position_siPixelClusters_mz_Disk_2","Clusters -Z Disk2;Global X (cm);Global Y (cm)",80,-20.,20.,80,-20.,20.);
00116
00117 firstRun = false;
00118 }
00119 }
00120
00121
00122 void SiPixelClusterSource::endJob(void){
00123 if(saveFile){
00124 LogInfo ("PixelDQM") << " SiPixelClusterSource::endJob - Saving Root File " << std::endl;
00125 std::string outputFile = conf_.getParameter<std::string>("outputFile");
00126 theDMBE->save( outputFile.c_str() );
00127 }
00128 }
00129
00130
00131
00132
00133 void SiPixelClusterSource::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup)
00134 {
00135 eventNo++;
00136
00137 if(modOn){
00138 MonitorElement* meReset = theDMBE->get("Pixel/Clusters/OffTrack/position_siPixelClusters_Layer_1");
00139 MonitorElement* meReset1 = theDMBE->get("Pixel/Clusters/OffTrack/position_siPixelClusters_Layer_2");
00140 MonitorElement* meReset2 = theDMBE->get("Pixel/Clusters/OffTrack/position_siPixelClusters_Layer_3");
00141 MonitorElement* meReset3 = theDMBE->get("Pixel/Clusters/OffTrack/position_siPixelClusters_mz_Disk_1");
00142 MonitorElement* meReset4 = theDMBE->get("Pixel/Clusters/OffTrack/position_siPixelClusters_mz_Disk_2");
00143 MonitorElement* meReset5 = theDMBE->get("Pixel/Clusters/OffTrack/position_siPixelClusters_pz_Disk_1");
00144 MonitorElement* meReset6 = theDMBE->get("Pixel/Clusters/OffTrack/position_siPixelClusters_pz_Disk_2");
00145 if(meReset && meReset->getEntries()>150000){
00146 meReset->Reset();
00147 meReset1->Reset();
00148 meReset2->Reset();
00149 meReset3->Reset();
00150 meReset4->Reset();
00151 meReset5->Reset();
00152 meReset6->Reset();
00153 }
00154 }
00155
00156
00157 edm::Handle< edmNew::DetSetVector<SiPixelCluster> > input;
00158 iEvent.getByLabel( src_, input );
00159
00160 edm::ESHandle<TrackerGeometry> pDD;
00161 iSetup.get<TrackerDigiGeometryRecord> ().get (pDD);
00162 const TrackerGeometry* tracker = &(* pDD);
00163
00164
00165
00166
00167
00168 int lumiSection = (int)iEvent.luminosityBlock();
00169 int nEventFpixClusters = 0;
00170
00171
00172 std::map<uint32_t,SiPixelClusterModule*>::iterator struct_iter;
00173 for (struct_iter = thePixelStructure.begin() ; struct_iter != thePixelStructure.end() ; struct_iter++) {
00174
00175 int numberOfFpixClusters = (*struct_iter).second->fill(*input, tracker, modOn,
00176 ladOn, layOn, phiOn,
00177 bladeOn, diskOn, ringOn,
00178 twoDimOn, reducedSet, smileyOn);
00179 nEventFpixClusters = nEventFpixClusters + numberOfFpixClusters;
00180
00181 }
00182
00183
00184
00185
00186
00187 if(nEventFpixClusters>bigEventSize){
00188 MonitorElement* me = theDMBE->get("Pixel/bigFpixClusterEventRate");
00189 if(me){
00190 me->Fill(lumiSection,1./23.);
00191 }
00192 }
00193
00194
00195
00196 if(slowDown) usleep(10000);
00197
00198 }
00199
00200
00201
00202
00203 void SiPixelClusterSource::buildStructure(const edm::EventSetup& iSetup){
00204
00205 LogInfo ("PixelDQM") <<" SiPixelClusterSource::buildStructure" ;
00206 edm::ESHandle<TrackerGeometry> pDD;
00207 iSetup.get<TrackerDigiGeometryRecord>().get( pDD );
00208
00209 LogVerbatim ("PixelDQM") << " *** Geometry node for TrackerGeom is "<<&(*pDD)<<std::endl;
00210 LogVerbatim ("PixelDQM") << " *** I have " << pDD->dets().size() <<" detectors"<<std::endl;
00211 LogVerbatim ("PixelDQM") << " *** I have " << pDD->detTypes().size() <<" types"<<std::endl;
00212
00213 for(TrackerGeometry::DetContainer::const_iterator it = pDD->dets().begin(); it != pDD->dets().end(); it++){
00214
00215 if(dynamic_cast<PixelGeomDetUnit*>((*it))!=0){
00216
00217 DetId detId = (*it)->geographicalId();
00218 const GeomDetUnit * geoUnit = pDD->idToDetUnit( detId );
00219 const PixelGeomDetUnit * pixDet = dynamic_cast<const PixelGeomDetUnit*>(geoUnit);
00220 int nrows = (pixDet->specificTopology()).nrows();
00221 int ncols = (pixDet->specificTopology()).ncolumns();
00222
00223
00224 if((detId.subdetId() == static_cast<int>(PixelSubdetector::PixelBarrel)) ||
00225 (detId.subdetId() == static_cast<int>(PixelSubdetector::PixelEndcap))){
00226 uint32_t id = detId();
00227 SiPixelClusterModule* theModule = new SiPixelClusterModule(id, ncols, nrows);
00228 if(detId.subdetId() == static_cast<int>(PixelSubdetector::PixelBarrel)) {
00229 if(isPIB) continue;
00230 LogDebug ("PixelDQM") << " ---> Adding Barrel Module " << detId.rawId() << endl;
00231 thePixelStructure.insert(pair<uint32_t,SiPixelClusterModule*> (id,theModule));
00232 }else if(detId.subdetId() == static_cast<int>(PixelSubdetector::PixelEndcap)) {
00233 LogDebug ("PixelDQM") << " ---> Adding Endcap Module " << detId.rawId() << endl;
00234 PixelEndcapName::HalfCylinder side = PixelEndcapName(DetId(id)).halfCylinder();
00235 int disk = PixelEndcapName(DetId(id)).diskName();
00236 int blade = PixelEndcapName(DetId(id)).bladeName();
00237 int panel = PixelEndcapName(DetId(id)).pannelName();
00238 int module = PixelEndcapName(DetId(id)).plaquetteName();
00239 char sside[80]; sprintf(sside, "HalfCylinder_%i",side);
00240 char sdisk[80]; sprintf(sdisk, "Disk_%i",disk);
00241 char sblade[80]; sprintf(sblade, "Blade_%02i",blade);
00242 char spanel[80]; sprintf(spanel, "Panel_%i",panel);
00243 char smodule[80];sprintf(smodule,"Module_%i",module);
00244 std::string side_str = sside;
00245 std::string disk_str = sdisk;
00246 bool mask = side_str.find("HalfCylinder_1")!=string::npos||
00247 side_str.find("HalfCylinder_2")!=string::npos||
00248 side_str.find("HalfCylinder_4")!=string::npos||
00249 disk_str.find("Disk_2")!=string::npos;
00250
00251 mask = false;
00252 if(isPIB && mask) continue;
00253 thePixelStructure.insert(pair<uint32_t,SiPixelClusterModule*> (id,theModule));
00254 }
00255 }
00256 }
00257 }
00258 LogInfo ("PixelDQM") << " *** Pixel Structure Size " << thePixelStructure.size() << endl;
00259 }
00260
00261
00262
00263 void SiPixelClusterSource::bookMEs(){
00264
00265
00266 DQMStore* theDMBE = edm::Service<DQMStore>().operator->();
00267 theDMBE->setCurrentFolder("Pixel");
00268 char title[256]; snprintf(title, 256, "Rate of events with >%i FPIX clusters;LumiSection;Rate of large FPIX events per LS [Hz]",bigEventSize);
00269 bigFpixClusterEventRate = theDMBE->book1D("bigFpixClusterEventRate",title,5000,0.,5000.);
00270
00271
00272 std::map<uint32_t,SiPixelClusterModule*>::iterator struct_iter;
00273
00274 SiPixelFolderOrganizer theSiPixelFolder;
00275
00276 for(struct_iter = thePixelStructure.begin(); struct_iter != thePixelStructure.end(); struct_iter++){
00277
00279 if(modOn){
00280 if(theSiPixelFolder.setModuleFolder((*struct_iter).first)){
00281 (*struct_iter).second->book( conf_,0,twoDimOn,reducedSet);
00282 } else {
00283
00284 if(!isPIB) throw cms::Exception("LogicError")
00285 << "[SiPixelClusterSource::bookMEs] Creation of DQM folder failed";
00286 }
00287 }
00288 if(ladOn){
00289 if(theSiPixelFolder.setModuleFolder((*struct_iter).first,1)){
00290 (*struct_iter).second->book( conf_,1,twoDimOn,reducedSet);
00291 } else {
00292 LogDebug ("PixelDQM") << "PROBLEM WITH LADDER-FOLDER\n";
00293 }
00294 }
00295 if(layOn){
00296 if(theSiPixelFolder.setModuleFolder((*struct_iter).first,2)){
00297 (*struct_iter).second->book( conf_,2,twoDimOn,reducedSet);
00298 } else {
00299 LogDebug ("PixelDQM") << "PROBLEM WITH LAYER-FOLDER\n";
00300 }
00301 }
00302 if(phiOn){
00303 if(theSiPixelFolder.setModuleFolder((*struct_iter).first,3)){
00304 (*struct_iter).second->book( conf_,3,twoDimOn,reducedSet);
00305 } else {
00306 LogDebug ("PixelDQM") << "PROBLEM WITH PHI-FOLDER\n";
00307 }
00308 }
00309 if(bladeOn){
00310 if(theSiPixelFolder.setModuleFolder((*struct_iter).first,4)){
00311 (*struct_iter).second->book( conf_,4,twoDimOn,reducedSet);
00312 } else {
00313 LogDebug ("PixelDQM") << "PROBLEM WITH BLADE-FOLDER\n";
00314 }
00315 }
00316 if(diskOn){
00317 if(theSiPixelFolder.setModuleFolder((*struct_iter).first,5)){
00318 (*struct_iter).second->book( conf_,5,twoDimOn,reducedSet);
00319 } else {
00320 LogDebug ("PixelDQM") << "PROBLEM WITH DISK-FOLDER\n";
00321 }
00322 }
00323 if(ringOn){
00324 if(theSiPixelFolder.setModuleFolder((*struct_iter).first,6)){
00325 (*struct_iter).second->book( conf_,6,twoDimOn,reducedSet);
00326 } else {
00327 LogDebug ("PixelDQM") << "PROBLEM WITH RING-FOLDER\n";
00328 }
00329 }
00330 if(smileyOn){
00331 if(theSiPixelFolder.setModuleFolder((*struct_iter).first,7)){
00332 (*struct_iter).second->book( conf_,7,twoDimOn,reducedSet);
00333 } else {
00334 LogDebug ("PixelDQM") << "PROBLEM WITH BARREL-FOLDER\n";
00335 }
00336 }
00337
00338 }
00339
00340 }
00341
00342
00343 DEFINE_FWK_MODULE(SiPixelClusterSource);