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;
Representation of a region of space diced into voxels.
void GetCenter(double *xyz, double localz=0.0) const
unsigned int GetNVoxels() const
Returns the total number of voxels in the volume.
Point GetCenter() const
Returns the center of the voxel (type Point).
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)
BEGIN_PROLOG could also be cout
PhotonVoxel GetPhotonVoxel(int ID) const