00001
00002
00003
00004
00005
00006
00007
00009
00010 #include <cmath>
00011
00012 using namespace std;
00013
00014 #include "RecoBase/ArrivalTime.h"
00015 #include "Conventions/Munits.h"
00016 #include "math.h"
00017
00018 #include "MessageService/MsgService.h"
00019
00020 ClassImp(ArrivalTime)
00021
00022 CVSID("$Id: ArrivalTime.cxx,v 1.5 2006/06/15 18:40:51 rhatcher Exp $");
00023
00024 ArrivalTime::ArrivalTime()
00025 {
00026 minprob = .01;
00027 timewindow[0] = -100.;
00028 timewindow[1] = 200.;
00029
00030 pe[ 0] = 1;
00031 pe[ 1] = 2;
00032 pe[ 2] = 3;
00033 pe[ 3] = 4;
00034 pe[ 4] = 5;
00035 pe[ 5] = 6;
00036 pe[ 6] = 7;
00037 pe[ 7] = 8;
00038 pe[ 8] = 9;
00039 pe[ 9] = 10;
00040 pe[10] = 15;
00041 pe[11] = 20;
00042 pe[12] = 25;
00043 pe[13] = 50;
00044 pe[14] = 100;
00045 pe[15] = 250;
00046
00047 tab[ 0] = 2.0;
00048 tab[ 1] = 1.8;
00049 tab[ 2] = 1.9;
00050 tab[ 3] = 2.0;
00051 tab[ 4] = 2.1;
00052 tab[ 5] = 2.2;
00053 tab[ 6] = 2.3;
00054 tab[ 7] = 2.4;
00055 tab[ 8] = 2.4;
00056 tab[ 9] = 2.4;
00057 tab[10] = 2.0;
00058 tab[11] = 1.8;
00059 tab[12] = 1.8;
00060 tab[13] = 1.7;
00061 tab[14] = 1.05;
00062 tab[15] = 0.55;
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173 a0[0] = 0.00380099;
00174 a0[1] = -8.80699e-05;
00175 a0[2] = -0.00260464;
00176 a0[3] = -0.00394667;
00177 a0[4] = -0.00289652;
00178 a0[5] = -0.0097678;
00179 a0[6] = -0.00484191;
00180 a0[7] = -0.0114235;
00181 a0[8] = -0.0077634;
00182 a0[9] = -0.0136922;
00183 a0[10] = -0.00504345;
00184 a0[11] = -0.00440376;
00185 a0[12] = -0.0139975;
00186 a0[13] = -0.0240564;
00187 a0[14] = -0.0471868;
00188 a0[15] = -0.0646101;
00189
00190 a1[0] = 0.0483934;
00191 a1[1] = 0.108423;
00192 a1[2] = 0.182121;
00193 a1[3] = 0.2649;
00194 a1[4] = 0.321433;
00195 a1[5] = 0.418531;
00196 a1[6] = 0.477308;
00197 a1[7] = 0.552298;
00198 a1[8] = 0.612061;
00199 a1[9] = 0.682585;
00200 a1[10] = 0.944322;
00201 a1[11] = 1.26909;
00202 a1[12] = 1.76145;
00203 a1[13] = 3.75802;
00204 a1[14] = 7.60245;
00205 a1[15] = 17.9181;
00206
00207 a2[0] = 0;
00208 a2[1] = 0;
00209 a2[2] = -0.0236899;
00210 a2[3] = -0.0587177;
00211 a2[4] = -0.0718435;
00212 a2[5] = -0.118051;
00213 a2[6] = -0.145666;
00214 a2[7] = -0.180387;
00215 a2[8] = -0.210393;
00216 a2[9] = -0.24361;
00217 a2[10] = -0.395095;
00218 a2[11] = -0.618682;
00219 a2[12] = -1.2721;
00220 a2[13] = -4.27503;
00221 a2[14] = -12.1432;
00222 a2[15] = -40.9239;
00223
00224 a3[0] = 0;
00225 a3[1] = 0;
00226 a3[2] = 0;
00227 a3[3] = 0;
00228 a3[4] = 0;
00229 a3[5] = 0;
00230 a3[6] = 0;
00231 a3[7] = 0;
00232 a3[8] = 0;
00233 a3[9] = 0;
00234 a3[10] = 0;
00235 a3[11] = 0;
00236 a3[12] = 0.207481;
00237 a3[13] = 1.23941;
00238 a3[14] = 4.91402;
00239 a3[15] = 20.5572;
00240
00241 b0[0] = -1.92681;
00242 b0[1] = -1.15934;
00243 b0[2] = -0.619546;
00244 b0[3] = -0.138392;
00245 b0[4] = 0.2311;
00246 b0[5] = 0.644398;
00247 b0[6] = 0.785976;
00248 b0[7] = 1.20838;
00249 b0[8] = 1.28904;
00250 b0[9] = 1.60773;
00251 b0[10] = 2.75615;
00252 b0[11] = 3.40441;
00253 b0[12] = 4.17189;
00254 b0[13] = 8.95878;
00255 b0[14] = 5.42604;
00256 b0[15] = 4.94429;
00257
00258 b1[ 0] = -0.12743;
00259 b1[ 1] = -0.24693;
00260 b1[ 2] = -0.36993;
00261 b1[ 3] = -0.50634;
00262 b1[ 4] = -0.64232;
00263 b1[ 5] = -0.7944;
00264 b1[ 6] = -0.88006;
00265 b1[ 7] = -1.0483;
00266 b1[ 8] = -1.1270;
00267 b1[ 9] = -1.2819;
00268 b1[10] = -1.946;
00269 b1[11] = -2.4642;
00270 b1[12] = -3.0376;
00271 b1[13] = -6.6758;
00272 b1[14] = -6.4324;
00273 b1[15] = -8.943;
00274
00275
00276
00277
00278 }
00279
00280 Double_t ArrivalTime::Weight(Double_t npe) const
00281 {
00282 Double_t weight = 1./Uncertainty(npe);
00283 return weight*weight;
00284 }
00285
00286 Double_t ArrivalTime::Uncertainty(Double_t npe) const
00287 {
00288 Double_t sigma = 0.;
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299 if (npe<10.) {
00300 if (npe>0.) sigma = 0.90+8.0/npe;
00301 else {
00302 sigma = 1.0e+5;
00303 MSG("ArrivalTime", Msg::kWarning)
00304 << "Uncertainty was passed npe = " << npe
00305 << ", use sigma = " << sigma << endl;
00306 }
00307 }
00308 else {
00309 sigma = 5.0*exp(-0.5*log(npe));
00310 }
00311
00312 return sigma;
00313 }
00314
00315 void ArrivalTime::SetTimeWindow(Double_t t0, Double_t t1)
00316 {
00317 if (t0<t1) {
00318 timewindow[0] = t0;
00319 timewindow[1] = t1;
00320 }
00321 else {
00322 timewindow[0] = t1;
00323 timewindow[1] = t0;
00324 }
00325 Renormalize();
00326 }
00327
00328 void ArrivalTime::SetMinimumProbability(Double_t prob)
00329 {
00330 minprob = prob;
00331 Renormalize();
00332 }
00333
00334 void ArrivalTime::Renormalize()
00335 {
00336 for (int i=0; i<16; i++) {
00337 Double_t integral = a0[i]*tab[i]+a1[i]*tab[i]*tab[i]/2.+a2[i]*tab[i]*tab[i]*tab[i]/3.+a3[i]*tab[i]*tab[i]*tab[i]*tab[i]/4.-exp(b0[i]+b1[i]*tab[i])/b1[i];
00338 a0[i] *= (1.-minprob)/integral;
00339 a1[i] *= (1.-minprob)/integral;
00340 a2[i] *= (1.-minprob)/integral;
00341 a3[i] *= (1.-minprob)/integral;
00342 b0[i] += log((1.-minprob)/integral);
00343 }
00344
00345 }
00346
00347 Double_t ArrivalTime::PDF(Double_t npe, Double_t t) const
00348 {
00349
00350 t /= Munits::ns;
00351 if (npe<=0. || t<timewindow[0] || t>timewindow[1]) {
00352 return 0.;
00353 }
00354 Double_t minpdf = minprob/(timewindow[1]-timewindow[0]);
00355 if (t<0.) {
00356 return minpdf;
00357 }
00358 Double_t p0[2] = { 0, 0 };
00359 Double_t pe0[2] = {-1.,1.};
00360 for (int i=0; i<16; i++) {
00361 if (npe>=pe[i]) {
00362 if (t<tab[i]) {
00363 p0[1] = a0[i]+a1[i]*t+a2[i]*t*t+a3[i]*t*t*t;
00364 }
00365 else {
00366 p0[1] = exp(b0[i]+b1[i]*t);
00367 }
00368 if (p0[1]<minpdf) p0[1] = minpdf;
00369 pe0[1] = (Double_t)(pe[i]);
00370 }
00371 }
00372 for (int i=15; i>=0; i--) {
00373 if (npe<=pe[i]) {
00374 if (t<tab[i]) {
00375 p0[0] = a0[i]+a1[i]*t+a2[i]*t*t+a3[i]*t*t*t;
00376 }
00377 else {
00378 p0[0] = exp(b0[i]+b1[i]*t);
00379 }
00380 if (p0[0]<minpdf) p0[0] = minpdf;
00381 pe0[0] = (Double_t)(pe[i]);
00382 }
00383 }
00384 if (pe0[0]==pe0[1]) {
00385 return (p0[0]+minpdf);
00386 }
00387 if (pe0[0]<0.) {
00388 return (p0[1]+minpdf);
00389 }
00390 if (pe0[1]<0.) {
00391 return (p0[0]+minpdf);
00392 }
00393 return (minpdf+ p0[0] + (p0[1]-p0[0])/(pe0[1]-pe0[0])*(npe-pe0[0]));
00394 }