CMS 3D CMS Logo

HcalForwardAnalysis.cc
Go to the documentation of this file.
1 // system include files
2 #include <cmath>
3 #include <iostream>
4 #include <iomanip>
5 
6 // user include files
8 
12 
14 
20 
21 #include "G4SDManager.hh"
22 #include "G4VProcess.hh"
23 #include "G4HCofThisEvent.hh"
24 #include "CLHEP/Units/GlobalSystemOfUnits.h"
25 #include "CLHEP/Units/GlobalPhysicalConstants.h"
26 
28  edm::ParameterSet m_SLP = p.getParameter<edm::ParameterSet>("HFShowerLibraryProducer");
29  theNames = m_SLP.getParameter<std::vector<std::string> >("Names");
30  //LibVer = m_HS.getParameter<std::string> ("LibVer");
31  //produces<HFShowerPhotonCollection> ();
32  init();
33  theEventCounter = 0;
34  nphot = 0;
35  for (int i = 0; i < 10000; ++i) {
36  x[i] = 0.;
37  y[i] = 0.;
38  z[i] = 0.;
39  t[i] = 0.;
40  lambda[i] = 0.;
41  fiberId[i] = 0;
42  }
43  primX = primY = primZ = primT = 0.;
44  primMomX = primMomY = primMomZ = 0.;
45 }
46 
48 
49 //
50 // member functions
51 //
52 
54  //std::auto_ptr<HFShowerPhotonCollection> product(new HFShowerPhotonCollection);
55  //edm::LogInfo("HcalForwardLib") << "HcalForwardAnalysis: =====> Filling event";
56  //fillEvent(*product);
57  //iEvent.put(product);
58  //std::auto_ptr<PHcalForwardLibInfo> product(new PHcalForwardLibInfo);
59  //fillEvent(*product);
60  fillEvent();
61  //iEvent.put(product);
62 }
63 
65  theTree = theFile->make<TTree>("CherenkovPhotons", "Cherenkov Photons");
66  theTree->Branch("nphot", &nphot, "nphot/I");
67  theTree->Branch("x", &x, "x[nphot]/F");
68  theTree->Branch("y", &y, "y[nphot]/F");
69  theTree->Branch("z", &z, "z[nphot]/F");
70  theTree->Branch("t", &t, "t[nphot]/F");
71  theTree->Branch("lambda", &lambda, "lambda[nphot]/F");
72  theTree->Branch("fiberId", &fiberId, "fiberId[nphot]/I");
73  theTree->Branch("primX", &primX, "primX/F");
74  theTree->Branch("primY", &primY, "primY/F");
75  theTree->Branch("primZ", &primZ, "primZ/F");
76  theTree->Branch("primMomX", &primMomX, "primMomX/F");
77  theTree->Branch("primMomY", &primMomY, "primMomY/F");
78  theTree->Branch("primMomZ", &primMomZ, "primMomZ/F");
79  theTree->Branch("primT", &primT, "primT/F");
80 
81  // counter
82  count = 0;
83  evNum = 0;
84  clear();
85 }
86 
88  int irun = (*run)()->GetRunID();
89  edm::LogInfo("HcalForwardLib") << " =====> Begin of Run = " << irun;
90 }
91 
93  evNum = (*evt)()->GetEventID();
94  clear();
95  edm::LogInfo("HcalForwardLib") << "HcalForwardAnalysis: =====> Begin of event = " << evNum;
96 }
97 
98 void HcalForwardAnalysis::update(const G4Step* aStep) {}
99 
101  count++;
102 
103  //fill the buffer
104  LogDebug("HcalForwardLib") << "HcalForwardAnalysis::Fill event " << (*evt)()->GetEventID();
105  setPhotons(evt);
106 
107  int iEvt = (*evt)()->GetEventID();
108  if (iEvt < 10)
109  edm::LogInfo("HcalForwardLib") << "HcalForwardAnalysis:: Event " << iEvt;
110  else if ((iEvt < 100) && (iEvt % 10 == 0))
111  edm::LogInfo("HcalForwardLib") << "HcalForwardAnalysis:: Event " << iEvt;
112  else if ((iEvt < 1000) && (iEvt % 100 == 0))
113  edm::LogInfo("HcalForwardLib") << "HcalForwardAnalysis:: Event " << iEvt;
114  else if ((iEvt < 10000) && (iEvt % 1000 == 0))
115  edm::LogInfo("HcalForwardLib") << "HcalForwardAnalysis:: Event " << iEvt;
116 }
117 
119  int idHC, j;
120  FiberG4HitsCollection* theHC;
121  // Look for the Hit Collection of HCal
122  G4HCofThisEvent* allHC = (*evt)()->GetHCofThisEvent();
123  std::string sdName = theNames[0]; //name for fiber hits
124  idHC = G4SDManager::GetSDMpointer()->GetCollectionID(sdName);
125  theHC = (FiberG4HitsCollection*)allHC->GetHC(idHC);
126  LogDebug("HcalForwardLib") << "HcalForwardAnalysis::setPhotons() Hit Collection for " << sdName << " of ID " << idHC
127  << " is obtained at " << theHC;
128  std::vector<HFShowerPhoton> ShortFiberPhotons;
129  std::vector<HFShowerPhoton> LongFiberPhotons;
130  LongFiberPhotons.clear();
131  ShortFiberPhotons.clear();
132  if (idHC >= 0 && theHC != nullptr) {
133  std::cout << "FiberhitSize " << theHC->entries() << std::endl;
134  for (j = 0; j < theHC->entries(); j++) {
135  FiberG4Hit* aHit = (*theHC)[j];
136  std::vector<HFShowerPhoton> thePhotonsFromHit = aHit->photon();
137  std::cout << "Fiberhit " << j << " has " << thePhotonsFromHit.size() << " photons." << std::endl;
138  int fTowerId = -1;
139  int fCellId = -1;
140  int fFiberId = -1;
141  parseDetId(aHit->towerId(), fTowerId, fCellId, fFiberId);
142  for (unsigned int iph = 0; iph < thePhotonsFromHit.size(); ++iph) {
143  if (aHit->depth() == 1)
144  LongFiberPhotons.push_back(thePhotonsFromHit[iph]);
145  if (aHit->depth() == 2)
146  ShortFiberPhotons.push_back(thePhotonsFromHit[iph]);
147  }
148  LogDebug("HcalForwardLib") << "HcalForwardAnalysis::setPhotons() NbPhotons " << thePhotonsFromHit.size()
149  << " towerId " << fTowerId << " cellId " << fCellId << " fiberId " << fFiberId
150  << " depth " << aHit->depth();
151  }
152  } else {
153  LogDebug("HcalForwardLib") << "HcalForwardAnalysis::setPhotons(): No Photons!";
154  return;
155  }
156  LogDebug("HcalForwardLib") << "HcalForwardAnalysis::setPhotons() LongFibPhotons: " << LongFiberPhotons.size()
157  << " ShortFibPhotons: " << ShortFiberPhotons.size();
158  std::cout << "HcalForwardAnalysis::setPhotons() LongFibPhotons: " << LongFiberPhotons.size()
159  << " ShortFibPhotons: " << ShortFiberPhotons.size() << std::endl;
160 
161  //Chamber hits to find information about primary particle on surface
162  HFShowerG4HitsCollection* theChamberHC;
163  G4HCofThisEvent* allChamberHC = (*evt)()->GetHCofThisEvent();
164  sdName = theNames[1];
165  idHC = G4SDManager::GetSDMpointer()->GetCollectionID(sdName);
166  theChamberHC = (HFShowerG4HitsCollection*)allChamberHC->GetHC(idHC);
167  math::XYZPoint primPosOnSurf(0, 0, 0);
168  math::XYZPoint primMomDirOnSurf(0, 0, 0);
169  float primTimeOnSurf = 0;
170  // the chamber hit is for primary particle, but step size can be small
171  // (in newer Geant4 versions) and as a result primary particle may have
172  // multiple hits. We want to take last one which is close the HF absorber
173  if (idHC >= 0 && theChamberHC != nullptr) {
174  LogDebug("HcalForwardLib") << "HcalForwardAnalysis::setPhotons() Chamber Hits size: " << theChamberHC->entries();
175  for (j = 0; j < theChamberHC->entries(); ++j) {
176  HFShowerG4Hit* aHit = (*theChamberHC)[j];
177  LogDebug("HcalForwardLib") << "HcalForwardAnalysis::setPhotons() Chamber Hit id " << aHit->hitId() << " track id "
178  << aHit->trackId() << " prim. pos. " << aHit->globalPosition() << " prom mom. dir. "
179  << aHit->primaryMomDir() << " time " << aHit->time();
180  primPosOnSurf.SetXYZ(aHit->globalPosition().x(), aHit->globalPosition().y(), aHit->globalPosition().z());
181  primMomDirOnSurf.SetXYZ(aHit->primaryMomDir().x(), aHit->primaryMomDir().y(), aHit->primaryMomDir().z());
182  primTimeOnSurf = aHit->time();
183  }
184  } else {
185  LogDebug("HcalForwardLib") << "HcalForwardAnalysis::setPhotons(): No Chamber hits. Something is wrong!";
186  return;
187  }
188  primX = primPosOnSurf.x();
189  primY = primPosOnSurf.y();
190  primZ = primPosOnSurf.z();
191  primT = primTimeOnSurf;
192  primMomX = primMomDirOnSurf.x();
193  primMomY = primMomDirOnSurf.y();
194  primMomZ = primMomDirOnSurf.z();
195  //production point of Cherenkov photons in long fibers w.r.t local coordinates
196  float photonProdX = 0.;
197  float photonProdY = 0.;
198  float photonProdZ = 0.;
199  float photonProdTime = 0.;
200  //angles for rotation matrices
201  double theta = primMomDirOnSurf.theta();
202  double phi = primMomDirOnSurf.phi();
203 
204  for (unsigned int k = 0; k < LongFiberPhotons.size(); ++k) {
205  HFShowerPhoton aPhoton = LongFiberPhotons[k];
206  photonProdX = aPhoton.x() * cos(theta) * cos(phi) + aPhoton.y() * cos(theta) * sin(phi) - aPhoton.z() * sin(theta) -
207  primPosOnSurf.x();
208  photonProdY = -aPhoton.x() * sin(phi) + aPhoton.y() * cos(phi) - primPosOnSurf.y();
209  photonProdZ = aPhoton.x() * sin(theta) * cos(phi) + aPhoton.y() * sin(theta) * sin(phi) + aPhoton.z() * cos(theta) -
210  primPosOnSurf.z();
211  photonProdTime = aPhoton.t() - primTimeOnSurf;
212  thePhotons.push_back(Photon(1, photonProdX, photonProdY, photonProdZ, photonProdTime, aPhoton.lambda()));
213  }
214  for (unsigned int k = 0; k < ShortFiberPhotons.size(); ++k) {
215  HFShowerPhoton aPhoton = ShortFiberPhotons[k];
216  photonProdX = aPhoton.x() * cos(theta) * cos(phi) + aPhoton.y() * cos(theta) * sin(phi) - aPhoton.z() * sin(theta) -
217  primPosOnSurf.x();
218  photonProdY = -aPhoton.x() * sin(phi) + aPhoton.y() * cos(phi) - primPosOnSurf.y();
219  photonProdZ = aPhoton.x() * sin(theta) * cos(phi) + aPhoton.y() * sin(theta) * sin(phi) + aPhoton.z() * cos(theta) -
220  primPosOnSurf.z();
221  photonProdTime = aPhoton.t() - primTimeOnSurf;
222  thePhotons.push_back(Photon(2, photonProdX, photonProdY, photonProdZ, photonProdTime, aPhoton.lambda()));
223  }
224 }
226  /*
227  edm::LogInfo("HcalForwardLib") << "HcalForwardAnalysis: =====> filledEvent";
228  */
229  nphot = int(thePhotons.size());
230  for (int i = 0; i < nphot; ++i) {
231  x[i] = thePhotons[i].x;
232  y[i] = thePhotons[i].y;
233  z[i] = thePhotons[i].z;
234  t[i] = thePhotons[i].t;
235  lambda[i] = thePhotons[i].lambda;
236  fiberId[i] = thePhotons[i].fiberId;
237  }
238  theTree->Fill();
239 }
240 void HcalForwardAnalysis::parseDetId(int id, int& tower, int& cell, int& fiber) {
241  tower = id / 10000;
242  cell = id / 10 - tower * 10;
243  fiber = id - tower * 10000 - cell * 10;
244 }
245 
247  nphot = 0;
248  for (int i = 0; i < 10000; ++i) {
249  x[i] = 0.;
250  y[i] = 0.;
251  z[i] = 0.;
252  t[i] = 0.;
253  lambda[i] = 0.;
254  fiberId[i] = 0;
255  }
256  primX = primY = primZ = primT = 0.;
257  primMomX = primMomY = primMomZ = 0.;
258 
259  thePhotons.clear();
260 }
#define LogDebug(id)
T getParameter(std::string const &) const
G4ThreeVector primaryMomDir() const
Definition: HFShowerG4Hit.h:52
G4int depth() const
Definition: FiberG4Hit.h:45
G4int hitId() const
Definition: HFShowerG4Hit.h:46
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
Geom::Theta< T > theta() const
T * make(const Args &...args) const
make new ROOT object
Definition: TFileService.h:64
void setPhotons(const EndOfEvent *evt)
int iEvent
Definition: GenABIO.cc:224
float t() const
std::vector< Photon > thePhotons
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
G4int towerId() const
Definition: FiberG4Hit.h:44
G4int trackId() const
Definition: HFShowerG4Hit.h:47
std::vector< HFShowerPhoton > photon() const
Definition: FiberG4Hit.h:50
float z() const
float lambda() const
void update(const BeginOfRun *run) override
This routine will be called when the appropriate signal arrives.
edm::Service< TFileService > theFile
float x() const
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
std::vector< std::string > theNames
G4THitsCollection< FiberG4Hit > FiberG4HitsCollection
Definition: FiberG4Hit.h:54
G4ThreeVector globalPosition() const
Definition: HFShowerG4Hit.h:51
HcalForwardAnalysis(const edm::ParameterSet &p)
G4double time() const
Definition: HFShowerG4Hit.h:49
G4THitsCollection< HFShowerG4Hit > HFShowerG4HitsCollection
Definition: HFShowerG4Hit.h:55
void parseDetId(int id, int &tower, int &cell, int &fiber)
float y() const
void produce(edm::Event &, const edm::EventSetup &) override