1 #include "TNaIAnalysis.h"
5 #include "TMucapData.h"
8 #include "TTimeWindow.h"
16 extern TMucapData *
gData;
20 TNaIAnalysis::TNaIAnalysis()
22 hXRayAmplitude =
new TH2F(
"hXRayAmplitude",
"X ray det pulse amplitude vs channel", 5000,0,5000, 4,0.5,4.5 );
23 hXRayAmplitude->GetXaxis()->SetTitle(
"Amplitude (channels)");
25 hXRayAmplitudeMissed =
new TH2F(
"hXRayAmplitudeMissed",
"X ray det rejected pulse amplitudes vs channel", 5000,0,5000, 4,0.5,4.5 );
26 hXRayAmplitudeMissed->GetXaxis()->SetTitle(
"Amplitude (channels)");
35 hXRayTime =
new TH2F(
"hXRayTime",
"X ray pulse trigger time vs channel", 40,0,4e8, 4,0.5,4.5);
36 hXRayTime->GetXaxis()->SetTitle(
"Block time (ns)");
37 hXRayTimingEnergyTDiffVsAmplitude =
new TH3F(
"hXRayTimingEnergyTDiffVsAmplitude",
"XRay T diff energy channel and timing channel versus amplitude", 200,-8000,8000,100,0,5000,2,0.5,2.5);
38 hXRayTimingEnergyTDiffVsAmplitude->GetXaxis()->SetTitle(
"Time difference (ns)");
39 hXRayTimingEnergyTDiffVsAmplitude->GetZaxis()->SetTitle(
"Detector Nr.");
40 hXRayTimingEnergyTDiffVsAmplitude->GetYaxis()->SetTitle(
"Amplitude");
52 hXRayStats =
new TH1I(
"hXRayStats",
"X ray stats", 20,0.5,20.5);
53 hXRayStats->GetXaxis()->SetBinLabel(1,
"NaI-fast islands");
54 hXRayStats->GetXaxis()->SetBinLabel(2,
"NaI-slow islands");
55 hXRayStats->GetXaxis()->SetBinLabel(3,
"CsI-fast islands");
56 hXRayStats->GetXaxis()->SetBinLabel(4,
"CsI-slow islands");
57 hXRayStats->GetXaxis()->SetBinLabel(5,
"NaI-fast bad islands");
58 hXRayStats->GetXaxis()->SetBinLabel(6,
"NaI-slow bad islands");
59 hXRayStats->GetXaxis()->SetBinLabel(7,
"CsI-fast bad islands");
60 hXRayStats->GetXaxis()->SetBinLabel(8,
"CsI-slow bad islands");\
61 hXRayStats->GetXaxis()->SetBinLabel(9,
"NaI hits");
62 hXRayStats->GetXaxis()->SetBinLabel(10,
"CsI hits");
63 hXRayStats->GetXaxis()->SetBinLabel(11,
"NaI Pile ups");
64 hXRayStats->GetXaxis()->SetBinLabel(12,
"CsI Pile ups");
65 hXRayStats->GetXaxis()->SetBinLabel(13,
"NaI double counts");
66 hXRayStats->GetXaxis()->SetBinLabel(14,
"CsI double counts");
75 fRunInfoEvent =
gData->runinfoEvent;
76 runnr = fRunInfoEvent->GetRunNumber();
79 kNaITimingChannel = OCTALFADC_PARAM::kNaITimingChannel;
80 kNaIEnergyChannel = OCTALFADC_PARAM::kNaIEnergyChannel;
82 kCsITimingChannel = OCTALFADC_PARAM::kCsITimingChannel;
83 kCsIEnergyChannel = OCTALFADC_PARAM::kCsIEnergyChannel;
86 shapNaIEnergyChannel = OCTALFADC_PARAM::shapNaIEnergyChannel;
87 shapNaITimingChannel = OCTALFADC_PARAM::shapNaITimingChannel;
89 shapCsIEnergyChannel = OCTALFADC_PARAM::shapCsIEnergyChannel;
90 shapCsITimingChannel = OCTALFADC_PARAM::shapCsITimingChannel;
98 pedestalNaIEnergyChannel = OCTALFADC_PARAM::pedestalNaITimingChannel;
99 pedestalNaITimingChannel = OCTALFADC_PARAM::pedestalNaITimingChannel;
101 pedestalCsIEnergyChannel = OCTALFADC_PARAM::pedestalCsIEnergyChannel;
102 pedestalCsITimingChannel = OCTALFADC_PARAM::pedestalCsITimingChannel;
105 TNaIAnalysis::~TNaIAnalysis()
107 delete hXRayAmplitude;
108 delete hXRayAmplitudeMissed;
117 delete hXRayTimingEnergyTDiffVsAmplitude;
131 INT TNaIAnalysis::ProcessEvent(EVENT_HEADER *pheader,
void *pevent)
133 printf(
"Running TNaIAnalysis (NaI + CsI run 5)...\n");
135 if(
gData->fGeFADCBanks.size() < 8)
137 printf(
"TNaIAnalysis::ProcessEvent : Could not find NaI Detector banks.\n");
161 for(
int i=0;
i < vNaI_timing.size();
i++)
164 if(vNaI_timing[
i].GoodPulse(shapNaITimingChannel,timingNaIClockPeriod,levelGoodPulse))
166 hXRayAmplitude->Fill(vNaI_timing[
i].GetMax(), kNaITimingChannel+1 );
167 hXRayTime->Fill(vNaI_timing[
i].GetTimeNs(),kNaITimingChannel+1 );
169 else{hXRayStats->Fill(5);hXRayAmplitudeMissed->Fill(vNaI_timing[
i].GetMax(), kNaITimingChannel+1 );}
173 for(
int i=0;
i < vNaI_energy.size();
i++)
176 if(vNaI_energy[
i].GoodPulse(shapNaIEnergyChannel,energyNaIClockPeriod,levelGoodPulse))
178 hXRayAmplitude->Fill(vNaI_energy[
i].GetMax(), kNaIEnergyChannel+1 );
181 hXRayTime->Fill(vNaI_energy[
i].GetTimeNs(),kNaIEnergyChannel+1 );
183 else{hXRayStats->Fill(6);hXRayAmplitudeMissed->Fill(vNaI_energy[
i].GetMax(), kNaIEnergyChannel+1 );}
187 for(
int i=0;
i < vCsI_timing.size();
i++)
190 if(vCsI_timing[
i].GoodPulse(shapCsITimingChannel,timingCsIClockPeriod,levelGoodPulse))
192 hXRayAmplitude->Fill(vCsI_timing[
i].GetMax(), kCsITimingChannel+1 );
193 hXRayTime->Fill(vCsI_timing[
i].GetTimeNs(),kCsITimingChannel+1 );
195 else{hXRayStats->Fill(7);hXRayAmplitudeMissed->Fill(vCsI_timing[
i].GetMax(), kCsITimingChannel+1 );}
199 for(
int i=0;
i < vCsI_energy.size();
i++)
202 if(vCsI_energy[
i].GoodPulse(shapCsIEnergyChannel,energyCsIClockPeriod,levelGoodPulse))
204 hXRayAmplitude->Fill(vCsI_energy[
i].GetMax(), kCsIEnergyChannel+1 );
207 hXRayTime->Fill(vCsI_energy[
i].GetTimeNs(),kCsIEnergyChannel+1 );
209 else {hXRayStats->Fill(8);hXRayAmplitudeMissed->Fill(vCsI_energy[
i].GetMax(), kCsIEnergyChannel+1 );}
213 gData->fNaIHits.clear();
214 MakeHits(vNaI_timing, vNaI_energy);
215 MakeHits(vCsI_timing, vCsI_energy);
223 void TNaIAnalysis::MakeHits(vector<TOctalFADCIsland>& vec_timing,vector<TOctalFADCIsland>& vec_energy)
225 vector<TNaIHit>& vHits =
gData->fNaIHits;
228 if(vec_timing.empty() || vec_energy.empty())
return;
229 int channel = vec_timing[0].GetFADCChannel();
233 double timingClockPeriod, energyClockPeriod;
235 if(channel == kNaITimingChannel)
237 timingClockPeriod = timingNaIClockPeriod;
238 energyClockPeriod = energyNaIClockPeriod;
240 else if(channel == kCsITimingChannel)
242 timingClockPeriod = timingCsIClockPeriod;
243 energyClockPeriod = energyCsIClockPeriod;
245 else {
printf(
"Invalid parameters to construct NaIHits!!!\n");};
248 int lastEnergyPulse=0;
253 for(
int iTime=0; iTime < vec_timing.size(); iTime++)
255 if(vec_timing[iTime].GetPulseQuality() == 0)
257 double timingT = vec_timing[iTime].GetCFBlockTime()*timingClockPeriod;
258 TTimeWindow coincWindow(timingT + tLow, timingT + tHigh);
260 for(
int iEgy=lastEnergyPulse; iEgy<vec_energy.size(); iEgy++)
262 if(vec_energy[iEgy].GetPulseQuality() == 0)
264 double energyT = vec_energy[iEgy].GetMaxBinBlockTime()*energyClockPeriod;
266 if(coincWindow.IsLow(energyT)) { lastEnergyPulse = iEgy; }
267 else if(coincWindow.Includes(energyT))
271 if(channel == kNaITimingChannel) { hXRayTimingEnergyTDiffVsAmplitude->Fill(energyT-timingT,vec_energy[iEgy].GetMax(),1.); }
272 else { hXRayTimingEnergyTDiffVsAmplitude->Fill(energyT-timingT,vec_energy[iEgy].GetMax(),2.); }
274 else if(coincWindow.IsHigh(energyT))
break;
281 if( channel == kNaITimingChannel) { hXRayStats->Fill(9); }
else { hXRayStats->Fill(10); }
282 TNaIHit naihit(vec_timing[iTime],vec_energy[energyHit],count);
283 vHits.push_back(naihit);
293 void TNaIAnalysis::PileUpProtectHits()
295 vector<TNaIHit>& vHits =
gData->fNaIHits;
297 if(vHits.size() == 0 || vHits.size() == 1)
return;
300 for(
int i = 1;
i < vHits.size()-1;
i++)
304 if(vHits[
i-1].GetEnergyTime()==vHits[
i].GetEnergyTime())
306 vHits[
i-1].SetPileUp(
true);
307 vHits[
i].SetPileUp(
true);
310 if(vHits[
i-1].GetPileUp()) { hXRayStats->Fill(vHits[
i-1].GetDetector()+10); }
311 if(vHits[
i-1].GetCount() > 1) {hXRayStats->Fill(vHits[
i-1].GetDetector()+12);}
315 if(vHits[vHits.size()-1].GetPileUp()){ hXRayStats->Fill(vHits[vHits.size()-1].GetDetector()+10); }
316 if(vHits[vHits.size()-1].GetCount() > 1){ hXRayStats->Fill(vHits[vHits.size()-1].GetDetector()+12); }
319 void TNaIAnalysis::SortHits()
321 vector<TNaIHit>& vHits =
gData->fNaIHits;