UMN CDMS Wiki archive
start › cdms › k100 › run_summary › run_76 › temp

Example signal search for NaI-triggered data

This is a temporary note. I'll put this info into appropriate analysis sections later.

Develop some cuts

We start with loading some calibration data (SiHV-triggered) and loading the correction & calibration

gStyle->SetOptStat(0)
gStyle->SetOptFit(1)
TString datapath ="/data/chocula/fritts/data/k100proc/midasrq/byseries/"
TString ser[] = {"07220827_1153","07220916_2059","07220917_1039","07220917_2125"}
//TString lab[] = {"0V","-4V","-21V","-65V","-84V","-84V"}
int nser = 4
TChain *e[10]
TChain *z[10]
for(int s=0;s<nser;s++)e[s] = new TChain("rqDir/eventTree")
for(int s=0;s<nser;s++)z[s] = new TChain("rqDir/zip1")
for(int s=0;s<nser;s++)e[s]->Add(Form("%s/%s/umn*root",datapath.Data(),ser[s].Data()));
for(int s=0;s<nser;s++)z[s]->Add(Form("%s/%s/umn*root",datapath.Data(),ser[s].Data()));
for(int s=0;s<nser;s++)z[s]->AddFriend(e[s])
//z->SetLineColor(kRed)
TCut crand = "EventCategory"
for(int s=0;s<nser;s++)z[s]->SetAlias("PTwid","(PTWKf40-PTWKr40)*1e6")
for(int s=0;s<nser;s++)z[s]->SetAlias("xdel","1e6*(PEWKr20-0.5*(PCWKr20+PDWKr20))-1")
for(int s=0;s<nser;s++)z[s]->SetAlias("ydel","1e6*(0.866*(PDWKr20-PCWKr20))+9")
// note empirical offsets in xdel, ydel
for(int s=0;s<nser;s++)z[s]->SetAlias("phidel","180./3.14159*atan2(ydel,xdel)")
for(int s=0;s<nser;s++)z[s]->SetAlias("afdel","1e6*(PFWKr20-PAWKr20)")
//
TCut cgoodwalk = "PCWKr20>0.25e-3&&PCWKr20<0.5e-3&&PDWKr20>0.25e-3&&PDWKr20<0.5e-3&&PEWKr20>0.25e-3&&PEWKr20<0.5e-3"
for(int s=1;s<4;s++)z[s]->SetAlias("pt_keV","7.738820e+07*PTOFamps+1.653756e+13*PTOFamps**2")
for(int s=1;s<4;s++)z[s]->SetAlias("pt0_keV","7.738820e+07*PTOFamps0+1.653756e+13*PTOFamps0**2")
for(int s=1;s<4;s++)z[s]->SetAlias("PSUMbs","PAbs+PBbs+PCbs+PDbs+PEbs+PFbs") 
for(int s=1;s<4;s++)z[s]->SetAlias("BSel","PSUMbs-18400") 
for(int s=1;s<4;s++)z[s]->SetAlias("pt_keV_bscorr","pt_keV/(1.-0.0461538*BSel/165)")  
for(int s=1;s<4;s++)z[s]->SetAlias("pt0_keV_bscorr","pt0_keV/(1.-0.0461538*BSel/165)")  
TCut cbs = "BSel<1100" 
for(int s=1;s<4;s++)z[s]->SetAlias("pt_keVee","14.0821*pt_keV_bscorr/(333.899-pt_keV_bscorr)") 
for(int s=1;s<4;s++)z[s]->SetAlias("pt0_keVee","14.0821*pt0_keV_bscorr/(333.899-pt0_keV_bscorr)") 

Integral / OF agreement cut

This cut requires that the integral amplitude and the OF amplitude of the total pulse track with one another. This cuts out a lot of bad pulses. For example, if there is pileup, the integral will essentially get the sum of the two pulses, but the OF algorithm only catches the first one. So there will be a mismatch. This cut will get rid of a lot of pileup and also likely other misshapen pulses.

The integral value is distorted if the pulse is on a downward sloping baseline. We want to include some downward-sloping baselines. Nick developed a way to correct the integral for the slope of the baseline. This corrected integral is a better one to use for this cut.

// make a int/of agreement cut
// with a correction like Nick's for Run68: correct PTINTall for slopes. 
for(int s=1;s<=3;s++)z[s]->SetAlias("PTdbs","(PAbspost-PAbs) + (PBbspost-PBbs) + (PCbspost-PCbs) + (PDbspost-PDbs) + (PEbspost-PEbs) + (PFbspost-PFbs)")
for(int s=1;s<=3;s++)z[s]->SetAlias("PTINTall_PTdbscorr", "PTINTall-(PTdbs<0)*0.5*(PTdbs*4096./PFnorm)")
//
z[1]->Draw("PTINTall_PTdbscorr/PTOFamps:pt_keVee>>h1ofint(300,0,5,200,-1000,2000)",!crand+cbs,"colz")

Here we have shown the ratio of integral to OF for a region of interest, 0-5 keVee. (actually ROI is probably 0-1 keVee). The ratio forms a band; the cut is meant to remove outliers from the band.

We could make a cut that tracks the shape of the band. As a first pass I will just set limits, which should encompass most of the wide part at low energy. I define a “tight” cut and a “loose” cut.

TCut cofintl = "PTINTall_PTdbscorr/PTOFamps>50&&PTINTall_PTdbscorr/PTOFamps<750"
TCut cofintt = "PTINTall_PTdbscorr/PTOFamps>250&&PTINTall_PTdbscorr/PTOFamps<550"

I only did this for one calibration series but I checked to make sure it works for the other two.

