00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 #include <memory>
00063
00064
00065 #include "FWCore/Framework/interface/Frameworkfwd.h"
00066 #include "FWCore/Framework/interface/EDProducer.h"
00067
00068 #include "FWCore/Framework/interface/Event.h"
00069 #include "FWCore/Framework/interface/MakerMacros.h"
00070 #include "FWCore/Framework/interface/EventSetup.h"
00071 #include "FWCore/Framework/interface/ESHandle.h"
00072 #include "DataFormats/FWLite/interface/Handle.h"
00073 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00074
00075 #include "DataFormats/HcalDigi/interface/HcalDigiCollections.h"
00076 #include "FWCore/Utilities/interface/InputTag.h"
00077 #include "DataFormats/TrackReco/interface/Track.h"
00078 #include "DataFormats/TrackReco/interface/TrackFwd.h"
00079
00080 #include "Geometry/Records/interface/IdealGeometryRecord.h"
00081 #include "Geometry/CaloGeometry/interface/CaloSubdetectorGeometry.h"
00082 #include "Geometry/CaloGeometry/interface/CaloGeometry.h"
00083 #include "Geometry/CaloGeometry/interface/CaloCellGeometry.h"
00084 #include "DataFormats/HcalDetId/interface/HcalDetId.h"
00085 #include "DataFormats/HcalDetId/interface/HcalSubdetector.h"
00086
00087 #include "Geometry/Records/interface/MuonGeometryRecord.h"
00088 #include "Geometry/DTGeometry/interface/DTGeometry.h"
00089 #include "Geometry/DTGeometry/interface/DTLayer.h"
00090 #include "Geometry/DTGeometry/interface/DTSuperLayer.h"
00091 #include "DataFormats/DTRecHit/interface/DTRecHitCollection.h"
00092
00093
00094 #include "CalibFormats/HcalObjects/interface/HcalDbService.h"
00095 #include "CalibFormats/HcalObjects/interface/HcalDbRecord.h"
00096
00097 #include "CalibCalorimetry/HcalAlgos/interface/HcalAlgoUtils.h"
00098 #include "CalibCalorimetry/HcalAlgos/interface/HcalDbASCIIIO.h"
00099 #include "CalibFormats/HcalObjects/interface/HcalCalibrations.h"
00100 #include "CalibFormats/HcalObjects/interface/HcalCalibrationWidths.h"
00101
00102
00103
00104
00105
00106
00107
00108 #include "DataFormats/TrajectorySeed/interface/PropagationDirection.h"
00109 #include "DataFormats/GeometrySurface/interface/PlaneBuilder.h"
00110
00111 #include "MagneticField/Engine/interface/MagneticField.h"
00112 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
00113
00114 #include "DataFormats/HcalCalibObjects/interface/HOCalibVariables.h"
00115 #include "DataFormats/Math/interface/Error.h"
00116 #include "CLHEP/Vector/LorentzVector.h"
00117
00118 #include "DataFormats/TrajectorySeed/interface/TrajectorySeedCollection.h"
00119 #include "DataFormats/CaloTowers/interface/CaloTowerCollection.h"
00120
00121 #include "DataFormats/HcalRecHit/interface/HcalRecHitCollections.h"
00122 #include "DataFormats/Math/interface/Error.h"
00123 #include "TrackingTools/TrajectoryState/interface/FreeTrajectoryState.h"
00124 #include "TrackPropagation/SteppingHelixPropagator/interface/SteppingHelixPropagator.h"
00125
00126
00127 #include "FWCore/ServiceRegistry/interface/Service.h"
00128 #include "CommonTools/UtilAlgos/interface/TFileService.h"
00129
00130 #include "DataFormats/L1GlobalTrigger/interface/L1GlobalTriggerReadoutRecord.h"
00131 #include "DataFormats/Common/interface/TriggerResults.h"
00132 #include "FWCore/Common/interface/TriggerNames.h"
00133
00134
00135 #include "TFile.h"
00136 #include "TH1F.h"
00137 #include "TH2F.h"
00138 #include "TProfile.h"
00139 #include "TTree.h"
00140
00141 #include <string>
00142
00143 #include <iostream>
00144 #include <fstream>
00145
00146
00147
00148 using namespace std;
00149 using namespace edm;
00150 using namespace reco;
00151
00152 const int netabin= 16;
00153 const int nphimx = 72;
00154 const int netamx = 32;
00155 const int nchnmx = 10;
00156 const int ncidmx = 5;
00157
00158
00159 const int nsigpk = 7;
00160 const int nstrbn = 0;
00161 const int ntrgp_gm = 11;
00162
00163
00164 const int netahbmx = 60;
00165 const int netahb3mx = 32;
00166
00167 static const unsigned int nL1trg = 200;
00168
00169 static const unsigned int nL1mx=140;
00170 static const unsigned int nHLTmx=140;
00171
00172
00173 class AlCaHOCalibProducer : public edm::EDProducer {
00174 public:
00175 explicit AlCaHOCalibProducer(const edm::ParameterSet&);
00176 ~AlCaHOCalibProducer();
00177
00178 typedef Basic3DVector<float> PositionType;
00179 typedef Basic3DVector<float> DirectionType;
00180 typedef Basic3DVector<float> RotationType;
00181
00182
00183 private:
00184 void findHOEtaPhi(int iphsect, int& ietaho, int& iphiho);
00185 virtual void beginJob() ;
00186 virtual void produce(edm::Event&, const edm::EventSetup&);
00187 virtual void endJob() ;
00188
00189
00190
00191 float xhor0;
00192 float yhor0;
00193 float xhor1;
00194 float yhor1;
00195 int iring;
00196
00197 float localxhor0;
00198 float localyhor0;
00199 float localxhor1;
00200 float localyhor1;
00201
00202 float pedestal[netamx][nphimx][ncidmx];
00203
00204 std::string digiLabel;
00205
00206 bool debug;
00207 std::string theRootFileName;
00208
00209
00210
00211 TH1F* libhoped;
00212 TH1F* libhoped1;
00213
00214 TH1F* allhotime;
00215 TH1F* hotime[ntrgp_gm+1];
00216 TH1F* hopedtime;
00217
00218 TProfile* hopedpr;
00219 TH1F* hopedrms;
00220 TH1F* hst_hopedrms;
00221
00222 TProfile* hopeak[ntrgp_gm+1];
00223 TProfile* horatio;
00224
00225 TH1F* Nallhotime;
00226 TH1F* Nhotime[ntrgp_gm+1];
00227 TH1F* Nhopedtime;
00228
00229 TH1F* allhb1;
00230 TH1F* allhb2;
00231 TH1F* allhb3;
00232
00233 TH1F* Nallhb1;
00234 TH1F* Nallhb2;
00235 TH1F* Nallhb3;
00236
00237 TProfile* hb1pedpr;
00238 TH1F* hb1pedrms;
00239 TH1F* hst_hb1pedrms;
00240
00241 TH1F* ho_occupency[5];
00242
00243 bool m_hotime;
00244
00245
00246 edm::InputTag muonTags_;
00247 edm::InputTag hbheLabel_;
00248 edm::InputTag hoLabel_;
00249 edm::InputTag hltLabel_;
00250 edm::InputTag l1Label_;
00251 edm::InputTag towerLabel_;
00252
00253 bool m_digiInput;
00254 bool m_hbinfo;
00255 int m_startTS;
00256 int m_endTS;
00257 double m_magscale;
00258 double m_sigma;
00259
00260 typedef math::Error<5>::type CovarianceMatrix;
00261
00262
00263 int Noccu;
00264
00265 int nRuns;
00266
00267
00268 int irunold;
00269
00270 FreeTrajectoryState getFreeTrajectoryState( const reco::Track& tk, const MagneticField* field, int itag, bool dir);
00271
00272 edm::ESHandle<HcalDbService> conditions_;
00273 const HcalQIEShape* m_shape;
00274 const HcalQIECoder* m_coder;
00275
00276 HcalCalibrations calibped;
00277 HcalCalibrationWidths calibwidth;
00278
00279 unsigned int Ntp;
00280 std::map<std::string, bool> fired;
00281
00282 };
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295 AlCaHOCalibProducer::AlCaHOCalibProducer(const edm::ParameterSet& iConfig)
00296 : muonTags_(iConfig.getUntrackedParameter<edm::InputTag>("muons"))
00297
00298 {
00299
00300
00301 theRootFileName = iConfig.getUntrackedParameter<string>("RootFileName","tmp.root");
00302 m_digiInput = iConfig.getUntrackedParameter<bool>("digiInput", true);
00303 m_hbinfo = iConfig.getUntrackedParameter<bool>("hbinfo", false);
00304 m_startTS = iConfig.getUntrackedParameter<int>("firstTS", 4);
00305
00306 m_hotime = iConfig.getUntrackedParameter<bool>("hotime", false);
00307
00308 if(m_startTS<0) m_startTS=0;
00309 m_endTS = iConfig.getUntrackedParameter<int>("lastTS", 7);
00310 if (m_endTS < m_startTS) m_endTS = m_startTS + 3;
00311 if (m_endTS >9) m_endTS=9;
00312 m_magscale = iConfig.getUntrackedParameter<double>("m_scale", 4.0);
00313 m_sigma = iConfig.getUntrackedParameter<double>("sigma", 1.0);
00314
00315 hoLabel_ = iConfig.getParameter<edm::InputTag>("hoInput");
00316 hbheLabel_ = iConfig.getParameter<edm::InputTag>("hbheInput");
00317 hltLabel_ = iConfig.getParameter<edm::InputTag>("hltInput");
00318 l1Label_ = iConfig.getParameter<edm::InputTag>("l1Input");
00319 towerLabel_ = iConfig.getParameter<edm::InputTag>("towerInput");
00320
00321 produces<HOCalibVariableCollection>("HOCalibVariableCollection").setBranchAlias("HOCalibVariableCollection");
00322
00323
00324 if (m_hotime) {
00325 edm::Service<TFileService> fs;
00326
00327 char title[200];
00328 if ( m_digiInput) {
00329 libhoped = fs->make<TH1F>("libhoped", "libhoped", ncidmx*netamx*nphimx, -0.5, ncidmx*netamx*nphimx-0.5);
00330 libhoped1 = fs->make<TH1F>("libhoped1", "libhoped1", nchnmx*netamx*nphimx, -0.5, nchnmx*netamx*nphimx-0.5);
00331 allhotime = fs->make<TH1F>("allhotime", "allhotime", nchnmx*netamx*nphimx, -0.5, nchnmx*netamx*nphimx-0.5);
00332 for (int ij=0; ij<=ntrgp_gm; ij++) {
00333 sprintf(title, "hotime_trgp_%i", ij+1);
00334 hotime[ij] = fs->make<TH1F>(title, title, nchnmx*netamx*nphimx, -0.5, nchnmx*netamx*nphimx-0.5);
00335 sprintf(title, "hopeak_trgp_%i", ij+1);
00336 hopeak[ij] = fs->make<TProfile>(title, title,netamx*nphimx, -0.5, netamx*nphimx-0.5);
00337 }
00338
00339 horatio = fs->make<TProfile>("horatio", "horatio",netamx*nphimx, -0.5, netamx*nphimx-0.5);
00340 hopedtime = fs->make<TH1F>("hopedtime", "hopedtime", nchnmx*netamx*nphimx, -0.5, nchnmx*netamx*nphimx-0.5);
00341
00342 Nallhotime = fs->make<TH1F>("Nallhotime", "Nallhotime", nchnmx*netamx*nphimx, -0.5, nchnmx*netamx*nphimx-0.5);
00343 hopedpr = fs->make<TProfile>("hopedpr", "hopedpr", nchnmx*netamx*nphimx, -0.5, nchnmx*netamx*nphimx-0.5);
00344 hopedrms = fs->make<TH1F>("hopedrms", "hopedrms", nchnmx*netamx*nphimx, -0.5, nchnmx*netamx*nphimx-0.5);
00345 hst_hopedrms = fs->make<TH1F>("hst_hopedrms", "hst_hopedrms", 100, 0.0, 0.1);
00346 for (int ij=0; ij<=ntrgp_gm; ij++) {
00347 sprintf(title, "Nhotime_trgp_%i", ij+1);
00348 Nhotime[ij] = fs->make<TH1F>(title, title, nchnmx*netamx*nphimx, -0.5, nchnmx*netamx*nphimx-0.5);
00349 }
00350 Nhopedtime = fs->make<TH1F>("Nhopedtime", "Nhopedtime", nchnmx*netamx*nphimx, -0.5, nchnmx*netamx*nphimx-0.5);
00351 allhb1 = fs->make<TH1F>("allhb1", "allhb1", nchnmx*netahbmx*nphimx, -0.5, nchnmx*netahbmx*nphimx-0.5);
00352 allhb2 = fs->make<TH1F>("allhb2", "allhb2", nchnmx*netahb3mx*nphimx, -0.5, nchnmx*netahb3mx*nphimx-0.5);
00353 allhb3 = fs->make<TH1F>("allhb3", "allhb3", nchnmx*netahb3mx*nphimx, -0.5, nchnmx*netahb3mx*nphimx-0.5);
00354 Nallhb1 = fs->make<TH1F>("Nallhb1", "Nallhb1", nchnmx*netahbmx*nphimx, -0.5, nchnmx*netahbmx*nphimx-0.5);
00355 Nallhb2 = fs->make<TH1F>("Nallhb2", "Nallhb2", nchnmx*netahb3mx*nphimx, -0.5, nchnmx*netahb3mx*nphimx-0.5);
00356 Nallhb3 = fs->make<TH1F>("Nallhb3", "Nallhb3", nchnmx*netahb3mx*nphimx, -0.5, nchnmx*netahb3mx*nphimx-0.5);
00357 hb1pedpr = fs->make<TProfile>("hb1pedpr", "hb1pedpr", nchnmx*netahbmx*nphimx, -0.5, nchnmx*netahbmx*nphimx-0.5);
00358 hb1pedrms = fs->make<TH1F>("hb1pedrms", "hb1pedrms", nchnmx*netahbmx*nphimx, -0.5, nchnmx*netahbmx*nphimx-0.5);
00359 hst_hb1pedrms = fs->make<TH1F>("hst_hb1pedrms", "hst_hb1pedrms", 100, 0., 0.1);
00360
00361 }
00362 for (int i=0; i<5; i++) {
00363 sprintf(title, "ho_occupency (>%i #sigma)", i+2);
00364 ho_occupency[i] = fs->make<TH1F>(title, title, netamx*nphimx, -0.5, netamx*nphimx-0.5);
00365 }
00366 }
00367
00368 }
00369
00370 AlCaHOCalibProducer::~AlCaHOCalibProducer()
00371 {
00372
00373
00374
00375
00376 if (m_hotime) {
00377
00378 if ( m_digiInput) {
00379 allhotime->Divide(Nallhotime);
00380 for (int ij=0; ij<=ntrgp_gm; ij++) {
00381 hotime[ij]->Divide(Nhotime[ij]);
00382 }
00383 hopedtime->Divide(Nhopedtime);
00384 libhoped->Scale(1./max(1,nRuns));
00385 libhoped1->Scale(1./max(1,nRuns));
00386 for (int i=0; i<nchnmx*netamx*nphimx; i++) {
00387 float xx = hopedpr->GetBinError(i+1);
00388 if (hopedpr->GetBinEntries(i+1) >0) {
00389 hopedrms->Fill(i, xx);
00390 hst_hopedrms->Fill(xx);
00391 }
00392 }
00393 allhb1->Divide(Nallhb1);
00394 allhb2->Divide(Nallhb2);
00395 allhb3->Divide(Nallhb3);
00396 for (int i=0; i<nchnmx*netahbmx*nphimx; i++) {
00397 float xx = hb1pedpr->GetBinError(i+1);
00398 if (hb1pedpr->GetBinEntries(i+1) >0) {
00399 hb1pedrms->Fill(i, xx);
00400 hst_hb1pedrms->Fill(xx);
00401 }
00402 }
00403 }
00404 for (int i=0; i<5; i++) {
00405 ho_occupency[i]->Scale(1./max(1,Noccu));
00406 }
00407 }
00408
00409 }
00410
00411
00412
00413
00414
00415
00416
00417 void
00418 AlCaHOCalibProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
00419 {
00420
00421 using namespace edm;
00422 int irun = iEvent.id().run();
00423 if (m_digiInput) {
00424 if (irunold !=irun) {
00425 iSetup.get<HcalDbRecord>().get(conditions_);
00426 m_shape = (*conditions_).getHcalShape();
00427
00428 for (int i=0; i<netamx; i++) {
00429 for (int j=0; j<nphimx; j++) {
00430 for (int k=0; k<ncidmx; k++) {
00431 pedestal[i][j][k]=0.0;
00432 }
00433 }
00434 }
00435 }
00436 }
00437
00438
00439 if (m_digiInput) {
00440 if (irunold !=irun) {
00441 nRuns++;
00442 for (int i =-netabin+1; i<=netabin-1; i++) {
00443 if (i==0) continue;
00444 int tmpeta1 = (i>0) ? i -1 : -i +14;
00445 if (tmpeta1 <0 || tmpeta1 >netamx) continue;
00446 for (int j=0; j<nphimx; j++) {
00447
00448 HcalDetId id(HcalOuter, i, j+1, 4);
00449 calibped = conditions_->getHcalCalibrations(id);
00450
00451 for (int k =0; k<ncidmx-1; k++) {
00452 pedestal[tmpeta1][j][k] = calibped.pedestal(k);
00453 pedestal[tmpeta1][j][ncidmx-1] += (1./(ncidmx-1))*pedestal[tmpeta1][j][k];
00454 }
00455
00456 if (m_hotime) {
00457 for (int k =0; k<ncidmx; k++) {
00458 libhoped->Fill(nphimx*ncidmx*tmpeta1 + ncidmx*j + k, pedestal[tmpeta1][j][k]);
00459 }
00460 for (int k =0; k<nchnmx; k++) {
00461 libhoped1->Fill(nphimx*nchnmx*tmpeta1 + nchnmx*j + k, pedestal[tmpeta1][j][min(k,ncidmx-1)]);
00462 }
00463 }
00464
00465 }
00466 }
00467 }
00468 }
00469
00470
00471 irunold = irun;
00472
00473
00474
00475
00476 std::auto_ptr<HOCalibVariableCollection> hostore (new HOCalibVariableCollection);
00477
00478 edm::Handle<HODigiCollection> ho;
00479
00480 edm::Handle<HBHEDigiCollection> hbhe;
00481
00482 if (m_digiInput) {
00483 iEvent.getByLabel(hoLabel_,ho);
00484 iEvent.getByLabel(hbheLabel_,hbhe);
00485 }
00486
00487 if (m_hotime && m_digiInput) {
00488 if ((*ho).size()>0) {
00489 for (HODigiCollection::const_iterator j=(*ho).begin(); j!=(*ho).end(); j++){
00490 HcalDetId id =(*j).id();
00491 int tmpeta= id.ieta();
00492 int tmpphi= id.iphi();
00493 m_coder = (*conditions_).getHcalCoder(id);
00494 float tmpdata[nchnmx];
00495 int tmpeta1 = (tmpeta>0) ? tmpeta -1 : -tmpeta +14;
00496 for (int i=0; i<(*j).size() && i<nchnmx; i++) {
00497 tmpdata[i] = m_coder->charge(*m_shape,(*j).sample(i).adc(),(*j).sample(i).capid());
00498 allhotime->Fill(nphimx*nchnmx*tmpeta1 + nchnmx*(tmpphi-1) + i, tmpdata[i]);
00499 Nallhotime->Fill(nphimx*nchnmx*tmpeta1 + nchnmx*(tmpphi-1) + i, 1.);
00500 }
00501 }
00502 }
00503 if ((*hbhe).size()>0) {
00504 for (HBHEDigiCollection::const_iterator j=(*hbhe).begin(); j!=(*hbhe).end(); j++){
00505 HcalDetId id =(*j).id();
00506 int tmpeta= id.ieta();
00507 int tmpphi= id.iphi();
00508 int tmpdepth =id.depth();
00509 m_coder = (*conditions_).getHcalCoder(id);
00510 int tmpeta1 = (tmpeta>0) ? tmpeta -15 : -tmpeta + 1;
00511 if (tmpdepth==1) tmpeta1 = (tmpeta>0) ? tmpeta -1 : -tmpeta +29;
00512 for (int i=0; i<(*j).size() && i<nchnmx; i++) {
00513 float signal = m_coder->charge(*m_shape,(*j).sample(i).adc(),(*j).sample(i).capid());
00514 if (tmpdepth==1) {
00515 allhb1->Fill(nphimx*nchnmx*tmpeta1 + nchnmx*(tmpphi-1) + i, signal);
00516 Nallhb1->Fill(nphimx*nchnmx*tmpeta1 + nchnmx*(tmpphi-1) + i, 1);
00517 hb1pedpr->Fill(nphimx*nchnmx*tmpeta1 + nchnmx*(tmpphi-1) + i, signal);}
00518 if (tmpdepth==2) {
00519 allhb2->Fill(nphimx*nchnmx*tmpeta1 + nchnmx*(tmpphi-1) + i, signal);
00520 Nallhb2->Fill(nphimx*nchnmx*tmpeta1 + nchnmx*(tmpphi-1) + i, 1);}
00521 if (tmpdepth==3) {
00522 allhb3->Fill(nphimx*nchnmx*tmpeta1 + nchnmx*(tmpphi-1) + i, signal);
00523 Nallhb3->Fill(nphimx*nchnmx*tmpeta1 + nchnmx*(tmpphi-1) + i, 1);}
00524 }
00525 }
00526 }
00527 }
00528
00529 double pival = acos(-1.);
00530
00531 Handle<reco::TrackCollection> cosmicmuon;
00532 iEvent.getByLabel(muonTags_, cosmicmuon);
00533
00534 if (cosmicmuon->size()>0) {
00535
00536 int l1trg = 0;
00537 int hlttr = 0;
00538
00539 int ntrgpas_gm[ntrgp_gm]={0,0,0,0,0,0,0,0,0,0};
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580 int Noccu_old = Noccu;
00581
00582 for(reco::TrackCollection::const_iterator ncosm = cosmicmuon->begin();
00583 ncosm != cosmicmuon->end(); ++ncosm) {
00584
00585 if ((*ncosm).ndof() < 15) continue;
00586 if ((*ncosm).normalizedChi2() >30.0) continue;
00587
00588 HOCalibVariables tmpHOCalib;
00589
00590 tmpHOCalib.trig1 = l1trg;
00591 tmpHOCalib.trig2 = hlttr;
00592
00593 int charge = ncosm->charge();
00594
00595 double innerr = (*ncosm).innerPosition().Perp2();
00596 double outerr = (*ncosm).outerPosition().Perp2();
00597 int iiner = (innerr <outerr) ? 1 : 0;
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608 double posx, posy, posz;
00609 double momx, momy, momz;
00610
00611 if (iiner==1) {
00612 posx = (*ncosm).innerPosition().X();
00613 posy = (*ncosm).innerPosition().Y();
00614 posz = (*ncosm).innerPosition().Z();
00615
00616 momx = (*ncosm).innerMomentum().X();
00617 momy = (*ncosm).innerMomentum().Y();
00618 momz = (*ncosm).innerMomentum().Z();
00619
00620 } else {
00621 posx = (*ncosm).outerPosition().X();
00622 posy = (*ncosm).outerPosition().Y();
00623 posz = (*ncosm).outerPosition().Z();
00624
00625 momx = (*ncosm).outerMomentum().X();
00626 momy = (*ncosm).outerMomentum().Y();
00627 momz = (*ncosm).outerMomentum().Z();
00628 }
00629
00630
00631 PositionType trkpos(posx, posy, posz);
00632
00633 CLHEP::Hep3Vector tmpmuon3v(posx, posy, posz);
00634 CLHEP::Hep3Vector tmpmuondir(momx, momy, momz);
00635
00636 bool samedir = (tmpmuon3v.dot(tmpmuondir) >0) ? true : false;
00637 for (int i=0; i<3; i++) {tmpHOCalib.caloen[i] = 0.0;}
00638 int inearbymuon = 0;
00639 for(reco::TrackCollection::const_iterator ncosmcor = cosmicmuon->begin();
00640 ncosmcor != cosmicmuon->end(); ++ncosmcor) {
00641 if (ncosmcor==ncosm) continue;
00642
00643 CLHEP::Hep3Vector tmpmuon3vcor;
00644 CLHEP::Hep3Vector tmpmom3v;
00645 if (iiner==1) {
00646 tmpmuon3vcor = CLHEP::Hep3Vector((*ncosmcor).innerPosition().X(),(*ncosmcor).innerPosition().Y(),(*ncosmcor).innerPosition().Z());
00647 tmpmom3v = CLHEP::Hep3Vector((*ncosmcor).innerMomentum().X(),(*ncosmcor).innerMomentum().Y(),(*ncosmcor).innerMomentum().Z());
00648 } else {
00649 tmpmuon3vcor = CLHEP::Hep3Vector((*ncosmcor).outerPosition().X(),(*ncosmcor).outerPosition().Y(),(*ncosmcor).outerPosition().Z());
00650 tmpmom3v = CLHEP::Hep3Vector((*ncosmcor).outerMomentum().X(),(*ncosmcor).outerMomentum().Y(),(*ncosmcor).outerMomentum().Z());
00651
00652 }
00653 if (tmpmom3v.mag()<0.2 || (*ncosmcor).ndof()<5) continue;
00654
00655 double angle = tmpmuon3v.angle(tmpmuon3vcor);
00656 if (angle < 7.5*pival/180.) {inearbymuon=1;}
00657
00658 if (muonTags_.label() =="cosmicMuons") {
00659 if (angle <7.5*pival/180.) { tmpHOCalib.caloen[0] +=1.;}
00660 if (angle <15.0*pival/180.) { tmpHOCalib.caloen[1] +=1.;}
00661 if (angle <35.0*pival/180.) { tmpHOCalib.caloen[2] +=1.;}
00662 }
00663 }
00664
00665 localxhor0 = localyhor0 = 20000;
00666
00667 if (muonTags_.label() =="standAloneMuons") {
00668
00669 Handle<CaloTowerCollection> calotower;
00670 iEvent.getByLabel(towerLabel_, calotower);
00671
00672 for (CaloTowerCollection::const_iterator calt = calotower->begin();
00673 calt !=calotower->end(); calt++) {
00674
00675 double ith = (*calt).momentum().theta();
00676 double iph = (*calt).momentum().phi();
00677
00678 CLHEP::Hep3Vector calo3v(sin(ith)*cos(iph), sin(ith)*sin(iph), cos(ith));
00679
00680 double angle = tmpmuon3v.angle(calo3v);
00681
00682 if (angle < 7.5*pival/180.) {tmpHOCalib.caloen[0] += calt->emEnergy()+calt->hadEnergy();}
00683 if (angle < 15*pival/180.) {tmpHOCalib.caloen[1] += calt->emEnergy()+calt->hadEnergy();}
00684 if (angle < 35*pival/180.) {tmpHOCalib.caloen[2] += calt->emEnergy()+calt->hadEnergy();}
00685 }
00686
00687
00688 }
00689 if (tmpHOCalib.caloen[0] >10.0) continue;
00690
00691 GlobalPoint glbpt(posx, posy, posz);
00692
00693 double mom = sqrt(momx*momx + momy*momy +momz*momz);
00694
00695 momx /= mom;
00696 momy /= mom;
00697 momz /= mom;
00698
00699 DirectionType trkdir(momx, momy, momz);
00700
00701 tmpHOCalib.trkdr = (*ncosm).d0();
00702 tmpHOCalib.trkdz = (*ncosm).dz();
00703
00704 tmpHOCalib.nmuon = cosmicmuon->size();
00705 tmpHOCalib.trkvx = glbpt.x();
00706 tmpHOCalib.trkvy = glbpt.y();
00707 tmpHOCalib.trkvz = glbpt.z();
00708 tmpHOCalib.trkmm = mom*charge;
00709 tmpHOCalib.trkth = trkdir.theta();
00710 tmpHOCalib.trkph = trkdir.phi();
00711
00712 tmpHOCalib.ndof = (inearbymuon ==0) ? (int)(*ncosm).ndof() : -(int)(*ncosm).ndof();
00713 tmpHOCalib.chisq = (*ncosm).normalizedChi2();
00714 tmpHOCalib.therr = 0.;
00715 tmpHOCalib.pherr = 0.;
00716
00717 if (iiner==1) {
00718 reco::TrackBase::CovarianceMatrix innercov = (*ncosm).innerStateCovariance();
00719 tmpHOCalib.therr = innercov(1,1);
00720 tmpHOCalib.pherr = innercov(2,2);
00721 } else {
00722 reco::TrackBase::CovarianceMatrix outercov = (*ncosm).outerStateCovariance();
00723 tmpHOCalib.therr = outercov(1,1);
00724 tmpHOCalib.pherr = outercov(2,2);
00725 }
00726
00727 ESHandle<MagneticField> theMagField;
00728 iSetup.get<IdealMagneticFieldRecord>().get(theMagField );
00729
00730 SteppingHelixPropagator myHelix(&*theMagField,anyDirection);
00731 myHelix.setMaterialMode(false);
00732 myHelix.applyRadX0Correction(true);
00733
00734 double phiho = trkpos.phi();
00735 if (phiho<0) phiho +=2*pival;
00736
00737 int iphisect_dt=int(6*(phiho+pival/18.)/pival);
00738 if (iphisect_dt>=12) iphisect_dt=0;
00739
00740 int iphisect = -1;
00741
00742 bool ipath = false;
00743 for (int kl = 0; kl<=2; kl++) {
00744
00745 int iphisecttmp = (kl<2) ? iphisect_dt + kl : iphisect_dt - 1;
00746 if (iphisecttmp <0) iphisecttmp = 11;
00747 if (iphisecttmp >=12) iphisecttmp = 0;
00748
00749 double phipos = iphisecttmp*pival/6.;
00750 double phirot = phipos;
00751
00752 GlobalVector xLocal(-sin(phirot), cos(phirot), 0.);
00753
00754 GlobalVector yLocal(0., 0., 1.);
00755 GlobalVector zLocal = xLocal.cross(yLocal).unit();
00756
00757
00758
00759 FreeTrajectoryState freetrajectorystate_ = getFreeTrajectoryState(*ncosm,&(*theMagField), iiner, samedir);
00760
00761 Surface::RotationType rot(xLocal, yLocal, zLocal);
00762
00763 for (int ik=1; ik>=0; ik--) {
00764
00765 double radial = 407.0;
00766 if (ik==0) radial = 382.0;
00767
00768 Surface::PositionType pos(radial*cos(phipos), radial*sin(phipos), 0.);
00769 PlaneBuilder::ReturnType aPlane = PlaneBuilder().plane(pos,rot);
00770
00771 Surface* aPlane2 = new Plane(pos,rot);
00772
00773 SteppingHelixStateInfo steppingHelixstateinfo_ = myHelix.propagate(freetrajectorystate_, (*aPlane2));
00774
00775 if (steppingHelixstateinfo_.isValid()) {
00776
00777 GlobalVector hotrkpos2(steppingHelixstateinfo_.position().x(), steppingHelixstateinfo_.position().y(), steppingHelixstateinfo_.position().z());
00778 CLHEP::Hep3Vector hotrkdir2(steppingHelixstateinfo_.momentum().x(), steppingHelixstateinfo_.momentum().y(),steppingHelixstateinfo_.momentum().z());
00779
00780 LocalVector lclvt0 = (*aPlane).toLocal(hotrkpos2);
00781
00782 double xx = lclvt0.x();
00783 double yy = lclvt0.y();
00784
00785 if (ik ==1) {
00786 if ((std::abs(yy) < 130 && xx >-64.7 && xx <138.2)
00787 ||(std::abs(yy) > 130 && std::abs(yy) <700 && xx >-76.3 && xx <140.5)) {
00788 ipath = true;
00789 iphisect = iphisecttmp;
00790 }
00791 }
00792
00793 if (iphisect != iphisecttmp) continue;
00794
00795 switch (ik)
00796 {
00797 case 0 :
00798 xhor0 = xx;
00799 yhor0 = yy;
00800 break;
00801 case 1 :
00802 xhor1 = xx;
00803 yhor1 = yy;
00804
00805 tmpHOCalib.hoang = CLHEP::Hep3Vector(zLocal.x(),zLocal.y(),zLocal.z()).dot(hotrkdir2.unit());
00806 break;
00807 default : break;
00808 }
00809 } else {
00810 break;
00811 }
00812 }
00813 if (ipath) break;
00814 }
00815 if (ipath) {
00816
00817 int ietaho = 50;
00818 int iphiho = -1;
00819
00820 for (int i=0; i<9; i++) {tmpHOCalib.hosig[i]=-100.0;}
00821 for (int i=0; i<18; i++) {tmpHOCalib.hocorsig[i]=-100.0;}
00822 for (int i=0; i<9; i++) {tmpHOCalib.hbhesig[i]=-100.0;}
00823 tmpHOCalib.hocro = -100;
00824 tmpHOCalib.htime = -1000;
00825
00826 int isect = 0;
00827
00828 findHOEtaPhi(iphisect, ietaho, iphiho);
00829
00830 if (ietaho !=0 && iphiho !=0 && std::abs(iring)<=2) {
00831 isect = 100*std::abs(ietaho+30)+std::abs(iphiho);
00832 if (std::abs(ietaho) >=netabin || iphiho<0) isect *=-1;
00833 if (std::abs(ietaho) >=netabin) isect -=1000000;
00834 if (iphiho<0) isect -=2000000;
00835 tmpHOCalib.isect = isect;
00836
00837 tmpHOCalib.hodx = localxhor1;
00838 tmpHOCalib.hody = localyhor1;
00839
00840 if (iring==0) {
00841 tmpHOCalib.hocorsig[8] = localxhor0;
00842 tmpHOCalib.hocorsig[9] = localyhor0;
00843 }
00844
00845 int etamn=-4;
00846 int etamx=4;
00847 if (iring==1) {etamn=5; etamx = 10;}
00848 if (iring==2) {etamn=11; etamx = 16;}
00849 if (iring==-1){etamn=-10; etamx = -5;}
00850 if (iring==-2){etamn=-16; etamx = -11;}
00851
00852 int phimn = 1;
00853 int phimx = 2;
00854 if (iring ==0) {
00855 phimx =2*int((iphiho+1)/2.);
00856 phimn = phimx - 1;
00857 } else {
00858 phimn = 3*int((iphiho+1)/3.) - 1;
00859 phimx = phimn + 2;
00860 }
00861
00862 if (phimn <1) phimn += nphimx;
00863 if (phimx >72) phimx -= nphimx;
00864
00865 int sigstr = m_startTS;
00866 int sigend = m_endTS;
00867
00868
00869
00870
00871
00872
00873 if (m_hbinfo) {
00874 for (int i=0; i<9; i++) {tmpHOCalib.hbhesig[i]=-100.0;}
00875
00876 if (m_digiInput) {
00877 if ((*hbhe).size() >0) {
00878 for (HBHEDigiCollection::const_iterator j=(*hbhe).begin(); j!=(*hbhe).end(); j++){
00879
00880
00881 HcalDetId id =(*j).id();
00882 int tmpeta= id.ieta();
00883 int tmpphi= id.iphi();
00884 m_coder = (*conditions_).getHcalCoder(id);
00885 calibped = conditions_->getHcalCalibrations(id);
00886
00887 int deta = tmpeta-ietaho;
00888 if (tmpeta==-1 && ietaho== 1) deta = -1;
00889 if (tmpeta== 1 && ietaho==-1) deta = 1;
00890 int dphi = tmpphi-iphiho;
00891 if (phimn >phimx) {
00892 if (dphi==71) dphi=-1;
00893 if (dphi==-71) dphi=1;
00894 }
00895
00896 int ipass2 = (std::abs(deta) <=1 && std::abs(dphi)<=1) ? 1 : 0;
00897
00898 if (ipass2 ==0 ) continue;
00899
00900 float tmpdata[nchnmx];
00901 for (int i=0; i<(*j).size() && i<nchnmx; i++) {
00902 tmpdata[i] = m_coder->charge(*m_shape,(*j).sample(i).adc(),(*j).sample(i).capid());
00903 }
00904
00905 float signal = 0;
00906 for (int i=1; i<(*j).size() && i<=8; i++) {
00907 signal += tmpdata[i] - calibped.pedestal((*j).sample(i).capid());;
00908 }
00909
00910 if (ipass2 == 1) {
00911 if (3*(deta+1)+dphi+1<9) tmpHOCalib.hbhesig[3*(deta+1)+dphi+1] = signal;
00912 }
00913 }
00914 }
00915
00916 } else {
00917
00918 edm::Handle<HBHERecHitCollection> hbheht;
00919 iEvent.getByLabel(hbheLabel_,hbheht);
00920
00921
00922 if ((*hbheht).size()>0) {
00923 if(!(*hbheht).size()) throw (int)(*hbheht).size();
00924
00925 for (HBHERecHitCollection::const_iterator j=(*hbheht).begin(); j!=(*hbheht).end(); j++){
00926
00927
00928 HcalDetId id =(*j).id();
00929 int tmpeta= id.ieta();
00930 int tmpphi= id.iphi();
00931
00932 int deta = tmpeta-ietaho;
00933 if (tmpeta==-1 && ietaho== 1) deta = -1;
00934 if (tmpeta== 1 && ietaho==-1) deta = 1;
00935 int dphi = tmpphi-iphiho;
00936 if (phimn >phimx) {
00937 if (dphi==71) dphi=-1;
00938 if (dphi==-71) dphi=1;
00939 }
00940
00941 int ipass2 = (std::abs(deta) <=1 && std::abs(dphi)<=1) ? 1 : 0;
00942 if ( ipass2 ==0 ) continue;
00943
00944 float signal = (*j).energy();
00945
00946 if (3*(deta+1)+dphi+1<9) tmpHOCalib.hbhesig[3*(deta+1)+dphi+1] = signal;
00947 }
00948 }
00949
00950 }
00951
00952 }
00953
00954 if (m_digiInput) {
00955 if ((*ho).size()>0) {
00956 int isFilled[netamx*nphimx];
00957 for (int j=0; j<netamx*nphimx; j++) {isFilled[j]=0;}
00958
00959 double sumEt = 0;
00960 double sumE = 0;
00961
00962 for (HODigiCollection::const_iterator j=(*ho).begin(); j!=(*ho).end(); j++){
00963
00964
00965
00966 HcalDetId id =(*j).id();
00967 int tmpeta= id.ieta();
00968 int tmpphi= id.iphi();
00969 m_coder = (*conditions_).getHcalCoder(id);
00970
00971 int ipass1 =0;
00972 if (tmpeta >=etamn && tmpeta <=etamx) {
00973 if (phimn < phimx) {
00974 ipass1 = (tmpphi >=phimn && tmpphi <=phimx ) ? 1 : 0;
00975 } else {
00976 ipass1 = (tmpphi==71 || tmpphi ==72 || tmpphi==1) ? 1 : 0;
00977 }
00978 }
00979
00980 int deta = tmpeta-ietaho;
00981 if (tmpeta==-1 && ietaho== 1) deta = -1;
00982 if (tmpeta== 1 && ietaho==-1) deta = 1;
00983
00984 int dphi = tmpphi -iphiho;
00985 if (phimn>phimx) {
00986 if (dphi==71) dphi=-1;
00987 if (dphi==-71) dphi=1;
00988 }
00989
00990 int ipass2 = (std::abs(deta) <=1 && std::abs(dphi)<=1) ? 1 : 0;
00991
00992 int tmpeta1 = (tmpeta>0) ? tmpeta -1 : -tmpeta +14;
00993
00994 float tmpdata[nchnmx]={0,0,0,0,0,0,0,0,0,0};
00995 float sigvall[nsigpk]={0,0,0,0,0,0,0};
00996
00997 for (int i=0; i<(*j).size() && i<nchnmx; i++) {
00998 tmpdata[i] = m_coder->charge(*m_shape,(*j).sample(i).adc(),(*j).sample(i).capid());
00999 if (deta==0 && dphi==0) {
01000 double tmpE = tmpdata[i] - pedestal[tmpeta1][tmpphi-1][(*j).sample(i).capid()];
01001 if (tmpE >0) {
01002 sumEt += i*tmpE;
01003 sumE += tmpE;
01004 }
01005 if (m_hotime) {
01006
01007 if (i>=7-nsigpk) {
01008 for (int ncap=0; ncap<nsigpk; ncap++) {
01009 if (i-ncap >= nstrbn && i-ncap <= nstrbn+3) {
01010 sigvall[ncap] +=tmpdata[i];
01011 }
01012 }
01013 }
01014 if (i==(*j).size()-1) {
01015 float mxled=-1;
01016 int imxled = 0;
01017 for (int ij=0; ij<nsigpk; ij++) {
01018 if (sigvall[ij] > mxled) {mxled = sigvall[ij]; imxled=ij;}
01019 }
01020 double pedx = 0.0;
01021 for (int ij=0; ij<4; ij++) {
01022 pedx +=pedestal[tmpeta1][tmpphi-1][ij];
01023 }
01024 if (mxled-pedx >2 && mxled-pedx <20 ) {
01025 hopeak[ntrgp_gm]->Fill(nphimx*tmpeta1 + tmpphi-1, imxled+nstrbn);
01026 for (int jk=0; jk<ntrgp_gm; jk++) {
01027 if (ntrgpas_gm[jk]>0) {
01028 hopeak[jk]->Fill(nphimx*tmpeta1 + tmpphi-1, imxled+nstrbn);
01029 }
01030 }
01031 if (tmpdata[5]+tmpdata[6] >1) {
01032 horatio->Fill(nphimx*tmpeta1 + tmpphi-1, (tmpdata[5]-tmpdata[6])/(tmpdata[5]+tmpdata[6]));
01033 }
01034 for (int ij=0; ij<(*j).size() && ij<nchnmx; ij++) {
01035 hotime[ntrgp_gm]->Fill(nphimx*nchnmx*tmpeta1 + nchnmx*(tmpphi-1) + ij, tmpdata[ij]);
01036 Nhotime[ntrgp_gm]->Fill(nphimx*nchnmx*tmpeta1 + nchnmx*(tmpphi-1) + ij, 1.);
01037 for (int jk=0; jk<ntrgp_gm; jk++) {
01038 if (ntrgpas_gm[jk]>0) {
01039 hotime[jk]->Fill(nphimx*nchnmx*tmpeta1 + nchnmx*(tmpphi-1) + ij, tmpdata[ij]);
01040 Nhotime[jk]->Fill(nphimx*nchnmx*tmpeta1 + nchnmx*(tmpphi-1) + ij, 1.);
01041 }
01042 }
01043 }
01044 }
01045 }
01046 }
01047 }
01048 }
01049
01050 if (std::abs(tmpeta) <=15 && deta==0 && dphi ==0) {
01051 float signal = 0;
01052 size_t icnt = 0;
01053 for (int i =0; i<nchnmx && i< (*j).size(); i++) {
01054 if (i >=sigstr && i<=sigend) continue;
01055 signal += tmpdata[i] - pedestal[tmpeta1][tmpphi-1][(*j).sample(i).capid()];
01056 if (++icnt >=4) break;
01057 }
01058 tmpHOCalib.hocro = signal;
01059 }
01060
01061 if (m_hotime) {
01062 if (ipass1 ==0 && ipass2 ==0 && cosmicmuon->size()<=2) {
01063 if (std::abs(ietaho) <=netabin && iphiho >0) {
01064 if ((iphiho >=1 && iphiho<=nphimx/2 && tmpphi >=1 && tmpphi <=nphimx/2) ||
01065 (iphiho >nphimx/2 && iphiho<=nphimx && tmpphi >nphimx/2 && tmpphi <=nphimx)) {
01066 if (isFilled[nphimx*tmpeta1+tmpphi-1]==0) {
01067 isFilled[nphimx*tmpeta1+tmpphi-1]=1;
01068 for (int i=0; i<(*j).size() && i<nchnmx; i++) {
01069 hopedtime->Fill(nphimx*nchnmx*tmpeta1 + nchnmx*(tmpphi-1) + i, tmpdata[i]);
01070 Nhopedtime->Fill(nphimx*nchnmx*tmpeta1 + nchnmx*(tmpphi-1) + i, 1.);
01071 hopedpr->Fill(nphimx*nchnmx*tmpeta1 + nchnmx*(tmpphi-1) + i, tmpdata[i]);
01072 }
01073 }
01074 }
01075 }
01076 }
01077 }
01078
01079 if (ipass1 ==0 && ipass2 ==0 ) continue;
01080
01081 float signal = 0;
01082 for (int i=sigstr; i<(*j).size() && i<=sigend; i++) {
01083 signal += tmpdata[i] - pedestal[tmpeta1][tmpphi-1][(*j).sample(i).capid()];
01084 }
01085 if (signal <-100 || signal >100000) signal = -100;
01086 if (m_hotime) {
01087 if (signal >-100 && Noccu == Noccu_old) {
01088 for (int i=0; i<5; i++) {
01089 if (signal >(i+2)*m_sigma) {
01090 ho_occupency[i]->Fill(nphimx*tmpeta1+tmpphi-1);
01091 }
01092 }
01093 }
01094 }
01095
01096 if (ipass1 ==0 && ipass2 ==0 ) continue;
01097
01098 if (ipass1 ==1) {
01099 int tmpdph = tmpphi-phimn;
01100 if (tmpdph<0) tmpdph = 2;
01101
01102 int ilog = 2*(tmpeta-etamn)+tmpdph;
01103 if (iring !=0) {
01104 if (iring >0) {
01105 ilog = 3*(tmpeta-etamn)+tmpdph;
01106 } else {
01107 ilog = 3*(etamx-tmpeta)+tmpdph;
01108 }
01109 }
01110 if (ilog>-1 && ilog<18) {
01111 tmpHOCalib.hocorsig[ilog] = signal;
01112 }
01113 }
01114
01115 if (ipass2 ==1) {
01116 if (3*(deta+1)+dphi+1<9) tmpHOCalib.hosig[3*(deta+1)+dphi+1] = signal;
01117 }
01118
01119
01120
01121
01122
01123
01124
01125
01126
01127
01128
01129
01130
01131
01132
01133
01134
01135
01136
01137
01138
01139
01140
01141
01142
01143
01144
01145
01146
01147
01148 }
01149 tmpHOCalib.htime = sumEt/max(sumE,1.e-6);
01150 }
01151 } else {
01152 edm::Handle<HORecHitCollection> hoht;
01153 iEvent.getByLabel(hoLabel_,hoht);
01154
01155
01156 if ((*hoht).size()>0) {
01157 for (HORecHitCollection::const_iterator j=(*hoht).begin(); j!=(*hoht).end(); j++){
01158
01159
01160 HcalDetId id =(*j).id();
01161 int tmpeta= id.ieta();
01162 int tmpphi= id.iphi();
01163
01164 int ipass1 =0;
01165 if (tmpeta >=etamn && tmpeta <=etamx) {
01166 if (phimn < phimx) {
01167 ipass1 = (tmpphi >=phimn && tmpphi <=phimx ) ? 1 : 0;
01168 } else {
01169 ipass1 = (tmpphi==71 || tmpphi ==72 || tmpphi==1) ? 1 : 0;
01170 }
01171 }
01172
01173 int deta = tmpeta-ietaho;
01174 if (tmpeta==-1 && ietaho== 1) deta = -1;
01175 if (tmpeta== 1 && ietaho==-1) deta = 1;
01176
01177 int dphi = tmpphi -iphiho;
01178 if (phimn>phimx) {
01179 if (dphi==71) dphi=-1;
01180 if (dphi==-71) dphi=1;
01181 }
01182
01183 float signal = (*j).energy();
01184 if (m_hotime) {
01185 int tmpeta1 = (tmpeta>0) ? tmpeta -1 : -tmpeta +14;
01186 if (signal >-100 && Noccu == Noccu_old) {
01187 for (int i=0; i<5; i++) {
01188 if (signal >(i+2)*m_sigma) {
01189 ho_occupency[i]->Fill(nphimx*tmpeta1+tmpphi-1);
01190 }
01191 }
01192 }
01193 }
01194
01195 int ipass2 = (std::abs(deta) <=1 && std::abs(dphi)<=1) ? 1 : 0;
01196
01197 if (ipass1 ==0 && ipass2 ==0 ) continue;
01198
01199 if (ipass1 ==1) {
01200 int tmpdph = tmpphi-phimn;
01201 if (tmpdph<0) tmpdph = 2;
01202
01203 int ilog = 2*(tmpeta-etamn)+tmpdph;
01204 if (iring !=0) {
01205 if (iring >0) {
01206 ilog = 3*(tmpeta-etamn)+tmpdph;
01207 } else {
01208 ilog = 3*(etamx-tmpeta)+tmpdph;
01209 }
01210 }
01211 if (ilog>-1 && ilog<18) {
01212 tmpHOCalib.hocorsig[ilog] = signal;
01213 }
01214 }
01215
01216 if (ipass2 ==1) {
01217
01218 if (3*(deta+1)+dphi+1<9) {
01219 tmpHOCalib.hosig[3*(deta+1)+dphi+1] = signal;
01220 }
01221 }
01222
01223 if (deta==0 && dphi ==0) {
01224 tmpHOCalib.htime = (*j).time();
01225 int crphi = tmpphi + 6;
01226 if (crphi >72) crphi -=72;
01227
01228 for (HORecHitCollection::const_iterator jcr=(*hoht).begin(); jcr!=(*hoht).end(); jcr++){
01229 const HORecHit reccr = (const HORecHit)(*jcr);
01230 HcalDetId idcr =reccr.id();
01231 int etacr= idcr.ieta();
01232 int phicr= idcr.iphi();
01233 if (tmpeta==etacr && crphi ==phicr) {
01234
01235 tmpHOCalib.hocro = reccr.energy();
01236
01237 }
01238 }
01239 }
01240 }
01241 }
01242 }
01243
01244
01245 if (Noccu == Noccu_old) Noccu++;
01246 hostore->push_back(tmpHOCalib);
01247
01248 }
01249 }
01250
01251 }
01252 }
01253
01254 iEvent.put(hostore, "HOCalibVariableCollection");
01255
01256 }
01257
01258
01259 void
01260 AlCaHOCalibProducer::beginJob()
01261 {
01262
01263
01264
01265
01266 irunold = -1;
01267 nRuns = 0;
01268
01269
01270
01271
01272
01273
01274 for (int i=0; i<netamx; i++) {
01275 for (int j=0; j<nphimx; j++) {
01276 for (int k=0; k<ncidmx; k++) {
01277 pedestal[i][j][k]=0.0;
01278 }
01279 }
01280 }
01281
01282
01283 }
01284
01285
01286 void
01287 AlCaHOCalibProducer::endJob() {
01288
01289
01290 }
01291
01292 void AlCaHOCalibProducer::findHOEtaPhi(int iphisect, int& ietaho, int& iphiho) {
01293
01294
01295
01296 double etalow[netabin]={ 0.025, 35.195, 70.625, 106.595, 141.565, 180.765, 220.235, 261.385, 304.525, 349.975, 410.025, 452.085, 506.645, 565.025, 627.725, 660.25};
01297 double etahgh[netabin]={ 35.145, 70.575, 106.545, 125.505, 180.715, 220.185, 261.335, 304.475, 349.925, 392.575, 452.035, 506.595, 564.975, 627.675, 661.075, 700.25};
01298
01299 double philow[6]={-76.27, -35.11, 0.35, 35.81, 71.77, 108.93};
01300 double phihgh[6]={-35.81, -0.35, 35.11, 71.07, 108.23, 140.49};
01301
01302 double philow00[6]={-60.27, -32.91, 0.35, 33.61, 67.37, 102.23};
01303 double phihgh00[6]={-33.61, -0.35, 32.91, 66.67, 101.53, 129.49};
01304
01305 double philow01[6]={-64.67, -34.91, 0.35, 35.61, 71.37, 108.33};
01306 double phihgh01[6]={-35.61, -0.35, 34.91, 70.67, 107.63, 138.19};
01307
01308
01309 iring = -10;
01310
01311 double tmpdy = std::abs(yhor1);
01312 for (int i=0; i<netabin; i++) {
01313 if (tmpdy >etalow[i] && tmpdy <etahgh[i]) {
01314 ietaho = i+1;
01315 float tmp1 = fabs(tmpdy-etalow[i]);
01316 float tmp2 = fabs(tmpdy-etahgh[i]);
01317
01318 localyhor1 = (tmp1 < tmp2) ? -tmp1 : tmp2;
01319
01320 if (i<4) iring =0;
01321 if (i>=4 && i<10) iring=1;
01322 if (i>=10 && i<netabin) iring=2;
01323 break;
01324 }
01325 }
01326
01327 int tmpphi = 0;
01328 int tmpphi0 = 0;
01329
01330 if (ietaho >4) {
01331 for (int i=0; i<6; i++) {
01332 if (xhor1 >philow[i] && xhor1 <phihgh[i]) {
01333 tmpphi=i+1;
01334 float tmp1 = fabs(xhor1-philow[i]);
01335 float tmp2 = fabs(xhor1-phihgh[i]);
01336 localxhor1 = (tmp1 < tmp2) ? -tmp1 : tmp2;
01337 break;
01338 }
01339 }
01340 } else {
01341 for (int i=0; i<6; i++) {
01342 if (xhor1 >philow01[i] && xhor1 <phihgh01[i]) {
01343 tmpphi=i+1;
01344 float tmp1 = fabs(xhor1-philow01[i]);
01345 float tmp2 = fabs(xhor1-phihgh01[i]);
01346 localxhor1 = (tmp1 < tmp2) ? -tmp1 : tmp2;
01347 break;
01348 }
01349 }
01350
01351 for (int i=0; i<6; i++) {
01352 if (xhor0 >philow00[i] && xhor0 <phihgh00[i]) {
01353 tmpphi0=i+1;
01354 float tmp1 = fabs(xhor0-philow00[i]);
01355 float tmp2 = fabs(xhor0-phihgh00[i]);
01356 localxhor0 = (tmp1 < tmp2) ? -tmp1 : tmp2;
01357 if (tmpphi !=tmpphi0) localxhor0 +=10000.;
01358 break;
01359 }
01360 }
01361
01362 double tmpdy = std::abs(yhor0);
01363 for (int i=0; i<4; i++) {
01364 if (tmpdy >etalow[i] && tmpdy <etahgh[i]) {
01365 float tmp1 = fabs(tmpdy-etalow[i]);
01366 float tmp2 = fabs(tmpdy-etahgh[i]);
01367 localyhor0 = (tmp1 < tmp2) ? -tmp1 : tmp2;
01368 if (i+1 != ietaho) localyhor0 +=10000.;
01369 break;
01370 }
01371 }
01372 }
01373
01374 if (tmpphi!=0) {
01375 iphiho = 6*iphisect -2 + tmpphi;
01376 if (iphiho <=0) iphiho +=nphimx;
01377 if (iphiho >nphimx) iphiho -=nphimx;
01378 }
01379
01380
01381
01382 if (yhor1 <0) {
01383 if (std::abs(ietaho) >netabin) {
01384 ietaho +=1;
01385 } else {
01386 ietaho *=-1;
01387 }
01388
01389 iring *=-1;
01390 }
01391 }
01392
01393 FreeTrajectoryState AlCaHOCalibProducer::getFreeTrajectoryState( const reco::Track& tk, const MagneticField* field, int iiner, bool dir)
01394 {
01395
01396 if (iiner ==0) {
01397 GlobalPoint gpos( tk.outerX(), tk.outerY(), tk.outerZ());
01398 GlobalVector gmom( tk.outerPx(), tk.outerPy(), tk.outerPz());
01399 if (dir) gmom *=-1.;
01400 GlobalTrajectoryParameters par( gpos, gmom, tk.charge(), field);
01401 CurvilinearTrajectoryError err( tk.extra()->outerStateCovariance());
01402 return FreeTrajectoryState( par, err);
01403 } else {
01404 GlobalPoint gpos( tk.innerPosition().X(), tk.innerPosition().Y(), tk.innerPosition().Z());
01405 GlobalVector gmom( tk.innerMomentum().X(), tk.innerMomentum().Y(), tk.innerMomentum().Z());
01406 if (dir) gmom *=-1.;
01407 GlobalTrajectoryParameters par( gpos, -gmom, tk.charge(), field);
01408 CurvilinearTrajectoryError err( tk.extra()->innerStateCovariance());
01409 return FreeTrajectoryState( par, err);
01410 }
01411
01412 }
01413
01414 #include "FWCore/Framework/interface/MakerMacros.h"
01415
01416
01417 DEFINE_FWK_MODULE(AlCaHOCalibProducer);
01418