56 using namespace KM3NETDAQ;
73 JParser<> zap(
"Example program to determine N-fold coincidence rates.");
77 zap[
'n'] =
make_field(numberOfEvents) = JLimit::max();
80 zap[
'C'] =
make_field(selector) = getROOTClassSelection<JDAQTimesliceTypes_t>();
82 zap[
's'] =
make_field(summaryFile) =
"halibut.txt";
88 catch(
const exception &error) {
89 FATAL(error.what() << endl);
121 JManager_t H1(
new TH1D(
"H1[%]", NULL, 100, -TMax_ns, +TMax_ns));
122 JManager_t T1(
new TH1D(
"T1[%]", NULL, 100, 0.0, TMax_s[
M.getLowerLimit()]));
139 STATUS(
"Processing " << *i << endl);
145 for ( ; ps->hasNext() && counter != inputFile.getLimit(); ++counter) {
147 STATUS(
"event: " << setw(10) << counter <<
'\r');
DEBUG(endl);
151 for (JDAQTimeslice::const_iterator frame = timeslice->begin(); frame != timeslice->end(); ++frame) {
153 JSuperFrame2D_t& buffer = JSuperFrame2D_t::demultiplex(*frame, router.getModule(frame->getModuleID()));
155 for (JSuperFrame2D_t::iterator i = buffer.begin(); i != buffer.end(); ++i) {
159 JSuperFrame1D_t& data = JSuperFrame1D_t::multiplex(buffer);
163 if (data.size() > 1) {
165 TH1D*
h1 = H1[frame->getModuleID()];
166 TH1D* t1 = T1[frame->getModuleID()];
172 while (++q != data.end() && q->getT() - p->getT() <= TMax_ns ) {}
178 const int i = router.getIndex(frame->getModuleID());
179 const double ts =
getTimeOfRTS(frame->getFrameIndex()) + p->getT();
181 t1->Fill((ts - t0[i]) * 1.0e-9);
189 h1->Fill(JCombinatorics::getSign(__p->getPMT(),__q->getPMT()) * (__q->getT() - __p->getT()), 1.0/W);
204 const double V = (H1->GetXaxis()->GetXmax() - H1->GetXaxis()->GetXmin()) / (
double) H1->GetXaxis()->GetNbins();
207 for (JManager_t::iterator i = H1.begin(); i != H1.end(); ++i) {
208 i->second->Scale(1.0/(V*W));
211 for (JManager_t::iterator i = T1.begin(); i != T1.end(); ++i) {
212 i->second->Scale(1.0/i->second->GetMaximum());
216 if (summaryFile !=
"") {
218 const double V = (H1->GetXaxis()->GetXmax() - H1->GetXaxis()->GetXmin()) / (
double) H1->GetXaxis()->GetNbins();
222 const int PRECISION = (
M.getLowerLimit() > 2 ? 4 : 3);
224 ofstream out(summaryFile.c_str());
226 out <<
"Multiplicity " <<
M << endl;
227 out <<
"-------------------------------------------------------" << endl;
228 out <<
" location | Gauss | S - B | Total | slope " << endl;
229 out <<
" | [Hz] | [Hz] | [Hz] | [Hz] " << endl;
230 out <<
"-------------------------------------------------------" << endl;
234 for (
int string = 1;
string <= number_of_strings; ++string) {
235 for (
int floor = number_of_floors; floor >= 1; --floor) {
239 out <<
" " << setw(3) <<
string <<
' ' << setw(2) << floor <<
" ";
241 TH1D* h1 = (H1.find(
id) != H1.end() ? H1[id] : NULL);
242 TH1D* t1 = (T1.find(
id) != T1.end() ? T1[id] : NULL);
246 TF1 f1(
"f1",
"[0]*exp(-0.5*(x-[1])*(x-[1])/([2]*[2]))/(TMath::Sqrt(2*TMath::Pi())*[2]) + [3]");
248 f1.SetParameter(0, h1->GetMaximum());
249 f1.SetParameter(1, 0.0);
250 f1.SetParameter(2, h1->GetRMS() * 0.25);
251 f1.SetParameter(3, h1->GetMinimum());
253 h1->Fit(&f1, option.c_str(),
"same");
255 out <<
" | " <<
FIXED(8,PRECISION) << f1.GetParameter(0);
256 out <<
" | " <<
FIXED(8,PRECISION) << (h1->GetSumOfWeights() - f1.GetParameter(3) * h1->GetNbinsX()) * V;
257 out <<
" | " <<
FIXED(8,PRECISION) << h1->GetSumOfWeights() * V;
259 Q[0].
put( f1.GetParameter(0));
260 Q[1].
put((h1->GetSumOfWeights() - f1.GetParameter(3) * h1->GetNbinsX()) * V);
261 Q[2].
put( h1->GetSumOfWeights() * V);
266 TF1 f1(
"f1",
"[0]*exp(-[1]*x)");
268 f1.SetParameter(0, t1->GetMaximum());
269 f1.SetParameter(1, 1.0 / t1->GetRMS());
271 t1->Fit(&f1, option.c_str(),
"same");
273 out <<
" | " <<
FIXED(8,PRECISION) << f1.GetParameter(1);
275 Q[3].
put(f1.GetParameter(1));
286 out <<
"-------------------------------------------------------" << endl;
287 out << setw(10) << left <<
" average";
289 for (
int i = 0; i !=
sizeof(Q)/
sizeof(Q[0]); ++i) {
Utility class to parse command line options.
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
Auxiliary class to select ROOT class based on class name.
Router for direct addressing of module data in detector data structure.
then for HISTOGRAM in h0 h1
Long64_t counter_type
Type definition for counter.
Auxiliary class for a type holder.
Auxiliary data structure for floating point format specification.
double getTimeOfRTS(const JDAQChronometer &chronometer)
Get time of last RTS in ns since start of run for a given chronometer.
Template definition for direct access of elements in ROOT TChain.
long long int factorial(const long long int n)
Determine factorial.
Auxiliary interface for direct access of elements in ROOT TChain.
1-dimensional frame with time calibrated data from one optical module.
Auxiliary class to manage set of compatible ROOT objects (e.g.
Auxiliary class for defining the range of iterations of objects.
Logical location of module.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
double getFrameTime()
Get frame time duration.
int getNumberOfFloors(const JDetector &detector)
Get number of floors.
void load(const JString &file_name, JDetector &detector)
Load detector from input file.
static const JStringCounter getNumberOfStrings
Function object to count unique strings.
Auxiliary class to select JTreeScanner based on ROOT class name.
JRange< Double_t > JRange_t
int getCount(const T &hit)
Get hit count.
2-dimensional frame with time calibrated data from one optical module.
const JLimit & getLimit() const
Get limit.
then usage $script[input file[working directory[option]]] nWhere option can be N
#define DEBUG(A)
Message macros.