16 namespace FITL1DTSLICES {
27 double logPoison(
double n,
double nhat,
double logP_min = -999999.9) {
28 if (nhat < 0.0 || n < 0.0) {
29 FATAL(
"logPoisson: n (" << n <<
") or nhat (" << nhat <<
") is < 0.0" << std::endl);
31 if (n == 0.0 && nhat == 0.0) {
34 if (n == 0.0 && nhat > 0.0) {
37 if (n >= 0.0 && nhat == 0.0) {
40 Double_t poisson = TMath::Poisson(n, nhat);
41 if (poisson == 0)
return 0.0;
42 else return TMath::Log(poisson);
45 double getLogQuality(
const TH1D* data,
const TH1D* model,
int di,
double data_bkg = 0.0001,
double model_bkg = 0.0001) {
51 int i_low = data->GetNbinsX() / 4;
52 int i_hgh = data->GetNbinsX() / 4 * 3;
53 for (
int i = i_low; i <= i_hgh; ++i) {
55 double nhat = model_bkg;
56 if (i >= 1 && i <= data->GetNbinsX()) {
58 n = data->GetBinContent(i);
60 if (i+di >= 1 && i+di <= model->GetNbinsX()) {
62 nhat = model->GetBinContent(i+di);
79 int main(
int argc,
char **argv)
82 using namespace FITL1DTSLICES;
97 JParser<> zap(
"Program to calculate log-likelihood distributions between DOM pairs and fit a poly2 to find the shape, used in FitL1dt to find time offsets");
99 zap[
'f'] =
make_field(inputFile,
"input file") =
"monitor.root";
100 zap[
'm'] =
make_field(modelFile,
"model file");
102 zap[
'a'] =
make_field(detectorFile,
"detector file");
103 zap[
'T'] =
make_field(TMax_ns,
"scan range around 0 in data-model comparison [ns]") = 50.0;
104 zap[
't'] =
make_field(dt_fitrange,
"fitrange of polynomial to quality [ns]") = 5.0;
105 zap[
'r'] =
make_field(rebin,
"rebin the histograms") = 1;
106 zap[
'N'] =
make_field(normaliseMC,
"normalize the MC histogram");
109 if (zap.
read(argc, argv) != 0) {
113 catch(
const exception &error) {
114 FATAL(error.what() << endl);
119 const double TSignal_ns = 750.0;
131 TFile*
in = TFile::Open(inputFile.c_str(),
"exist");
132 TFile* in_model = TFile::Open(modelFile.c_str(),
"exist");
134 if (
in == NULL || !
in->IsOpen()) {
135 FATAL(
"File: " << inputFile <<
" not opened." << endl);
137 if (in_model == NULL || !in_model->IsOpen()) {
138 FATAL(
"File: " << modelFile <<
" not opened." << endl);
150 for (JDetector::iterator moduleA =
detector.begin(); moduleA !=
detector.end(); ++moduleA) {
152 TString label = Form(
"%i", moduleA->getID());
153 h2A.GetXaxis()->SetBinLabel(idom+1, label);
154 h2A.GetYaxis()->SetBinLabel(idom+1, label);
155 h2B.GetXaxis()->SetBinLabel(idom+1, label);
156 h2B.GetYaxis()->SetBinLabel(idom+1, label);
157 h2C.GetXaxis()->SetBinLabel(idom+1, label);
158 h2C.GetYaxis()->SetBinLabel(idom+1, label);
160 h2Bbare.GetXaxis()->SetBinLabel(idom+1, label);
161 h2Bbare.GetYaxis()->SetBinLabel(idom+1, label);
164 for (JDetector::iterator moduleA =
detector.begin(); moduleA !=
detector.end(); ++moduleA) {
166 DEBUG(
"Module " << moduleA->getID() << endl);
171 TH2D* d2s = (TH2D*)
in->Get((title +
".2S").c_str());
172 TH1D* d1l = (TH1D*)
in->Get((title +
".1L").c_str());
174 if (d2s == NULL || d1l == NULL) {
175 WARNING(
"No data in data histogram " << title << endl);
180 TH2D* m2s = (TH2D*) in_model->Get((title +
".2S").c_str());
181 TH1D* m1l = (TH1D*) in_model->Get((title +
".1L").c_str());
183 if (m2s == NULL || m1l == NULL) {
184 WARNING(
"No mata in model histogram " << title << endl);
189 for (JDetector::iterator moduleB = moduleA; moduleB !=
detector.end(); ++moduleB) {
192 if (moduleB->getID() == moduleA->getID()) {
195 if (moduleB->getString() != moduleA->getString()) {
199 TH1D* d1s = d2s->ProjectionY((title + Form(
".%i.d1S", moduleB->getID())).c_str(),
200 d2s->GetXaxis()->FindBin(TString(Form(
"%i", moduleB->getID()))),
201 d2s->GetXaxis()->FindBin(TString(Form(
"%i", moduleB->getID()))),
"e");
202 TH1D* m1s = m2s->ProjectionY((title + Form(
".%i.m1S", moduleB->getID())).c_str(),
203 m2s->GetXaxis()->FindBin(TString(Form(
"%i", moduleB->getID()))),
204 m2s->GetXaxis()->FindBin(TString(Form(
"%i", moduleB->getID()))),
"e");
206 if (d1s->Integral() <= 0.0 || m1s->Integral() <= 0.0) {
211 double binCenterMaxBin = d1s->GetXaxis()->GetBinCenter(d1s->GetMaximumBin());
212 double backgroundrate_s = 0.0;
214 for (
int j = 1;
j <= d1s->GetXaxis()->GetNbins(); ++
j) {
215 if (fabs(d1s->GetXaxis()->GetBinCenter(
j) - binCenterMaxBin) > TSignal_ns ) {
216 backgroundrate_s += d1s->GetBinContent(
j);
220 backgroundrate_s /= nbins;
223 binCenterMaxBin = m1s->GetXaxis()->GetBinCenter(m1s->GetMaximumBin());
224 double backgroundrate_m = 0.0;
226 for (
int j = 1;
j <= m1s->GetXaxis()->GetNbins(); ++
j) {
227 if (fabs(m1s->GetXaxis()->GetBinCenter(
j) - binCenterMaxBin) > TSignal_ns ) {
228 backgroundrate_m += m1s->GetBinContent(
j);
232 backgroundrate_m /= nbins;
235 const double Ld = d1l->GetBinContent(d1l->GetXaxis()->FindBin(TString(Form(
"%i", moduleB->getID()))));
236 const double Lm = m1l->GetBinContent(m1l->GetXaxis()->FindBin(TString(Form(
"%i", moduleB->getID()))));
238 for (
int j = 1;
j <= d1s->GetXaxis()->GetNbins(); ++
j) {
239 const double y = d1s->GetBinContent(
j);
240 const double dy = d1s->GetBinError(
j);
242 d1s->SetBinContent(
j, y);
243 d1s->SetBinError(
j, dy);
247 for (
int j = 1;
j <= m1s->GetXaxis()->GetNbins(); ++
j) {
248 const double y = m1s->GetBinContent(
j);
249 const double dy = m1s->GetBinError(
j);
251 m1s->SetBinContent(
j, y * Ld/Lm);
252 m1s->SetBinError(
j, dy*Ld/Lm);
257 const double scalefactor = d1s->Integral()/m1s->Integral();
258 m1s->Scale(scalefactor);
270 int ddt_min = -0.5*TMax_ns;
271 int ddt_max = 0.5*TMax_ns;
273 TH1D q1((title + Form(
".%i.q1", moduleB->getID())).c_str(), (title + Form(
".%i.q1", moduleB->getID())).c_str(), (ddt_max-ddt_min)/rebin+1, ddt_min-0.5*rebin, ddt_max+0.5*rebin);
275 for (
int di = 1; di <= q1.GetNbinsX(); di++) {
276 q1.SetBinContent(di,
getLogQuality(d1s, m1s, (
int)(q1.GetBinCenter(di)/rebin), 0.0, 0.0));
280 const double dt_fitmid = q1.GetBinCenter(q1.GetMaximumBin());
282 TF1 q1f((title + Form(
".%i.q1f", moduleB->getID())).c_str(),
"[0]*x*x + [1]*x + [2]", dt_fitmid - dt_fitrange, dt_fitmid + dt_fitrange);
283 q1f.SetParLimits(0, -1e5, 0.0);
285 string fitoptions =
"R";
289 q1.Fit(&q1f, fitoptions.c_str());
295 const double Aij = q1f.GetParameter(0);
296 const double Bij = q1f.GetParameter(1);
297 const double Cij = q1f.GetParameter(2);
299 double bareBij = Bij / Aij;
300 if (Aij == 0) bareBij = 0;
302 if (fabs(-0.5*Bij/Aij - dt_fitmid) > 3 || fabs(-0.5*Bij/Aij) > dt_fitrange) {
303 WARNING(
" Please check fit of pair " << idom <<
", " << jdom <<
" : " << moduleA->getID() <<
", " << moduleB->getID() << endl);
304 WARNING(
" DOMpair " << idom <<
"; " << jdom <<
" A=" << Aij <<
" B=" << Bij <<
" , max at: " << dt_fitmid <<
" [ns], best fit at " << -0.5*Bij/Aij <<
" ns " << endl);
306 DEBUG(
"DOMpair " << idom <<
"; " << jdom <<
" A=" << Aij <<
" B=" << Bij <<
" , max at: " << dt_fitmid <<
" [ns], best fit at " << -0.5*Bij/Aij <<
" ns " << endl);
308 h2A.SetBinContent(idom+1, jdom+1, Aij);
309 h2A.SetBinContent(jdom+1, idom+1, Aij);
310 h2B.SetBinContent(idom+1, jdom+1, Bij);
311 h2B.SetBinContent(jdom+1, idom+1,-Bij);
312 h2C.SetBinContent(idom+1, jdom+1, Cij);
313 h2C.SetBinContent(jdom+1, idom+1, Cij);
315 h2Bbare.SetBinContent(idom+1, jdom+1, bareBij);
316 h2Bbare.SetBinContent(jdom+1, idom+1, 0);
Utility class to parse command line options.
Wrapper class around STL string class.
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
esac print_variable DETECTOR INPUT_FILE OUTPUT_FILE CDF for TYPE in
Data structure for detector geometry and calibration.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
void load(const JString &file_name, JDetector &detector)
Load detector from input file.
int read(const int argc, const char *const argv[])
Parse the program's command line options.
Utility class to parse command line options.
alias put_queue eval echo n
KM3NeT DAQ constants, bit handling, etc.
double logPoison(double n, double nhat, double logP_min=-999999.9)
#define DEBUG(A)
Message macros.
double getLogQuality(const TH1D *data, const TH1D *model, int di, double data_bkg=0.0001, double model_bkg=0.0001)
int main(int argc, char *argv[])