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 GlobalVector magfld = theMagField->inInverseGeV(glbpt);
00730
00731
00732 SteppingHelixPropagator myHelix(&*theMagField,anyDirection);
00733 myHelix.setMaterialMode(false);
00734 myHelix.applyRadX0Correction(true);
00735
00736 double phiho = trkpos.phi();
00737 if (phiho<0) phiho +=2*pival;
00738
00739 int iphisect_dt=int(6*(phiho+pival/18.)/pival);
00740 if (iphisect_dt>=12) iphisect_dt=0;
00741
00742 int iphisect = -1;
00743
00744 int ipath = 0;
00745 for (int kl = 0; kl<=2; kl++) {
00746
00747 int iphisecttmp = (kl<2) ? iphisect_dt + kl : iphisect_dt - 1;
00748 if (iphisecttmp <0) iphisecttmp = 11;
00749 if (iphisecttmp >=12) iphisecttmp = 0;
00750
00751 double phipos = iphisecttmp*pival/6.;
00752 double phirot = phipos;
00753
00754 GlobalVector xLocal(-sin(phirot), cos(phirot), 0.);
00755
00756 GlobalVector yLocal(0., 0., 1.);
00757 GlobalVector zLocal = xLocal.cross(yLocal).unit();
00758
00759
00760
00761 FreeTrajectoryState freetrajectorystate_ = getFreeTrajectoryState(*ncosm,&(*theMagField), iiner, samedir);
00762
00763 Surface::RotationType rot(xLocal, yLocal, zLocal);
00764
00765 for (int ik=1; ik>=0; ik--) {
00766
00767 double radial = 407.0;
00768 if (ik==0) radial = 382.0;
00769
00770 Surface::PositionType pos(radial*cos(phipos), radial*sin(phipos), 0.);
00771 PlaneBuilder::ReturnType aPlane = PlaneBuilder().plane(pos,rot);
00772
00773 Surface* aPlane2 = new Plane(pos,rot);
00774
00775 SteppingHelixStateInfo steppingHelixstateinfo_ = myHelix.propagate(freetrajectorystate_, (*aPlane2));
00776
00777 if (steppingHelixstateinfo_.isValid()) {
00778
00779 GlobalVector hotrkpos2(steppingHelixstateinfo_.position().x(), steppingHelixstateinfo_.position().y(), steppingHelixstateinfo_.position().z());
00780 CLHEP::Hep3Vector hotrkdir2(steppingHelixstateinfo_.momentum().x(), steppingHelixstateinfo_.momentum().y(),steppingHelixstateinfo_.momentum().z());
00781
00782 LocalVector lclvt0 = (*aPlane).toLocal(hotrkpos2);
00783
00784 double xx = lclvt0.x();
00785 double yy = lclvt0.y();
00786
00787 if (ik ==1) {
00788 if ((std::abs(yy) < 130 && xx >-64.7 && xx <138.2)
00789 ||(std::abs(yy) > 130 && std::abs(yy) <700 && xx >-76.3 && xx <140.5)) {
00790 ipath = 1;
00791 iphisect = iphisecttmp;
00792 }
00793 }
00794
00795 if (iphisect != iphisecttmp) continue;
00796
00797 switch (ik)
00798 {
00799 case 0 :
00800 xhor0 = xx;
00801 yhor0 = yy;
00802 break;
00803 case 1 :
00804 xhor1 = xx;
00805 yhor1 = yy;
00806
00807 tmpHOCalib.hoang = CLHEP::Hep3Vector(zLocal.x(),zLocal.y(),zLocal.z()).dot(hotrkdir2.unit());
00808 break;
00809 default : break;
00810 }
00811 } else {
00812 break;
00813 }
00814 }
00815 if (ipath) break;
00816 }
00817 if (ipath) {
00818
00819 int ietaho = 50;
00820 int iphiho = -1;
00821
00822 for (int i=0; i<9; i++) {tmpHOCalib.hosig[i]=-100.0;}
00823 for (int i=0; i<18; i++) {tmpHOCalib.hocorsig[i]=-100.0;}
00824 for (int i=0; i<9; i++) {tmpHOCalib.hbhesig[i]=-100.0;}
00825 tmpHOCalib.hocro = -100;
00826 tmpHOCalib.htime = -1000;
00827
00828 int isect = 0;
00829
00830 findHOEtaPhi(iphisect, ietaho, iphiho);
00831
00832 if (ietaho !=0 && iphiho !=0 && std::abs(iring)<=2) {
00833 isect = 100*std::abs(ietaho+30)+std::abs(iphiho);
00834 if (std::abs(ietaho) >=netabin || iphiho<0) isect *=-1;
00835 if (std::abs(ietaho) >=netabin) isect -=1000000;
00836 if (iphiho<0) isect -=2000000;
00837 tmpHOCalib.isect = isect;
00838
00839 tmpHOCalib.hodx = localxhor1;
00840 tmpHOCalib.hody = localyhor1;
00841
00842 if (iring==0) {
00843 tmpHOCalib.hocorsig[8] = localxhor0;
00844 tmpHOCalib.hocorsig[9] = localyhor0;
00845 }
00846
00847 int etamn=-4;
00848 int etamx=4;
00849 if (iring==1) {etamn=5; etamx = 10;}
00850 if (iring==2) {etamn=11; etamx = 16;}
00851 if (iring==-1){etamn=-10; etamx = -5;}
00852 if (iring==-2){etamn=-16; etamx = -11;}
00853
00854 int phimn = 1;
00855 int phimx = 2;
00856 if (iring ==0) {
00857 phimx =2*int((iphiho+1)/2.);
00858 phimn = phimx - 1;
00859 } else {
00860 phimn = 3*int((iphiho+1)/3.) - 1;
00861 phimx = phimn + 2;
00862 }
00863
00864 if (phimn <1) phimn += nphimx;
00865 if (phimx >72) phimx -= nphimx;
00866
00867 int sigstr = m_startTS;
00868 int sigend = m_endTS;
00869
00870
00871
00872
00873
00874
00875 if (m_hbinfo) {
00876 for (int i=0; i<9; i++) {tmpHOCalib.hbhesig[i]=-100.0;}
00877
00878 if (m_digiInput) {
00879 if ((*hbhe).size() >0) {
00880 for (HBHEDigiCollection::const_iterator j=(*hbhe).begin(); j!=(*hbhe).end(); j++){
00881
00882
00883 HcalDetId id =(*j).id();
00884 int tmpeta= id.ieta();
00885 int tmpphi= id.iphi();
00886 m_coder = (*conditions_).getHcalCoder(id);
00887 calibped = conditions_->getHcalCalibrations(id);
00888
00889 int deta = tmpeta-ietaho;
00890 if (tmpeta==-1 && ietaho== 1) deta = -1;
00891 if (tmpeta== 1 && ietaho==-1) deta = 1;
00892 int dphi = tmpphi-iphiho;
00893 if (phimn >phimx) {
00894 if (dphi==71) dphi=-1;
00895 if (dphi==-71) dphi=1;
00896 }
00897
00898 int ipass2 = (std::abs(deta) <=1 && std::abs(dphi)<=1) ? 1 : 0;
00899
00900 if (ipass2 ==0 ) continue;
00901
00902 float tmpdata[nchnmx];
00903 for (int i=0; i<(*j).size() && i<nchnmx; i++) {
00904 tmpdata[i] = m_coder->charge(*m_shape,(*j).sample(i).adc(),(*j).sample(i).capid());
00905 }
00906
00907 float signal = 0;
00908 for (int i=1; i<(*j).size() && i<=8; i++) {
00909 signal += tmpdata[i] - calibped.pedestal((*j).sample(i).capid());;
00910 }
00911
00912 if (ipass2 == 1) {
00913 if (3*(deta+1)+dphi+1<9) tmpHOCalib.hbhesig[3*(deta+1)+dphi+1] = signal;
00914 }
00915 }
00916 }
00917
00918 } else {
00919
00920 edm::Handle<HBHERecHitCollection> hbheht;
00921 iEvent.getByLabel(hbheLabel_,hbheht);
00922
00923
00924 if ((*hbheht).size()>0) {
00925 if(!(*hbheht).size()) throw (int)(*hbheht).size();
00926
00927 for (HBHERecHitCollection::const_iterator j=(*hbheht).begin(); j!=(*hbheht).end(); j++){
00928
00929
00930 HcalDetId id =(*j).id();
00931 int tmpeta= id.ieta();
00932 int tmpphi= id.iphi();
00933
00934 int deta = tmpeta-ietaho;
00935 if (tmpeta==-1 && ietaho== 1) deta = -1;
00936 if (tmpeta== 1 && ietaho==-1) deta = 1;
00937 int dphi = tmpphi-iphiho;
00938 if (phimn >phimx) {
00939 if (dphi==71) dphi=-1;
00940 if (dphi==-71) dphi=1;
00941 }
00942
00943 int ipass2 = (std::abs(deta) <=1 && std::abs(dphi)<=1) ? 1 : 0;
00944 if ( ipass2 ==0 ) continue;
00945
00946 float signal = (*j).energy();
00947
00948 if (3*(deta+1)+dphi+1<9) tmpHOCalib.hbhesig[3*(deta+1)+dphi+1] = signal;
00949 }
00950 }
00951
00952 }
00953
00954 }
00955
00956 if (m_digiInput) {
00957 if ((*ho).size()>0) {
00958 int isFilled[netamx*nphimx];
00959 for (int j=0; j<netamx*nphimx; j++) {isFilled[j]=0;}
00960
00961 double sumEt = 0;
00962 double sumE = 0;
00963
00964 for (HODigiCollection::const_iterator j=(*ho).begin(); j!=(*ho).end(); j++){
00965
00966
00967
00968 HcalDetId id =(*j).id();
00969 int tmpeta= id.ieta();
00970 int tmpphi= id.iphi();
00971 m_coder = (*conditions_).getHcalCoder(id);
00972
00973 int ipass1 =0;
00974 if (tmpeta >=etamn && tmpeta <=etamx) {
00975 if (phimn < phimx) {
00976 ipass1 = (tmpphi >=phimn && tmpphi <=phimx ) ? 1 : 0;
00977 } else {
00978 ipass1 = (tmpphi==71 || tmpphi ==72 || tmpphi==1) ? 1 : 0;
00979 }
00980 }
00981
00982 int deta = tmpeta-ietaho;
00983 if (tmpeta==-1 && ietaho== 1) deta = -1;
00984 if (tmpeta== 1 && ietaho==-1) deta = 1;
00985
00986 int dphi = tmpphi -iphiho;
00987 if (phimn>phimx) {
00988 if (dphi==71) dphi=-1;
00989 if (dphi==-71) dphi=1;
00990 }
00991
00992 int ipass2 = (std::abs(deta) <=1 && std::abs(dphi)<=1) ? 1 : 0;
00993
00994 int tmpeta1 = (tmpeta>0) ? tmpeta -1 : -tmpeta +14;
00995
00996 float tmpdata[nchnmx]={0,0,0,0,0,0,0,0,0,0};
00997 float sigvall[nsigpk]={0,0,0,0,0,0,0};
00998
00999 for (int i=0; i<(*j).size() && i<nchnmx; i++) {
01000 tmpdata[i] = m_coder->charge(*m_shape,(*j).sample(i).adc(),(*j).sample(i).capid());
01001 if (deta==0 && dphi==0) {
01002 double tmpE = tmpdata[i] - pedestal[tmpeta1][tmpphi-1][(*j).sample(i).capid()];
01003 if (tmpE >0) {
01004 sumEt += i*tmpE;
01005 sumE += tmpE;
01006 }
01007 if (m_hotime) {
01008
01009 if (i>=7-nsigpk) {
01010 for (int ncap=0; ncap<nsigpk; ncap++) {
01011 if (i-ncap >= nstrbn && i-ncap <= nstrbn+3) {
01012 sigvall[ncap] +=tmpdata[i];
01013 }
01014 }
01015 }
01016 if (i==(*j).size()-1) {
01017 float mxled=-1;
01018 int imxled = 0;
01019 for (int ij=0; ij<nsigpk; ij++) {
01020 if (sigvall[ij] > mxled) {mxled = sigvall[ij]; imxled=ij;}
01021 }
01022 double pedx = 0.0;
01023 for (int ij=0; ij<4; ij++) {
01024 pedx +=pedestal[tmpeta1][tmpphi-1][ij];
01025 }
01026 if (mxled-pedx >2 && mxled-pedx <20 ) {
01027 hopeak[ntrgp_gm]->Fill(nphimx*tmpeta1 + tmpphi-1, imxled+nstrbn);
01028 for (int jk=0; jk<ntrgp_gm; jk++) {
01029 if (ntrgpas_gm[jk]>0) {
01030 hopeak[jk]->Fill(nphimx*tmpeta1 + tmpphi-1, imxled+nstrbn);
01031 }
01032 }
01033 if (tmpdata[5]+tmpdata[6] >1) {
01034 horatio->Fill(nphimx*tmpeta1 + tmpphi-1, (tmpdata[5]-tmpdata[6])/(tmpdata[5]+tmpdata[6]));
01035 }
01036 for (int ij=0; ij<(*j).size() && ij<nchnmx; ij++) {
01037 hotime[ntrgp_gm]->Fill(nphimx*nchnmx*tmpeta1 + nchnmx*(tmpphi-1) + ij, tmpdata[ij]);
01038 Nhotime[ntrgp_gm]->Fill(nphimx*nchnmx*tmpeta1 + nchnmx*(tmpphi-1) + ij, 1.);
01039 for (int jk=0; jk<ntrgp_gm; jk++) {
01040 if (ntrgpas_gm[jk]>0) {
01041 hotime[jk]->Fill(nphimx*nchnmx*tmpeta1 + nchnmx*(tmpphi-1) + ij, tmpdata[ij]);
01042 Nhotime[jk]->Fill(nphimx*nchnmx*tmpeta1 + nchnmx*(tmpphi-1) + ij, 1.);
01043 }
01044 }
01045 }
01046 }
01047 }
01048 }
01049 }
01050 }
01051
01052 if (std::abs(tmpeta) <=15 && deta==0 && dphi ==0) {
01053 float signal = 0;
01054 int icnt = 0;
01055 for (int i =0; i<nchnmx && i< (*j).size(); i++) {
01056 if (i >=sigstr && i<=sigend) continue;
01057 signal += tmpdata[i] - pedestal[tmpeta1][tmpphi-1][(*j).sample(i).capid()];
01058 if (++icnt >=4) break;
01059 }
01060 tmpHOCalib.hocro = signal;
01061 }
01062
01063 if (m_hotime) {
01064 if (ipass1 ==0 && ipass2 ==0 && cosmicmuon->size()<=2) {
01065 if (std::abs(ietaho) <=netabin && iphiho >0) {
01066 if ((iphiho >=1 && iphiho<=nphimx/2 && tmpphi >=1 && tmpphi <=nphimx/2) ||
01067 (iphiho >nphimx/2 && iphiho<=nphimx && tmpphi >nphimx/2 && tmpphi <=nphimx)) {
01068 if (isFilled[nphimx*tmpeta1+tmpphi-1]==0) {
01069 isFilled[nphimx*tmpeta1+tmpphi-1]=1;
01070 for (int i=0; i<(*j).size() && i<nchnmx; i++) {
01071 hopedtime->Fill(nphimx*nchnmx*tmpeta1 + nchnmx*(tmpphi-1) + i, tmpdata[i]);
01072 Nhopedtime->Fill(nphimx*nchnmx*tmpeta1 + nchnmx*(tmpphi-1) + i, 1.);
01073 hopedpr->Fill(nphimx*nchnmx*tmpeta1 + nchnmx*(tmpphi-1) + i, tmpdata[i]);
01074 }
01075 }
01076 }
01077 }
01078 }
01079 }
01080
01081 if (ipass1 ==0 && ipass2 ==0 ) continue;
01082
01083 float signal = 0;
01084 for (int i=sigstr; i<(*j).size() && i<=sigend; i++) {
01085 signal += tmpdata[i] - pedestal[tmpeta1][tmpphi-1][(*j).sample(i).capid()];
01086 }
01087 if (signal <-100 || signal >100000) signal = -100;
01088 if (m_hotime) {
01089 if (signal >-100 && Noccu == Noccu_old) {
01090 for (int i=0; i<5; i++) {
01091 if (signal >(i+2)*m_sigma) {
01092 ho_occupency[i]->Fill(nphimx*tmpeta1+tmpphi-1);
01093 }
01094 }
01095 }
01096 }
01097
01098 if (ipass1 ==0 && ipass2 ==0 ) continue;
01099
01100 if (ipass1 ==1) {
01101 int tmpdph = tmpphi-phimn;
01102 if (tmpdph<0) tmpdph = 2;
01103
01104 int ilog = 2*(tmpeta-etamn)+tmpdph;
01105 if (iring !=0) {
01106 if (iring >0) {
01107 ilog = 3*(tmpeta-etamn)+tmpdph;
01108 } else {
01109 ilog = 3*(etamx-tmpeta)+tmpdph;
01110 }
01111 }
01112 if (ilog>-1 && ilog<18) {
01113 tmpHOCalib.hocorsig[ilog] = signal;
01114 }
01115 }
01116
01117 if (ipass2 ==1) {
01118 if (3*(deta+1)+dphi+1<9) tmpHOCalib.hosig[3*(deta+1)+dphi+1] = signal;
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
01150 }
01151 tmpHOCalib.htime = sumEt/max(sumE,1.e-6);
01152 }
01153 } else {
01154 edm::Handle<HORecHitCollection> hoht;
01155 iEvent.getByLabel(hoLabel_,hoht);
01156
01157
01158 if ((*hoht).size()>0) {
01159 for (HORecHitCollection::const_iterator j=(*hoht).begin(); j!=(*hoht).end(); j++){
01160
01161
01162 HcalDetId id =(*j).id();
01163 int tmpeta= id.ieta();
01164 int tmpphi= id.iphi();
01165
01166 int ipass1 =0;
01167 if (tmpeta >=etamn && tmpeta <=etamx) {
01168 if (phimn < phimx) {
01169 ipass1 = (tmpphi >=phimn && tmpphi <=phimx ) ? 1 : 0;
01170 } else {
01171 ipass1 = (tmpphi==71 || tmpphi ==72 || tmpphi==1) ? 1 : 0;
01172 }
01173 }
01174
01175 int deta = tmpeta-ietaho;
01176 if (tmpeta==-1 && ietaho== 1) deta = -1;
01177 if (tmpeta== 1 && ietaho==-1) deta = 1;
01178
01179 int dphi = tmpphi -iphiho;
01180 if (phimn>phimx) {
01181 if (dphi==71) dphi=-1;
01182 if (dphi==-71) dphi=1;
01183 }
01184
01185 float signal = (*j).energy();
01186 if (m_hotime) {
01187 int tmpeta1 = (tmpeta>0) ? tmpeta -1 : -tmpeta +14;
01188 if (signal >-100 && Noccu == Noccu_old) {
01189 for (int i=0; i<5; i++) {
01190 if (signal >(i+2)*m_sigma) {
01191 ho_occupency[i]->Fill(nphimx*tmpeta1+tmpphi-1);
01192 }
01193 }
01194 }
01195 }
01196
01197 int ipass2 = (std::abs(deta) <=1 && std::abs(dphi)<=1) ? 1 : 0;
01198
01199 if (ipass1 ==0 && ipass2 ==0 ) continue;
01200
01201 if (ipass1 ==1) {
01202 int tmpdph = tmpphi-phimn;
01203 if (tmpdph<0) tmpdph = 2;
01204
01205 int ilog = 2*(tmpeta-etamn)+tmpdph;
01206 if (iring !=0) {
01207 if (iring >0) {
01208 ilog = 3*(tmpeta-etamn)+tmpdph;
01209 } else {
01210 ilog = 3*(etamx-tmpeta)+tmpdph;
01211 }
01212 }
01213 if (ilog>-1 && ilog<18) {
01214 tmpHOCalib.hocorsig[ilog] = signal;
01215 }
01216 }
01217
01218 if (ipass2 ==1) {
01219
01220 if (3*(deta+1)+dphi+1<9) {
01221 tmpHOCalib.hosig[3*(deta+1)+dphi+1] = signal;
01222 }
01223 }
01224
01225 if (deta==0 && dphi ==0) {
01226 tmpHOCalib.htime = (*j).time();
01227 int crphi = tmpphi + 6;
01228 if (crphi >72) crphi -=72;
01229
01230 for (HORecHitCollection::const_iterator jcr=(*hoht).begin(); jcr!=(*hoht).end(); jcr++){
01231 const HORecHit reccr = (const HORecHit)(*jcr);
01232 HcalDetId idcr =reccr.id();
01233 int etacr= idcr.ieta();
01234 int phicr= idcr.iphi();
01235 if (tmpeta==etacr && crphi ==phicr) {
01236
01237 tmpHOCalib.hocro = reccr.energy();
01238
01239 }
01240 }
01241 }
01242 }
01243 }
01244 }
01245
01246
01247 if (Noccu == Noccu_old) Noccu++;
01248 hostore->push_back(tmpHOCalib);
01249
01250 }
01251 }
01252
01253 }
01254 }
01255
01256 iEvent.put(hostore, "HOCalibVariableCollection");
01257
01258 }
01259
01260
01261 void
01262 AlCaHOCalibProducer::beginJob()
01263 {
01264
01265
01266
01267
01268 irunold = -1;
01269 nRuns = 0;
01270
01271
01272
01273
01274
01275
01276 for (int i=0; i<netamx; i++) {
01277 for (int j=0; j<nphimx; j++) {
01278 for (int k=0; k<ncidmx; k++) {
01279 pedestal[i][j][k]=0.0;
01280 }
01281 }
01282 }
01283
01284
01285 }
01286
01287
01288 void
01289 AlCaHOCalibProducer::endJob() {
01290
01291
01292 }
01293
01294 void AlCaHOCalibProducer::findHOEtaPhi(int iphisect, int& ietaho, int& iphiho) {
01295
01296
01297
01298 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};
01299 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};
01300
01301 double philow[6]={-76.27, -35.11, 0.35, 35.81, 71.77, 108.93};
01302 double phihgh[6]={-35.81, -0.35, 35.11, 71.07, 108.23, 140.49};
01303
01304 double philow00[6]={-60.27, -32.91, 0.35, 33.61, 67.37, 102.23};
01305 double phihgh00[6]={-33.61, -0.35, 32.91, 66.67, 101.53, 129.49};
01306
01307 double philow01[6]={-64.67, -34.91, 0.35, 35.61, 71.37, 108.33};
01308 double phihgh01[6]={-35.61, -0.35, 34.91, 70.67, 107.63, 138.19};
01309
01310
01311 iring = -10;
01312
01313 double tmpdy = std::abs(yhor1);
01314 for (int i=0; i<netabin; i++) {
01315 if (tmpdy >etalow[i] && tmpdy <etahgh[i]) {
01316 ietaho = i+1;
01317 float tmp1 = fabs(tmpdy-etalow[i]);
01318 float tmp2 = fabs(tmpdy-etahgh[i]);
01319
01320 localyhor1 = (tmp1 < tmp2) ? -tmp1 : tmp2;
01321
01322 if (i<4) iring =0;
01323 if (i>=4 && i<10) iring=1;
01324 if (i>=10 && i<netabin) iring=2;
01325 break;
01326 }
01327 }
01328
01329 int tmpphi = 0;
01330 int tmpphi0 = 0;
01331
01332 if (ietaho >4) {
01333 for (int i=0; i<6; i++) {
01334 if (xhor1 >philow[i] && xhor1 <phihgh[i]) {
01335 tmpphi=i+1;
01336 float tmp1 = fabs(xhor1-philow[i]);
01337 float tmp2 = fabs(xhor1-phihgh[i]);
01338 localxhor1 = (tmp1 < tmp2) ? -tmp1 : tmp2;
01339 break;
01340 }
01341 }
01342 } else {
01343 for (int i=0; i<6; i++) {
01344 if (xhor1 >philow01[i] && xhor1 <phihgh01[i]) {
01345 tmpphi=i+1;
01346 float tmp1 = fabs(xhor1-philow01[i]);
01347 float tmp2 = fabs(xhor1-phihgh01[i]);
01348 localxhor1 = (tmp1 < tmp2) ? -tmp1 : tmp2;
01349 break;
01350 }
01351 }
01352
01353 for (int i=0; i<6; i++) {
01354 if (xhor0 >philow00[i] && xhor0 <phihgh00[i]) {
01355 tmpphi0=i+1;
01356 float tmp1 = fabs(xhor0-philow00[i]);
01357 float tmp2 = fabs(xhor0-phihgh00[i]);
01358 localxhor0 = (tmp1 < tmp2) ? -tmp1 : tmp2;
01359 if (tmpphi !=tmpphi0) localxhor0 +=10000.;
01360 break;
01361 }
01362 }
01363
01364 double tmpdy = std::abs(yhor0);
01365 for (int i=0; i<4; i++) {
01366 if (tmpdy >etalow[i] && tmpdy <etahgh[i]) {
01367 float tmp1 = fabs(tmpdy-etalow[i]);
01368 float tmp2 = fabs(tmpdy-etahgh[i]);
01369 localyhor0 = (tmp1 < tmp2) ? -tmp1 : tmp2;
01370 if (i+1 != ietaho) localyhor0 +=10000.;
01371 break;
01372 }
01373 }
01374 }
01375
01376 if (tmpphi!=0) {
01377 iphiho = 6*iphisect -2 + tmpphi;
01378 if (iphiho <=0) iphiho +=nphimx;
01379 if (iphiho >nphimx) iphiho -=nphimx;
01380 }
01381
01382
01383
01384 if (yhor1 <0) {
01385 if (std::abs(ietaho) >netabin) {
01386 ietaho +=1;
01387 } else {
01388 ietaho *=-1;
01389 }
01390
01391 iring *=-1;
01392 }
01393 }
01394
01395 FreeTrajectoryState AlCaHOCalibProducer::getFreeTrajectoryState( const reco::Track& tk, const MagneticField* field, int iiner, bool dir)
01396 {
01397
01398 if (iiner ==0) {
01399 GlobalPoint gpos( tk.outerX(), tk.outerY(), tk.outerZ());
01400 GlobalVector gmom( tk.outerPx(), tk.outerPy(), tk.outerPz());
01401 if (dir) gmom *=-1.;
01402 GlobalTrajectoryParameters par( gpos, gmom, tk.charge(), field);
01403 CurvilinearTrajectoryError err( tk.extra()->outerStateCovariance());
01404 return FreeTrajectoryState( par, err);
01405 } else {
01406 GlobalPoint gpos( tk.innerPosition().X(), tk.innerPosition().Y(), tk.innerPosition().Z());
01407 GlobalVector gmom( tk.innerMomentum().X(), tk.innerMomentum().Y(), tk.innerMomentum().Z());
01408 if (dir) gmom *=-1.;
01409 GlobalTrajectoryParameters par( gpos, -gmom, tk.charge(), field);
01410 CurvilinearTrajectoryError err( tk.extra()->innerStateCovariance());
01411 return FreeTrajectoryState( par, err);
01412 }
01413
01414 }
01415
01416 #include "FWCore/Framework/interface/MakerMacros.h"
01417
01418
01419 DEFINE_FWK_MODULE(AlCaHOCalibProducer);
01420