00001 #include "RecoLocalMuon/CSCValidation/src/CSCValHists.h"
00002 #include <algorithm>
00003
00004 using namespace std;
00005
00006
00007 CSCValHists::CSCValHists(){
00008
00009 std::cout << "Initializing Histogram Manager..." << std::endl;
00010
00011 }
00012
00013
00014 CSCValHists::~CSCValHists(){
00015
00016 }
00017
00018
00019 void CSCValHists::writeHists(TFile* theFile){
00020
00021 std::vector<std::string> theFolders;
00022 std::vector<std::string>::iterator fit;
00023 theFile->cd();
00024
00025 std::map<std::string,std::pair<TH1*,string> >::const_iterator mapit;
00026 for (mapit = theMap.begin(); mapit != theMap.end(); mapit++){
00027 std::string folder = (*mapit).second.second.c_str();
00028 fit = find(theFolders.begin(), theFolders.end(), folder);
00029 if (fit == theFolders.end()){
00030 theFolders.push_back(folder);
00031 theFile->mkdir(folder.c_str());
00032 }
00033 theFile->cd((*mapit).second.second.c_str());
00034 (*mapit).second.first->Write();
00035 theFile->cd();
00036 }
00037
00038 }
00039
00040
00041 void CSCValHists::writeTrees(TFile* theFile){
00042
00043 theFile->cd("recHits");
00044 rHTree->Write();
00045 theFile->cd();
00046
00047 theFile->cd("Segments");
00048 segTree->Write();
00049 theFile->cd();
00050
00051
00052 }
00053
00054
00055 void CSCValHists::setupTrees(){
00056
00057
00058 rHTree = new TTree("rHPositions","Local and Global reconstructed positions for recHits");
00059 segTree = new TTree("segPositions","Local and Global reconstructed positions for segments");
00060
00061
00062 rHTree->Branch("rHpos",&rHpos,"endcap/I:station/I:ring/I:chamber/I:layer/I:localx/F:localy/F:globalx/F:globaly/F");
00063 segTree->Branch("segpos",&segpos,"endcap/I:station/I:ring/I:chamber/I:layer/I:localx/F:localy/F:globalx/F:globaly/F");
00064
00065 }
00066
00067
00068 void CSCValHists::fillRechitTree(float x, float y, float gx, float gy, int en, int st, int ri, int ch, int la){
00069
00070
00071 rHpos.localx = x;
00072 rHpos.localy = y;
00073 rHpos.globalx = gx;
00074 rHpos.globaly = gy;
00075 rHpos.endcap = en;
00076 rHpos.ring = ri;
00077 rHpos.station = st;
00078 rHpos.chamber = ch;
00079 rHpos.layer = la;
00080 rHTree->Fill();
00081
00082 }
00083
00084 void CSCValHists::fillSegmentTree(float x, float y, float gx, float gy, int en, int st, int ri, int ch){
00085
00086
00087 segpos.localx = x;
00088 segpos.localy = y;
00089 segpos.globalx = gx;
00090 segpos.globaly = gy;
00091 segpos.endcap = en;
00092 segpos.ring = ri;
00093 segpos.station = st;
00094 segpos.chamber = ch;
00095 segpos.layer = 0;
00096 segTree->Fill();
00097
00098 }
00099
00100 void CSCValHists::insertPlot(TH1* thePlot, std::string name, std::string folder){
00101
00102 theMap[name] = std::pair<TH1*,string>(thePlot, folder);
00103
00104 }
00105
00106
00107 void CSCValHists::fillCalibHist(float x, std::string name, std::string title, int bins, float xmin, float xmax,
00108 int bin, std::string folder){
00109
00110 std::map<std::string,std::pair<TH1*,string> >::iterator it;
00111 it = theMap.find(name);
00112 if (it == theMap.end()){
00113 theMap[name] = std::pair<TH1*,string>(new TH1I(name.c_str(),title.c_str(),bins,xmin,xmax), folder);
00114 }
00115
00116 theMap[name].first->SetBinContent(bin,x);
00117
00118 }
00119
00120
00121 void CSCValHists::fill1DHist(float x, std::string name, std::string title,
00122 int bins, float xmin, float xmax, std::string folder){
00123
00124 std::map<std::string,std::pair<TH1*,string> >::iterator it;
00125 it = theMap.find(name);
00126 if (it == theMap.end()){
00127 theMap[name] = std::pair<TH1*,string>(new TH1I(name.c_str(),title.c_str(),bins,xmin,xmax), folder);
00128 }
00129
00130
00131 theMap[name].first->Fill(x);
00132
00133 }
00134
00135
00136 void CSCValHists::fill2DHist(float x, float y, std::string name, std::string title,
00137 int binsx, float xmin, float xmax,
00138 int binsy, float ymin, float ymax, std::string folder){
00139
00140 std::map<std::string,std::pair<TH1*,string> >::iterator it;
00141 it = theMap.find(name);
00142 if (it == theMap.end()){
00143 theMap[name] = std::pair<TH1*,string>(new TH2F(name.c_str(),title.c_str(),binsx,xmin,xmax,binsy,ymin,ymax),folder);
00144 }
00145
00146 theMap[name].first->Fill(x,y);
00147
00148 }
00149
00150
00151 void CSCValHists::fill1DHistByType(float x, std::string name, std::string title, CSCDetId id,
00152 int bins, float xmin, float xmax, std::string folder){
00153
00154 std::string endcap;
00155 if (id.endcap() == 1) endcap = "+";
00156 if (id.endcap() == 2) endcap = "-";
00157
00158 std::map<std::string,std::pair<TH1*,string> >::iterator it;
00159 ostringstream oss1;
00160 ostringstream oss2;
00161 oss1 << name << endcap << id.station() << id.ring();
00162 oss2 << title << " (ME " << endcap << id.station() << "/" << id.ring() << ")";
00163 name = oss1.str();
00164 title = oss2.str();
00165 it = theMap.find(name);
00166 if (it == theMap.end()){
00167 theMap[name] = std::pair<TH1*,string>(new TH1F(name.c_str(),title.c_str(),bins,xmin,xmax), folder);
00168 }
00169
00170 theMap[name].first->Fill(x);
00171
00172 }
00173
00174 void CSCValHists::fill2DHistByType(float x, float y, std::string name, std::string title, CSCDetId id,
00175 int binsx, float xmin, float xmax,
00176 int binsy, float ymin, float ymax, std::string folder){
00177
00178 std::string endcap;
00179 if (id.endcap() == 1) endcap = "+";
00180 if (id.endcap() == 2) endcap = "-";
00181
00182 std::map<std::string,std::pair<TH1*,string> >::iterator it;
00183 ostringstream oss1;
00184 ostringstream oss2;
00185 oss1 << name << endcap << id.station() << id.ring();
00186 oss2 << title << " (ME " << endcap << id.station() << "/" << id.ring() << ")";
00187 name = oss1.str();
00188 title = oss2.str();
00189 it = theMap.find(name);
00190 if (it == theMap.end()){
00191 theMap[name] = std::pair<TH1*,string>(new TH2F(name.c_str(),title.c_str(),binsx,xmin,xmax,binsy,ymin,ymax), folder);
00192 }
00193
00194 theMap[name].first->Fill(x,y);
00195
00196 }
00197
00198
00199 void CSCValHists::fill1DHistByCrate(float x, string name, string title, CSCDetId id,
00200 int bins, float xmin, float xmax, string folder){
00201
00202 int crate = crate_lookup(id);
00203
00204 map<string,pair<TH1*,string> >::iterator it;
00205 ostringstream oss1;
00206 ostringstream oss2;
00207 oss1 << name << "_crate_" << crate;
00208 oss2 << title << " (crate " << crate << ")";
00209 name = oss1.str();
00210 title = oss2.str();
00211 it = theMap.find(name);
00212 if (it == theMap.end()){
00213 theMap[name] = pair<TH1*,string>(new TH1F(name.c_str(),title.c_str(),bins,xmin,xmax), folder);
00214 }
00215
00216 theMap[name].first->Fill(x);
00217
00218 }
00219
00220 void CSCValHists::fill2DHistByCrate(float x, float y, string name, string title, CSCDetId id,
00221 int binsx, float xmin, float xmax,
00222 int binsy, float ymin, float ymax, string folder){
00223
00224 int crate = crate_lookup(id);
00225
00226 map<string,pair<TH1*,string> >::iterator it;
00227 ostringstream oss1;
00228 ostringstream oss2;
00229 oss1 << name << "_crate_" << crate;
00230 oss2 << title << " (crate " << crate << ")";
00231 name = oss1.str();
00232 title = oss2.str();
00233 it = theMap.find(name);
00234 if (it == theMap.end()){
00235 theMap[name] = pair<TH1*,string>(new TH2F(name.c_str(),title.c_str(),binsx,xmin,xmax,binsy,ymin,ymax), folder);
00236 }
00237
00238 theMap[name].first->Fill(x,y);
00239
00240 }
00241
00242
00243
00244 void CSCValHists::fill1DHistByStation(float x, string name, string title, CSCDetId id,
00245 int bins, float xmin, float xmax, string folder){
00246
00247 string endcap;
00248 if (id.endcap() == 1) endcap = "+";
00249 if (id.endcap() == 2) endcap = "-";
00250
00251 map<string,pair<TH1*,string> >::iterator it;
00252 ostringstream oss1;
00253 ostringstream oss2;
00254 oss1 << name << endcap << id.station();
00255 oss2 << title << " (Station " << endcap << id.station() << ")";
00256 name = oss1.str();
00257 title = oss2.str();
00258 it = theMap.find(name);
00259 if (it == theMap.end()){
00260 theMap[name] = pair<TH1*,string>(new TH1F(name.c_str(),title.c_str(),bins,xmin,xmax), folder);
00261 }
00262
00263 theMap[name].first->Fill(x);
00264
00265 }
00266
00267
00268 void CSCValHists::fill2DHistByStation(float x, float y, string name, string title, CSCDetId id,
00269 int binsx, float xmin, float xmax,
00270 int binsy, float ymin, float ymax, std::string folder){
00271
00272 std::string endcap;
00273 if (id.endcap() == 1) endcap = "+";
00274 if (id.endcap() == 2) endcap = "-";
00275
00276 std::map<std::string,std::pair<TH1*,string> >::iterator it;
00277 ostringstream oss1;
00278 ostringstream oss2;
00279 oss1 << name << endcap << id.station();
00280 oss2 << title << " (Station " << endcap << id.station() << ")";
00281 name = oss1.str();
00282 title = oss2.str();
00283 it = theMap.find(name);
00284 if (it == theMap.end()){
00285 theMap[name] = std::pair<TH1*,string>(new TH2F(name.c_str(),title.c_str(),binsx,xmin,xmax,binsy,ymin,ymax), folder);
00286 }
00287
00288 theMap[name].first->Fill(x,y);
00289
00290 }
00291
00292
00293 void CSCValHists::fill1DHistByChamber(float x, std::string name, std::string title, CSCDetId id,
00294 int bins, float xmin, float xmax, std::string folder){
00295
00296 std::string endcap;
00297 if (id.endcap() == 1) endcap = "+";
00298 if (id.endcap() == 2) endcap = "-";
00299
00300 std::map<std::string,std::pair<TH1*,string> >::iterator it;
00301 ostringstream oss1;
00302 ostringstream oss2;
00303 oss1 << name << "_" << endcap << id.station() << "_" << id.ring() << "_" << id.chamber();
00304 oss2 << title << " (ME " << endcap << id.station() << "/" << id.ring() << "/" << id.chamber() << ")";
00305 name = oss1.str();
00306 title = oss2.str();
00307 it = theMap.find(name);
00308 if (it == theMap.end()){
00309 theMap[name] = std::pair<TH1*,string>(new TH1F(name.c_str(),title.c_str(),bins,xmin,xmax),folder);
00310 }
00311
00312 theMap[name].first->Fill(x);
00313
00314 }
00315
00316
00317 void CSCValHists::fill2DHistByChamber(float x, float y, std::string name, std::string title, CSCDetId id,
00318 int binsx, float xmin, float xmax,
00319 int binsy, float ymin, float ymax, std::string folder){
00320
00321 std::string endcap;
00322 if (id.endcap() == 1) endcap = "+";
00323 if (id.endcap() == 2) endcap = "-";
00324
00325 std::map<std::string,std::pair<TH1*,string> >::iterator it;
00326 ostringstream oss1;
00327 ostringstream oss2;
00328 oss1 << name << "_" << endcap << id.station() << "_" << id.ring() << "_" << id.chamber();
00329 oss2 << title << " (ME " << endcap << id.station() << "/" << id.ring() << "/" << id.chamber() << ")";
00330 name = oss1.str();
00331 title = oss2.str();
00332 it = theMap.find(name);
00333 if (it == theMap.end()){
00334 theMap[name] = std::pair<TH1*,string>(new TH2F(name.c_str(),title.c_str(),binsx,xmin,xmax,binsy,ymin,ymax),folder);
00335 }
00336
00337 theMap[name].first->Fill(x,y);
00338
00339 }
00340
00341 void CSCValHists::fill2DHistByEvent(int run, int event, float z, string name, string title, CSCDetId id, string folder){
00342
00343 string endcap;
00344 if (id.endcap() == 1) endcap = "+";
00345 if (id.endcap() == 2) endcap = "-";
00346
00347 map<string,pair<TH1*,string> >::iterator it;
00348 ostringstream oss1;
00349 ostringstream oss2;
00350 oss1 << name << "_" << run << "_" << event ;
00351 oss2 << title << " ( Run: " << run << " Event: " << event << " )";
00352 name = oss1.str();
00353 title = oss2.str();
00354 it = theMap.find(name);
00355 if (it == theMap.end()){
00356 theMap[name] = pair<TH1*,string>(new TH2F(name.c_str(),title.c_str(),36,0.5,36.5,18,0.5,18.5),folder);
00357 }
00358
00359 int x = id.chamber();
00360 int y = id.ring();
00361 if (y==4) y =1;
00362 if (id.station() >1)
00363 y = y + 3 + (id.station()-2)*2;
00364
00365 if (id.endcap()==1)
00366 y = y+9;
00367 else
00368 y = -1*y+10;
00369
00370 dynamic_cast<TH2F*>(theMap[name].first)->Fill(x,y,z);
00371
00372 }
00373
00374 void CSCValHists::fill2DHist(float z, string name, string title, CSCDetId id, string folder){
00375
00376 map<string,pair<TH1*,string> >::iterator it;
00377 it = theMap.find(name);
00378 if (it == theMap.end()){
00379 theMap[name] = pair<TH1*,string>(new TH2F(name.c_str(),title.c_str(),36,0.5,36.5,18,0.5,18.5),folder);
00380 }
00381
00382 int x = id.chamber();
00383 int y = id.ring();
00384 if (y==4) y =1;
00385 if (id.station() >1)
00386 y = y + 3 + (id.station()-2)*2;
00387
00388 if (id.endcap()==1)
00389 y = y+9;
00390 else
00391 y = -1*y+10;
00392
00393 dynamic_cast<TH2F*>(theMap[name].first)->Fill(x,y,z);
00394
00395 }
00396
00397 void CSCValHists::fill1DHistByLayer(float x, string name, string title, CSCDetId id,
00398 int bins, float xmin, float xmax, string folder){
00399
00400 std::string endcap;
00401 if (id.endcap() == 1) endcap = "+";
00402 if (id.endcap() == 2) endcap = "-";
00403
00404 std::map<std::string,std::pair<TH1*,string> >::iterator it;
00405 ostringstream oss1;
00406 ostringstream oss2;
00407 oss1 << name << "_" << endcap << id.station() << "_" << id.ring() << "_" << id.chamber() << "_L" << id.layer();
00408 oss2 << title << " (ME " << endcap << id.station() << "/" << id.ring() << "/" << id.chamber() << "/L" << id.layer() << ")";
00409 name = oss1.str();
00410 title = oss2.str();
00411 it = theMap.find(name);
00412 if (it == theMap.end()){
00413 theMap[name] = std::pair<TH1*,string>(new TH1F(name.c_str(),title.c_str(),bins,xmin,xmax),folder);
00414 }
00415
00416 theMap[name].first->Fill(x);
00417
00418 }
00419
00420
00421 void CSCValHists::fill2DHistByLayer(float x, float y, std::string name, std::string title, CSCDetId id,
00422 int binsx, float xmin, float xmax,
00423 int binsy, float ymin, float ymax, std::string folder){
00424
00425 std::string endcap;
00426 if (id.endcap() == 1) endcap = "+";
00427 if (id.endcap() == 2) endcap = "-";
00428
00429 std::map<std::string,std::pair<TH1*,string> >::iterator it;
00430 ostringstream oss1;
00431 ostringstream oss2;
00432 oss1 << name << "_" << endcap << id.station() << "_" << id.ring() << "_" << id.chamber() << "_L" << id.layer();;
00433 oss2 << title << " (ME " << endcap << id.station() << "/" << id.ring() << "/" << id.chamber() << "/L" << id.layer() << ")";
00434 name = oss1.str();
00435 title = oss2.str();
00436 it = theMap.find(name);
00437 if (it == theMap.end()){
00438 theMap[name] = std::pair<TH1*,string>(new TH2F(name.c_str(),title.c_str(),binsx,xmin,xmax,binsy,ymin,ymax),folder);
00439 }
00440
00441 theMap[name].first->Fill(x,y);
00442
00443 }
00444
00445
00446 void CSCValHists::fillProfile(float x, float y, std::string name, std::string title,
00447 int binsx, float xmin, float xmax,
00448 float ymin, float ymax, std::string folder){
00449
00450 std::map<std::string,std::pair<TH1*,string> >::iterator it;
00451 it = theMap.find(name);
00452 if (it == theMap.end()){
00453 theMap[name] = std::pair<TProfile*,string>(new TProfile(name.c_str(),title.c_str(),binsx,xmin,xmax,ymin,ymax), folder);
00454 }
00455
00456 theMap[name].first->Fill(x,y);
00457
00458 }
00459
00460
00461 void CSCValHists::fillProfileByType(float x, float y, std::string name, std::string title, CSCDetId id,
00462 int binsx, float xmin, float xmax,
00463 float ymin, float ymax, std::string folder){
00464
00465 std::map<std::string,std::pair<TH1*,string> >::iterator it;
00466 std::string endcap;
00467 if (id.endcap() == 1) endcap = "+";
00468 if (id.endcap() == 2) endcap = "-";
00469
00470 ostringstream oss1;
00471 ostringstream oss2;
00472 oss1 << name << endcap << id.station() << id.ring();
00473 oss2 << title << " (ME " << endcap << id.station() << "/" << id.ring() << ")";
00474 name = oss1.str();
00475 title = oss2.str();
00476
00477 it = theMap.find(name);
00478 if (it == theMap.end()){
00479 theMap[name] = std::pair<TProfile*,string>(new TProfile(name.c_str(),title.c_str(),binsx,xmin,xmax,ymin,ymax), folder);
00480 }
00481
00482 theMap[name].first->Fill(x,y);
00483
00484 }
00485
00486
00487 void CSCValHists::fillProfileByChamber(float x, float y, std::string name, std::string title, CSCDetId id,
00488 int binsx, float xmin, float xmax,
00489 float ymin, float ymax, std::string folder){
00490
00491 std::map<std::string,std::pair<TH1*,string> >::iterator it;
00492 std::string endcap;
00493 if (id.endcap() == 1) endcap = "+";
00494 if (id.endcap() == 2) endcap = "-";
00495
00496 ostringstream oss1;
00497 ostringstream oss2;
00498 oss1 << name << "_" << endcap << id.station() << "_" << id.ring() << "_" << id.chamber();
00499 oss2 << title << " (ME " << endcap << id.station() << "/" << id.ring() << "/" << id.chamber() << ")";
00500 name = oss1.str();
00501 title = oss2.str();
00502
00503 it = theMap.find(name);
00504 if (it == theMap.end()){
00505 theMap[name] = std::pair<TProfile*,string>(new TProfile(name.c_str(),title.c_str(),binsx,xmin,xmax,ymin,ymax), folder);
00506 }
00507
00508 theMap[name].first->Fill(x,y);
00509
00510 }
00511
00512
00513 void CSCValHists::fill2DProfile(float x, float y, float z, std::string name, std::string title,
00514 int binsx, float xmin, float xmax,
00515 int binsy, float ymin, float ymax,
00516 float zmin, float zmax, std::string folder){
00517
00518 std::map<std::string,std::pair<TH1*,string> >::iterator it;
00519
00520 it = theMap.find(name);
00521 if (it == theMap.end()){
00522 theMap[name] = std::pair<TProfile2D*,string>(new TProfile2D(name.c_str(),title.c_str(),binsx,xmin,xmax,binsy,ymin,ymax,zmin,zmax), folder);
00523 }
00524
00525 TProfile2D *tempp = (TProfile2D*)theMap[name].first;
00526 tempp->Fill(x,y,z);
00527
00528 }
00529
00530 int CSCValHists::crate_lookup(CSCDetId id){
00531
00532 int crate = 0;
00533
00534 if (id.station() == 1){
00535 if (id.chamber() == 36 || id.chamber() == 1 || id.chamber() == 2 ) crate = 1;
00536 if (id.chamber() == 3 || id.chamber() == 4 || id.chamber() == 5 ) crate = 2;
00537 if (id.chamber() == 6 || id.chamber() == 7 || id.chamber() == 8 ) crate = 3;
00538 if (id.chamber() == 9 || id.chamber() == 10 || id.chamber() == 11 ) crate = 4;
00539 if (id.chamber() == 12 || id.chamber() == 13 || id.chamber() == 14 ) crate = 5;
00540 if (id.chamber() == 15 || id.chamber() == 16 || id.chamber() == 17 ) crate = 6;
00541 if (id.chamber() == 18 || id.chamber() == 19 || id.chamber() == 20 ) crate = 7;
00542 if (id.chamber() == 21 || id.chamber() == 22 || id.chamber() == 23 ) crate = 8;
00543 if (id.chamber() == 24 || id.chamber() == 25 || id.chamber() == 26 ) crate = 9;
00544 if (id.chamber() == 27 || id.chamber() == 28 || id.chamber() == 29 ) crate = 10;
00545 if (id.chamber() == 30 || id.chamber() == 31 || id.chamber() == 32 ) crate = 11;
00546 if (id.chamber() == 33 || id.chamber() == 34 || id.chamber() == 35 ) crate = 12;
00547 }
00548 else{
00549 crate = 12 + id.triggerSector() + (id.station()-2)*6;
00550 }
00551
00552 if (id.endcap() == 2)
00553 crate = crate+30;
00554
00555 return crate;
00556
00557 }