00001
00002
00003
00004
00005
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <memory>
00023 #include <iostream>
00024 #include <fstream>
00025
00026
00027
00028 #include "FWCore/Framework/interface/Frameworkfwd.h"
00029 #include "FWCore/Framework/interface/EDAnalyzer.h"
00030
00031 #include "FWCore/Framework/interface/Event.h"
00032 #include "FWCore/Framework/interface/MakerMacros.h"
00033
00034 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00035 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00036
00037 #include "DataFormats/EcalRecHit/interface/EcalUncalibratedRecHit.h"
00038 #include "DataFormats/EcalRecHit/interface/EcalRecHitCollections.h"
00039 #include "DataFormats/EcalDigi/interface/EcalDigiCollections.h"
00040 #include "DataFormats/EcalDigi/interface/EBDataFrame.h"
00041 #include "DataFormats/EcalRawData/interface/EcalRawDataCollections.h"
00042
00043 #include "TFile.h"
00044 #include "TH1F.h"
00045 #include "TH2F.h"
00046 #include "TROOT.h"
00047 #include "TF1.h"
00048 #include "TNtuple.h"
00049 #include "TDirectory.h"
00050
00051
00052
00053
00054
00055
00056
00057 class EcalLaserAnalyzerYousi : public edm::EDAnalyzer {
00058 public:
00059 explicit EcalLaserAnalyzerYousi(const edm::ParameterSet&);
00060 ~EcalLaserAnalyzerYousi();
00061
00062
00063 private:
00064 virtual void beginJob();
00065 virtual void analyze(const edm::Event&, const edm::EventSetup&);
00066 virtual void endJob();
00067
00068
00069
00070 TH1F *C_APD[1700];
00071 TH1F *C_APDPN[1700];
00072 TH1F *C_PN[1700];
00073 TH1F *C_J[1700];
00074 TH2F *C_APDPN_J[1700];
00075
00076 TH1F *peakAPD[2];
00077 TH1F *peakAPDPN[2];
00078 TH1F *APD_LM[9];
00079 TH1F *APDPN_LM[9];
00080 TH2F *APDPN_J_LM[9];
00081 TH2F *APDPN_J_H[2];
00082
00083
00084
00085 TH2F *APD;
00086 TH2F *APD_RMS;
00087 TH2F *APDPN;
00088 TH2F *APDPN_RMS;
00089 TH2F *PN;
00090 TH2F *APDPN_J;
00091 TH2F *APDPN_C;
00092
00093 TH1F *FitHist;
00094 TH2F *Count;
00095
00096
00097 TFile *fPN;
00098 TFile *fAPD;
00099 TFile *fROOT;
00100
00101 TNtuple *C_Tree[1700];
00102
00103
00104
00105 std::string hitCollection_ ;
00106 std::string hitProducer_ ;
00107
00108
00109 std::string outFileName_ ;
00110 std::string SM_ ;
00111 std::string Run_ ;
00112 std::string digiProducer_ ;
00113 std::string PNdigiCollection_ ;
00114
00115
00116 };
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129 EcalLaserAnalyzerYousi::EcalLaserAnalyzerYousi(const edm::ParameterSet& iConfig)
00130 {
00131
00132
00133
00134
00135 hitCollection_ = iConfig.getUntrackedParameter<std::string>("hitCollection");
00136 hitProducer_ = iConfig.getUntrackedParameter<std::string>("hitProducer");
00137
00138
00139 outFileName_ = iConfig.getUntrackedParameter<std::string>("outFileName");
00140 SM_ = iConfig.getUntrackedParameter<std::string>("SM");
00141 Run_ = iConfig.getUntrackedParameter<std::string>("Run");
00142 digiProducer_ = iConfig.getUntrackedParameter<std::string>("digiProducer");
00143 PNdigiCollection_ = iConfig.getUntrackedParameter<std::string>("PNdigiCollection");
00144
00145
00146
00147
00148 }
00149
00150
00151 EcalLaserAnalyzerYousi::~EcalLaserAnalyzerYousi()
00152 {
00153
00154
00155
00156
00157
00158
00159 }
00160
00161
00162
00163
00164
00165
00166
00167 void
00168 EcalLaserAnalyzerYousi::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup)
00169 {
00170 using namespace edm;
00171
00172
00173
00174
00175
00176 edm::Handle<EcalRawDataCollection> DCCHeaders;
00177 iEvent.getByLabel(digiProducer_, DCCHeaders);
00178
00179 EcalDCCHeaderBlock::EcalDCCEventSettings settings = DCCHeaders->begin()->getEventSettings();
00180
00181 int wavelength = settings.wavelength;
00182
00183
00184
00185 if ( wavelength !=0 ) { return; }
00186
00187 edm::Handle<EBUncalibratedRecHitCollection> hits;
00188
00189 try{
00190 iEvent.getByLabel(hitProducer_ , hitCollection_ , hits);
00191
00192 } catch ( std::exception& ex ) {
00193 LogError("EcalLaserAnalyzerYousi") << "Cannot get product: EBRecHitCollection from: "
00194 << hitCollection_ << " - returning.\n\n";
00195
00196 }
00197
00198 edm::Handle<EcalPnDiodeDigiCollection> pndigis;
00199
00200 try{
00201
00202 iEvent.getByLabel(digiProducer_, PNdigiCollection_, pndigis);
00203
00204 } catch ( std::exception& ex ) {
00205 LogError("EcalLaserAnalyzerYousi") << "Cannot get product: EBdigiCollection from: "
00206 << "getbytype" << " - returning.\n\n";
00207
00208 }
00209
00210
00211 Float_t PN_amp[5];
00212
00213
00214 for (int j = 0; j < 5; ++j) {
00215 PN_amp[j] = 0;
00216 for (int z = 0; z<2; ++z) {
00217 FitHist->Reset();
00218 TF1 peakFit("peakFit", "[0] +[1]*x +[2]*x^2", 30, 50);
00219 TF1 pedFit("pedFit","[0]",0,5);
00220
00221 for(int k = 0; k < 50; k++){
00222 FitHist->SetBinContent(k, (*pndigis)[j+z*5].sample(k).adc() );
00223 }
00224 pedFit.SetParameter(0,750);
00225 FitHist->Fit(&pedFit,"RQI");
00226 Float_t ped = pedFit.GetParameter(0);
00227
00228 Int_t maxbin = FitHist->GetMaximumBin();
00229 peakFit.SetRange(FitHist->GetBinCenter(maxbin)-4*FitHist->GetBinWidth(maxbin),
00230 FitHist->GetBinCenter(maxbin)+4*FitHist->GetBinWidth(maxbin));
00231 peakFit.SetParameters(750,4,-.05);
00232 FitHist->Fit(&peakFit,"RQI");
00233 Float_t max = peakFit.Eval(-peakFit.GetParameter(1)/(2*peakFit.GetParameter(2)));
00234 if(ped != max){
00235 PN_amp[j] = PN_amp[j] + max - ped;
00236 } else {
00237 PN_amp[j] = PN_amp[j] + max;
00238 }
00239
00240 }
00241 PN_amp[j] = PN_amp[j]/2.0;
00242 }
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258 Float_t fTree[7];
00259
00260
00261 Int_t cx, cy;
00262
00263 EBDetId ID;
00264 Float_t theAPD;
00265 Float_t thePN;
00266 Float_t Jitter;
00267 Float_t Chi2;
00268 Int_t CN = hits->size();
00269
00270 for(int j = 0; j < CN; j++){
00271 ID = (*hits)[j].id();
00272 cy = 20-(ID.ic()-1)%20;
00273 cx = 85-(ID.ic()-1)/20;
00274 theAPD = (*hits)[j].amplitude();
00275 Jitter = (*hits)[j].jitter();
00276 Chi2 = (*hits)[j].chi2();
00277 thePN = PN_amp[ (ID.ic() + 299)/400 ];
00278
00279
00280
00281
00282 C_APD[ID.ic()-1]->Fill(theAPD);
00283 C_APDPN[ID.ic()-1]->Fill(theAPD/thePN);
00284 C_PN[ID.ic()-1]->Fill(thePN);
00285 C_J[ID.ic()-1]->Fill(Jitter);
00286 C_APDPN_J[ID.ic()-1]->Fill(Jitter, theAPD/thePN);
00287 APDPN_J->Fill(Jitter, theAPD/thePN);
00288 APDPN_C->Fill(Chi2, theAPD/thePN);
00289 fTree[0] = theAPD;
00290 fTree[1] = thePN;
00291 fTree[2] = theAPD/thePN;
00292 fTree[3] = Jitter;
00293 fTree[4] = Chi2;
00294 fTree[5] = (*hits)[j].pedestal();
00295 fTree[6] = iEvent.id().event();
00296 C_Tree[ID.ic()-1]->Fill(fTree);
00297 if(((ID.ic()-1)%20 > 9)||((ID.ic()-1)<100)){
00298 peakAPD[0]->Fill(theAPD);
00299 peakAPDPN[0]->Fill(theAPD/thePN);
00300 APDPN_J_H[0]->Fill(Jitter, theAPD/thePN);
00301 } else {
00302 peakAPD[1]->Fill(theAPD);
00303 peakAPDPN[1]->Fill(theAPD/thePN);
00304 APDPN_J_H[1]->Fill(Jitter, theAPD/thePN);
00305 }
00306 if((ID.ic()-1) < 100){
00307 APD_LM[0]->Fill(theAPD);
00308 APDPN_LM[0]->Fill(theAPD/thePN);
00309 APDPN_J_LM[0]->Fill(Jitter, theAPD/thePN);
00310 }
00311 else {
00312 Int_t index;
00313 if(((ID.ic()-1)%20) < 10){
00314 index = ((ID.ic()-101)/400)*2 + 1;
00315 APD_LM[index]->Fill(theAPD);
00316 APDPN_LM[index]->Fill(theAPD/thePN);
00317 APDPN_J_LM[index]->Fill(Jitter, theAPD/thePN);
00318 }
00319 else {
00320 index = ((ID.ic()-101)/400)*2 + 2;
00321 APD_LM[index]->Fill(theAPD);
00322 APDPN_LM[index]->Fill(theAPD/thePN);
00323 APDPN_J_LM[index]->Fill(Jitter, theAPD/thePN);
00324 }
00325 }
00326 }
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344 }
00345
00346
00347
00348 void
00349 EcalLaserAnalyzerYousi::beginJob()
00350 {
00351
00352 edm::LogInfo("EcalLaserAnalyzerYousi") << "running laser analyzer \n\n";
00353
00354 fROOT = new TFile(outFileName_.c_str(), "RECREATE");
00355 fROOT->cd();
00356
00357
00358 APD = new TH2F("APD", "APD", 85, 0., 85., 20, 0., 20.);
00359 APD_RMS = new TH2F("APD_RMS", "APD_RMS", 85, 0., 85., 20, 0., 20.);
00360 APDPN = new TH2F("APDPN", "APDPN", 85, 0., 85., 20, 0., 20.);
00361 APDPN_RMS = new TH2F("APDPN_RMS", "APDPN_RMS", 85, 0., 85., 20, 0., 20.);
00362 PN = new TH2F("PN", "PN", 85, 0., 85., 20, 0., 20.);
00363 APDPN_J = new TH2F("JittervAPDPN", "JittervAPDPN",250, 3., 7., 250, 1., 2.);
00364 APDPN_C = new TH2F("Chi2vAPDPN", "Chi2vAPDPN", 250, 0., 50., 250, 0., 5.0);
00365 FitHist = new TH1F("FitHist", "FitHist", 50, 0, 50);
00366 Count = new TH2F("Count", "Count", 85, 0., 1., 20, 0., 1.);
00367
00368
00369 for(int i = 0; i < 1700; i++){
00370 std::ostringstream name_1;
00371 std::ostringstream name_2;
00372 std::ostringstream name_3;
00373 std::ostringstream name_4;
00374 std::ostringstream name_5;
00375 name_1 << "C_APD_" << i+1;
00376 name_2 << "C_APDPN_" << i+1;
00377 name_3 << "C_PN_" << i+1;
00378 name_4 << "C_J_" << i+1;
00379 name_5 << "C_APDPN_J_" << i+1;
00380 C_APD[i] = new TH1F(name_1.str().c_str(), name_1.str().c_str(), 2500, 0., 5000.);
00381 C_APDPN[i] = new TH1F(name_2.str().c_str(), name_2.str().c_str(), 20000, 0., 25.);
00382 C_PN[i] = new TH1F(name_3.str().c_str(), name_3.str().c_str(), 1000, 0., 4000.);
00383 C_J[i] = new TH1F(name_4.str().c_str(), name_4.str().c_str(), 250, 3.0, 7.);
00384 C_APDPN_J[i] = new TH2F(name_5.str().c_str(), name_5.str().c_str(), 250, 3.0, 6., 250, 1., 2.2);
00385 }
00386
00387 for(int i = 0; i < 2; i++){
00388 std::ostringstream aname_1;
00389 std::ostringstream aname_2;
00390 std::ostringstream aname_3;
00391 aname_1 << "peakAPD_" << i;
00392 aname_2 << "peakAPDPN_" << i;
00393 aname_3 << "JittervAPDPN_Half_" << i;
00394 peakAPD[i] = new TH1F(aname_1.str().c_str(), aname_1.str().c_str(), 1000, 0., 5000.);
00395 peakAPDPN[i] = new TH1F(aname_2.str().c_str(), aname_2.str().c_str(), 1000, 0., 8.);
00396 APDPN_J_H[i] = new TH2F(aname_3.str().c_str(), aname_3.str().c_str(), 250, 3., 7., 250, 1., 2.2);
00397 }
00398
00399 for(int i = 0; i < 9; i++){
00400 std::ostringstream bname_1;
00401 std::ostringstream bname_2;
00402 std::ostringstream bname_3;
00403 bname_1 << "APD_LM_" << i;
00404 bname_2 << "APDPN_LM_" << i;
00405 bname_3 << "APDPN_J_LM_" << i;
00406 APD_LM[i] = new TH1F(bname_1.str().c_str(), bname_1.str().c_str(), 500, 0., 5000.);
00407 APDPN_LM[i] = new TH1F(bname_2.str().c_str(), bname_2.str().c_str(), 500, 0., 8.);
00408 APDPN_J_LM[i] = new TH2F(bname_3.str().c_str(), bname_3.str().c_str(), 250, 3., 7., 250, 1., 2.2);
00409 }
00410
00411
00412
00413
00414
00415
00416
00417 std::ostringstream varlist;
00418 varlist << "APD:PN:APDPN:Jitter:Chi2:ped:EVT";
00419 for(int i = 0; i < 1700; i++){
00420 std::ostringstream name;
00421 name << "C_Tree_" << i+1;
00422 C_Tree[i] = (TNtuple*) new TNtuple(name.str().c_str(), name.str().c_str(),
00423 varlist.str().c_str());
00424 }
00425
00426 }
00427
00428
00429 void
00430 EcalLaserAnalyzerYousi::endJob() {
00431
00432
00433 TFile *fROOT = (TFile*) new TFile(outFileName_.c_str(), "RECREATE");
00434
00435
00436 TDirectory *DIR;
00437
00438 DIR = fROOT->mkdir(Run_.c_str());
00439
00440 DIR->cd();
00441 for(int j = 0; j < 1700; j++){
00442 Float_t min_r, max_r;
00443 Float_t RMS, Sigma, K;
00444 Int_t iCount;
00445 TF1 *gs1;
00446 TF1 *gs2;
00447 TF1 *gs3;
00448
00449 RMS = C_APD[j]->GetRMS();
00450 APD_RMS->SetBinContent(85-(j/20), 20-(j%20), RMS);
00451 Sigma = 999999;
00452 K = 2.5;
00453 iCount = 0;
00454 while(Sigma > RMS){
00455 min_r = C_APD[j]->GetBinCenter(C_APD[j]->GetMaximumBin()) - K*RMS;
00456 max_r = C_APD[j]->GetBinCenter(C_APD[j]->GetMaximumBin()) + K*RMS;
00457 gs1 = new TF1("gs1", "gaus", min_r, max_r);
00458 C_APD[j]->Fit("gs1", "RQI");
00459 Sigma = gs1->GetParameter(2);
00460 K = K*1.5;
00461 iCount++;
00462 if(iCount > 2){
00463 C_APD[j]->Fit("gaus", "QI");
00464 gs1 = C_APD[j]->GetFunction("gaus");
00465 break;
00466 }
00467 }
00468
00469 RMS = C_APDPN[j]->GetRMS();
00470 APDPN_RMS->SetBinContent(85-(j/20), 20-(j%20), RMS);
00471 Sigma = 999999;
00472 K = 2.5;
00473 iCount = 0;
00474 while(Sigma > RMS){
00475 min_r = C_APDPN[j]->GetBinCenter(C_APDPN[j]->GetMaximumBin()) - K*RMS;
00476 max_r = C_APDPN[j]->GetBinCenter(C_APDPN[j]->GetMaximumBin()) + K*RMS;
00477 gs2 = new TF1("gs2", "gaus", min_r, max_r);
00478 C_APDPN[j]->Fit("gs2", "RQI");
00479 Sigma = gs2->GetParameter(2);
00480 K = K*1.5;
00481 iCount++;
00482 if(iCount > 2){
00483 C_APDPN[j]->Fit("gaus", "QI");
00484 gs2 = C_APDPN[j]->GetFunction("gaus");
00485 break;
00486 }
00487 }
00488
00489 TF1 *newgs1;
00490 TF1 *newgs2;
00491
00492 C_PN[j]->Fit("gaus", "Q");
00493 C_APD[j]->Fit("gaus","QI");
00494 C_APDPN[j]->Fit("gaus","QI");
00495 C_APD[j]->Write("", TObject::kOverwrite);
00496 C_APDPN[j]->Write("", TObject::kOverwrite);
00497 C_PN[j]->Write("", TObject::kOverwrite);
00498 C_J[j]->Write("", TObject::kOverwrite);
00499 C_APDPN_J[j]->Write("", TObject::kOverwrite);
00500 newgs1 = C_APD[j]->GetFunction("gaus");
00501 newgs2 = C_APDPN[j]->GetFunction("gaus");
00502 gs3 = C_PN[j]->GetFunction("gaus");
00503 Float_t theAPD = newgs1->GetParameter(1);
00504 APD->SetBinContent(85-(j/20), 20-(j%20), theAPD);
00505 Float_t theAPDPN = newgs2->GetParameter(1);
00506 APDPN->SetBinContent(85-(j/20), 20-(j%20), theAPDPN);
00507 Float_t thePN = gs3->GetParameter(1);
00508
00509 PN->SetBinContent(85-(j/20), 20-(j%20), thePN);
00510 C_Tree[j]->Write("", TObject::kOverwrite);
00511 }
00512
00513 for(int i = 0; i < 9; i++){
00514 APD_LM[i]->Write("", TObject::kOverwrite);
00515 APDPN_LM[i]->Write("", TObject::kOverwrite);
00516 APDPN_J_LM[i]->Write("", TObject::kOverwrite);
00517 }
00518
00519
00520
00521 APD->Write("", TObject::kOverwrite);
00522 APD_RMS->Write("", TObject::kOverwrite);
00523 APDPN_RMS->Write("", TObject::kOverwrite);
00524 APDPN->Write("", TObject::kOverwrite);
00525 APDPN_J->Write("", TObject::kOverwrite);
00526 APDPN_C->Write("", TObject::kOverwrite);
00527 PN->Write("", TObject::kOverwrite);
00528 peakAPD[0]->Write("", TObject::kOverwrite);
00529 peakAPD[1]->Write("", TObject::kOverwrite);
00530 peakAPDPN[0]->Write("", TObject::kOverwrite);
00531 peakAPDPN[1]->Write("", TObject::kOverwrite);
00532 APDPN_J_H[0]->Write("", TObject::kOverwrite);
00533 APDPN_J_H[1]->Write("", TObject::kOverwrite);
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544 fROOT->Write();
00545
00546
00547 }
00548
00549
00550 DEFINE_FWK_MODULE(EcalLaserAnalyzerYousi);