// ********************************************** // protected functions // ********************************************** // return the postion of hit i in hit arrays // ********************************************** inline short int hits::position(int i) { return(places[i]); } // ********************************************** // return number of hits in a set // ********************************************** inline int hits::hits_in_set(int set,int i) { if ((set<0) || (set>=nchargeset)) return(-1); if ((i<0) || (i>=nhit[set])) return(-1); if (set==0) return(i); return(i+nhit[set-1]); } // ********************************************** // test valid hit number // ********************************************** inline int hits::invalid_hit(int hit) { return((hit<0) || (hit>=nhit[nchargeset-1])); } // ********************************************** // swap two hits // ********************************************** inline void hits::swap(int i,int j) { float hf; int hi,ti=3*i,tj=3*j; if (i==j) return; /*if (invalid_hit(i) || invalid_hit(j)) return;*/ hi=cables[i]; cables[i]=cables[j]; cables[j]=hi; hi=places[i]; places[i]=places[j]; places[j]=hi; hf=times[i]; times[i]=times[j]; times[j]=hf; hf=charges[i]; charges[i]=charges[j]; charges[j]=hf; hf=positions[ti]; positions[ti++]=positions[tj]; positions[tj++]=hf; hf=positions[ti]; positions[ti++]=positions[tj]; positions[tj++]=hf; hf=positions[ti]; positions[ti++]=positions[tj]; positions[tj++]=hf; } // ********************************************** // return time difference between two hits // ********************************************** inline float hits::tdiff(int i,int j) { //if (i==j) return(0); //if (invalid_hit(i) || invalid_hit(j)) return(-1); if (times[i]>times[j]) return(times[i]-times[j]); else return(times[j]-times[i]); } // ********************************************** // return distance^2 between two hits // ********************************************** inline float hits::dist2(int i,int j) { int ti=3*i,tj=3*j; float delta_x,delta_y,delta_z; //if (i==j) return(0); //if (invalid_hit(i) || invalid_hit(j)) return(-1); delta_x=positions[ti++]-positions[tj++]; delta_y=positions[ti++]-positions[tj++]; delta_z=positions[ti] -positions[tj]; return(delta_x*delta_x+delta_y*delta_y+delta_z*delta_z); } // ********************************************** // public functions // ********************************************** // return # of charge sets // ********************************************** inline int hits::nset() { return(nchargeset); } // ********************************************** // return hit # of first hit in a set // ********************************************** inline int hits::first_hit(int set) { if ((set<0) || (set>=nchargeset)) return(-1); if (set==0) return(0); return(nhit[set-1]); } // ********************************************** // return hit # of last hit in a set +1 // ********************************************** inline int hits::beyond_last_hit(int set) { if ((set<0) || (set>=nchargeset)) return(-1); return(nhit[set]); } // ********************************************** // return # of hits in a set // ********************************************** inline int hits::nhits(int set) { if ((set<0) || (set>=nchargeset)) return(-1); if (set==0) return(*nhit); return(nhit[set]-nhit[set-1]); } // ********************************************** // return # of hits in a set // ********************************************** inline float hits::charge(int set) { if ((set<0) || (set>=nchargeset)) return(-1); if (set==0) if (*nhit==0) return(-1); else return(*avcharges); if (nhit[set]==nhit[set-1]) return(-1); else return(avcharges[set]); } // ********************************************** // return sum of hits for this set and higher charge sets // ********************************************** inline int hits::sumhits(int set) { if ((set<0) || (set>=nchargeset)) return(-1); if (set==0) return(nhit[nchargeset-1]); return(nhit[nchargeset-1]-nhit[set-1]); } // ********************************************** // return cable of a hit PMT // ********************************************** inline int hits::hitcable(int hit) { return(cables[hit]); } // ********************************************** // return time of hit // ********************************************** inline float hits::x(int hit) { return(positions[3*hit]); } // ********************************************** // return time of hit // ********************************************** inline float hits::y(int hit) { return(positions[3*hit+1]); } // ********************************************** // return time of hit // ********************************************** inline float hits::z(int hit) { return(positions[3*hit+2]); } // ********************************************** // return time of hit PMT // ********************************************** inline float hits::hittime(int hit) { return(times[hit]); } // ********************************************** // return charge of hit // ********************************************** inline float hits::hitcharge(int hit) { return(charges[hit]); } // ********************************************** // print out a hit // ********************************************** inline void hits::printhit(int hit) { printf("%5d %8.2f %8.2f %8.2f %11.5f %6.2f\n", cables[hit],positions[3*hit],positions[3*hit+1], positions[3*hit+2],times[hit],charges[hit]); } // ********************************************** // return total number of hits // ********************************************** inline int hits::ntot(void) { return(nhit[nchargeset-1]); } // ********************************************** // return position in front of a hit PMT // ********************************************** inline void hits::frontof(float *pos,int i,float top) { if (fabs(positions[3*i+2])