Go to the documentation of this file.00001
00002
00003
00004
00005
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <memory>
00021 #include <vector>
00022 #include <iostream>
00023 #include <TMath.h>
00024 #include <TRandom3.h>
00025
00026
00027 #include "FWCore/Framework/interface/Frameworkfwd.h"
00028 #include "FWCore/Framework/interface/EDProducer.h"
00029 #include "FWCore/Framework/interface/Event.h"
00030 #include "FWCore/Framework/interface/MakerMacros.h"
00031 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00032 #include "DataFormats/Math/interface/Point3D.h"
00033
00034
00035 #include "DataFormats/HcalRecHit/interface/CastorRecHit.h"
00036 #include "DataFormats/HcalDetId/interface/HcalCastorDetId.h"
00037 #include "DataFormats/CastorReco/interface/CastorTower.h"
00038 #include "DataFormats/CastorReco/interface/CastorCluster.h"
00039 #include "DataFormats/Candidate/interface/CandidateFwd.h"
00040 #include "DataFormats/Candidate/interface/Candidate.h"
00041 #include "DataFormats/JetReco/interface/BasicJet.h"
00042 #include "DataFormats/JetReco/interface/BasicJetCollection.h"
00043 #include "DataFormats/JetReco/interface/Jet.h"
00044
00045
00046
00047
00048
00049
00050
00051 class CastorClusterProducer : public edm::EDProducer {
00052 public:
00053 explicit CastorClusterProducer(const edm::ParameterSet&);
00054 ~CastorClusterProducer();
00055
00056 private:
00057 virtual void beginJob() ;
00058 virtual void produce(edm::Event&, const edm::EventSetup&);
00059 double phiangle (double testphi);
00060 virtual void endJob() ;
00061
00062
00063 typedef math::XYZPointD Point;
00064 typedef ROOT::Math::RhoEtaPhiPoint TowerPoint;
00065 typedef ROOT::Math::RhoZPhiPoint CellPoint;
00066 typedef std::vector<reco::CastorTower> CastorTowerCollection;
00067 typedef std::vector<reco::CastorCluster> CastorClusterCollection;
00068 std::string input_, basicjets_;
00069 bool clusteralgo_;
00070 };
00071
00072
00073
00074
00075
00076 const double MYR2D = 180/M_PI;
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086 CastorClusterProducer::CastorClusterProducer(const edm::ParameterSet& iConfig) :
00087 input_(iConfig.getUntrackedParameter<std::string>("inputtowers","")),
00088 basicjets_(iConfig.getUntrackedParameter<std::string>("basicjets","")),
00089 clusteralgo_(iConfig.getUntrackedParameter<bool>("ClusterAlgo",false))
00090 {
00091
00092 produces<CastorClusterCollection>();
00093
00094 }
00095
00096
00097 CastorClusterProducer::~CastorClusterProducer()
00098 {
00099
00100
00101 }
00102
00103
00104
00105
00106
00107
00108
00109 void CastorClusterProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
00110
00111 using namespace edm;
00112 using namespace reco;
00113 using namespace TMath;
00114
00115 LogDebug("CastorClusterProducer")
00116 <<"3. entering CastorClusterProducer";
00117
00118 if ( input_ != "") {
00119
00120
00121
00122 edm::Handle<CastorTowerCollection> InputTowers;
00123 iEvent.getByLabel(input_, InputTowers);
00124
00125 std::auto_ptr<CastorClusterCollection> OutputClustersfromClusterAlgo (new CastorClusterCollection);
00126
00127
00128 int nTowers = InputTowers->size();
00129
00130 if (nTowers==0) LogDebug("CastorClusterProducer")<<"Warning: You are trying to run the Cluster algorithm with 0 input towers.";
00131
00132 CastorTowerRefVector posInputTowers, negInputTowers;
00133
00134 for (size_t i = 0; i < InputTowers->size(); ++i) {
00135 reco::CastorTowerRef tower_p = reco::CastorTowerRef(InputTowers, i);
00136 if (tower_p->eta() > 0.) posInputTowers.push_back(tower_p);
00137 if (tower_p->eta() < 0.) negInputTowers.push_back(tower_p);
00138 }
00139
00140
00141 if (clusteralgo_ == true) {
00142
00143 iEvent.put(OutputClustersfromClusterAlgo);
00144 }
00145
00146 }
00147
00148 if ( basicjets_ != "") {
00149
00150 Handle<BasicJetCollection> bjCollection;
00151 iEvent.getByLabel(basicjets_,bjCollection);
00152
00153 Handle<CastorTowerCollection> ctCollection;
00154 iEvent.getByLabel("CastorTowerReco",ctCollection);
00155
00156 std::auto_ptr<CastorClusterCollection> OutputClustersfromBasicJets (new CastorClusterCollection);
00157
00158 if (bjCollection->size()==0) LogDebug("CastorClusterProducer")<< "Warning: You are trying to run the Cluster algorithm with 0 input basicjets.";
00159
00160 for (unsigned i=0; i< bjCollection->size();i++) {
00161 const BasicJet* bj = &(*bjCollection)[i];
00162
00163 double energy = bj->energy();
00164 TowerPoint temp(88.5,bj->eta(),bj->phi());
00165 Point position(temp);
00166 double emEnergy = 0.;
00167 double hadEnergy = 0.;
00168 double width = 0.;
00169 double depth = 0.;
00170 double fhot = 0.;
00171 double sigmaz = 0.;
00172 CastorTowerRefVector usedTowers;
00173 double zmean = 0.;
00174 double z2mean = 0.;
00175
00176 std::vector<CandidatePtr> ccp = bj->getJetConstituents();
00177 std::vector<CandidatePtr>::const_iterator itParticle;
00178 for (itParticle=ccp.begin();itParticle!=ccp.end();++itParticle){
00179 const CastorTower* castorcand = dynamic_cast<const CastorTower*>(itParticle->get());
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189 size_t thisone = 0;
00190 for (size_t l=0;l<ctCollection->size();l++) {
00191 const CastorTower ct = (*ctCollection)[l];
00192 if ( std::abs(ct.phi() - castorcand->phi()) < 0.0001 ) { thisone = l;}
00193 }
00194
00195 CastorTowerRef towerref(ctCollection,thisone);
00196 usedTowers.push_back(towerref);
00197 emEnergy += castorcand->emEnergy();
00198 hadEnergy += castorcand->hadEnergy();
00199 depth += castorcand->depth()*castorcand->energy();
00200 width += pow(phiangle(castorcand->phi() - bj->phi()),2)*castorcand->energy();
00201 fhot += castorcand->fhot()*castorcand->energy();
00202
00203
00204 for (edm::RefVector<edm::SortedCollection<CastorRecHit> >::iterator it = castorcand->rechitsBegin(); it != castorcand->rechitsEnd(); it++) {
00205 edm::Ref<edm::SortedCollection<CastorRecHit> > rechit_p = *it;
00206 double Erechit = rechit_p->energy();
00207 HcalCastorDetId id = rechit_p->id();
00208 int module = id.module();
00209 double zrechit = 0;
00210 if (module < 3) zrechit = -14390 - 24.75 - 49.5*(module-1);
00211 if (module > 2) zrechit = -14390 - 99 - 49.5 - 99*(module-3);
00212 zmean += Erechit*zrechit;
00213 z2mean += Erechit*zrechit*zrechit;
00214 }
00215 }
00216
00217
00218 depth = depth/energy;
00219 width = sqrt(width/energy);
00220 fhot = fhot/energy;
00221
00222 zmean = zmean/energy;
00223 z2mean = z2mean/energy;
00224 double sigmaz2 = z2mean - zmean*zmean;
00225 if(sigmaz2 > 0) sigmaz = sqrt(sigmaz2);
00226
00227 CastorCluster cc(energy,position,emEnergy,hadEnergy,emEnergy/energy,width,depth,fhot,sigmaz,usedTowers);
00228 OutputClustersfromBasicJets->push_back(cc);
00229 }
00230
00231 iEvent.put(OutputClustersfromBasicJets);
00232
00233 }
00234
00235 }
00236
00237
00238 double CastorClusterProducer::phiangle (double testphi) {
00239 double phi = testphi;
00240 while (phi>M_PI) phi -= (2*M_PI);
00241 while (phi<-M_PI) phi += (2*M_PI);
00242 return phi;
00243 }
00244
00245
00246 void CastorClusterProducer::beginJob() {
00247 LogDebug("CastorClusterProducer")
00248 <<"Starting CastorClusterProducer";
00249 }
00250
00251
00252 void CastorClusterProducer::endJob() {
00253 LogDebug("CastorClusterProducer")
00254 <<"Ending CastorClusterProducer";
00255 }
00256
00257
00258 DEFINE_FWK_MODULE(CastorClusterProducer);