NCFS-Pack
A generic (astro)particle physics analysis framework
 
Loading...
Searching...
No Matches
IceCleanHits.cxx
Go to the documentation of this file.
1
17
19
109
110#include "IceCleanHits.h"
111#include "Riostream.h"
112
113ClassImp(IceCleanHits); // Class implementation to enable ROOT I/O
114
116IceCleanHits::IceCleanHits(const char* name,const char* title) : TTask(name,title)
117{
123
124 fEvt=0;
125 fAdcminAM=0.3;
126 fAdcmaxAM=999999;
127 fAdcminAT=0.3;
128 fAdcmaxAT=999999;
129 fAdcminT=0;
130 fAdcmaxT=999999;
131 fAdcminIC=0;
132 fAdcmaxIC=999999;
133 fAdcminDC=0;
134 fAdcmaxDC=999999;
135 fTotminAEM=125;
136 fTotmaxAEM=2000;
137 fTotminAOM=20;
138 fTotmaxAOM=2000;
139 fTotminAET=125;
140 fTotmaxAET=2000;
141 fTotminAOT=20;
142 fTotmaxAOT=2000;
143 fTotminT=0;
144 fTotmaxT=999999;
145 fTotminIC=0;
146 fTotmaxIC=999999;
147 fTotminDC=0;
148 fTotmaxDC=999999;
149 fRmaxA=70;
150 fDtmaxA=500;
151 fRmaxT=150;
152 fDtmaxT=1000;
153 fRmaxIC=150;
154 fDtmaxIC=1000;
155 fRmaxDC=75;
156 fDtmaxDC=500;
157 fTnamAM="main";
158 fTtimAM=-1;
159 fTnamAT="main";
160 fTtimAT=-1;
161 fTnamT="user";
162 fSlcT=0;
163 fMultT=1;
164 fTtimT=-1;
165 fTnamIC="user";
166 fSlcIC=0;
167 fMultIC=1;
168 fTtimIC=-1;
169 fTnamDC="user";
170 fSlcDC=0;
171 fMultDC=1;
172 fTtimDC=-1;
173 fTwinAM=2250;
174 fTwinAT=3000;
175 fTwinT=999999;
176 fTwinIC=3000;
177 fTwinDC=1000;
178}
179
188
189void IceCleanHits::SetAdcRange(Float_t min,Float_t max,TString s)
190{
204
205 if (s=="MuDaq")
206 {
207 fAdcminAM=min;
208 fAdcmaxAM=max;
209 }
210 if (s=="TWRDaq")
211 {
212 fAdcminAT=min;
213 fAdcmaxAT=max;
214 }
215 if (s=="TDOM")
216 {
217 fAdcminT=min;
218 fAdcmaxT=max;
219 }
220 if (s=="ICDOM")
221 {
222 fAdcminIC=min;
223 fAdcmaxIC=max;
224 }
225 if (s=="DCDOM")
226 {
227 fAdcminDC=min;
228 fAdcmaxDC=max;
229 }
230}
231
232void IceCleanHits::SetTotRange(Float_t min,Float_t max,TString s)
233{
249
250 if (s=="AEM")
251 {
252 fTotminAEM=min;
253 fTotmaxAEM=max;
254 }
255 if (s=="AOM")
256 {
257 fTotminAOM=min;
258 fTotmaxAOM=max;
259 }
260 if (s=="AET")
261 {
262 fTotminAET=min;
263 fTotmaxAET=max;
264 }
265 if (s=="AOT")
266 {
267 fTotminAOT=min;
268 fTotmaxAOT=max;
269 }
270 if (s=="TDOM")
271 {
272 fTotminT=min;
273 fTotmaxT=max;
274 }
275 if (s=="ICDOM")
276 {
277 fTotminIC=min;
278 fTotmaxIC=max;
279 }
280 if (s=="DCDOM")
281 {
282 fTotminDC=min;
283 fTotmaxDC=max;
284 }
285}
286
287void IceCleanHits::SetIsolation(Float_t rmax,Float_t dtmax,TString s)
288{
304
305 if (s=="AOM")
306 {
307 if (rmax >= 0) fRmaxA=rmax;
308 if (dtmax >= 0) fDtmaxA=dtmax;
309 }
310 if (s=="TDOM")
311 {
312 if (rmax >= 0) fRmaxT=rmax;
313 if (dtmax >= 0) fDtmaxT=dtmax;
314 }
315 if (s=="ICDOM")
316 {
317 if (rmax >= 0) fRmaxIC=rmax;
318 if (dtmax >= 0) fDtmaxIC=dtmax;
319 }
320 if (s=="DCDOM")
321 {
322 if (rmax >= 0) fRmaxDC=rmax;
323 if (dtmax >= 0) fDtmaxDC=dtmax;
324 }
325}
326
327void IceCleanHits::SetTwindow(Float_t dtmax,TString s)
328{
347
348 if (s=="MuDaq") fTwinAM=dtmax;
349 if (s=="TWRDaq") fTwinAT=dtmax;
350 if (s=="TDOM") fTwinT=dtmax;
351 if (s=="ICDOM") fTwinIC=dtmax;
352 if (s=="DCDOM") fTwinDC=dtmax;
353}
354
355void IceCleanHits::SetTname(TString name,TString s)
356{
384
385 if (s=="MuDaq")
386 {
387 fTnamAM=name;
388 fTtimAM=0;
389 if (name=="Average") fTtimAM=-1;
390 }
391 if (s=="TWRDaq")
392 {
393 fTnamAT=name;
394 fTtimAT=0;
395 if (name=="Average") fTtimAT=-1;
396 }
397 if (s=="TDOM")
398 {
399 fTnamT=name;
400 fTtimT=0;
401 if (name=="Average") fTtimT=-1;
402 }
403 if (s=="ICDOM")
404 {
405 fTnamIC=name;
406 fTtimIC=0;
407 if (name=="Average") fTtimIC=-1;
408 }
409 if (s=="DCDOM")
410 {
411 fTnamDC=name;
412 fTtimDC=0;
413 if (name=="Average") fTtimDC=-1;
414 }
415}
416
417void IceCleanHits::SetTtime(Float_t t,TString s,Int_t slc,Int_t mult)
418{
464
465 if (s=="MuDaq")
466 {
467 fTtimAM=t;
468 fTnamAM="user";
469 }
470 if (s=="TWRDaq")
471 {
472 fTtimAT=t;
473 fTnamAT="user";
474 }
475 if (s=="TDOM")
476 {
477 fTtimT=t;
478 fSlcT=slc;
479 fMultT=mult;
480 fTnamT="user";
481 }
482 if (s=="ICDOM")
483 {
484 fTtimIC=t;
485 fSlcIC=slc;
486 fMultIC=mult;
487 fTnamIC="user";
488 }
489 if (s=="DCDOM")
490 {
491 fTtimDC=t;
492 fSlcDC=slc;
493 fMultDC=mult;
494 fTnamDC="user";
495 }
496}
497
498void IceCleanHits::Exec(Option_t* opt)
499{
505
506 TString name=opt;
507 NcJob* parent=(NcJob*)(gROOT->GetListOfTasks()->FindObject(name.Data()));
508
509 if (!parent) return;
510
511 fEvt=(IceEvent*)parent->GetObject("IceEvent");
512 if (!fEvt) return;
513
514 // Only process accepted events
515 NcDevice* seldev=(NcDevice*)fEvt->GetDevice("NcEventSelector");
516 if (seldev)
517 {
518 if (seldev->GetSignal("Select") < 0.1) return;
519 }
520
521 // Storage of the used parameters in the IceCleanHits device
522 NcDevice params;
523 params.SetNameTitle("IceCleanHits","IceCleanHits processor parameters");
524 params.AddNamedSlot("AdcminAM");
525 params.AddNamedSlot("AdcmaxAM");
526 params.AddNamedSlot("AdcminAT");
527 params.AddNamedSlot("AdcmaxAT");
528 params.AddNamedSlot("AdcminT");
529 params.AddNamedSlot("AdcmaxT");
530 params.AddNamedSlot("AdcminIC");
531 params.AddNamedSlot("AdcmaxIC");
532 params.AddNamedSlot("AdcminDC");
533 params.AddNamedSlot("AdcmaxDC");
534 params.AddNamedSlot("TotminAEM");
535 params.AddNamedSlot("TotmaxAEM");
536 params.AddNamedSlot("TotminAOM");
537 params.AddNamedSlot("TotmaxAOM");
538 params.AddNamedSlot("TotminAET");
539 params.AddNamedSlot("TotmaxAET");
540 params.AddNamedSlot("TotminAOT");
541 params.AddNamedSlot("TotmaxAOT");
542 params.AddNamedSlot("TotminT");
543 params.AddNamedSlot("TotmaxT");
544 params.AddNamedSlot("TotminIC");
545 params.AddNamedSlot("TotmaxIC");
546 params.AddNamedSlot("TotminDC");
547 params.AddNamedSlot("TotmaxDC");
548 params.AddNamedSlot("RmaxA");
549 params.AddNamedSlot("DtmaxA");
550 params.AddNamedSlot("RmaxT");
551 params.AddNamedSlot("DtmaxT");
552 params.AddNamedSlot("RmaxIC");
553 params.AddNamedSlot("DtmaxIC");
554 params.AddNamedSlot("RmaxDC");
555 params.AddNamedSlot("DtmaxDC");
556 params.AddNamedSlot("TwinAM");
557 params.AddNamedSlot("TtimAM");
558 params.AddNamedSlot("TwinAT");
559 params.AddNamedSlot("TtimAT");
560 params.AddNamedSlot("TwinT");
561 params.AddNamedSlot("SlcT");
562 params.AddNamedSlot("MultT");
563 params.AddNamedSlot("TtimT");
564 params.AddNamedSlot("TwinIC");
565 params.AddNamedSlot("SlcIC");
566 params.AddNamedSlot("MultIC");
567 params.AddNamedSlot("TtimIC");
568 params.AddNamedSlot("TwinDC");
569 params.AddNamedSlot("SlcDC");
570 params.AddNamedSlot("MultDC");
571 params.AddNamedSlot("TtimDC");
572
573 params.SetSignal(fAdcminAM,"AdcminAM");
574 params.SetSignal(fAdcmaxAM,"AdcmaxAM");
575 params.SetSignal(fAdcminAT,"AdcminAT");
576 params.SetSignal(fAdcmaxAT,"AdcmaxAT");
577 params.SetSignal(fAdcminT,"AdcminT");
578 params.SetSignal(fAdcmaxT,"AdcmaxT");
579 params.SetSignal(fAdcminIC,"AdcminIC");
580 params.SetSignal(fAdcmaxIC,"AdcmaxIC");
581 params.SetSignal(fAdcminDC,"AdcminDC");
582 params.SetSignal(fAdcmaxDC,"AdcmaxDC");
583 params.SetSignal(fTotminAEM,"TotminAEM");
584 params.SetSignal(fTotmaxAEM,"TotmaxAEM");
585 params.SetSignal(fTotminAOM,"TotminAOM");
586 params.SetSignal(fTotmaxAOM,"TotmaxAOM");
587 params.SetSignal(fTotminAET,"TotminAET");
588 params.SetSignal(fTotmaxAET,"TotmaxAET");
589 params.SetSignal(fTotminAOT,"TotminAOT");
590 params.SetSignal(fTotmaxAOT,"TotmaxAOT");
591 params.SetSignal(fTotminT,"TotminT");
592 params.SetSignal(fTotmaxT,"TotmaxT");
593 params.SetSignal(fTotminIC,"TotminIC");
594 params.SetSignal(fTotmaxIC,"TotmaxIC");
595 params.SetSignal(fTotminDC,"TotminDC");
596 params.SetSignal(fTotmaxDC,"TotmaxDC");
597 params.SetSignal(fRmaxA,"RmaxA");
598 params.SetSignal(fDtmaxA,"DtmaxA");
599 params.SetSignal(fRmaxT,"RmaxT");
600 params.SetSignal(fDtmaxT,"DtmaxT");
601 params.SetSignal(fRmaxIC,"RmaxIC");
602 params.SetSignal(fDtmaxIC,"DtmaxIC");
603 params.SetSignal(fRmaxDC,"RmaxDC");
604 params.SetSignal(fDtmaxDC,"DtmaxDC");
605 params.SetSignal(fTwinAM,"TwinAM");
606 params.SetSignal(fTtimAM,"TtimAM");
607 params.SetSignal(fTwinAT,"TwinAT");
608 params.SetSignal(fTtimAT,"TtimAT");
609 params.SetSignal(fTwinT,"TwinT");
610 params.SetSignal(fSlcT,"SlcT");
611 params.SetSignal(fMultT,"MultT");
612 params.SetSignal(fTtimT,"TtimT");
613 params.SetSignal(fTwinIC,"TwinIC");
614 params.SetSignal(fSlcIC,"SlcIC");
615 params.SetSignal(fMultIC,"MultIC");
616 params.SetSignal(fTtimIC,"TtimIC");
617 params.SetSignal(fTwinDC,"TwinDC");
618 params.SetSignal(fSlcDC,"SlcDC");
619 params.SetSignal(fMultDC,"MultDC");
620 params.SetSignal(fTtimDC,"TtimDC");
621
622 fEvt->AddDevice(params);
623
624 Amanda();
625 IceTop();
626 ICdoms();
627 DCdoms();
628}
629
631{
637
638 NcDevice* daq=(NcDevice*)fEvt->GetDevice("Daq");
639 if (!daq) return;
640
641 if (daq->GetSignal("Muon")) MuDaq();
642 if (daq->GetSignal("TWR")) TWRDaq();
643}
644
646{
652
653 // All Amanda OMs with a signal
654 TObjArray* aoms=fEvt->GetDevices("IceAOM");
655 if (!aoms) return;
656
657 // Local OM array with bad/dead OMs (as indicated via IceCalibrate) discarded
658 TObjArray oms;
659 IceAOM* omx=0;
660 for (Int_t i=0; i<aoms->GetEntries(); i++)
661 {
662 omx=(IceAOM*)aoms->At(i);
663 if (!omx) continue;
664 if (omx->GetDeadValue("ADC") || omx->GetDeadValue("LE") || omx->GetDeadValue("TOT")) continue;
665 oms.Add(omx);
666 }
667
668 // Determination of the selected trigger time
669 if (fTnamAM != "user") // Trigger time derived from trigger data
670 {
671 fTtimAM=fEvt->GetTriggerTime(fTnamAM);
672 }
673 else // Trigger time from median of hit times
674 {
675 if (fTtimAM<0)
676 {
677 fTtimAM=fEvt->GetTriggerTime(fTnamAM,&oms);
678
679 // Make the value negative to stay with median of hit times selection
680 // for all following invokations.
681 if (fTtimAM>0) fTtimAM*=-1.;
682 if (!fTtimAM) fTtimAM=-0.001;
683 }
684 }
685
686 // Store the trigger time in the parameters device
687 NcDevice* params=(NcDevice*)fEvt->GetDevice("IceCleanHits");
688 if (params) params->SetSignal(fTtimAM,"TtimAM");
689
690 // Local array with clean hits
691 TObjArray hits;
692 Int_t omid=0;
693 Int_t clean=1;
694 NcSignal* sx=0;
695 Float_t adc,le,tot;
696 Int_t readout;
697 for (Int_t iom=0; iom<oms.GetEntries(); iom++)
698 {
699 omx=(IceAOM*)oms.At(iom);
700 if (!omx) continue;
701 omid=omx->GetUniqueID();
702 readout=int(omx->GetSignal("READOUT"));
703 // General readout setting in case info was missing
704 if (!readout)
705 {
706 readout=1;
707 if (omid>=303) readout=2; // Optical OMs
708 }
709 for (Int_t ih=1; ih<=omx->GetNhits(); ih++)
710 {
711 sx=omx->GetHit(ih);
712 if (!sx) continue;
713 adc=sx->GetSignal("ADC",7);
714 le=sx->GetSignal("LE",7);
715 tot=sx->GetSignal("TOT",7);
716
717 // Remove hits with an ADC value outside the range
718 if (adc<fAdcminAM || adc>fAdcmaxAM)
719 {
720 sx->SetDead("ADC");
721 clean=0;
722 }
723 // Remove hits with a TOT value outside the range
724 // Note : Different ranges for electrical and optical modules
725 if (readout==1) // Electrical OMs
726 {
727 if (tot<fTotminAEM || tot>fTotmaxAEM)
728 {
729 sx->SetDead("TOT");
730 clean=0;
731 }
732 }
733 else // Optical OMs
734 {
735 if (tot<fTotminAOM || tot>fTotmaxAOM)
736 {
737 sx->SetDead("TOT");
738 clean=0;
739 }
740 }
741 // Remove hits that are outside the trigger time window.
742 // Since the trigger time was determined from uncalibrated LE's
743 // (to include cable length effects) the uncalibrated LE of each
744 // hit should be used here as well.
745 le=sx->GetSignal("LE",-7);
746 if (fabs(le-fTtimAM)>fTwinAM)
747 {
748 sx->SetDead("LE");
749 clean=0;
750 }
751 // Store only the current clean hits in our local hit array
752 // This will save CPU time for the isolation criterion
753 if (clean) hits.Add(sx);
754 }
755 }
756
757 // Isolation cut
758 // Only retain hits that have at least one hit of another OM within a certain
759 // radius and within a certain time window
760 Int_t nhits=hits.GetEntries();
761 NcSignal* sx1=0;
762 NcSignal* sx2=0;
763 Float_t t1,t2;
764 IceAOM* omx1=0;
765 IceAOM* omx2=0;
766 NcPosition r1;
767 NcPosition r2;
768 Float_t dt,dr;
769 Int_t iso;
770 for (Int_t jh1=0; jh1<nhits; jh1++)
771 {
772 sx1=(NcSignal*)hits.At(jh1);
773 if (!sx1) continue;
774
775 iso=1;
776 for (Int_t jh2=0; jh2<nhits; jh2++)
777 {
778 sx2=(NcSignal*)hits.At(jh2);
779 if (!sx2) continue;
780
781 omx1=(IceAOM*)sx1->GetDevice();
782 omx2=(IceAOM*)sx2->GetDevice();
783 if (omx1==omx2) continue;
784
785 t1=sx1->GetSignal("LE",7);
786 t2=sx2->GetSignal("LE",7);
787 dt=fabs(t2-t1);
788 if (dt>fDtmaxA) continue;
789
790 if (omx1 && omx2)
791 {
792 r1=omx1->GetPosition();
793 r2=omx2->GetPosition();
794 dr=r1.GetDistance(r2);
795 if (dr>fRmaxA) continue;
796 iso=0;
797 }
798 }
799 if (iso) sx1->SetDead("LE");
800 }
801}
802
804{
810
811 // All Amanda OMs with a signal
812 TObjArray* aoms=fEvt->GetDevices("IceAOM");
813 if (!aoms) return;
814
815 // Local OM array with bad/dead OMs (as indicated via IceCalibrate) discarded
816 TObjArray oms;
817 IceAOM* omx=0;
818 for (Int_t i=0; i<aoms->GetEntries(); i++)
819 {
820 omx=(IceAOM*)aoms->At(i);
821 if (!omx) continue;
822 if (omx->GetDeadValue("ADC") || omx->GetDeadValue("LE") || omx->GetDeadValue("TOT")) continue;
823 oms.Add(omx);
824 }
825
826 // Determination of the selected trigger time
827 if (fTnamAT != "user") // Trigger time derived from trigger data
828 {
829 fTtimAT=fEvt->GetTriggerTime(fTnamAT);
830 }
831 else // Trigger time from median of hit times
832 {
833 if (fTtimAT<0)
834 {
835 fTtimAT=fEvt->GetTriggerTime(fTnamAT,&oms);
836
837 // Make the value negative to stay with median of hit times selection
838 // for all following invokations.
839 if (fTtimAT>0) fTtimAT*=-1.;
840 if (!fTtimAT) fTtimAT=-0.001;
841 }
842 }
843
844 // Store the trigger time in the parameters device
845 NcDevice* params=(NcDevice*)fEvt->GetDevice("IceCleanHits");
846 if (params) params->SetSignal(fTtimAT,"TtimAT");
847
848 // Local array with clean hits
849 TObjArray hits;
850 Int_t omid=0;
851 Int_t clean=1;
852 NcSignal* sx=0;
853 Float_t adc,le,tot;
854 Int_t readout;
855 for (Int_t iom=0; iom<oms.GetEntries(); iom++)
856 {
857 omx=(IceAOM*)oms.At(iom);
858 if (!omx) continue;
859 omid=omx->GetUniqueID();
860 readout=int(omx->GetSignal("READOUT"));
861 // General readout setting in case info was missing
862 if (!readout)
863 {
864 readout=1;
865 if (omid>=303) readout=2; // Optical OMs
866 }
867 for (Int_t ih=1; ih<=omx->GetNhits(); ih++)
868 {
869 sx=omx->GetHit(ih);
870 if (!sx) continue;
871 adc=sx->GetSignal("ADC",7);
872 le=sx->GetSignal("LE",7);
873 tot=sx->GetSignal("TOT",7);
874
875 // Remove hits with an ADC value outside the range
876 if (adc<fAdcminAT || adc>fAdcmaxAT)
877 {
878 sx->SetDead("ADC");
879 clean=0;
880 }
881 // Remove hits with a TOT value outside the range
882 // Note : Different ranges for electrical and optical modules
883 if (readout==1) // Electrical OMs
884 {
885 if (tot<fTotminAET || tot>fTotmaxAET)
886 {
887 sx->SetDead("TOT");
888 clean=0;
889 }
890 }
891 else // Optical OMs
892 {
893 if (tot<fTotminAOT || tot>fTotmaxAOT)
894 {
895 sx->SetDead("TOT");
896 clean=0;
897 }
898 }
899 // Remove hits that are outside the trigger time window.
900 // Since the trigger time was determined from uncalibrated LE's
901 // (to include cable length effects) the uncalibrated LE of each
902 // hit should be used here as well.
903 le=sx->GetSignal("LE",-7);
904 if (fabs(le-fTtimAT)>fTwinAT)
905 {
906 sx->SetDead("LE");
907 clean=0;
908 }
909 // Store only the current clean hits in our local hit array
910 // This will save CPU time for the isolation criterion
911 if (clean) hits.Add(sx);
912 }
913 }
914
915 // Isolation cut
916 // Only retain hits that have at least one hit of another OM within a certain
917 // radius and within a certain time window
918 Int_t nhits=hits.GetEntries();
919 NcSignal* sx1=0;
920 NcSignal* sx2=0;
921 Float_t t1,t2;
922 IceAOM* omx1=0;
923 IceAOM* omx2=0;
924 NcPosition r1;
925 NcPosition r2;
926 Float_t dt,dr;
927 Int_t iso;
928 for (Int_t jh1=0; jh1<nhits; jh1++)
929 {
930 sx1=(NcSignal*)hits.At(jh1);
931 if (!sx1) continue;
932
933 iso=1;
934 for (Int_t jh2=0; jh2<nhits; jh2++)
935 {
936 sx2=(NcSignal*)hits.At(jh2);
937 if (!sx2) continue;
938
939 omx1=(IceAOM*)sx1->GetDevice();
940 omx2=(IceAOM*)sx2->GetDevice();
941 if (omx1==omx2) continue;
942
943 t1=sx1->GetSignal("LE",7);
944 t2=sx2->GetSignal("LE",7);
945 dt=fabs(t2-t1);
946 if (dt>fDtmaxA) continue;
947
948 if (omx1 && omx2)
949 {
950 r1=omx1->GetPosition();
951 r2=omx2->GetPosition();
952 dr=r1.GetDistance(r2);
953 if (dr>fRmaxA) continue;
954 iso=0;
955 }
956 }
957 if (iso) sx1->SetDead("LE");
958 }
959}
960
962{
968
969 // All IceTop DOMs with a signal
970 TObjArray* doms=fEvt->GetDevices("IceTDOM");
971 if (!doms) return;
972
973 TObjArray hits; // Local hit array
974 IceGOM* omx=0;
975 NcSignal* sx=0;
976 for (Int_t i=0; i<doms->GetEntries(); i++)
977 {
978 omx=(IceGOM*)doms->At(i);
979 if (!omx) continue;
980 for (Int_t ih=1; ih<=omx->GetNhits(); ih++)
981 {
982 sx=omx->GetHit(ih);
983 if (!sx) continue;
984
985 if (omx->GetDeadValue("ADC")) sx->SetDead("ADC");
986 if (omx->GetDeadValue("LE")) sx->SetDead("LE");
987 if (omx->GetDeadValue("TOT")) sx->SetDead("TOT");
988
989 hits.Add(sx);
990 }
991 }
992
993 // ADC and TOT cleaning
995
996 // Isolated hit cleaning
998
999 // Determination of the selected trigger time
1000 TArrayF peaks;
1001 TArrayF* refp=0;
1002 if (fMultT) refp=&peaks;
1003 if (fTnamT != "user") // Trigger time derived from trigger data
1004 {
1005 fTtimT=fEvt->GetTriggerTime(fTnamT);
1006 }
1007 else // Trigger time from median of hit times
1008 {
1009 if (fTtimT<0)
1010 {
1011 fTtimT=fEvt->GetTriggerTime(fTnamT,&hits,fSlcT,refp);
1012
1013 // Make the value negative to stay with median of hit times selection
1014 // for all following invokations.
1015 if (fTtimT>0) fTtimT*=-1.;
1016 if (!fTtimT) fTtimT=-0.001;
1017 }
1018 }
1019
1020 // Store the trigger time in the parameters device
1021 NcDevice* params=(NcDevice*)fEvt->GetDevice("IceCleanHits");
1022 if (params) params->SetSignal(fTtimT,"TtimT");
1023
1024 // Time window cleaning
1025 TimeWindow(hits,fTtimT,fTwinT,refp);
1026}
1027
1029{
1035
1036 // All standard IceCube DOMs with a signal
1037 TObjArray* doms=fEvt->GetDevices("IceICDOM");
1038 if (!doms) return;
1039
1040 TObjArray hits; // Local hit array
1041 IceGOM* omx=0;
1042 NcSignal* sx=0;
1043 for (Int_t i=0; i<doms->GetEntries(); i++)
1044 {
1045 omx=(IceGOM*)doms->At(i);
1046 if (!omx) continue;
1047 for (Int_t ih=1; ih<=omx->GetNhits(); ih++)
1048 {
1049 sx=omx->GetHit(ih);
1050 if (!sx) continue;
1051
1052 if (omx->GetDeadValue("ADC")) sx->SetDead("ADC");
1053 if (omx->GetDeadValue("LE")) sx->SetDead("LE");
1054 if (omx->GetDeadValue("TOT")) sx->SetDead("TOT");
1055
1056 hits.Add(sx);
1057 }
1058 }
1059
1060 // ADC and TOT cleaning
1062
1063 // Isolated hit cleaning
1065
1066 // Determination of the selected trigger time
1067 TArrayF peaks;
1068 TArrayF* refp=0;
1069 if (fMultIC) refp=&peaks;
1070 if (fTnamIC != "user") // Trigger time derived from trigger data
1071 {
1072 fTtimIC=fEvt->GetTriggerTime(fTnamIC);
1073 }
1074 else // Trigger time from median of hit times
1075 {
1076 if (fTtimIC<0)
1077 {
1078 fTtimIC=fEvt->GetTriggerTime(fTnamIC,&hits,fSlcIC,refp);
1079
1080 // Make the value negative to stay with median of hit times selection
1081 // for all following invokations.
1082 if (fTtimIC>0) fTtimIC*=-1.;
1083 if (!fTtimIC) fTtimIC=-0.001;
1084 }
1085 }
1086
1087 // Store the trigger time in the parameters device
1088 NcDevice* params=(NcDevice*)fEvt->GetDevice("IceCleanHits");
1089 if (params) params->SetSignal(fTtimIC,"TtimIC");
1090
1091 // Time window cleaning
1092 TimeWindow(hits,fTtimIC,fTwinIC,refp);
1093}
1094
1096{
1102
1103 // All DeepCore DOMs with a signal
1104 TObjArray* doms=fEvt->GetDevices("IceDCDOM");
1105 if (!doms) return;
1106
1107 TObjArray hits; // Local hit array
1108 IceGOM* omx=0;
1109 NcSignal* sx=0;
1110 for (Int_t i=0; i<doms->GetEntries(); i++)
1111 {
1112 omx=(IceGOM*)doms->At(i);
1113 if (!omx) continue;
1114 for (Int_t ih=1; ih<=omx->GetNhits(); ih++)
1115 {
1116 sx=omx->GetHit(ih);
1117 if (!sx) continue;
1118
1119 if (omx->GetDeadValue("ADC")) sx->SetDead("ADC");
1120 if (omx->GetDeadValue("LE")) sx->SetDead("LE");
1121 if (omx->GetDeadValue("TOT")) sx->SetDead("TOT");
1122
1123 hits.Add(sx);
1124 }
1125 }
1126
1127 // ADC and TOT cleaning
1129
1130 // Isolated hit cleaning
1132
1133 // Determination of the selected trigger time
1134 TArrayF peaks;
1135 TArrayF* refp=0;
1136 if (fMultDC) refp=&peaks;
1137 if (fTnamDC != "user") // Trigger time derived from trigger data
1138 {
1139 fTtimDC=fEvt->GetTriggerTime(fTnamDC);
1140 }
1141 else // Trigger time from median of hit times
1142 {
1143 if (fTtimDC<0)
1144 {
1145 fTtimDC=fEvt->GetTriggerTime(fTnamDC,&hits,fSlcDC,refp);
1146
1147 // Make the value negative to stay with median of hit times selection
1148 // for all following invokations.
1149 if (fTtimDC>0) fTtimDC*=-1.;
1150 if (!fTtimDC) fTtimDC=-0.001;
1151 }
1152 }
1153
1154 // Store the trigger time in the parameters device
1155 NcDevice* params=(NcDevice*)fEvt->GetDevice("IceCleanHits");
1156 if (params) params->SetSignal(fTtimDC,"TtimDC");
1157
1158 // Time window cleaning
1159 TimeWindow(hits,fTtimDC,fTwinDC,refp);
1160}
1161
1162void IceCleanHits::Amplitude(TObjArray& hits,Float_t adcmin,Float_t adcmax,Float_t totmin,Float_t totmax) const
1163{
1169
1170 NcSignal* sx=0;
1171 Float_t adc,tot;
1172 for (Int_t ih=0; ih<hits.GetEntries(); ih++)
1173 {
1174 sx=(NcSignal*)hits.At(ih);
1175 if (!sx) continue;
1176 adc=sx->GetSignal("ADC",7);
1177 tot=sx->GetSignal("TOT",7);
1178
1179 // Reject hits with an ADC value outside the range
1180 if (adc<adcmin || adc>adcmax) sx->SetDead("ADC");
1181
1182 // Reject hits with a TOT value outside the range
1183 if (tot<totmin || tot>totmax) sx->SetDead("TOT");
1184 }
1185}
1186
1187void IceCleanHits::Isolation(TObjArray& hits,Float_t dtmax,Float_t rmax) const
1188{
1196
1197 NcSignal* sx1=0;
1198 NcSignal* sx2=0;
1199 Float_t t1,t2;
1200 IceGOM* omx1=0;
1201 IceGOM* omx2=0;
1202 NcPosition r1;
1203 NcPosition r2;
1204 Float_t dt,dr;
1205 Int_t iso;
1206 Int_t nhits=hits.GetEntries();
1207 for (Int_t jh1=0; jh1<nhits; jh1++)
1208 {
1209 sx1=(NcSignal*)hits.At(jh1);
1210 if (!sx1) continue;
1211
1212 // No need to investigate further if LE was already rejected
1213 if (sx1->GetDeadValue("LE")) continue;
1214
1215 iso=1;
1216
1217 for (Int_t jh2=0; jh2<nhits; jh2++)
1218 {
1219 sx2=(NcSignal*)hits.At(jh2);
1220 if (!sx2) continue;
1221
1222 if (sx2->GetDeadValue("ADC") || sx2->GetDeadValue("LE") || sx2->GetDeadValue("TOT")) continue;
1223
1224 omx1=(IceGOM*)sx1->GetDevice();
1225 omx2=(IceGOM*)sx2->GetDevice();
1226 if (omx1==omx2) continue;
1227
1228 t1=sx1->GetSignal("LE",7);
1229 t2=sx2->GetSignal("LE",7);
1230 dt=fabs(t2-t1);
1231 if (dt>dtmax) continue;
1232
1233 if (omx1 && omx2)
1234 {
1235 r1=omx1->GetPosition();
1236 r2=omx2->GetPosition();
1237 dr=r1.GetDistance(r2);
1238 if (dr>rmax) continue;
1239 iso=0;
1240 break;
1241 }
1242 } // End of loop over hit2
1243
1244 if (iso) sx1->SetDead("LE");
1245 } // End of loop over hit1
1246}
1247
1248void IceCleanHits::TimeWindow(TObjArray& hits,Float_t ttrig,Float_t twin,TArrayF* peaks) const
1249{
1255
1256 NcSignal* sx=0;
1257 Float_t le;
1258 Int_t npeaks=0;
1259 if (peaks) npeaks=peaks->GetSize();
1260 if (npeaks<1) npeaks=1;
1261 for (Int_t ih=0; ih<hits.GetEntries(); ih++)
1262 {
1263 sx=(NcSignal*)hits.At(ih);
1264 if (!sx) continue;
1265
1266 // No need to investigate further if LE was already rejected
1267 if (sx->GetDeadValue("LE")) continue;
1268
1269 le=sx->GetSignal("LE",7);
1270
1271 // Retain only hits that are inside a trigger time window.
1272 sx->SetDead("LE");
1273 for (Int_t ipeak=0; ipeak<npeaks; ipeak++)
1274 {
1275 if (peaks) ttrig=peaks->At(ipeak);
1276 if (fabs(le-fabs(ttrig))<=twin)
1277 {
1278 sx->SetAlive("LE");
1279 break;
1280 }
1281 }
1282 }
1283}
1284
ClassImp(IceCleanHits)
Signal (Hit) handling of a generic Amanda Optical Module (AOM).
Definition IceAOM.h:12
TTask derived class to perform hit cleaning.
void SetAdcRange(Float_t min, Float_t max, TString s)
Float_t fDtmaxIC
Float_t fDtmaxT
Float_t fRmaxT
Float_t fAdcmaxAT
Float_t fRmaxIC
TString fTnamIC
Float_t fTwinT
IceCleanHits(const char *name="IceCleanHits", const char *title="Hit cleaning")
Float_t fTotmaxDC
Float_t fTotmaxAOT
Float_t fAdcminAM
Float_t fRmaxA
Float_t fDtmaxA
Float_t fTtimIC
Float_t fRmaxDC
Float_t fTwinDC
Float_t fTtimAT
Float_t fAdcmaxDC
void SetTotRange(Float_t min, Float_t max, TString s)
Float_t fAdcminT
Float_t fAdcmaxAM
Float_t fTotminAET
IceEvent * fEvt
TString fTnamT
Float_t fTotmaxAOM
TString fTnamAT
Float_t fTwinAT
Float_t fTotmaxAET
TString fTnamAM
Float_t fAdcminAT
Float_t fTotmaxAEM
virtual void Exec(Option_t *opt)
Float_t fTotminAOT
Float_t fAdcminIC
Float_t fAdcmaxT
Float_t fTotminDC
Float_t fTotminAOM
void SetIsolation(Float_t rmax, Float_t dtmax, TString s)
Float_t fTotminIC
void Amplitude(TObjArray &hits, Float_t adcmin, Float_t adcmax, Float_t totmin, Float_t totmax) const
Float_t fAdcmaxIC
void SetTwindow(Float_t dtmax, TString s)
Float_t fTotminT
Float_t fTotmaxT
Float_t fTtimAM
Float_t fTotminAEM
TString fTnamDC
Float_t fTtimT
void SetTtime(Float_t t, TString s, Int_t slc=0, Int_t mult=0)
virtual ~IceCleanHits()
Float_t fTtimDC
void TimeWindow(TObjArray &hits, Float_t ttrig, Float_t twin, TArrayF *peaks=0) const
Float_t fDtmaxDC
void Isolation(TObjArray &hits, Float_t dtmax, Float_t rmax) const
Float_t fAdcminDC
void SetTname(TString name, TString s)
Float_t fTwinAM
Float_t fTotmaxIC
Float_t fTwinIC
Handling of IceCube event data.
Definition IceEvent.h:20
Signal (Hit) handling of a generic IceCube Optical Module (GOM).
Definition IceGOM.h:12
void SetAlive(Int_t j=1)
Definition NcAttrib.cxx:946
void AddNamedSlot(TString s)
Int_t GetDeadValue(Int_t j=1) const
void SetDead(Int_t j=1)
Definition NcAttrib.cxx:886
Signal (Hit) handling of a generic device.
Definition NcDevice.h:14
Int_t GetNhits() const
Definition NcDevice.cxx:437
NcSignal * GetHit(Int_t j) const
Definition NcDevice.cxx:489
Base class for top level job in a task based procedure.
Definition NcJob.h:18
TObject * GetObject(const char *classname) const
Definition NcJob.cxx:456
Handling of positions (with timestamps) in various reference frames.
Definition NcPosition.h:18
void GetPosition(Double_t *r, TString f, TString u="rad", Float_t s=-1) const
Double_t GetDistance(NcPosition &p, Float_t scale=-1)
Generic handling of (extrapolated) detector signals.
Definition NcSignal.h:23
virtual void SetSignal(Double_t sig, Int_t j=1)
Definition NcSignal.cxx:516
NcDevice * GetDevice() const
virtual Float_t GetSignal(Int_t j=1, Int_t mode=0) const
Definition NcSignal.cxx:651