File indexing completed on 2024-04-06 12:00:04
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019 #include "CaloOnlineTools/EcalTools/plugins/EcalPulseShapeGrapher.h"
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032 EcalPulseShapeGrapher::EcalPulseShapeGrapher(const edm::ParameterSet& iConfig)
0033 : EBUncalibratedRecHitCollection_(consumes<EcalUncalibratedRecHitCollection>(
0034 iConfig.getParameter<edm::InputTag>("EBUncalibratedRecHitCollection"))),
0035 EBDigis_(consumes<EBDigiCollection>(iConfig.getParameter<edm::InputTag>("EBDigiCollection"))),
0036 EEUncalibratedRecHitCollection_(consumes<EcalUncalibratedRecHitCollection>(
0037 iConfig.getParameter<edm::InputTag>("EEUncalibratedRecHitCollection"))),
0038 EEDigis_(consumes<EEDigiCollection>(iConfig.getParameter<edm::InputTag>("EEDigiCollection"))),
0039 ampCut_(iConfig.getUntrackedParameter<int>("AmplitudeCutADC", 13)),
0040 rootFilename_(iConfig.getUntrackedParameter<std::string>("rootFilename", "pulseShapeGrapher")) {
0041
0042
0043 std::vector<int> listDefaults;
0044 listDefaults.push_back(-1);
0045 listChannels_ = iConfig.getUntrackedParameter<std::vector<int> >("listChannels", listDefaults);
0046
0047 for (std::vector<int>::const_iterator itr = listChannels_.begin(); itr != listChannels_.end(); ++itr) {
0048 std::string title = "Amplitude of cry " + intToString(*itr);
0049 std::string name = "ampOfCry" + intToString(*itr);
0050 ampHistMap_[*itr] = new TH1F(name.c_str(), title.c_str(), 100, 0, 100);
0051 ampHistMap_[*itr]->GetXaxis()->SetTitle("ADC");
0052
0053 title = "Amplitude (over 13 ADC) of cry " + intToString(*itr);
0054 name = "cutAmpOfCry" + intToString(*itr);
0055 cutAmpHistMap_[*itr] = new TH1F(name.c_str(), title.c_str(), 100, 0, 100);
0056 cutAmpHistMap_[*itr]->GetXaxis()->SetTitle("ADC");
0057
0058 title = "Pulse shape of cry " + intToString(*itr);
0059 name = "PulseShapeCry" + intToString(*itr);
0060 pulseShapeHistMap_[*itr] = new TH2F(name.c_str(), title.c_str(), 10, 0, 10, 220, -20, 2);
0061 pulseShapeHistMap_[*itr]->GetXaxis()->SetTitle("sample");
0062
0063 title = "Raw Pulse shape of cry " + intToString(*itr);
0064 name = "RawPulseShapeCry" + intToString(*itr);
0065 rawPulseShapeHistMap_[*itr] = new TH2F(name.c_str(), title.c_str(), 10, 0, 10, 500, 0, 500);
0066 rawPulseShapeHistMap_[*itr]->GetXaxis()->SetTitle("sample");
0067
0068 title = "Amplitude of first sample, cry " + intToString(*itr);
0069 name = "AmpOfFirstSampleCry" + intToString(*itr);
0070 firstSampleHistMap_[*itr] = new TH1F(name.c_str(), title.c_str(), 300, 100, 400);
0071 firstSampleHistMap_[*itr]->GetXaxis()->SetTitle("ADC");
0072 }
0073
0074 fedMap_ = new EcalFedMap();
0075
0076 for (int i = 0; i < 10; i++)
0077 abscissa[i] = i;
0078 }
0079
0080
0081
0082
0083
0084
0085 void EcalPulseShapeGrapher::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
0086 using namespace edm;
0087 using namespace std;
0088
0089 const Handle<EcalUncalibratedRecHitCollection>& EBHits = iEvent.getHandle(EBUncalibratedRecHitCollection_);
0090 const Handle<EcalUncalibratedRecHitCollection>& EEHits = iEvent.getHandle(EEUncalibratedRecHitCollection_);
0091 const Handle<EBDigiCollection>& EBdigis = iEvent.getHandle(EBDigis_);
0092 const Handle<EEDigiCollection>& EEdigis = iEvent.getHandle(EEDigis_);
0093
0094 unique_ptr<EcalElectronicsMapping> ecalElectronicsMap(new EcalElectronicsMapping);
0095
0096
0097 for (EcalUncalibratedRecHitCollection::const_iterator hitItr = EBHits->begin(); hitItr != EBHits->end(); ++hitItr) {
0098 EcalUncalibratedRecHit hit = (*hitItr);
0099 float amplitude = hit.amplitude();
0100 EBDetId hitDetId = hit.id();
0101
0102
0103 EcalElectronicsId elecId = ecalElectronicsMap->getElectronicsId(hitDetId);
0104 int FEDid = 600 + elecId.dccId();
0105 string SMname = fedMap_->getSliceFromFed(FEDid);
0106
0107 vector<int>::const_iterator itr = listChannels_.begin();
0108 while (itr != listChannels_.end() && (*itr) != hitDetId.hashedIndex()) {
0109 itr++;
0110 }
0111 if (itr == listChannels_.end())
0112 continue;
0113
0114 ampHistMap_[hitDetId.hashedIndex()]->Fill(amplitude);
0115 if (amplitude < ampCut_)
0116 continue;
0117
0118 cutAmpHistMap_[hitDetId.hashedIndex()]->Fill(amplitude);
0119 EBDigiCollection::const_iterator digiItr = EBdigis->begin();
0120 while (digiItr != EBdigis->end() && digiItr->id() != hitItr->id()) {
0121 digiItr++;
0122 }
0123 if (digiItr == EBdigis->end())
0124 continue;
0125
0126 double sampleADC[10];
0127 EBDataFrame df(*digiItr);
0128 double pedestal = 200;
0129
0130 if (df.sample(0).gainId() != 1 || df.sample(1).gainId() != 1)
0131 continue;
0132 else {
0133 sampleADC[0] = df.sample(0).adc();
0134 sampleADC[1] = df.sample(1).adc();
0135 pedestal = (double)(sampleADC[0] + sampleADC[1]) / (double)2;
0136 }
0137
0138 for (int i = 0; (unsigned int)i < digiItr->size(); ++i) {
0139 EBDataFrame df(*digiItr);
0140 double gain = 12.;
0141 if (df.sample(i).gainId() == 1)
0142 gain = 1.;
0143 else if (df.sample(i).gainId() == 2)
0144 gain = 2.;
0145 sampleADC[i] = pedestal + (df.sample(i).adc() - pedestal) * gain;
0146 }
0147
0148 for (int i = 0; i < 10; ++i) {
0149 pulseShapeHistMap_[hitDetId.hashedIndex()]->Fill(i, (float)(sampleADC[i] - pedestal) / amplitude);
0150 rawPulseShapeHistMap_[hitDetId.hashedIndex()]->Fill(i, (float)(sampleADC[i]));
0151 }
0152 firstSampleHistMap_[hitDetId.hashedIndex()]->Fill(sampleADC[0]);
0153 }
0154
0155
0156 for (EcalUncalibratedRecHitCollection::const_iterator hitItr = EEHits->begin(); hitItr != EEHits->end(); ++hitItr) {
0157 EcalUncalibratedRecHit hit = (*hitItr);
0158 float amplitude = hit.amplitude();
0159 EEDetId hitDetId = hit.id();
0160
0161
0162 EcalElectronicsId elecId = ecalElectronicsMap->getElectronicsId(hitDetId);
0163 int FEDid = 600 + elecId.dccId();
0164 string SMname = fedMap_->getSliceFromFed(FEDid);
0165
0166 vector<int>::const_iterator itr = listChannels_.begin();
0167 while (itr != listChannels_.end() && (*itr) != hitDetId.hashedIndex()) {
0168 itr++;
0169 }
0170 if (itr == listChannels_.end())
0171 continue;
0172
0173 ampHistMap_[hitDetId.hashedIndex()]->Fill(amplitude);
0174 if (amplitude < ampCut_)
0175 continue;
0176
0177 cutAmpHistMap_[hitDetId.hashedIndex()]->Fill(amplitude);
0178 EEDigiCollection::const_iterator digiItr = EEdigis->begin();
0179 while (digiItr != EEdigis->end() && digiItr->id() != hitItr->id()) {
0180 digiItr++;
0181 }
0182 if (digiItr == EEdigis->end())
0183 continue;
0184
0185 double sampleADC[10];
0186 EEDataFrame df(*digiItr);
0187 double pedestal = 200;
0188
0189 if (df.sample(0).gainId() != 1 || df.sample(1).gainId() != 1)
0190 continue;
0191 else {
0192 sampleADC[0] = df.sample(0).adc();
0193 sampleADC[1] = df.sample(1).adc();
0194 pedestal = (double)(sampleADC[0] + sampleADC[1]) / (double)2;
0195 }
0196
0197 for (int i = 0; (unsigned int)i < digiItr->size(); ++i) {
0198 EEDataFrame df(*digiItr);
0199 double gain = 12.;
0200 if (df.sample(i).gainId() == 1)
0201 gain = 1.;
0202 else if (df.sample(i).gainId() == 2)
0203 gain = 2.;
0204 sampleADC[i] = pedestal + (df.sample(i).adc() - pedestal) * gain;
0205 }
0206
0207 for (int i = 0; i < 10; ++i) {
0208 pulseShapeHistMap_[hitDetId.hashedIndex()]->Fill(i, (float)(sampleADC[i] - pedestal) / amplitude);
0209 rawPulseShapeHistMap_[hitDetId.hashedIndex()]->Fill(i, (float)(sampleADC[i]));
0210 }
0211 firstSampleHistMap_[hitDetId.hashedIndex()]->Fill(sampleADC[0]);
0212 }
0213 }
0214
0215
0216 void EcalPulseShapeGrapher::endJob() {
0217 rootFilename_ += ".root";
0218 file_ = new TFile(rootFilename_.c_str(), "RECREATE");
0219 TH1::AddDirectory(false);
0220
0221 for (std::vector<int>::const_iterator itr = listChannels_.begin(); itr != listChannels_.end(); ++itr) {
0222 ampHistMap_[*itr]->Write();
0223 cutAmpHistMap_[*itr]->Write();
0224 firstSampleHistMap_[*itr]->Write();
0225
0226 rawPulseShapeHistMap_[*itr]->Write();
0227 TProfile* t2 = (TProfile*)(rawPulseShapeHistMap_[*itr]->ProfileX());
0228 t2->Write();
0229
0230 }
0231
0232 file_->Write();
0233 file_->Close();
0234 }
0235
0236 std::string EcalPulseShapeGrapher::intToString(int num) {
0237 using namespace std;
0238 ostringstream myStream;
0239 myStream << num << flush;
0240 return (myStream.str());
0241 }