Note that these cuts don't work at high energies. We may want to look more at high energies to better understand the coincident spectrum, or for other reasons. If so we'd want to not use these cuts, and if we want a pileup cut we need to make a new one that follows the trend.

The figure below show the integral/OF ratio to higher energies. Because of pulse widening the ratio drifts upward (the OF template becomes an increasingly poorer fit). The colored regions show what events are retained by the two cuts.

Phi-based Am-241 source cut

A cut to remove the region of the detector near the source is useful because we see events related to the source at low energy, that produce extra background for our signal search. (Note: this cut would probably not be necessary if we had put a layer of tape on the collimator, to block both alphas and any low-energy electrons.)

// Am cut
z[1]->Draw("phidel:pt_keVee>>h1phie(300,0,10,200,-180,180)",!crand+cbs+cofintl+cgoodwalk,"colz")
z[1]->Draw("phidel>>h1phile(200,-180,180)",!crand+cbs+cofintl+cgoodwalk+"pt_keVee<1")
z[2]->Draw("phidel>>h2phile(200,-180,180)",!crand+cbs+cofintl+cgoodwalk+"pt_keVee<1")
z[3]->Draw("phidel>>h3phile(200,-180,180)",!crand+cbs+cofintl+cgoodwalk+"pt_keVee<1")
h1phile->Draw();h2phile->SetLineColor(kRed);h2phile->Draw("same");h3phile->SetLineColor("kGreen");h3phile->Draw("same");

The first drawing shows phi versus energy for 0-10 keVee for the first calibration series:

The main purpose of the cut is to remove Am-events in the signal region. The plot below shows phi for 0-1 keVee for each of the three series.

The phi reconstruction seems to be time dependent. To be thorough for this dataset, we set a wide phi cut to cover the full time period.

// There's some time dependence in phi. This cut covers all of them.
TCut cam = "phidel>-70&&phidel<50"
//
// Approximate efficiency is 66.7%

somethign

Now load all the NaI-triggered data, apply correction & calibration and copy the new cuts.

// load NaI series into one chain
gStyle->SetOptStat(0)
gStyle->SetOptFit(1)
TString datapath ="/data/chocula/fritts/data/k100proc/midasrq/byseries/"
TString ser[] = {"07220916_2059","07220916_2200","07220917_1039","07220917_1225","07220917_2125","07220917_2155"}
//TString lab[] = {"0V","-4V","-21V","-65V","-84V","-84V"}
int nser = 6
TChain *e
TChain *z
e = new TChain("rqDir/eventTree")
z = new TChain("rqDir/zip1")
// load odd-numbered series only, those are the NaI-triggered series
for(int s=0;s<nser;s++)if(s%2==1)e->Add(Form("%s/%s/umn*root",datapath.Data(),ser[s].Data()));
for(int s=0;s<nser;s++)if(s%2==1)z->Add(Form("%s/%s/umn*root",datapath.Data(),ser[s].Data()));
z->AddFriend(e)
//z->SetLineColor(kRed)
TCut crand = "EventCategory"
z->SetAlias("PTwid","(PTWKf40-PTWKr40)*1e6")
z->SetAlias("xdel","1e6*(PEWKr20-0.5*(PCWKr20+PDWKr20))-1")
z->SetAlias("ydel","1e6*(0.866*(PDWKr20-PCWKr20))+9")
// note empirical offsets in xdel, ydel
z->SetAlias("phidel","180./3.14159*atan2(ydel,xdel)")
z->SetAlias("afdel","1e6*(PFWKr20-PAWKr20)")
//
TCut cgoodwalk = "PCWKr20>0.25e-3&&PCWKr20<0.5e-3&&PDWKr20>0.25e-3&&PDWKr20<0.5e-3&&PEWKr20>0.25e-3&&PEWKr20<0.5e-3"
// Correction & Calibration
//
z->SetAlias("pt_keV","7.738820e+07*PTOFamps+1.653756e+13*PTOFamps**2")
z->SetAlias("pt0_keV","7.738820e+07*PTOFamps0+1.653756e+13*PTOFamps0**2")
z->SetAlias("PSUMbs","PAbs+PBbs+PCbs+PDbs+PEbs+PFbs") 
//
z->SetAlias("BSel","PSUMbs-18400")  
//
z->SetAlias("pt_keV_bscorr","pt_keV/(1.-0.0461538*BSel/165)")  
z->SetAlias("pt0_keV_bscorr","pt0_keV/(1.-0.0461538*BSel/165)")  
TCut cbs = "BSel<1100"  
//
// note: this is an averaged calibration, rather than a time-dependent one. Not as precise. 
z->SetAlias("pt_keVee","14.0821*pt_keV_bscorr/(333.899-pt_keV_bscorr)") 
z->SetAlias("pt0_keVee","14.0821*pt0_keV_bscorr/(333.899-pt0_keV_bscorr)") 

Now let's create a coincidence timing cut. We use the PTOFdelay quantity. This is the time that the OF integral finds as the start time of the pulse. If we plot this time versus energy (over a fairly wide energy range) we see a clear band of coincident events.

// find coincidence timing
z->Draw("PTOFdelay/0.8e-6:pt_keVee",!crand+cbs+"pt_keVee>0&&pt_keVee<200")
// note: cofint cuts don't work for higher energies, so better not to use here
// and cam cut is not necessary - stats are higher without it

Note this band is not present when randoms are selected, rather than NaI-triggered events. This is as expected - pulses randomly appear at any time in the OF time range when we take random traces.

TCut ccoin = "PTOFdelay/0.8e-6>8&&PTOFdelay/0/8e-6<40"

The cut is meant to be good for a wide range of energy, so that we can study the coincident spectrum not only in the signal region but also at higher energies.