10 #include "art/Framework/Core/EDAnalyzer.h"
11 #include "art/Framework/Core/ModuleMacros.h"
12 #include "art/Framework/Services/Registry/ServiceHandle.h"
28 namespace fhicl {
class ParameterSet; }
43 void analyze(
const art::Event&
e)
override;
51 art::ServiceHandle<geo::Geometry const> geom;
53 art::ServiceHandle<phot::PhotonVisibilityService const> pvs;
56 TFile* fout_full =
new TFile(
"full.root",
"RECREATE");
57 TFile* fout_fit =
new TFile(
"fit.root",
"RECREATE");
59 std::cout << voxdef.
GetNVoxels() <<
" voxels for each of " << geom->NOpDets() <<
" OpDets" << std::endl;
63 long totExceptions = 0;
66 for(
unsigned int opdetIdx =0; opdetIdx < geom->NOpDets(); ++opdetIdx){
67 std::cout << opdetIdx <<
" / " << geom->NOpDets() << std::endl;
69 TDirectory* d_full = fout_full->mkdir(TString::Format(
"opdet_%d", opdetIdx).
Data());
70 TDirectory* d_fit = fout_fit->mkdir(TString::Format(
"opdet_%d", opdetIdx).
Data());
73 TTree* tr_full =
new TTree(
"tr",
"tr");
75 float dist, vis, psi, theta, xpos;
76 tr_full->Branch(
"vox", &vox);
77 tr_full->Branch(
"dist", &dist);
78 tr_full->Branch(
"vis", &vis);
79 tr_full->Branch(
"taken", &taken);
80 tr_full->Branch(
"psi", &psi);
81 tr_full->Branch(
"theta", &theta);
82 tr_full->Branch(
"xpos", &xpos);
84 const geo::OpDetGeo& opdet = geom->OpDetGeoFromOpDet(opdetIdx);
85 auto const opdetCenter = opdet.
GetCenter();
89 Visibility(
int vx,
int t,
float d,
float v,
float p,
float th,
float xp) : vox(vx), taken(t),
dist(d), vis(v), psi(p), theta(th), xpos(xp) {}
98 TCanvas *c1=
new TCanvas(
"c1",
"c1");
100 c1->SetWindowSize(600, 600);
105 std::vector<Visibility> viss;
108 for(
unsigned int voxIdx = 0U; voxIdx < voxdef.
GetNVoxels(); ++voxIdx){
111 const double xyzvox[] = {voxvec.X(), voxvec.Y(), voxvec.Z()};
112 const double fc_y = 600;
113 const double fc_z = 1394;
114 const double fc_x = 350;
119 vis = pvs->GetVisibility(xyzvox, opdetIdx);
125 if((voxvec.X() - opdetCenter.X())<0){
126 psi = atan((voxvec.Y() - opdetCenter.Y())/(-voxvec.X() +opdetCenter.X()));
129 if(voxvec.X()<fc_x && voxvec.X()>-fc_x && voxvec.Y()<fc_y && voxvec.Y()>-fc_y && voxvec.Z()> -9 && voxvec.Z()<fc_z){
130 g.SetPoint(g.GetN(),
dist, vis*dist*
dist);
132 psi = atan((voxvec.Y() - opdetCenter.Y())/(voxvec.X() - opdetCenter.X()))* 180.0/
PI ;
133 theta = acos((voxvec.Z() - opdetCenter.Z())/dist) * 180.0/
PI;
135 if((voxvec.X() - opdetCenter.X())<0){
136 psi = atan((voxvec.Y() - opdetCenter.Y())/(-voxvec.X() +opdetCenter.X()));
141 viss.emplace_back(voxIdx, taken, dist, vis, psi, theta, xpos);
151 g.GetXaxis()->SetTitle(
"Distance (cm)");
152 g.GetYaxis()->SetTitle(
"Visibility #times r^{2}");
154 TF1* fit = g.GetFunction(
"expo");
158 fitres[0] = fit->GetParameter(0);
159 fitres[1] = fit->GetParameter(1);
164 TH1F
h(
"",
"", 200, 0, 20);
167 TTree* tr_fit =
new TTree(
"tr",
"tr");
168 tr_fit->Branch(
"vox", &vox);
169 tr_fit->Branch(
"dist", &dist);
170 tr_fit->Branch(
"vis", &vis);
171 tr_fit->Branch(
"taken", &taken);
172 tr_fit->Branch(
"psi", &psi);
173 tr_fit->Branch(
"theta", &theta);
174 tr_fit->Branch(
"xpos", &xpos);
177 for(
const Visibility& v: viss){
181 const double obs = v.vis / 2
e-5;
182 const double pred = fit->Eval(v.dist) / (v.dist*v.dist) / 2
e-5;
192 double chisq = 2*(pred-obs);
193 if(obs) chisq += 2*obs*log(obs/pred);
210 g2.SetPoint(g2.GetN(), v.dist, v.vis*v.dist*v.dist);
223 g2.SetMarkerStyle(7);
224 g2.SetMarkerColor(kRed);
225 gStyle->SetLabelSize(.04,
"XY");
226 gStyle->SetTitleSize(.04,
"XY");
229 c1->SaveAs(TString::Format(
"plots/Chris_vis_vs_dist_%d.png", opdetIdx).
Data());
232 h.GetXaxis()->SetTitle(
"#chi^{2}");
233 h.GetYaxis()->SetTitle(
"Counts");
234 gStyle->SetLabelSize(.04,
"XY");
235 gStyle->SetTitleSize(.04,
"XY");
237 std::cout <<
"Integral(90,-1)/Integral(all) = "<< h.Integral(90, -1) / h.Integral(0, -1) << std::endl;
238 std::cout <<
"*****************************" << std::endl;
239 totExceptions += h.Integral(90, -1);
240 totPts += h.Integral(0, -1);
241 gPad->Print(TString::Format(
"plots/chisq_opdet_%d.eps", opdetIdx).
Data());
246 std::cout << totExceptions <<
" exceptions from " << totPts <<
" points = " << (100.*totExceptions)/totPts <<
"%" << std::endl;
CreateHybridLibrary(const fhicl::ParameterSet &p)
Representation of a region of space diced into voxels.
void analyze(const art::Event &e) override
void GetCenter(double *xyz, double localz=0.0) const
unsigned int GetNVoxels() const
Returns the total number of voxels in the volume.
Definitions of voxel data structures.
Point GetCenter() const
Returns the center of the voxel (type Point).
Encapsulate the geometry of an optical detector.
double DistanceToPoint(geo::Point_t const &point) const
Returns the distance of the specified point from detector center [cm].
constexpr double dist(const TReal *x, const TReal *y, const unsigned int dimension)
CreateHybridLibrary & operator=(const CreateHybridLibrary &)=delete
art framework interface to geometry description
BEGIN_PROLOG could also be cout
PhotonVoxel GetPhotonVoxel(int ID) const