loop over all clusters the begin/end_inclusive_m(M) methods return the begin and end iterator for clusters of multiplicity M or higher
loop over clusters of a given multiplicity the begin/end_m(M) methods return the begin and end iterator for clusters of multiplicity exactly M
38 const unsigned int max_multiplicity = 31 ;
61 catch(
const exception &error) {
62 cerr << error.what() << endl ;
63 cout <<
"Use option -h! to display command line options." << endl ;
72 load(detectorFile, detector);
75 cerr <<
"FATAL ERROR. Could not open detector file '" << detectorFile <<
"'." << endl ;
83 const int ncolors = 5 ;
84 const int nice_colors[ncolors] = { kRed, kBlue, kBlack, kViolet, kCyan } ;
89 for(
unsigned int m=0; m<max_multiplicity+1; ++m ) {
91 sprintf( hname,
"hToT_m%u", m ) ;
93 sprintf( htitle,
"Exclusive %u-fold coincidence clusters;ToT [ns];a.u. (normalized)", m ) ;
94 hToT[m] =
new TH1D( hname, htitle, 256, -0.5, 255.5 ) ;
95 hToT[m]->SetLineColor( nice_colors[m%ncolors] ) ;
96 hToT[m]->SetLineWidth(2) ;
101 for(
unsigned int m=0; m<max_multiplicity+1; ++m ) {
103 sprintf( hname,
"ht_m%u", m ) ;
105 sprintf( htitle,
"Exclusive %u-fold coincidence clusters;Time after first hits [ns];a.u. (normalized)", m ) ;
106 const int margin = 5 ;
107 double xmin = -margin ;
108 double xmax = ceil(window) + margin ;
109 int nbins = (int) round(xmax-xmin) ;
110 ht[m] =
new TH1D( hname, htitle, nbins, xmin, xmax ) ;
111 ht[m]->SetLineColor( nice_colors[m%ncolors] ) ;
112 ht[m]->SetLineWidth(2) ;
118 TH2D hSizeVsMultiplicity(
"hSizeVsMultiplicity",
";cluster size;cluster multiplicity",
121 hSizeVsMultiplicity.SetOption(
"colz") ;
127 cout <<
"---------- Reading file(s) ----------" << endl ;
133 unsigned int nTS = 0 ;
134 while( scan.hasNext() ) {
136 if( (
int)nTS == maxnslices ) break ;
140 cout <<
"------ Frame index = " << ts->
getFrameIndex() << endl ;
144 for(JDAQTimeslice::const_iterator sf = ts->begin() ; sf!=ts->end() ; ++sf ) {
146 if( sf->size() == 0 )
continue ;
148 int moduleID = sf->getModuleID() ;
149 int localID = moduleRouter.getAddress(moduleID).first ;
150 JModule module = detector[localID] ;
153 cluster_builder.reset(*sf,module) ;
157 cout <<
"--- " <<
"S" << module.
getString() <<
"F" << module.
getFloor() << endl ;
158 cout << setw(10) <<
"multiplicity"
159 << setw(20) <<
"excl. nclusters"
160 << setw(20) <<
"incl. nclusters"
162 for(
unsigned int m=2; m<=max_multiplicity; ++m) {
163 if( cluster_builder.getNclusters(m) != 0 ) {
164 cout << setw(10) << m
165 << setw(20) << cluster_builder.getNclusters(m)
166 << setw(20) << cluster_builder.getInclusiveNclusters(m)
178 hSizeVsMultiplicity.Fill( it->size(), it->getMultiplicity() ) ;
186 for(
unsigned int m=0; m<=max_multiplicity; ++m) {
189 for( JHitL1::const_iterator hit=it->begin(); hit!=it->end(); ++hit ) {
190 hToT[m]->Fill( hit->getToT() ) ;
193 if( it->size() > 1 ) {
194 JHitL1::const_iterator first_hit = it->begin() ;
195 JHitL1::const_iterator hit(first_hit) ;
196 for( ++hit; hit!=it->end(); ++hit ) {
197 ht[m]->Fill( hit->getT() - first_hit->getT() ) ;
205 if( verbose ) cout << endl ;
209 cout <<
"Read " << nTS <<
" time slices." << endl ;
211 TFile* f =
new TFile( ofname.c_str(),
"recreate" ) ;
213 hSizeVsMultiplicity.Write() ;
215 for(
unsigned int m=0; m<=max_multiplicity; ++m) {
216 if( hToT[m]->GetEntries()>0 ) {
218 hToT[m]->Scale( 1.0/hToT[m]->Integral() ) ;
222 if( ht[m]->GetEntries()>0 ) {
224 ht[m]->Scale( 1.0/ht[m]->Integral() ) ;
232 cout <<
"Output in '" << ofname <<
"'." << endl ;
Utility class to parse command line options.
Data structure for a composite optical module.
Router for direct addressing of module data in detector data structure.
int getFrameIndex() const
Get frame index.
int getFloor() const
Get floor number.
int getString() const
Get string number.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
void load(const JString &file_name, JDetector &detector)
Load detector from input file.
Local coincidence cluster builder.