10 #include <ecl/modules/eclEdgeCollector/eclEdgeCollectorModule.h>
14 #include <ecl/geometry/ECLGeometryPar.h>
15 #include <ecl/dbobjects/ECLCrystalCalib.h>
30 m_ECLCrystalOffsetPhi("ECLCrystalOffsetPhi")
33 setDescription(
"Obtain location of crystal edges from geometry and ECLCrystalOffsetTheta and ECLCrystalOffsetPhi payloads.");
39 auto eclCrystalX =
new TH1F(
"eclCrystalX",
"x of each crystal;cellID;x (cm)", 8736, 1, 8737);
40 registerObject<TH1F>(
"eclCrystalX", eclCrystalX);
42 auto eclCrystalY =
new TH1F(
"eclCrystalY",
"y of each crystal;cellID;y(cm)", 8736, 1, 8737);
43 registerObject<TH1F>(
"eclCrystalY", eclCrystalY);
45 auto eclCrystalZ =
new TH1F(
"eclCrystalZ",
"z of each crystal;cellID;z (cm)", 8736, 1, 8737);
46 registerObject<TH1F>(
"eclCrystalZ", eclCrystalZ);
48 auto eclCrystalR =
new TH1F(
"eclCrystalR",
"R (3d) of each crystal;cellID;R (cm)", 8736, 1, 8737);
49 registerObject<TH1F>(
"eclCrystalR", eclCrystalR);
51 auto eclCrystalTheta =
new TH1F(
"eclCrystalTheta",
"theta of each crystal location;cellID;theta (rad)", 8736, 1, 8737);
52 registerObject<TH1F>(
"eclCrystalTheta", eclCrystalTheta);
54 auto eclCrystalPhi =
new TH1F(
"eclCrystalPhi",
"phi of each crystal location;cellID;phi (rad)", 8736, 1, 8737);
55 registerObject<TH1F>(
"eclCrystalPhi", eclCrystalPhi);
57 auto eclCrystalDirTheta =
new TH1F(
"eclCrystalDirTheta",
"theta of each crystal direction;cellID;theta (rad)", 8736, 1, 8737);
58 registerObject<TH1F>(
"eclCrystalDirTheta", eclCrystalDirTheta);
60 auto eclCrystalDirPhi =
new TH1F(
"eclCrystalDirPhi",
"phi of each crystal direction;cellID;phi (rad)", 8736, 1, 8737);
61 registerObject<TH1F>(
"eclCrystalDirPhi", eclCrystalDirPhi);
63 auto eclCrystalEdgeTheta =
new TH1F(
"eclCrystalEdgeTheta",
"lower edge of each crystal in theta;cellID;theta (rad)", 8736, 1, 8737);
64 registerObject<TH1F>(
"eclCrystalEdgeTheta", eclCrystalEdgeTheta);
66 auto eclCrystalEdgePhi =
new TH1F(
"eclCrystalEdgePhi",
"lower edge of each crystal in phi;cellID;phi (rad)", 8736, 1, 8737);
67 registerObject<TH1F>(
"eclCrystalEdgePhi", eclCrystalEdgePhi);
78 std::vector<float> offsetTheta;
80 std::vector<float> offsetPhi;
85 for (
int cellID = 1; cellID <= 8736; cellID++) {
87 TVector3 crystalDirection = eclGeometry->
GetCrystalVec(cellID - 1);
88 getObjectPtr<TH1F>(
"eclCrystalX")->SetBinContent(cellID, crystalPos.X());
89 getObjectPtr<TH1F>(
"eclCrystalY")->SetBinContent(cellID, crystalPos.Y());
90 getObjectPtr<TH1F>(
"eclCrystalZ")->SetBinContent(cellID, crystalPos.Z());
91 getObjectPtr<TH1F>(
"eclCrystalR")->SetBinContent(cellID, crystalPos.Mag());
92 getObjectPtr<TH1F>(
"eclCrystalTheta")->SetBinContent(cellID, crystalPos.Theta());
93 getObjectPtr<TH1F>(
"eclCrystalPhi")->SetBinContent(cellID, crystalPos.Phi());
94 getObjectPtr<TH1F>(
"eclCrystalDirTheta")->SetBinContent(cellID, crystalDirection.Theta());
95 getObjectPtr<TH1F>(
"eclCrystalDirPhi")->SetBinContent(cellID, crystalDirection.Phi());
98 float thetaEdge = crystalPos.Theta() - offsetTheta[cellID - 1];
99 getObjectPtr<TH1F>(
"eclCrystalEdgeTheta")->SetBinContent(cellID, thetaEdge);
101 float phiEdge = crystalPos.Phi() - offsetPhi[cellID - 1];
102 if (phiEdge < -TMath::Pi()) {phiEdge += 2 * TMath::Pi();}
103 getObjectPtr<TH1F>(
"eclCrystalEdgePhi")->SetBinContent(cellID, phiEdge);
106 if (cellID % 1000 == 0) {
107 B2INFO(
"cellID " << cellID <<
": theta " << crystalPos.Theta() <<
" phi " <<
108 crystalPos.Phi() <<
" R " << crystalPos.Mag() <<
" thetaEdge " << thetaEdge <<
" phiEdge " << phiEdge);