Hall C ROOT/C++ Analyzer (hcana)
THcAerogel.cxx
Go to the documentation of this file.
1 
8 #include "THcAerogel.h"
9 #include "THcHodoscope.h"
10 #include "TClonesArray.h"
11 #include "THcSignalHit.h"
12 #include "THaEvData.h"
13 #include "THaDetMap.h"
14 #include "THcDetectorMap.h"
15 #include "THcGlobals.h"
16 #include "THaCutList.h"
17 #include "THcParmList.h"
18 #include "THcHitList.h"
19 #include "THaApparatus.h"
20 #include "VarDef.h"
21 #include "VarType.h"
22 #include "THaTrack.h"
23 #include "TClonesArray.h"
24 #include "TMath.h"
25 #include "THaTrackProj.h"
26 #include "THcRawAdcHit.h"
27 #include "THcHallCSpectrometer.h"
28 
29 #include <cstring>
30 #include <cstdio>
31 #include <cstdlib>
32 #include <iostream>
33 
34 using namespace std;
35 
36 //_____________________________________________________________________________
37 THcAerogel::THcAerogel( const char* name, const char* description,
38  THaApparatus* apparatus ) :
39  THaNonTrackingDetector(name,description,apparatus), fPresentP(0),
40  fAdcPosTimeWindowMin(0), fAdcPosTimeWindowMax(0), fAdcNegTimeWindowMin(0),
41  fAdcNegTimeWindowMax(0),fPedNegDefault(0),fPedPosDefault(0),
42  fRegionValue(0), fPosGain(0), fNegGain(0),
43  frPosAdcPedRaw(0), frPosAdcPulseIntRaw(0), frPosAdcPulseAmpRaw(0),
44  frPosAdcPulseTimeRaw(0), frPosAdcPed(0), frPosAdcPulseInt(0),
45  frPosAdcPulseAmp(0), frPosAdcPulseTime(0), frNegAdcPedRaw(0),
46  frNegAdcPulseIntRaw(0), frNegAdcPulseAmpRaw(0), frNegAdcPulseTimeRaw(0),
47  frNegAdcPed(0), frNegAdcPulseInt(0), frNegAdcPulseAmp(0),
48  frNegAdcPulseTime(0), fPosAdcErrorFlag(0),
49  fNegAdcErrorFlag(0), fPosPedSum(0), fPosPedSum2(0), fPosPedLimit(0),
50  fPosPedCount(0), fNegPedSum(0), fNegPedSum2(0), fNegPedLimit(0), fNegPedCount(0),
51  fA_Pos(0), fA_Neg(0), fA_Pos_p(0), fA_Neg_p(0), fT_Pos(0), fT_Neg(0),
52  fPosPed(0), fPosSig(0), fPosThresh(0), fNegPed(0), fNegSig(0),
53  fNegThresh(0), fPosPedMean(0), fNegPedMean(0),
54  fPosTDCHits(0), fNegTDCHits(0), fPosADCHits(0), fNegADCHits(0)
55 {
56 }
57 
58 //_____________________________________________________________________________
60  THaNonTrackingDetector(),
61  fAdcPosTimeWindowMin(0), fAdcPosTimeWindowMax(0), fAdcNegTimeWindowMin(0),
62  fAdcNegTimeWindowMax(0),
63  fPedNegDefault(0),fPedPosDefault(0),fRegionValue(0), fPosGain(0), fNegGain(0),
64  frPosAdcPedRaw(0), frPosAdcPulseIntRaw(0), frPosAdcPulseAmpRaw(0),
65  frPosAdcPulseTimeRaw(0), frPosAdcPed(0), frPosAdcPulseInt(0),
66  frPosAdcPulseAmp(0), frPosAdcPulseTime(0), frNegAdcPedRaw(0),
67  frNegAdcPulseIntRaw(0), frNegAdcPulseAmpRaw(0), frNegAdcPulseTimeRaw(0),
68  frNegAdcPed(0), frNegAdcPulseInt(0), frNegAdcPulseAmp(0),
69  frNegAdcPulseTime(0), fPosAdcErrorFlag(0),
70  fNegAdcErrorFlag(0), fPosPedSum(0), fPosPedSum2(0), fPosPedLimit(0),
71  fPosPedCount(0), fNegPedSum(0), fNegPedSum2(0), fNegPedLimit(0), fNegPedCount(0),
72  fA_Pos(0), fA_Neg(0), fA_Pos_p(0), fA_Neg_p(0), fT_Pos(0), fT_Neg(0),
73  fPosPed(0), fPosSig(0), fPosThresh(0), fNegPed(0), fNegSig(0),
74  fNegThresh(0), fPosPedMean(0), fNegPedMean(0),
75  fPosTDCHits(0), fNegTDCHits(0), fPosADCHits(0), fNegADCHits(0)
76 {
77 }
78 
79 //_____________________________________________________________________________
81 {
82  // Destructor
83  DeleteArrays();
84 }
85 
86 //_____________________________________________________________________________
88 {
89  // Delete all dynamically allocated memory
90 
91  delete frPosAdcPedRaw; frPosAdcPedRaw = NULL;
95  delete frPosAdcPed; frPosAdcPed = NULL;
96  delete frPosAdcPulseInt; frPosAdcPulseInt = NULL;
97  delete frPosAdcPulseAmp; frPosAdcPulseAmp = NULL;
98  delete frPosAdcPulseTime; frPosAdcPulseTime = NULL;
99  delete frNegAdcPedRaw; frNegAdcPedRaw = NULL;
103  delete frNegAdcPed; frNegAdcPed = NULL;
104  delete frNegAdcPulseInt; frNegAdcPulseInt = NULL;
105  delete frNegAdcPulseAmp; frNegAdcPulseAmp = NULL;
106  delete frNegAdcPulseTime; frNegAdcPulseTime = NULL;
107  delete fPosAdcErrorFlag; fPosAdcErrorFlag = NULL;
108  delete fNegAdcErrorFlag; fNegAdcErrorFlag = NULL;
109 
110  delete [] fRegionValue; fRegionValue = 0;
115  delete [] fPedNegDefault; fPedNegDefault = 0;
116  delete [] fPedPosDefault; fPedPosDefault = 0;
117 
118  // 6 GeV variables
119  delete fPosTDCHits; fPosTDCHits = NULL;
120  delete fNegTDCHits; fNegTDCHits = NULL;
121  delete fPosADCHits; fPosADCHits = NULL;
122  delete fNegADCHits; fNegADCHits = NULL;
123 
124  delete [] fPosGain; fPosGain = NULL;
125  delete [] fNegGain; fNegGain = NULL;
126 
127  delete [] fA_Pos; fA_Pos = NULL;
128  delete [] fA_Neg; fA_Neg = NULL;
129  delete [] fA_Pos_p; fA_Pos_p = NULL;
130  delete [] fA_Neg_p; fA_Neg_p = NULL;
131  delete [] fT_Pos; fT_Pos = NULL;
132  delete [] fT_Neg; fT_Neg = NULL;
133 
134  if (fSixGevData)
136 }
137 
138 //_____________________________________________________________________________
140 {
141  // Delete all dynamically allocated memory for pedestal processing
142 
143  delete [] fPosPedLimit; fPosPedLimit = NULL;
144  delete [] fNegPedLimit; fNegPedLimit = NULL;
145  delete [] fPosPedMean; fPosPedMean = NULL;
146  delete [] fNegPedMean; fNegPedMean = NULL;
147  delete [] fPosPedSum; fPosPedSum = NULL;
148  delete [] fPosPedSum2; fPosPedSum2 = NULL;
149  delete [] fPosPedCount; fPosPedCount = NULL;
150  delete [] fNegPedSum; fNegPedSum = NULL;
151  delete [] fNegPedSum2; fNegPedSum2 = NULL;
152  delete [] fNegPedCount; fNegPedCount = NULL;
153  delete [] fPosPed; fPosPed = NULL;
154  delete [] fPosSig; fPosSig = NULL;
155  delete [] fPosThresh; fPosThresh = NULL;
156  delete [] fNegPed; fNegPed = NULL;
157  delete [] fNegSig; fNegSig = NULL;
158  delete [] fNegThresh; fNegThresh = NULL;
159 }
160 
161 //_____________________________________________________________________________
162 THaAnalysisObject::EStatus THcAerogel::Init( const TDatime& date )
163 {
164 
165  // cout << "THcAerogel::Init for: " << GetName() << endl;
166 
167  char EngineDID[] = "xAERO";
168  EngineDID[0] = toupper(GetApparatus()->GetName()[0]);
169  if( gHcDetectorMap->FillMap(fDetMap, EngineDID) < 0 ) {
170  static const char* const here = "Init()";
171  Error( Here(here), "Error filling detectormap for %s.", EngineDID );
172  return kInitError;
173  }
174 
175  EStatus status;
176  if( (status = THaNonTrackingDetector::Init( date )) )
177  return fStatus=status;
178 
179  // Should probably put this in ReadDatabase as we will know the
180  // maximum number of hits after setting up the detector map
181  InitHitList(fDetMap, "THcAerogelHit", fDetMap->GetTotNumChan()+1,
182  0, fADC_RefTimeCut);
183 
184  THcHallCSpectrometer *app=dynamic_cast<THcHallCSpectrometer*>(GetApparatus());
185  if( !app ||
186  !(fglHod = dynamic_cast<THcHodoscope*>(app->GetDetector("hod"))) ) {
187  static const char* const here = "ReadDatabase()";
188  Warning(Here(here),"Hodoscope \"%s\" not found. ","hod");
189  }
190 
191  fPresentP = 0;
192  THaVar* vpresent = gHaVars->Find(Form("%s.present",GetApparatus()->GetName()));
193  if(vpresent) {
194  fPresentP = (Bool_t *) vpresent->GetValuePointer();
195  }
196  return fStatus = kOK;
197 }
198 
199 //_____________________________________________________________________________
201 {
202  // This function is called by THaDetectorBase::Init() once at the beginning
203  // of the analysis.
204 
205  // cout << "THcAerogel::ReadDatabase for: " << GetName() << endl;
206 
207  char prefix[2];
208  prefix[0]=tolower(GetApparatus()->GetName()[0]);
209  prefix[1]='\0';
210 
211  CreateMissReportParms(Form("%saero",prefix));
212 
213  fNRegions = 1; // Default if not set in parameter file
214 
215  DBRequest listextra[]={
216  {"aero_num_pairs", &fNelem, kInt},
217  {0}
218  };
219 
220  gHcParms->LoadParmValues((DBRequest*)&listextra, prefix);
221 
222  Bool_t optional = true;
223 
224  cout << "Created aerogel detector " << GetApparatus()->GetName() << "."
225  << GetName() << " with " << fNelem << " PMT pairs" << endl;
226 
227  DeleteArrays(); // avoid memory leak when reinitializing
228 
229  fPosGain = new Double_t[fNelem];
230  fNegGain = new Double_t[fNelem];
231 
232  // 6 GeV variables
233  fTdcOffset = 0; // Offset to make reference time subtracted times positve
234  fA_Pos = new Float_t[fNelem];
235  fA_Neg = new Float_t[fNelem];
236  fA_Pos_p = new Float_t[fNelem];
237  fA_Neg_p = new Float_t[fNelem];
238  fT_Pos = new Float_t[fNelem];
239  fT_Neg = new Float_t[fNelem];
240 
241  // Normal constructor with name and description
242  frPosAdcPedRaw = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse);
243  frPosAdcPulseIntRaw = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse);
244  frPosAdcPulseAmpRaw = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse);
245  frPosAdcPulseTimeRaw = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse);
246  frPosAdcPed = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse);
247  frPosAdcPulseInt = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse);
248  frPosAdcPulseAmp = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse);
249  frPosAdcPulseTime = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse);
250  frNegAdcPedRaw = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse);
251  frNegAdcPulseIntRaw = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse);
252  frNegAdcPulseAmpRaw = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse);
253  frNegAdcPulseTimeRaw = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse);
254  frNegAdcPed = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse);
255  frNegAdcPulseInt = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse);
256  frNegAdcPulseAmp = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse);
257  frNegAdcPulseTime = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse);
258  fPosAdcErrorFlag = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse);
259  fNegAdcErrorFlag = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse);
260 
261  fNumPosAdcHits.assign(fNelem, 0);
262  fNumGoodPosAdcHits.assign(fNelem, 0);
263  fNumNegAdcHits.assign(fNelem, 0);
264  fNumGoodNegAdcHits.assign(fNelem, 0);
265  fNumTracksMatched.assign(fNelem, 0);
266  fNumTracksFired.assign(fNelem, 0);
267  fPosNpe.assign(fNelem, 0.0);
268  fNegNpe.assign(fNelem, 0.0);
269  fGoodPosAdcPed.assign(fNelem, 0.0);
270  fGoodPosAdcMult.assign(fNelem, 0.0);
271  fGoodPosAdcPulseInt.assign(fNelem, 0.0);
272  fGoodPosAdcPulseIntRaw.assign(fNelem, 0.0);
273  fGoodPosAdcPulseAmp.assign(fNelem, 0.0);
274  fGoodPosAdcPulseTime.assign(fNelem, 0.0);
275  fGoodPosAdcTdcDiffTime.assign(fNelem, 0.0);
276  fGoodNegAdcPed.assign(fNelem, 0.0);
277  fGoodNegAdcMult.assign(fNelem, 0.0);
278  fGoodNegAdcPulseInt.assign(fNelem, 0.0);
279  fGoodNegAdcPulseIntRaw.assign(fNelem, 0.0);
280  fGoodNegAdcPulseAmp.assign(fNelem, 0.0);
281  fGoodNegAdcPulseTime.assign(fNelem, 0.0);
282  fGoodNegAdcTdcDiffTime.assign(fNelem, 0.0);
283 
284  // 6 GeV variables
285  fPosTDCHits = new TClonesArray("THcSignalHit", fNelem*16);
286  fNegTDCHits = new TClonesArray("THcSignalHit", fNelem*16);
287  fPosADCHits = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse);
288  fNegADCHits = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse);
289 
290  fPosNpeSixGev.assign(fNelem, 0.0);
291  fNegNpeSixGev.assign(fNelem, 0.0);
292 
293  // Region parameters
296 
297  fAdcPosTimeWindowMin = new Double_t [fNelem];
298  fAdcPosTimeWindowMax = new Double_t [fNelem];
299  fAdcNegTimeWindowMin = new Double_t [fNelem];
300  fAdcNegTimeWindowMax = new Double_t [fNelem];
301  fPedNegDefault = new Int_t [fNelem];
302  fPedPosDefault = new Int_t [fNelem];
303 
304  DBRequest list[]={
305  {"aero_num_regions", &fNRegions, kInt},
306  {"aero_red_chi2_min", &fRedChi2Min, kDouble},
307  {"aero_red_chi2_max", &fRedChi2Max, kDouble},
308  {"aero_beta_min", &fBetaMin, kDouble},
309  {"aero_beta_max", &fBetaMax, kDouble},
310  {"aero_enorm_min", &fENormMin, kDouble},
311  {"aero_enorm_max", &fENormMax, kDouble},
312  {"aero_dp_min", &fDpMin, kDouble},
313  {"aero_dp_max", &fDpMax, kDouble},
314  {"aero_diff_box_zpos", &fDiffBoxZPos, kDouble},
315  {"aero_npe_thresh", &fNpeThresh, kDouble},
318  {"aero_adcPosTimeWindowMin", fAdcPosTimeWindowMin, kDouble, static_cast<UInt_t>(fNelem), 1},
319  {"aero_adcPosTimeWindowMax", fAdcPosTimeWindowMax, kDouble, static_cast<UInt_t>(fNelem), 1},
320  {"aero_adcNegTimeWindowMin", fAdcNegTimeWindowMin, kDouble, static_cast<UInt_t>(fNelem), 1},
321  {"aero_adcNegTimeWindowMax", fAdcNegTimeWindowMax, kDouble, static_cast<UInt_t>(fNelem), 1},
322  {"aero_PedNegDefault", fPedNegDefault, kInt, static_cast<UInt_t>(fNelem), 1},
323  {"aero_PedPosDefault", fPedPosDefault, kInt, static_cast<UInt_t>(fNelem), 1},
324  {"aero_adc_tdc_offset", &fAdcTdcOffset, kDouble, 0, 1},
325  {"aero_debug_adc", &fDebugAdc, kInt, 0, 1},
326  {"aero_six_gev_data", &fSixGevData, kInt, 0, 1},
327  {"aero_pos_gain", fPosGain, kDouble, (UInt_t) fNelem},
328  {"aero_neg_gain", fNegGain, kDouble, (UInt_t) fNelem},
329  {"aero_tdc_offset", &fTdcOffset, kInt, 0, optional},
330  {"aero_region", &fRegionValue[0], kDouble, (UInt_t) fRegionsValueMax},
331  {"aero_adcrefcut", &fADC_RefTimeCut, kInt, 0, 1},
332  {0}
333  };
334 
335  for(Int_t ip=0;ip<fNelem;ip++) {
336  fAdcPosTimeWindowMin[ip] = -1000.;
337  fAdcNegTimeWindowMin[ip] = -1000.;
338  fAdcPosTimeWindowMax[ip] = 1000.;
339  fAdcNegTimeWindowMax[ip] = 1000.;
340  fPedNegDefault[ip] = 0.;
341  fPedPosDefault[ip] = 0.;
342  }
343 
344  fSixGevData = 0; // Set 6 GeV data parameter to false unless set in parameter file
345  fDebugAdc = 0; // Set ADC debug parameter to false unless set in parameter file
346  fAdcTdcOffset = 0.0;
347  fADC_RefTimeCut = 0;
348 
349  gHcParms->LoadParmValues((DBRequest*)&list, prefix);
350 
351  if (fSixGevData) {
352  // Create arrays to hold pedestal results
354 
355  DBRequest list2[]={
356  {"aero_pos_ped_limit", fPosPedLimit, kInt, (UInt_t) fNelem, optional},
357  {"aero_neg_ped_limit", fNegPedLimit, kInt, (UInt_t) fNelem, optional},
358  {"aero_pos_ped_mean", fPosPedMean, kDouble, (UInt_t) fNelem, optional},
359  {"aero_neg_ped_mean", fNegPedMean, kDouble, (UInt_t) fNelem, optional},
360  {"aero_min_peds", &fMinPeds, kInt, 0, optional},
361  {0}
362  };
363  gHcParms->LoadParmValues((DBRequest*)&list2, prefix);
364 
365  cout << "6 GeV Data Analysis Flag Set To TRUE" << endl;
366  }
367 
368  fIsInit = true;
369 
370  // cout << "Track Matching Parameters for: " << GetApparatus()->GetName()
371  // << "." << GetName() << endl;
372  // for (Int_t iregion = 0; iregion < fNRegions; iregion++) {
373  // cout << "Region = " << iregion + 1 << endl;
374  // for (Int_t ivalue = 0; ivalue < 8; ivalue++)
375  // cout << fRegionValue[GetIndex(iregion, ivalue)] << " ";
376  // cout << endl;
377  // }
378 
379  return kOK;
380 }
381 
382 //_____________________________________________________________________________
384 {
385  // Initialize global variables for histogramming and tree
386 
387  // cout << "THcAerogel::DefineVariables called for: " << GetName() << endl;
388 
389  if( mode == kDefine && fIsSetup ) return kOK;
390  fIsSetup = ( mode == kDefine );
391 
392  // Register variables in global list
393 
394  // Do we need to put the number of pos/neg TDC/ADC hits into the variables?
395  // No. They show up in tree as Ndata.H.aero.postdchits for example
396 
397  if (fDebugAdc) {
398  RVarDef vars[] = {
399  {"posGain", "Positive PMT gains", "fPosGain"},
400  {"negGain", "Negative PMT gains", "fNegGain"},
401 
402  {"numPosAdcHits", "Number of Positive ADC Hits Per PMT", "fNumPosAdcHits"}, // Aerogel occupancy
403  {"totNumPosAdcHits", "Total Number of Positive ADC Hits", "fTotNumPosAdcHits"}, // Aerogel multiplicity
404  {"numNegAdcHits", "Number of Negative ADC Hits Per PMT", "fNumNegAdcHits"}, // Aerogel occupancy
405  {"totNumNegAdcHits", "Total Number of Negative ADC Hits", "fTotNumNegAdcHits"}, // Aerogel multiplicity
406  {"totnumAdcHits", "Total Number of ADC Hits Per PMT", "fTotNumAdcHits"}, // Aerogel multiplicity
407 
408  {"posAdcPedRaw", "Positive Raw ADC pedestals", "frPosAdcPedRaw.THcSignalHit.GetData()"},
409  {"posAdcPulseIntRaw", "Positive Raw ADC pulse integrals", "frPosAdcPulseIntRaw.THcSignalHit.GetData()"},
410  {"posAdcPulseAmpRaw", "Positive Raw ADC pulse amplitudes", "frPosAdcPulseAmpRaw.THcSignalHit.GetData()"},
411  {"posAdcPulseTimeRaw", "Positive Raw ADC pulse times", "frPosAdcPulseTimeRaw.THcSignalHit.GetData()"},
412  {"posAdcPed", "Positive ADC pedestals", "frPosAdcPed.THcSignalHit.GetData()"},
413  {"posAdcPulseInt", "Positive ADC pulse integrals", "frPosAdcPulseInt.THcSignalHit.GetData()"},
414  {"posAdcPulseAmp", "Positive ADC pulse amplitudes", "frPosAdcPulseAmp.THcSignalHit.GetData()"},
415  {"posAdcPulseTime", "Positive ADC pulse times", "frPosAdcPulseTime.THcSignalHit.GetData()"},
416 
417  {"negAdcPedRaw", "Negative Raw ADC pedestals", "frNegAdcPedRaw.THcSignalHit.GetData()"},
418  {"negAdcPulseIntRaw", "Negative Raw ADC pulse integrals", "frNegAdcPulseIntRaw.THcSignalHit.GetData()"},
419  {"negAdcPulseAmpRaw", "Negative Raw ADC pulse amplitudes", "frNegAdcPulseAmpRaw.THcSignalHit.GetData()"},
420  {"negAdcPulseTimeRaw", "Negative Raw ADC pulse times", "frNegAdcPulseTimeRaw.THcSignalHit.GetData()"},
421  {"negAdcPed", "Negative ADC pedestals", "frNegAdcPed.THcSignalHit.GetData()"},
422  {"negAdcPulseInt", "Negative ADC pulse integrals", "frNegAdcPulseInt.THcSignalHit.GetData()"},
423  {"negAdcPulseAmp", "Negative ADC pulse amplitudes", "frNegAdcPulseAmp.THcSignalHit.GetData()"},
424  {"negAdcPulseTime", "Negative ADC pulse times", "frNegAdcPulseTime.THcSignalHit.GetData()"},
425  { 0 }
426  };
427  DefineVarsFromList( vars, mode);
428  } //end debug statement
429 
430  if (fSixGevData) {
431  RVarDef vars[] = {
432  {"apos", "Positive Raw ADC Amplitudes", "fA_Pos"},
433  {"aneg", "Negative Raw ADC Amplitudes", "fA_Neg"},
434  {"apos_p", "Positive Ped-subtracted ADC Amplitudes", "fA_Pos_p"},
435  {"aneg_p", "Negative Ped-subtracted ADC Amplitudes", "fA_Neg_p"},
436  {"tpos", "Positive Raw TDC", "fT_Pos"},
437  {"tneg", "Negative Raw TDC", "fT_Neg"},
438  {"ntdc_pos_hits", "Number of Positive Tube Hits", "fNTDCPosHits"},
439  {"ntdc_neg_hits", "Number of Negative Tube Hits", "fNTDCNegHits"},
440  {"posadchits", "Positive ADC hits", "fPosADCHits.THcSignalHit.GetPaddleNumber()"},
441  {"negadchits", "Negative ADC hits", "fNegADCHits.THcSignalHit.GetPaddleNumber()"},
442  {"postdchits", "Positive TDC hits", "fPosTDCHits.THcSignalHit.GetPaddleNumber()"},
443  {"negtdchits", "Negative TDC hits", "fNegTDCHits.THcSignalHit.GetPaddleNumber()"},
444  {"nGoodHits", "Total number of good hits", "fNGoodHits"},
445  {"posNpeSixGev", "Number of Positive PEs", "fPosNpeSixGev"},
446  {"negNpeSixGev", "Number of Negative PEs", "fNegNpeSixGev"},
447  {"posNpeSumSixGev", "Total Number of Positive PEs", "fPosNpeSumSixGev"},
448  {"negNpeSumSixGev", "Total Number of Negative PEs", "fNegNpeSumSixGev"},
449  {"npeSumSixGev", "Total Number of PEs", "fNpeSumSixGev"},
450  { 0 }
451  };
452  DefineVarsFromList( vars, mode);
453  } //end fSixGevData statement
454 
455  RVarDef vars[] = {
456  {"posAdcCounter", "Positive ADC counter numbers", "frPosAdcPulseIntRaw.THcSignalHit.GetPaddleNumber()"},
457  {"negAdcCounter", "Negative ADC counter numbers", "frNegAdcPulseIntRaw.THcSignalHit.GetPaddleNumber()"},
458  {"posAdcErrorFlag", "Error Flag for When FPGA Fails", "fPosAdcErrorFlag.THcSignalHit.GetData()"},
459  {"negAdcErrorFlag", "Error Flag for When FPGA Fails", "fNegAdcErrorFlag.THcSignalHit.GetData()"},
460 
461  {"numGoodPosAdcHits", "Number of Good Positive ADC Hits Per PMT", "fNumGoodPosAdcHits"}, // Aerogel occupancy
462  {"numGoodNegAdcHits", "Number of Good Negative ADC Hits Per PMT", "fNumGoodNegAdcHits"}, // Aerogel occupancy
463  {"totNumGoodPosAdcHits", "Total Number of Good Positive ADC Hits", "fTotNumGoodPosAdcHits"}, // Aerogel multiplicity
464  {"totNumGoodNegAdcHits", "Total Number of Good Negative ADC Hits", "fTotNumGoodNegAdcHits"}, // Aerogel multiplicity
465 
466  {"totnumGoodAdcHits", "TotalNumber of Good ADC Hits Per PMT", "fTotNumGoodAdcHits"}, // Aerogel multiplicity
467  {"numTracksMatched", "Number of Tracks Matched Per Region", "fNumTracksMatched"},
468  {"numTracksFired", "Number of Tracks that Fired Per Region", "fNumTracksFired"},
469  {"totNumTracksMatched", "Total Number of Tracks Matched Per Region", "fTotNumTracksMatched"},
470  {"totNumTracksFired", "Total Number of Tracks that Fired", "fTotNumTracksFired"},
471 
472  {"xAtAero", "Track X at Aero diffusion box", "fXAtAero"},
473  {"yAtAero", "Track Y at Aero diffusion box", "fYAtAero"},
474 
475  {"posNpe", "Number of Positive PEs", "fPosNpe"},
476  {"negNpe", "Number of Negative PEs", "fNegNpe"},
477  {"posNpeSum", "Total Number of Positive PEs", "fPosNpeSum"},
478  {"negNpeSum", "Total Number of Negative PEs", "fNegNpeSum"},
479  {"npeSum", "Total Number of PEs", "fNpeSum"},
480 
481  {"goodPosAdcPed", "Good Negative ADC pedestals", "fGoodPosAdcPed"},
482  {"goodPosAdcMult", "Good Positive ADC mult", "fGoodPosAdcMult"},
483  {"goodPosAdcPulseInt", "Good Negative ADC pulse integrals", "fGoodPosAdcPulseInt"},
484  {"goodPosAdcPulseIntRaw", "Good Negative ADC raw pulse integrals", "fGoodPosAdcPulseIntRaw"},
485  {"goodPosAdcPulseAmp", "Good Negative ADC pulse amplitudes", "fGoodPosAdcPulseAmp"},
486  {"goodPosAdcPulseTime", "Good Negative ADC pulse times", "fGoodPosAdcPulseTime"},
487  {"goodPosAdcTdcDiffTime", "Good Positive hodo Start - ADC pulse times", "fGoodPosAdcTdcDiffTime"},
488 
489  {"goodNegAdcPed", "Good Negative ADC pedestals", "fGoodNegAdcPed"},
490  {"goodNegAdcMult", "Good Negative ADC Mult", "fGoodNegAdcMult"},
491  {"goodNegAdcPulseInt", "Good Negative ADC pulse integrals", "fGoodNegAdcPulseInt"},
492  {"goodNegAdcPulseIntRaw", "Good Negative ADC raw pulse integrals", "fGoodNegAdcPulseIntRaw"},
493  {"goodNegAdcPulseAmp", "Good Negative ADC pulse amplitudes", "fGoodNegAdcPulseAmp"},
494  {"goodNegAdcPulseTime", "Good Negative ADC pulse times", "fGoodNegAdcPulseTime"},
495  {"goodNegAdcTdcDiffTime", "Good Negative hodo Start - ADC pulse times", "fGoodNegAdcTdcDiffTime"},
496  { 0 }
497  };
498 
499  return DefineVarsFromList(vars, mode);
500 }
501 //_____________________________________________________________________________
502 inline
504 {
505  // Clear the hit lists
506  fNhits = 0;
507  fTotNumAdcHits = 0;
508  fTotNumGoodAdcHits = 0;
509  fTotNumPosAdcHits = 0;
510  fTotNumNegAdcHits = 0;
514  fTotNumTracksFired = 0;
515 
516  fXAtAero = 0.0;
517  fYAtAero = 0.0;
518 
519  fNpeSum = 0.0;
520  fPosNpeSum = 0.0;
521  fNegNpeSum = 0.0;
522 
527  frPosAdcPed->Clear();
531 
536  frNegAdcPed->Clear();
540 
543 
544  for (UInt_t ielem = 0; ielem < fNumPosAdcHits.size(); ielem++)
545  fNumPosAdcHits.at(ielem) = 0;
546  for (UInt_t ielem = 0; ielem < fNumNegAdcHits.size(); ielem++)
547  fNumNegAdcHits.at(ielem) = 0;
548  for (UInt_t ielem = 0; ielem < fNumGoodPosAdcHits.size(); ielem++)
549  fNumGoodPosAdcHits.at(ielem) = 0;
550  for (UInt_t ielem = 0; ielem < fNumGoodNegAdcHits.size(); ielem++)
551  fNumGoodNegAdcHits.at(ielem) = 0;
552  for (UInt_t ielem = 0; ielem < fNumTracksMatched.size(); ielem++)
553  fNumTracksMatched.at(ielem) = 0;
554  for (UInt_t ielem = 0; ielem < fNumTracksFired.size(); ielem++)
555  fNumTracksFired.at(ielem) = 0;
556 
557  for (UInt_t ielem = 0; ielem < fGoodPosAdcPed.size(); ielem++) {
558  fGoodPosAdcPed.at(ielem) = 0.0;
559  fGoodPosAdcMult.at(ielem) = 0.0;
560  fGoodPosAdcPulseInt.at(ielem) = 0.0;
561  fGoodPosAdcPulseIntRaw.at(ielem) = 0.0;
562  fGoodPosAdcPulseAmp.at(ielem) = 0.0;
563  fGoodPosAdcPulseTime.at(ielem) = kBig;
564  fGoodPosAdcTdcDiffTime.at(ielem) = kBig;
565  fPosNpe.at(ielem) = 0.0;
566  }
567  for (UInt_t ielem = 0; ielem < fGoodNegAdcPed.size(); ielem++) {
568  fGoodNegAdcPed.at(ielem) = 0.0;
569  fGoodNegAdcMult.at(ielem) = 0.0;
570  fGoodNegAdcPulseInt.at(ielem) = 0.0;
571  fGoodNegAdcPulseIntRaw.at(ielem) = 0.0;
572  fGoodNegAdcPulseAmp.at(ielem) = 0.0;
573  fGoodNegAdcPulseTime.at(ielem) = kBig;
574  fGoodNegAdcTdcDiffTime.at(ielem) = kBig;
575  fNegNpe.at(ielem) = 0.0;
576  }
577 
578  // 6 GeV variables
579  fNGoodHits = 0;
580  fNADCPosHits = 0;
581  fNADCNegHits = 0;
582  fNTDCPosHits = 0;
583  fNTDCNegHits = 0;
584  fNpeSumSixGev = 0.0;
585  fPosNpeSumSixGev = 0.0;
586  fNegNpeSumSixGev = 0.0;
587  fPosTDCHits->Clear();
588  fNegTDCHits->Clear();
589  fPosADCHits->Clear();
590  fNegADCHits->Clear();
591 
592  for (UInt_t ielem = 0; ielem < fPosNpeSixGev.size(); ielem++)
593  fPosNpeSixGev.at(ielem) = 0.0;
594  for (UInt_t ielem = 0; ielem < fNegNpeSixGev.size(); ielem++)
595  fNegNpeSixGev.at(ielem) = 0.0;
596 
597  for(Int_t itube = 0;itube < fNelem;itube++) {
598  fA_Pos[itube] = 0;
599  fA_Neg[itube] = 0;
600  fA_Pos_p[itube] = 0;
601  fA_Neg_p[itube] = 0;
602  fT_Pos[itube] = 0;
603  fT_Neg[itube] = 0;
604  }
605 
606 }
607 
608 //_____________________________________________________________________________
610 {
611  // Get the Hall C style hitlist (fRawHitList) for this event
612  Bool_t present = kTRUE; // Suppress reference time warnings
613  if(fPresentP) { // if this spectrometer not part of trigger
614  present = *fPresentP;
615  }
616  fNhits = DecodeToHitList(evdata, !present);
617 
618  if (fSixGevData) {
619  if(gHaCuts->Result("Pedestal_event")) {
621  fAnalyzePedestals = 1; // Analyze pedestals first normal events
622  return(0);
623  }
624  if(fAnalyzePedestals) {
626  Print("");
627  fAnalyzePedestals = 0; // Don't analyze pedestals next event
628  }
629  }
630 
631  Int_t ihit = 0;
632  UInt_t nrPosAdcHits = 0;
633  UInt_t nrNegAdcHits = 0;
634 
635  while(ihit < fNhits) {
636  THcAerogelHit* hit = (THcAerogelHit*) fRawHitList->At(ihit);
637  Int_t npmt = hit->fCounter;
638  THcRawAdcHit& rawPosAdcHit = hit->GetRawAdcHitPos();
639  THcRawAdcHit& rawNegAdcHit = hit->GetRawAdcHitNeg();
640 
641  for (UInt_t thit=0; thit<rawPosAdcHit.GetNPulses(); ++thit) {
642 
643  ((THcSignalHit*) frPosAdcPedRaw->ConstructedAt(nrPosAdcHits))->Set(npmt, rawPosAdcHit.GetPedRaw());
644  ((THcSignalHit*) frPosAdcPed->ConstructedAt(nrPosAdcHits))->Set(npmt, rawPosAdcHit.GetPed());
645 
646  ((THcSignalHit*) frPosAdcPulseIntRaw->ConstructedAt(nrPosAdcHits))->Set(npmt, rawPosAdcHit.GetPulseIntRaw(thit));
647  ((THcSignalHit*) frPosAdcPulseInt->ConstructedAt(nrPosAdcHits))->Set(npmt, rawPosAdcHit.GetPulseInt(thit));
648 
649  ((THcSignalHit*) frPosAdcPulseAmpRaw->ConstructedAt(nrPosAdcHits))->Set(npmt, rawPosAdcHit.GetPulseAmpRaw(thit));
650  ((THcSignalHit*) frPosAdcPulseAmp->ConstructedAt(nrPosAdcHits))->Set(npmt, rawPosAdcHit.GetPulseAmp(thit));
651 
652  ((THcSignalHit*) frPosAdcPulseTimeRaw->ConstructedAt(nrPosAdcHits))->Set(npmt, rawPosAdcHit.GetPulseTimeRaw(thit));
653  ((THcSignalHit*) frPosAdcPulseTime->ConstructedAt(nrPosAdcHits))->Set(npmt, rawPosAdcHit.GetPulseTime(thit)+fAdcTdcOffset);
654 
655  if (rawPosAdcHit.GetPulseAmpRaw(thit) > 0) ((THcSignalHit*) fPosAdcErrorFlag->ConstructedAt(nrPosAdcHits))->Set(npmt, 0);
656  if (rawPosAdcHit.GetPulseAmpRaw(thit) <= 0) ((THcSignalHit*) fPosAdcErrorFlag->ConstructedAt(nrPosAdcHits))->Set(npmt, 1);
657 
658  if (rawPosAdcHit.GetPulseAmpRaw(thit) <= 0) {
659  Double_t PeakPedRatio= rawPosAdcHit.GetF250_PeakPedestalRatio();
660  Int_t NPedSamples= rawPosAdcHit.GetF250_NPedestalSamples();
661  Double_t AdcToC = rawPosAdcHit.GetAdcTopC();
662  Double_t AdcToV = rawPosAdcHit.GetAdcTomV();
663  if (fPedPosDefault[npmt-1] !=0) {
664  Double_t tPulseInt = AdcToC*(rawPosAdcHit.GetPulseIntRaw(thit) - fPedPosDefault[npmt-1]*PeakPedRatio);
665  ((THcSignalHit*) frPosAdcPulseInt->ConstructedAt(nrPosAdcHits))->Set(npmt, tPulseInt);
666  ((THcSignalHit*) frPosAdcPedRaw->ConstructedAt(nrPosAdcHits))->Set(npmt, fPedPosDefault[npmt-1]);
667  ((THcSignalHit*) frPosAdcPed->ConstructedAt(nrPosAdcHits))->Set(npmt, float(fPedPosDefault[npmt-1])/float(NPedSamples)*AdcToV);
668 
669  }
670  ((THcSignalHit*) frPosAdcPulseAmp->ConstructedAt(nrPosAdcHits))->Set(npmt, 0.);
671  }
672 
673  ++nrPosAdcHits;
674  fTotNumAdcHits++;
676  fNumPosAdcHits.at(npmt-1) = npmt;
677  }
678 
679  for (UInt_t thit=0; thit<rawNegAdcHit.GetNPulses(); ++thit) {
680  ((THcSignalHit*) frNegAdcPedRaw->ConstructedAt(nrNegAdcHits))->Set(npmt, rawNegAdcHit.GetPedRaw());
681  ((THcSignalHit*) frNegAdcPed->ConstructedAt(nrNegAdcHits))->Set(npmt, rawNegAdcHit.GetPed());
682 
683  ((THcSignalHit*) frNegAdcPulseIntRaw->ConstructedAt(nrNegAdcHits))->Set(npmt, rawNegAdcHit.GetPulseIntRaw(thit));
684  ((THcSignalHit*) frNegAdcPulseInt->ConstructedAt(nrNegAdcHits))->Set(npmt, rawNegAdcHit.GetPulseInt(thit));
685 
686  ((THcSignalHit*) frNegAdcPulseAmpRaw->ConstructedAt(nrNegAdcHits))->Set(npmt, rawNegAdcHit.GetPulseAmpRaw(thit));
687  ((THcSignalHit*) frNegAdcPulseAmp->ConstructedAt(nrNegAdcHits))->Set(npmt, rawNegAdcHit.GetPulseAmp(thit));
688 
689  ((THcSignalHit*) frNegAdcPulseTimeRaw->ConstructedAt(nrNegAdcHits))->Set(npmt, rawNegAdcHit.GetPulseTimeRaw(thit));
690  ((THcSignalHit*) frNegAdcPulseTime->ConstructedAt(nrNegAdcHits))->Set(npmt, rawNegAdcHit.GetPulseTime(thit));
691 
692  if (rawNegAdcHit.GetPulseAmpRaw(thit) > 0) ((THcSignalHit*) fNegAdcErrorFlag->ConstructedAt(nrNegAdcHits))->Set(npmt, 0);
693  if (rawNegAdcHit.GetPulseAmpRaw(thit) <= 0) ((THcSignalHit*) fNegAdcErrorFlag->ConstructedAt(nrNegAdcHits))->Set(npmt, 1);
694 
695  if (rawNegAdcHit.GetPulseAmpRaw(thit) <= 0) {
696  Double_t PeakPedRatio= rawNegAdcHit.GetF250_PeakPedestalRatio();
697  Int_t NPedSamples= rawNegAdcHit.GetF250_NPedestalSamples();
698  Double_t AdcToC = rawNegAdcHit.GetAdcTopC();
699  Double_t AdcToV = rawNegAdcHit.GetAdcTomV();
700  if (fPedNegDefault[npmt-1] !=0) {
701  Double_t tPulseInt = AdcToC*(rawNegAdcHit.GetPulseIntRaw(thit) - fPedNegDefault[npmt-1]*PeakPedRatio);
702  ((THcSignalHit*) frNegAdcPulseInt->ConstructedAt(nrNegAdcHits))->Set(npmt, tPulseInt);
703  ((THcSignalHit*) frNegAdcPedRaw->ConstructedAt(nrNegAdcHits))->Set(npmt, fPedNegDefault[npmt-1]);
704  ((THcSignalHit*) frNegAdcPed->ConstructedAt(nrNegAdcHits))->Set(npmt, float(fPedNegDefault[npmt-1])/float(NPedSamples)*AdcToV);
705 
706  }
707  ((THcSignalHit*) frNegAdcPulseAmp->ConstructedAt(nrNegAdcHits))->Set(npmt, 0.);
708  }
709 
710  ++nrNegAdcHits;
711  fTotNumAdcHits++;
713  fNumNegAdcHits.at(npmt-1) = npmt;
714  }
715  ihit++;
716  }
717  return ihit;
718 }
719 
720 //_____________________________________________________________________________
722 {
723  return(0);
724 }
725 
726 //_____________________________________________________________________________
728 {
729  Double_t StartTime = 0.0;
730  if( fglHod ) StartTime = fglHod->GetStartTime();
731  Double_t OffsetTime = 0.0;
732  if( fglHod ) OffsetTime = fglHod->GetOffsetTime();
733  //cout << " starttime = " << StartTime << endl;
734  // Loop over the elements in the TClonesArray
735  for(Int_t ielem = 0; ielem < frPosAdcPulseInt->GetEntries(); ielem++) {
736 
737  Int_t npmt = ((THcSignalHit*) frPosAdcPulseInt->ConstructedAt(ielem))->GetPaddleNumber() - 1;
738  Double_t pulsePed = ((THcSignalHit*) frPosAdcPed->ConstructedAt(ielem))->GetData();
739  Double_t pulseInt = ((THcSignalHit*) frPosAdcPulseInt->ConstructedAt(ielem))->GetData();
740  Double_t pulseIntRaw = ((THcSignalHit*) frPosAdcPulseIntRaw->ConstructedAt(ielem))->GetData();
741  Double_t pulseAmp = ((THcSignalHit*) frPosAdcPulseAmp->ConstructedAt(ielem))->GetData();
742  Double_t pulseTime = ((THcSignalHit*) frPosAdcPulseTime->ConstructedAt(ielem))->GetData();
743  Double_t adctdcdiffTime = StartTime-pulseTime+OffsetTime;
745  Bool_t pulseTimeCut = adctdcdiffTime > fAdcPosTimeWindowMin[npmt] && adctdcdiffTime < fAdcPosTimeWindowMax[npmt];
746 
747  // By default, the last hit within the timing cut will be considered "good"
748  fGoodPosAdcMult.at(npmt) += 1;
749  if (pulseTimeCut) {
750  fGoodPosAdcPed.at(npmt) = pulsePed;
751  // cout << " out = " << npmt << " " << frPosAdcPulseInt->GetEntries() << " " <<fGoodPosAdcMult.at(npmt);
752  fGoodPosAdcPulseInt.at(npmt) = pulseInt;
753  fGoodPosAdcPulseIntRaw.at(npmt) = pulseIntRaw;
754  fGoodPosAdcPulseAmp.at(npmt) = pulseAmp;
755  fGoodPosAdcPulseTime.at(npmt) = pulseTime;
756  fGoodPosAdcTdcDiffTime.at(npmt) = adctdcdiffTime;
757 
758  fPosNpe.at(npmt) = fPosGain[npmt]*fGoodPosAdcPulseInt.at(npmt);
759  fPosNpeSum += fPosNpe.at(npmt);
760 
763  fNumGoodPosAdcHits.at(npmt) = npmt + 1;
764  }
765  }
766 
767  // Loop over the elements in the TClonesArray
768  for(Int_t ielem = 0; ielem < frNegAdcPulseInt->GetEntries(); ielem++) {
769 
770  Int_t npmt = ((THcSignalHit*) frNegAdcPulseInt->ConstructedAt(ielem))->GetPaddleNumber() - 1;
771  Double_t pulsePed = ((THcSignalHit*) frNegAdcPed->ConstructedAt(ielem))->GetData();
772  Double_t pulseInt = ((THcSignalHit*) frNegAdcPulseInt->ConstructedAt(ielem))->GetData();
773  Double_t pulseIntRaw = ((THcSignalHit*) frNegAdcPulseIntRaw->ConstructedAt(ielem))->GetData();
774  Double_t pulseAmp = ((THcSignalHit*) frNegAdcPulseAmp->ConstructedAt(ielem))->GetData();
775  Double_t pulseTime = ((THcSignalHit*) frNegAdcPulseTime->ConstructedAt(ielem))->GetData();
776  Double_t adctdcdiffTime = StartTime-pulseTime+OffsetTime;
778  Bool_t pulseTimeCut = adctdcdiffTime > fAdcNegTimeWindowMin[npmt] && adctdcdiffTime < fAdcNegTimeWindowMax[npmt];
779  fGoodNegAdcMult.at(npmt) += 1;
780 
781  // By default, the last hit within the timing cut will be considered "good"
782  if (pulseTimeCut) {
783  fGoodNegAdcPed.at(npmt) = pulsePed;
784  fGoodNegAdcPulseIntRaw.at(npmt) = pulseIntRaw;
785  fGoodNegAdcPulseAmp.at(npmt) = pulseAmp;
786  fGoodNegAdcPulseInt.at(npmt) = pulseInt;
787  fGoodNegAdcPulseTime.at(npmt) = pulseTime;
788  fGoodNegAdcTdcDiffTime.at(npmt) = adctdcdiffTime;
789 
790  fNegNpe.at(npmt) = fNegGain[npmt]*fGoodNegAdcPulseInt.at(npmt);
791  fNegNpeSum += fNegNpe.at(npmt);
792 
795  fNumGoodNegAdcHits.at(npmt) = npmt + 1;
796  }
797  }
798 
800 
801  for(Int_t ihit=0; ihit < fNhits; ihit++) {
802 
803  Int_t nPosTDCHits = 0;
804  Int_t nNegTDCHits = 0;
805  Int_t nPosADCHits = 0;
806  Int_t nNegADCHits = 0;
807 
808  // 6 GeV calculations
809  Int_t adc_pos;
810  Int_t adc_neg;
811  Int_t tdc_pos = -1;
812  Int_t tdc_neg = -1;
813  if (fSixGevData) {
814  THcAerogelHit* hit = (THcAerogelHit*) fRawHitList->At(ihit);
815  Int_t npmt = hit->fCounter - 1;
816 
817  // Sum positive and negative hits to fill tot_good_hits
818  if(fPosNpe.at(npmt) > 0.3) {fNADCPosHits++; fNGoodHits++;}
819  if(fNegNpe.at(npmt) > 0.3) {fNADCNegHits++; fNGoodHits++;}
820 
821  // ADC positive hit
822  if((adc_pos = hit->GetRawAdcHitPos().GetPulseInt()) > 0) {
823  THcSignalHit *sighit = (THcSignalHit*) fPosADCHits->ConstructedAt(nPosADCHits++);
824  sighit->Set(hit->fCounter, adc_pos);
825  }
826  // ADC negative hit
827  if((adc_neg = hit->GetRawAdcHitNeg().GetPulseInt()) > 0) {
828  THcSignalHit *sighit = (THcSignalHit*) fNegADCHits->ConstructedAt(nNegADCHits++);
829  sighit->Set(hit->fCounter, adc_neg);
830  }
831  // TDC positive hit
832  if(hit->GetRawTdcHitPos().GetNHits() > 0) {
833  THcSignalHit *sighit = (THcSignalHit*) fPosTDCHits->ConstructedAt(nPosTDCHits++);
834  tdc_pos = hit->GetRawTdcHitPos().GetTime()+fTdcOffset;
835  sighit->Set(hit->fCounter, tdc_pos);
836  }
837  // TDC negative hit
838  if(hit->GetRawTdcHitNeg().GetNHits() > 0) {
839  THcSignalHit *sighit = (THcSignalHit*) fNegTDCHits->ConstructedAt(nNegTDCHits++);
840  tdc_neg = hit->GetRawTdcHitNeg().GetTime()+fTdcOffset;
841  sighit->Set(hit->fCounter, tdc_neg);
842  }
843  // For each TDC, identify the first hit that is positive.
844  tdc_pos = -1;
845  tdc_neg = -1;
846  for(UInt_t thit=0; thit<hit->GetRawTdcHitPos().GetNHits(); thit++) {
847  Int_t tdc = hit->GetRawTdcHitPos().GetTime(thit);
848  if(tdc >=0 ) {
849  tdc_pos = tdc;
850  break;
851  }
852  }
853  for(UInt_t thit=0; thit<hit->GetRawTdcHitNeg().GetNHits(); thit++) {
854  Int_t tdc = hit->GetRawTdcHitNeg().GetTime(thit);
855  if(tdc >= 0) {
856  tdc_neg = tdc;
857  break;
858  }
859  }
860 
861  fA_Pos[npmt] = adc_pos;
862  fA_Neg[npmt] = adc_neg;
863  fA_Pos_p[npmt] = fA_Pos[npmt] - fPosPedMean[npmt];
864  fA_Neg_p[npmt] = fA_Neg[npmt] - fNegPedMean[npmt];
865  fT_Pos[npmt] = tdc_pos;
866  fT_Neg[npmt] = tdc_neg;
867 
868  if(fA_Pos[npmt] < 8000) fPosNpeSixGev[npmt] = fPosGain[npmt]*fA_Pos_p[npmt];
869  else fPosNpeSixGev[npmt] = 100.0;
870 
871  if(fA_Neg[npmt] < 8000) fNegNpeSixGev[npmt] = fNegGain[npmt]*fA_Neg_p[npmt];
872  else fNegNpeSixGev[npmt] = 100.0;
873 
876 
877  // Sum positive and negative hits to fill tot_good_hits
878  if(fPosNpeSixGev[npmt] > 0.3) {fNADCPosHits++; fNGoodHits++;}
879  if(fNegNpeSixGev[npmt] > 0.3) {fNADCNegHits++; fNGoodHits++;}
880 
881  if(fT_Pos[npmt] > 0 && fT_Pos[npmt] < 8000) fNTDCPosHits++;
882  if(fT_Neg[npmt] > 0 && fT_Neg[npmt] < 8000) fNTDCNegHits++;
883  }
884 
885  if (fPosNpeSumSixGev > 0.5 || fNegNpeSumSixGev > 0.5)
887  else fNpeSumSixGev = 0.0;
888  // If total hits are 0, then give a noticable ridiculous NPE
889  if (fNhits < 1) fNpeSumSixGev = 0.0;
890 
891  }
892  return 0;
893 }
894 
895 //_____________________________________________________________________________
897 {
898 
899  Int_t nTracks = tracks.GetLast() + 1;
900 
901  for (Int_t itrack = 0; itrack < nTracks; itrack++) {
902 
903  THaTrack* track = dynamic_cast<THaTrack*> (tracks[itrack]);
904  if (track->GetIndex() != 0) continue; // Select the best track
905 
906  Double_t trackChi2 = track->GetChi2();
907  Int_t trackNDoF = track->GetNDoF();
908  Double_t trackRedChi2 = trackChi2/trackNDoF;
909  Double_t trackBeta = track->GetBeta();
910  Double_t trackEnergy = track->GetEnergy();
911  Double_t trackMom = track->GetP();
912  Double_t trackENorm = trackEnergy/trackMom;
913  Double_t trackDp = track->GetDp();
914  Double_t trackXfp = track->GetX();
915  Double_t trackYfp = track->GetY();
916  Double_t trackTheta = track->GetTheta();
917  Double_t trackPhi = track->GetPhi();
918 
919  Bool_t trackRedChi2Cut = trackRedChi2 > fRedChi2Min && trackRedChi2 < fRedChi2Max;
920  Bool_t trackBetaCut = trackBeta > fBetaMin && trackBeta < fBetaMax;
921  Bool_t trackENormCut = trackENorm > fENormMin && trackENorm < fENormMax;
922  Bool_t trackDpCut = trackDp > fDpMin && trackDp < fDpMax;
923  fXAtAero = trackXfp + trackTheta * fDiffBoxZPos;
924  fYAtAero = trackYfp + trackPhi * fDiffBoxZPos;
925 
926  if (trackRedChi2Cut && trackBetaCut && trackENormCut && trackDpCut) {
927 
928  // Project the track to the Aerogel diffuser box plane
929 
930  // cout << "Aerogel Detector: " << GetName() << endl;
931  // cout << "nTracks = " << nTracks << "\t" << "trackChi2 = " << trackChi2
932  // << "\t" << "trackNDof = " << trackNDoF << "\t" << "trackRedChi2 = " << trackRedChi2 << endl;
933  // cout << "trackBeta = " << trackBeta << "\t" << "trackEnergy = " << trackEnergy << "\t"
934  // << "trackMom = " << trackMom << "\t" << "trackENorm = " << trackENorm << endl;
935  // cout << "trackXfp = " << trackXfp << "\t" << "trackYfp = " << trackYfp << "\t"
936  // << "trackTheta = " << trackTheta << "\t" << "trackPhi = " << trackPhi << endl;
937  // cout << "fDiffBoxZPos = " << fDiffBoxZPos << "\t" << "fXAtAero = " << fXAtAero << "\t" << "fYAtAero = " << fYAtAero << endl;
938  // cout << "=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:" << endl;
939 
940 
941  for (Int_t iregion = 0; iregion < fNRegions; iregion++) {
942 
943  if ((TMath::Abs(fRegionValue[GetIndex(iregion, 0)] - fXAtAero) < fRegionValue[GetIndex(iregion, 4)]) &&
944  (TMath::Abs(fRegionValue[GetIndex(iregion, 1)] - fYAtAero) < fRegionValue[GetIndex(iregion, 5)]) &&
945  (TMath::Abs(fRegionValue[GetIndex(iregion, 2)] - trackTheta) < fRegionValue[GetIndex(iregion, 6)]) &&
946  (TMath::Abs(fRegionValue[GetIndex(iregion, 3)] - trackPhi) < fRegionValue[GetIndex(iregion, 7)])) {
947 
949  fNumTracksMatched.at(iregion) = iregion + 1;
950 
951  if (fNpeSum > fNpeThresh) {
953  fNumTracksFired.at(iregion) = iregion + 1;
954  } // NPE threshold cut
955  } // Regional cuts
956  } // Loop over regions
957  } // Tracking cuts
958  } // Track loop
959 
960  return 0;
961 }
962 
963 //_____________________________________________________________________________
964 // Method for initializing pedestals in the 6 GeV era
966 {
967  fNPedestalEvents = 0;
968  fMinPeds = 0; // Do not calculate pedestals by default
969 
971  fPosPedLimit = new Int_t [fNelem];
972  fNegPedLimit = new Int_t [fNelem];
973  fPosPedMean = new Double_t[fNelem];
974  fNegPedMean = new Double_t[fNelem];
975  fPosPedSum = new Int_t [fNelem];
976  fPosPedSum2 = new Int_t [fNelem];
977  fPosPedCount = new Int_t [fNelem];
978  fNegPedSum = new Int_t [fNelem];
979  fNegPedSum2 = new Int_t [fNelem];
980  fNegPedCount = new Int_t [fNelem];
981  fPosPed = new Double_t [fNelem];
982  fPosThresh = new Double_t [fNelem];
983  fNegPed = new Double_t [fNelem];
984  fNegThresh = new Double_t [fNelem];
985 
986  for(Int_t i = 0;i < fNelem; i++) {
987  fPosPedSum[i] = 0;
988  fPosPedSum2[i] = 0;
989  fPosPedLimit[i] = 1000; // In engine, this are set in parameter file
990  fPosPedCount[i] = 0;
991  fNegPedSum[i] = 0;
992  fNegPedSum2[i] = 0;
993  fNegPedLimit[i] = 1000; // In engine, this are set in parameter file
994  fNegPedCount[i] = 0;
995  fPosPedMean[i] = 0; // Default pedestal values
996  fNegPedMean[i] = 0; // Default pedestal values
997  }
998 
999 }
1000 
1001 //_____________________________________________________________________________
1002 // Method for accumulating pedestals in the 6 GeV era
1004 {
1005  // Extract data from the hit list, accumulating into arrays for
1006  // calculating pedestals
1007 
1008  Int_t nrawhits = rawhits->GetLast()+1;
1009  Int_t ihit = 0;
1010 
1011  while(ihit < nrawhits) {
1012  THcAerogelHit* hit = (THcAerogelHit *) rawhits->At(ihit);
1013 
1014  Int_t element = hit->fCounter - 1;
1015  Int_t adcpos = hit->GetRawAdcHitPos().GetPulseInt();
1016  Int_t adcneg = hit->GetRawAdcHitNeg().GetPulseInt();
1017  if(adcpos <= fPosPedLimit[element]) {
1018  fPosPedSum[element] += adcpos;
1019  fPosPedSum2[element] += adcpos*adcpos;
1020  fPosPedCount[element]++;
1021  if(fPosPedCount[element] == fMinPeds/5)
1022  fPosPedLimit[element] = 100 + fPosPedSum[element]/fPosPedCount[element];
1023  }
1024  if(adcneg <= fNegPedLimit[element]) {
1025  fNegPedSum[element] += adcneg;
1026  fNegPedSum2[element] += adcneg*adcneg;
1027  fNegPedCount[element]++;
1028  if(fNegPedCount[element] == fMinPeds/5)
1029  fNegPedLimit[element] = 100 + fNegPedSum[element]/fNegPedCount[element];
1030  }
1031  ihit++;
1032  }
1033  fNPedestalEvents++;
1034  return;
1035 }
1036 
1037 //_____________________________________________________________________________
1038 // Method for calculating pedestals in the 6 GeV era
1040 {
1041  // Use the accumulated pedestal data to calculate pedestals
1042  // Later add check to see if pedestals have drifted ("Danger Will Robinson!")
1043  // cout << "Plane: " << fPlaneNum << endl;
1044  for(Int_t i=0; i<fNelem;i++) {
1045 
1046  // Positive tubes
1047  fPosPed[i] = ((Double_t) fPosPedSum[i]) / TMath::Max(1, fPosPedCount[i]);
1048  fPosThresh[i] = fPosPed[i] + 15;
1049  // Negative tubes
1050  fNegPed[i] = ((Double_t) fNegPedSum[i]) / TMath::Max(1, fNegPedCount[i]);
1051  fNegThresh[i] = fNegPed[i] + 15;
1052  // cout << i+1 << " " << fPosPed[i] << " " << fNegPed[i] << endl;
1053 
1054  // Just a copy for now, but allow the possibility that fXXXPedMean is set
1055  // in a parameter file and only overwritten if there is a sufficient number of
1056  // pedestal events. (So that pedestals are sensible even if the pedestal events were
1057  // not acquired.)
1058  if(fMinPeds > 0) {
1059  if(fPosPedCount[i] > fMinPeds)
1060  fPosPedMean[i] = fPosPed[i];
1061  if(fNegPedCount[i] > fMinPeds)
1062  fNegPedMean[i] = fNegPed[i];
1063  }
1064  }
1065 }
1066 
1067 //_____________________________________________________________________________
1069 {
1070  return fNRegions * nValue + nRegion;
1071 }
1072 
1073 //_____________________________________________________________________________
1074 void THcAerogel::Print(const Option_t* opt) const
1075 {
1076  THaNonTrackingDetector::Print(opt);
1077 
1078  // Print out the pedestals
1079  if (fSixGevData) {
1080  cout << endl;
1081  cout << "Aerogel Pedestals" << endl;
1082  cout << "No. Neg Pos" << endl;
1083  for(Int_t i=0; i<fNelem; i++)
1084  cout << " " << i << "\t" << fNegPedMean[i] << "\t" << fPosPedMean[i] << endl;
1085  cout << endl;
1086  cout << " fMinPeds = " << fMinPeds << endl;
1087  cout << endl;
1088  }
1089 }
1090 //_____________________________________________________________________________
1091 Int_t THcAerogel::End(THaRunBase* run)
1092 {
1093  MissReport(Form("%s.%s", GetApparatus()->GetName(), GetName()));
1094  return 0;
1095 }
Float_t * fT_Neg
Definition: THcAerogel.h:163
Double_t fDpMin
Definition: THcAerogel.h:60
Double_t GetF250_PeakPedestalRatio()
Definition: THcRawAdcHit.h:24
std::string GetName(const std::string &scope_name)
virtual Int_t ApplyCorrections(void)
Definition: THcAerogel.cxx:721
virtual Int_t FillMap(THaDetMap *detmap, const char *detectorname)
Int_t End(THaRunBase *run=0)
TClonesArray * frNegAdcPulseAmpRaw
Definition: THcAerogel.h:104
virtual Int_t Decode(const THaEvData &)
Definition: THcAerogel.cxx:609
Double_t fNpeSum
Definition: THcAerogel.h:90
TClonesArray * frNegAdcPulseAmp
Definition: THcAerogel.h:108
Float_t * fA_Neg_p
Definition: THcAerogel.h:161
Int_t fNTDCNegHits
Definition: THcAerogel.h:143
Int_t * fNegPedCount
Definition: THcAerogel.h:157
Double_t fENormMin
Definition: THcAerogel.h:58
Int_t fMinPeds
Definition: THcAerogel.h:146
virtual EStatus Init(const TDatime &run_time)
Definition: THcAerogel.cxx:162
Double_t fDpMax
Definition: THcAerogel.h:61
Double_t * fPosSig
Definition: THcAerogel.h:165
Int_t fRegionsValueMax
Definition: THcAerogel.h:52
float Float_t
Int_t GetLast() const
virtual void CalculatePedestals()
vector< Int_t > fNumNegAdcHits
Definition: THcAerogel.h:114
const char Option_t
TClonesArray * frPosAdcPulseAmpRaw
Definition: THcAerogel.h:96
void MissReport(const char *name)
Definition: THcHitList.cxx:557
TClonesArray * frNegAdcPedRaw
Definition: THcAerogel.h:102
vector< Int_t > fNumPosAdcHits
Definition: THcAerogel.h:113
Bool_t * fPresentP
Definition: THcAerogel.h:43
THcHodoscope * fglHod
Definition: THcAerogel.h:185
vector< Double_t > fPosNpe
Definition: THcAerogel.h:119
virtual Int_t CoarseProcess(TClonesArray &tracks)
Definition: THcAerogel.cxx:727
Int_t fTotNumTracksMatched
Definition: THcAerogel.h:85
vector< Double_t > fGoodNegAdcPulseIntRaw
Definition: THcAerogel.h:131
vector< Int_t > fNumTracksMatched
Definition: THcAerogel.h:117
Double_t GetOffsetTime() const
Definition: THcHodoscope.h:59
TClonesArray * frPosAdcPulseTime
Definition: THcAerogel.h:101
virtual Int_t FineProcess(TClonesArray &tracks)
Definition: THcAerogel.cxx:896
Int_t GetPulseTimeRaw(UInt_t iPulse=0) const
Gets raw pulse time. In subsamples.
int Int_t
bool Bool_t
TClonesArray * frPosAdcPulseTimeRaw
Definition: THcAerogel.h:97
STL namespace.
Double_t fPosNpeSum
Definition: THcAerogel.h:88
Double_t fNegNpeSum
Definition: THcAerogel.h:89
UInt_t GetNHits() const
Gets the number of set hits.
Int_t fTotNumAdcHits
Definition: THcAerogel.h:79
Int_t fTotNumPosAdcHits
Definition: THcAerogel.h:81
TClonesArray * fRawHitList
Definition: THcHitList.h:51
Int_t fCounter
Definition: THcRawHit.h:55
virtual void InitializePedestals()
Definition: THcAerogel.cxx:965
Int_t fDebugAdc
Definition: THcAerogel.h:53
TClonesArray * frPosAdcPed
Definition: THcAerogel.h:98
Int_t fTotNumGoodNegAdcHits
Definition: THcAerogel.h:84
Short_t Abs(Short_t d)
Double_t fXAtAero
Definition: THcAerogel.h:63
vector< Double_t > fGoodNegAdcMult
Definition: THcAerogel.h:129
Int_t fAnalyzePedestals
Definition: THcAerogel.h:137
TClonesArray * fPosTDCHits
Definition: THcAerogel.h:173
Double_t fNpeSumSixGev
Definition: THcAerogel.h:149
Float_t * fA_Pos
Definition: THcAerogel.h:158
Double_t fYAtAero
Definition: THcAerogel.h:64
Double_t fBetaMin
Definition: THcAerogel.h:56
Int_t fNGoodHits
Definition: THcAerogel.h:139
Int_t * fPedNegDefault
Definition: THcAerogel.h:73
Double_t * fPosPed
Definition: THcAerogel.h:164
Double_t fBetaMax
Definition: THcAerogel.h:57
vector< Double_t > fGoodNegAdcPulseInt
Definition: THcAerogel.h:130
TObject * ConstructedAt(Int_t idx)
TClonesArray * frPosAdcPulseInt
Definition: THcAerogel.h:99
Double_t fENormMax
Definition: THcAerogel.h:59
Float_t * fA_Pos_p
Definition: THcAerogel.h:160
Double_t * fNegPedMean
Definition: THcAerogel.h:171
virtual void Set(Int_t paddle, Int_t data)
Definition: THcSignalHit.h:23
Double_t fDiffBoxZPos
Definition: THcAerogel.h:62
vector< Double_t > fGoodPosAdcPulseInt
Definition: THcAerogel.h:123
Int_t fSixGevData
Definition: THcAerogel.h:138
tuple app
Int_t * fPosPedLimit
Definition: THcAerogel.h:152
TClonesArray * frNegAdcPulseInt
Definition: THcAerogel.h:107
Class for an Aerogel detector consisting of pairs of PMT's attached to a diffuser box...
Definition: THcAerogel.h:16
vector< Double_t > fGoodPosAdcPulseTime
Definition: THcAerogel.h:126
Double_t GetPed() const
Gets sample pedestal. In channels.
void Error(const char *location, const char *msgfmt,...)
Double_t * fRegionValue
Definition: THcAerogel.h:77
Int_t * fPosPedSum
Definition: THcAerogel.h:150
Int_t * fNegPedLimit
Definition: THcAerogel.h:156
THcRawAdcHit & GetRawAdcHitNeg()
virtual void Clear(Option_t *option="")
THcRawTdcHit & GetRawTdcHitNeg()
void InitHitList(THaDetMap *detmap, const char *hitclass, Int_t maxhits, Int_t tdcref_cut=0, Int_t adcref_cut=0)
Save the electronics module to detector mapping and initialize a hit array of hits of class hitclass...
Definition: THcHitList.cxx:65
Double_t * fAdcNegTimeWindowMin
Definition: THcAerogel.h:71
void DeletePedestalArrays()
Definition: THcAerogel.cxx:139
Double_t fNegNpeSumSixGev
Definition: THcAerogel.h:148
THcRawAdcHit & GetRawAdcHitPos()
Int_t fTdcOffset
Definition: THcAerogel.h:144
TClonesArray * fNegTDCHits
Definition: THcAerogel.h:174
Int_t GetPulseAmpRaw(UInt_t iPulse=0) const
Gets raw pulse amplitude. In channels.
Int_t fTotNumGoodAdcHits
Definition: THcAerogel.h:80
TClonesArray * frNegAdcPulseIntRaw
Definition: THcAerogel.h:103
Double_t * fPosGain
Definition: THcAerogel.h:91
Int_t GetIndex(Int_t nRegion, Int_t nValue)
Double_t GetPulseAmp(UInt_t iPulse=0) const
Gets pedestal subtracted pulse amplitude. In channels.
Double_t GetPulseInt(UInt_t iPulse=0) const
Gets pedestal subtracted pulse integral. In channels.
vector< Double_t > fGoodNegAdcTdcDiffTime
Definition: THcAerogel.h:134
vector< Int_t > fNumTracksFired
Definition: THcAerogel.h:118
TClonesArray * frNegAdcPulseTime
Definition: THcAerogel.h:109
virtual Int_t ReadDatabase(const TDatime &date)
Definition: THcAerogel.cxx:200
Int_t fNTDCPosHits
Definition: THcAerogel.h:142
Double_t * fPosThresh
Definition: THcAerogel.h:166
TClonesArray * frPosAdcPedRaw
Definition: THcAerogel.h:94
unsigned int UInt_t
virtual void AccumulatePedestals(TClonesArray *rawhits)
char * Form(const char *fmt,...)
void CreateMissReportParms(const char *prefix)
Definition: THcHitList.cxx:544
Double_t * fAdcPosTimeWindowMax
Definition: THcAerogel.h:70
TClonesArray * frPosAdcPulseAmp
Definition: THcAerogel.h:100
TClonesArray * fNegAdcErrorFlag
Definition: THcAerogel.h:111
Double_t GetStartTime() const
Definition: THcHodoscope.h:58
Int_t fNhits
Definition: THcAerogel.h:42
void Warning(const char *location, const char *msgfmt,...)
Double_t * fNegSig
Definition: THcAerogel.h:168
TClonesArray * frNegAdcPed
Definition: THcAerogel.h:106
TClonesArray * fNegADCHits
Definition: THcAerogel.h:176
tuple list
Definition: SConscript.py:9
Raw Aerogel Hit Info.
Definition: THcAerogelHit.h:6
Double_t fRedChi2Min
Definition: THcAerogel.h:54
Int_t GetPulseIntRaw(UInt_t iPulse=0) const
Gets raw pulse integral. In channels.
R__EXTERN class THcDetectorMap * gHcDetectorMap
Definition: THcGlobals.h:12
Int_t fNADCNegHits
Definition: THcAerogel.h:141
vector< Double_t > fNegNpeSixGev
Definition: THcAerogel.h:179
vector< Double_t > fPosNpeSixGev
Definition: THcAerogel.h:178
vector< Int_t > fNumGoodPosAdcHits
Definition: THcAerogel.h:115
vector< Int_t > fNumGoodNegAdcHits
Definition: THcAerogel.h:116
Int_t LoadParmValues(const DBRequest *list, const char *prefix="")
Retrieve parameter values from the parameter cache.
double Double_t
Double_t fPosNpeSumSixGev
Definition: THcAerogel.h:147
Int_t GetTime(UInt_t iHit=0) const
Gets TDC time. In channels.
vector< Double_t > fGoodNegAdcPed
Definition: THcAerogel.h:128
void DeleteArrays()
Definition: THcAerogel.cxx:87
TClonesArray * frNegAdcPulseTimeRaw
Definition: THcAerogel.h:105
UInt_t GetNPulses() const
Gets number of set pulses.
Double_t fAdcTdcOffset
Definition: THcAerogel.h:76
virtual ~THcAerogel()
Definition: THcAerogel.cxx:80
Int_t fNPedestalEvents
Definition: THcAerogel.h:145
Double_t * fPosPedMean
Definition: THcAerogel.h:170
Int_t GetEntries() const
vector< Double_t > fGoodPosAdcPulseIntRaw
Definition: THcAerogel.h:124
THcRawTdcHit & GetRawTdcHitPos()
ClassImp(THcDCLookupTTDConv) THcDCLookupTTDConv
TClonesArray * fPosADCHits
Definition: THcAerogel.h:175
Double_t * fAdcNegTimeWindowMax
Definition: THcAerogel.h:72
Int_t fNADCPosHits
Definition: THcAerogel.h:140
Int_t * fPosPedSum2
Definition: THcAerogel.h:151
TClonesArray * fPosAdcErrorFlag
Definition: THcAerogel.h:110
Double_t * fNegThresh
Definition: THcAerogel.h:169
vector< Double_t > fGoodPosAdcMult
Definition: THcAerogel.h:122
Int_t GetPedRaw() const
Gets raw signal pedestal. In channels.
Int_t fADC_RefTimeCut
Definition: THcAerogel.h:45
Int_t * fNegPedSum
Definition: THcAerogel.h:154
Short_t Max(Short_t a, Short_t b)
Double_t fRedChi2Max
Definition: THcAerogel.h:55
vector< Double_t > fGoodNegAdcPulseTime
Definition: THcAerogel.h:133
Double_t * fNegPed
Definition: THcAerogel.h:167
Double_t * fAdcPosTimeWindowMin
Definition: THcAerogel.h:69
Double_t GetPulseTime(UInt_t iPulse=0) const
virtual void Print(const Option_t *opt) const
vector< Double_t > fNegNpe
Definition: THcAerogel.h:120
Double_t fNpeThresh
Definition: THcAerogel.h:65
virtual Int_t DefineVariables(EMode mode=kDefine)
Definition: THcAerogel.cxx:383
Double_t * fNegGain
Definition: THcAerogel.h:92
R__EXTERN class THcParmList * gHcParms
Definition: THcGlobals.h:11
TClonesArray * frPosAdcPulseIntRaw
Definition: THcAerogel.h:95
TObject * At(Int_t idx) const
Int_t GetF250_NPedestalSamples()
Definition: THcRawAdcHit.h:25
void GetData(std::string s, double *x, double *y, double *ey)
static const Double_t kBig
Definition: THcFormula.cxx:31
vector< Double_t > fGoodPosAdcTdcDiffTime
Definition: THcAerogel.h:127
Int_t fTotNumNegAdcHits
Definition: THcAerogel.h:83
Int_t fNRegions
Definition: THcAerogel.h:51
const Bool_t kTRUE
vector< Double_t > fGoodPosAdcPed
Definition: THcAerogel.h:121
Double_t GetAdcTopC() const
Class representing a single raw ADC hit.
Definition: THcRawAdcHit.h:7
static const Int_t MaxNumAdcPulse
Definition: THcAerogel.h:49
Float_t * fA_Neg
Definition: THcAerogel.h:159
vector< Double_t > fGoodNegAdcPulseAmp
Definition: THcAerogel.h:132
Int_t * fPedPosDefault
Definition: THcAerogel.h:74
virtual void Clear(Option_t *opt="")
Definition: THcAerogel.cxx:503
Int_t fTotNumTracksFired
Definition: THcAerogel.h:86
virtual Int_t DecodeToHitList(const THaEvData &evdata, Bool_t suppress=kFALSE)
Populate the hitlist from the raw event data.
Definition: THcHitList.cxx:191
Int_t fTotNumGoodPosAdcHits
Definition: THcAerogel.h:82
Double_t GetAdcTomV() const
Float_t * fT_Pos
Definition: THcAerogel.h:162
Int_t * fPosPedCount
Definition: THcAerogel.h:153
Int_t * fNegPedSum2
Definition: THcAerogel.h:155
A standard Hall C spectrometer apparatus.
vector< Double_t > fGoodPosAdcPulseAmp
Definition: THcAerogel.h:125