29 #include "G4SDManager.hh"
33 #include "G4PrimaryVertex.hh"
34 #include "G4VProcess.hh"
35 #include "G4HCofThisEvent.hh"
36 #include "G4UserEventAction.hh"
38 #include <CLHEP/Units/GlobalSystemOfUnits.h>
39 #include <CLHEP/Units/GlobalPhysicalConstants.h>
40 #include <CLHEP/Random/Randomize.h>
49 #include "TLorentzVector.h"
50 #include "TUnixSystem.h"
69 public Observer<const BeginOfEvent *>,
152 edm::LogVerbatim(
"ForwardSim") <<
"============================================================================";
153 edm::LogVerbatim(
"ForwardSim") <<
"CastorTestAnalysis:: Initialized as observer";
154 if (doNTcastorstep > 0) {
158 if (doNTcastorevent > 0) {
162 edm::LogVerbatim(
"ForwardSim") <<
"============================================================================";
165 if (doNTcastorstep > 0)
167 new TNtuple(
"NTcastorstep",
"NTcastorstep",
"evt:trackid:charge:pdgcode:x:y:z:stepl:stepe:eta:phi:vpx:vpy:vpz");
169 if (doNTcastorevent > 0)
171 "NTcastorevent",
"NTcastorevent",
"evt:ihit:detector:sector:module:enem:totalenergy:hitenergy:x:y:z");
190 edm::LogVerbatim(
"ForwardSim") << std::endl <<
"CastorTestAnalysis: Starting Run";
192 edm::LogVerbatim(
"ForwardSim") <<
"CastorTestAnalysis: output step root file created";
198 edm::LogVerbatim(
"ForwardSim") <<
"CastorTestAnalysis: output event root file created";
216 G4StepPoint *preStepPoint = aStep->GetPreStepPoint();
218 G4double stepL = aStep->GetStepLength();
219 G4double stepE = aStep->GetTotalEnergyDeposit();
224 G4Track *theTrack = aStep->GetTrack();
225 G4int theTrackID = theTrack->GetTrackID();
226 G4double theCharge = theTrack->GetDynamicParticle()->GetCharge();
228 G4int pdgcode = theTrack->GetDefinition()->GetPDGEncoding();
230 const G4ThreeVector &vert_mom = theTrack->GetVertexMomentumDirection();
231 G4double vpx = vert_mom.x();
232 G4double vpy = vert_mom.y();
233 G4double vpz = vert_mom.z();
234 double eta = 0.5 *
log((1. + vpz) / (1. - vpz));
235 double phi = atan2(vpy, vpx);
237 const G4ThreeVector &hitPoint = preStepPoint->GetPosition();
282 if (theTrack->GetNextVolume() != 0)
283 edm::LogVerbatim(
"ForwardSim") <<
" NextVolume: " << theTrack->GetNextVolume()->GetName();
297 <<
"CastorTest::update(EndOfEvent * evt) - event #" << (*evt)()->GetEventID();
300 G4HCofThisEvent *allHC = (*evt)()->GetHCofThisEvent();
303 int CAFIid = G4SDManager::GetSDMpointer()->GetCollectionID(
"CastorFI");
327 if (theCAFI->entries() > 0)
335 G4PrimaryParticle *thePrim =
nullptr;
336 G4int nvertex = (*evt)()->GetNumberOfPrimaryVertex();
339 edm::LogVerbatim(
"ForwardSim") <<
"CASTORTest End Of Event ERROR: no vertex";
341 for (
int i = 0;
i < nvertex;
i++) {
342 G4PrimaryVertex *avertex = (*evt)()->GetPrimaryVertex(
i);
343 if (avertex ==
nullptr)
344 edm::LogVerbatim(
"ForwardSim") <<
"CASTORTest End Of Event ERR: pointer to vertex = 0";
346 int npart = avertex->GetNumberOfParticle();
348 edm::LogVerbatim(
"ForwardSim") <<
"CASTORTest End Of Event ERR: no primary!";
349 if (thePrim ==
nullptr)
350 thePrim = avertex->GetPrimary(trackID);
353 double px = 0., py = 0., pz = 0., pInit = 0;
355 double eta = 0.,
phi = 0.;
357 if (thePrim !=
nullptr) {
358 px = thePrim->GetPx();
359 py = thePrim->GetPy();
360 pz = thePrim->GetPz();
363 edm::LogVerbatim(
"ForwardSim") <<
"CASTORTest End Of Event ERR: primary has p=0 ";
366 float costheta = pz / pInit;
368 eta = -
log(
tan(theta / 2));
375 particleType = thePrim->GetPDGcode();
378 edm::LogVerbatim(
"ForwardSim") <<
"CASTORTest End Of Event ERR: could not find primary ";
381 edm::LogVerbatim(
"ForwardSim") <<
"CastorTestAnalysis: Particle Type " << particleType <<
" p/eta/phi " << pInit
382 <<
", " << eta <<
", " <<
phi;
386 int iEvt = (*evt)()->GetEventID();
389 else if ((iEvt < 100) && (iEvt % 10 == 0))
391 else if ((iEvt < 1000) && (iEvt % 100 == 0))
393 else if ((iEvt < 10000) && (iEvt % 1000 == 0))
396 edm::LogVerbatim(
"ForwardSim") << std::endl <<
"===>>> Done writing user histograms ";
403 int nentries = hc->entries();
406 unsigned int volumeID = 0;
407 int det = 0,
zside, sector, zmodule;
408 std::map<int, float, std::less<int> > themap;
409 double totalEnergy = 0;
410 double hitEnergy = 0;
411 double en_in_sd = 0.;
413 for (
int ihit = 0; ihit < nentries; ihit++) {
418 for (
int ihit = 0; ihit < nentries; ihit++) {
461 edm::LogVerbatim(
"ForwardSim") <<
"CastorTestAnalysis: Ntuple step written";
469 edm::LogVerbatim(
"ForwardSim") <<
"CastorTestAnalysis: Ntuple event written";
Log< level::Info, true > LogVerbatim
#define DEFINE_SIMWATCHER(type)
math::XYZPoint getPosition() const
static std::vector< std::string > checklist log
~CastorTestAnalysis() override
Float_t castoreventarray[11]
TNtuple * castoreventntuple
TNtuple * castorstepntuple
Geom::Theta< T > theta() const
static void unpackIndex(const uint32_t &idx, int &z, int §or, int &zmodule)
CastorNumberingScheme * theCastorNumScheme
Tan< T >::type tan(const T &t)
Float_t castorsteparray[14]
void update(const BeginOfJob *run) override
This routine will be called when the appropriate signal arrives.
T getParameter(std::string const &) const
CastorTestAnalysis(const edm::ParameterSet &p)
std::string stepNtFileName
G4THitsCollection< CaloG4Hit > CaloG4HitCollection
TFile * castorOutputStepFile
uint32_t getUnitID() const
TFile * castorOutputEventFile
Power< A, B >::type pow(const A &a, const B &b)
void getCastorBranchData(const CaloG4HitCollection *hc)
std::string eventNtFileName
double getEnergyDeposit() const