NCFS-Pack
A generic (astro)particle physics analysis framework
 
Loading...
Searching...
No Matches
NcEventSelector.cxx
Go to the documentation of this file.
1
31
33
152
153#include "NcEventSelector.h"
154#include "Riostream.h"
155
156ClassImp(NcEventSelector); // Class implementation to enable ROOT I/O
157
159NcEventSelector::NcEventSelector(const char* name,const char* title) : NcAstrolab(name,title)
160{
166
167 fFirst=1;
168 fEvt=0;
169 fParams=0;
170 fSelect=0;
171 fTrackflag=0;
172 fEventflag=0;
173 fAstroflag=0;
174 fLogic=0;
175 fUseNames=0;
176 fUseNtk=0;
177 fAstroDa=-1;
178 fAstroDt=-1;
179 fAstroDir=0;
180
181 for (Int_t i=0; i<=8; i=i+2)
182 {
183 fEventTracks[i]=0;
184 fEventTracks[i+1]=-1;
185 if (i<=4)
186 {
187 fTrackMomenta[i]=0;
188 fTrackMomenta[i+1]=-1;
189 fTrackEnergies[i]=0;
190 fTrackEnergies[i+1]=-1;
191 fEventMomenta[i]=0;
192 fEventMomenta[i+1]=-1;
193 fEventEnergies[i]=0;
194 fEventEnergies[i+1]=-1;
195 }
196 if (i<=2)
197 {
198 fTrackRapidities[i]=0;
199 fTrackRapidities[i+1]=-1;
200 }
201 if (i==0)
202 {
203 fTrackMasses[i]=0;
204 fTrackMasses[i+1]=-1;
205 fEventMasses[i]=0;
206 fEventMasses[i+1]=-1;
207 fTrackCharges[i]=0;
208 fTrackCharges[i+1]=-1;
209 fEventCharges[i]=0;
210 fEventCharges[i+1]=-1;
211 fEventVetos[i]=0;
212 fEventVetos[i+1]=-1;
213 fTrackDevices[i]=0;
214 fTrackDevices[i+1]=-1;
215 fEventDevices[i]=0;
216 fEventDevices[i+1]=-1;
217 }
218 }
221 fEventTrkName="";
222}
223
225{
231
232 if (fParams)
233 {
234 delete fParams;
235 fParams=0;
236 }
237
238 if (fUseNames)
239 {
240 delete fUseNames;
241 fUseNames=0;
242 }
243 if (fUseNtk)
244 {
245 delete fUseNtk;
246 fUseNtk=0;
247 }
248}
249
251{
257
258 fFirst=1;
259 fEvt=0;
260 fParams=new NcDevice(*(q.fParams));
265 fLogic=q.fLogic;
269
270 for (Int_t i=0; i<10; i++)
271 {
273
274 if (i<6)
275 {
280 }
281
282 if (i<4) fTrackRapidities[i]=q.fTrackRapidities[i];
283
284 if (i<2)
285 {
290 fEventVetos[i]=q.fEventVetos[i];
293 }
294 }
298}
299
300void NcEventSelector::SetSelector(TString type,Int_t flag)
301{
332
333 if (type=="track") fTrackflag=flag;
334 if (type=="event") fEventflag=flag;
335 if (type=="astro") fAstroflag=flag;
336}
337
339{
352
353 if (type=="and") fLogic=1;
354 if (type=="or") fLogic=2;
355 if (type=="nand") fLogic=-1;
356 if (type=="nor") fLogic=-2;
357}
358
359void NcEventSelector::UseTracks(TString name,Int_t n)
360{
388
389 if (!fUseNames)
390 {
391 fUseNames=new TObjArray();
392 fUseNames->SetOwner();
393 }
394
395 if (!fUseNtk) fUseNtk=new TArrayI();
396
397 // Check if this classname has already been specified before
398 TString s;
399 Int_t nen=fUseNames->GetEntries();
400 for (Int_t i=0; i<nen; i++)
401 {
402 TObjString* sx=(TObjString*)fUseNames->At(i);
403 if (!sx) continue;
404 s=sx->GetString();
405 if (s==name) return;
406 }
407
408 // New name to be added into the storage
409 if (nen >= fUseNames->GetSize()) fUseNames->Expand(nen+1);
410 if (nen >= fUseNtk->GetSize()) fUseNtk->Set(nen+1);
411
412 TObjString* namex=new TObjString();
413 namex->SetString(name);
414 fUseNames->Add(namex);
415 fUseNtk->AddAt(n,nen);
416}
417
418void NcEventSelector::SetAstroMatch(Double_t da,Double_t dt,TString dir)
419{
430
431 fAstroDa=fabs(da);
432 fAstroDt=fabs(dt);
433 fAstroDir=0;
434 if (dir=="to") fAstroDir=1;
435 if (dir=="from") fAstroDir=-1;
436
437 if (!fParams) fParams=new NcDevice();
438
439 fParams->AddNamedSlot("AstroDa");
440 fParams->AddNamedSlot("AstroDt");
441 fParams->AddNamedSlot("AstroDir");
442 fParams->SetSignal(fAstroDa,"AstroDa");
443 fParams->SetSignal(fAstroDt,"AstroDt");
444 fParams->SetSignal(fAstroDir,"AstroDir");
445}
446
447void NcEventSelector::SetRange(TString type,TString obs,Double_t low,Double_t up)
448{
477
478 if (!fParams) fParams=new NcDevice();
479
480 if (type=="track") // Individual track observables
481 {
482 if (obs=="p")
483 {
484 fTrackMomenta[0]=low;
485 fTrackMomenta[1]=up;
486 fParams->AddNamedSlot("TrackMinP");
487 fParams->AddNamedSlot("TrackMaxP");
488 fParams->SetSignal(low,"TrackMinP");
489 fParams->SetSignal(up,"TrackMaxP");
490 }
491 if (obs=="pt")
492 {
493 fTrackMomenta[2]=low;
494 fTrackMomenta[3]=up;
495 fParams->AddNamedSlot("TrackMinPt");
496 fParams->AddNamedSlot("TrackMaxPt");
497 fParams->SetSignal(low,"TrackMinPt");
498 fParams->SetSignal(up,"TrackMaxPt");
499 }
500 if (obs=="pl")
501 {
502 fTrackMomenta[4]=low;
503 fTrackMomenta[5]=up;
504 fParams->AddNamedSlot("TrackMinPl");
505 fParams->AddNamedSlot("TrackMaxPl");
506 fParams->SetSignal(low,"TrackMinPl");
507 fParams->SetSignal(up,"TrackMaxPl");
508 }
509 if (obs=="e")
510 {
511 fTrackEnergies[0]=low;
512 fTrackEnergies[1]=up;
513 fParams->AddNamedSlot("TrackMinE");
514 fParams->AddNamedSlot("TrackMaxE");
515 fParams->SetSignal(low,"TrackMinE");
516 fParams->SetSignal(up,"TrackMaxE");
517 }
518 if (obs=="et")
519 {
520 fTrackEnergies[2]=low;
521 fTrackEnergies[3]=up;
522 fParams->AddNamedSlot("TrackMinEt");
523 fParams->AddNamedSlot("TrackMaxEt");
524 fParams->SetSignal(low,"TrackMinEt");
525 fParams->SetSignal(up,"TrackMaxEt");
526 }
527 if (obs=="el")
528 {
529 fTrackEnergies[4]=low;
530 fTrackEnergies[5]=up;
531 fParams->AddNamedSlot("TrackMinEl");
532 fParams->AddNamedSlot("TrackMaxEl");
533 fParams->SetSignal(low,"TrackMinEl");
534 fParams->SetSignal(up,"TrackMaxEl");
535 }
536 if (obs=="m")
537 {
538 fTrackMasses[0]=low;
539 fTrackMasses[1]=up;
540 fParams->AddNamedSlot("TrackMinM");
541 fParams->AddNamedSlot("TrackMaxM");
542 fParams->SetSignal(low,"TrackMinM");
543 fParams->SetSignal(up,"TrackMaxM");
544 }
545 if (obs=="q")
546 {
547 fTrackCharges[0]=low;
548 fTrackCharges[1]=up;
549 fParams->AddNamedSlot("TrackMinQ");
550 fParams->AddNamedSlot("TrackMaxQ");
551 fParams->SetSignal(low,"TrackMinQ");
552 fParams->SetSignal(up,"TrackMaxQ");
553 }
554 if (obs=="y")
555 {
556 fTrackRapidities[0]=low;
557 fTrackRapidities[1]=up;
558 fParams->AddNamedSlot("TrackMinY");
559 fParams->AddNamedSlot("TrackMaxY");
560 fParams->SetSignal(low,"TrackMinY");
561 fParams->SetSignal(up,"TrackMaxY");
562 }
563 if (obs=="eta")
564 {
565 fTrackRapidities[2]=low;
566 fTrackRapidities[3]=up;
567 fParams->AddNamedSlot("TrackMinEta");
568 fParams->AddNamedSlot("TrackMaxEta");
569 fParams->SetSignal(low,"TrackMinEta");
570 fParams->SetSignal(up,"TrackMaxEta");
571 }
572 }
573
574 if (type=="event") // Total event observables
575 {
576 if (obs=="p")
577 {
578 fEventMomenta[0]=low;
579 fEventMomenta[1]=up;
580 fParams->AddNamedSlot("EventMinP");
581 fParams->AddNamedSlot("EventMaxP");
582 fParams->SetSignal(low,"EventMinP");
583 fParams->SetSignal(up,"EventMaxP");
584 }
585 if (obs=="pt")
586 {
587 fEventMomenta[2]=low;
588 fEventMomenta[3]=up;
589 fParams->AddNamedSlot("EventMinPt");
590 fParams->AddNamedSlot("EventMaxPt");
591 fParams->SetSignal(low,"EventMinPt");
592 fParams->SetSignal(up,"EventMaxPt");
593 }
594 if (obs=="pl")
595 {
596 fEventMomenta[4]=low;
597 fEventMomenta[5]=up;
598 fParams->AddNamedSlot("EventMinPl");
599 fParams->AddNamedSlot("EventMaxPl");
600 fParams->SetSignal(low,"EventMinPl");
601 fParams->SetSignal(up,"EventMaxPl");
602 }
603 if (obs=="e")
604 {
605 fEventEnergies[0]=low;
606 fEventEnergies[1]=up;
607 fParams->AddNamedSlot("EventMinE");
608 fParams->AddNamedSlot("EventMaxE");
609 fParams->SetSignal(low,"EventMinE");
610 fParams->SetSignal(up,"EventMaxE");
611 }
612 if (obs=="et")
613 {
614 fEventEnergies[2]=low;
615 fEventEnergies[3]=up;
616 fParams->AddNamedSlot("EventMinEt");
617 fParams->AddNamedSlot("EventMaxEt");
618 fParams->SetSignal(low,"EventMinEt");
619 fParams->SetSignal(up,"EventMaxEt");
620 }
621 if (obs=="el")
622 {
623 fEventEnergies[4]=low;
624 fEventEnergies[5]=up;
625 fParams->AddNamedSlot("EventMinEl");
626 fParams->AddNamedSlot("EventMaxEl");
627 fParams->SetSignal(low,"EventMinEl");
628 fParams->SetSignal(up,"EventMaxEl");
629 }
630 if (obs=="m")
631 {
632 fEventMasses[0]=low;
633 fEventMasses[1]=up;
634 fParams->AddNamedSlot("EventMinM");
635 fParams->AddNamedSlot("EventMaxM");
636 fParams->SetSignal(low,"EventMinM");
637 fParams->SetSignal(up,"EventMaxM");
638 }
639 if (obs=="q")
640 {
641 fEventCharges[0]=low;
642 fEventCharges[1]=up;
643 fParams->AddNamedSlot("EventMinQ");
644 fParams->AddNamedSlot("EventMaxQ");
645 fParams->SetSignal(low,"EventMinQ");
646 fParams->SetSignal(up,"EventMaxQ");
647 }
648 if (obs=="veto")
649 {
650 fEventVetos[0]=low;
651 fEventVetos[1]=up;
652 fParams->AddNamedSlot("EventMinVetoLevel");
653 fParams->AddNamedSlot("EventMaxVetoLevel");
654 fParams->SetSignal(low,"EventMinVetoLevel");
655 fParams->SetSignal(up,"EventMaxVetoLevel");
656 }
657 }
658}
659
660void NcEventSelector::SetRange(TString type,TString obs,TString name,Int_t nlow,Int_t nup)
661{
689
690 if (!fParams) fParams=new NcDevice();
691
692 if (type=="track") // Individual track observables
693 {
694 if (obs=="ndev")
695 {
696 fTrackDevices[0]=nlow;
697 fTrackDevices[1]=nup;
698 fTrackDevClass=name;
699 fParams->AddNamedSlot("TrackMinNdev");
700 fParams->AddNamedSlot("TrackMaxNdev");
701 fParams->SetSignal(float(nlow),"TrackMinNdev");
702 fParams->SetSignal(float(nup),"TrackMaxNdev");
703 }
704 }
705
706 if (type=="event") // Total event observables
707 {
708 if (obs=="ndev")
709 {
710 fEventDevices[0]=nlow;
711 fEventDevices[1]=nup;
712 fEventDevClass=name;
713 fParams->AddNamedSlot("EventMinNdev");
714 fParams->AddNamedSlot("EventMaxNdev");
715 fParams->SetSignal(float(nlow),"EventMinNdev");
716 fParams->SetSignal(float(nup),"EventMaxNdev");
717 }
718 if (obs=="ntrk")
719 {
720 fEventTracks[0]=nlow;
721 fEventTracks[1]=nup;
722 fEventTrkName=name;
723 fParams->AddNamedSlot("EventMinNtrk");
724 fParams->AddNamedSlot("EventMaxNtrk");
725 fParams->SetSignal(float(nlow),"EventMinNtrk");
726 fParams->SetSignal(float(nup),"EventMaxNtrk");
727 }
728 if (obs=="ntkc")
729 {
730 fEventTracks[2]=nlow;
731 fEventTracks[3]=nup;
732 fParams->AddNamedSlot("EventMinNtkc");
733 fParams->AddNamedSlot("EventMaxNtkc");
734 fParams->SetSignal(float(nlow),"EventMinNtkc");
735 fParams->SetSignal(float(nup),"EventMaxNtkc");
736 }
737 if (obs=="ntk0")
738 {
739 fEventTracks[4]=nlow;
740 fEventTracks[5]=nup;
741 fParams->AddNamedSlot("EventMinNtk0");
742 fParams->AddNamedSlot("EventMaxNtk0");
743 fParams->SetSignal(float(nlow),"EventMinNtk0");
744 fParams->SetSignal(float(nup),"EventMaxNtk0");
745 }
746 if (obs=="ntk+")
747 {
748 fEventTracks[6]=nlow;
749 fEventTracks[7]=nup;
750 fParams->AddNamedSlot("EventMinNtk+");
751 fParams->AddNamedSlot("EventMaxNtk+");
752 fParams->SetSignal(float(nlow),"EventMinNtk+");
753 fParams->SetSignal(float(nup),"EventMaxNtk+");
754 }
755 if (obs=="ntk-")
756 {
757 fEventTracks[8]=nlow;
758 fEventTracks[9]=nup;
759 fParams->AddNamedSlot("EventMinNtk-");
760 fParams->AddNamedSlot("EventMaxNtk-");
761 fParams->SetSignal(float(nlow),"EventMinNtk-");
762 fParams->SetSignal(float(nup),"EventMaxNtk-");
763 }
764 }
765}
766
767void NcEventSelector::Exec(Option_t* opt)
768{
774
775 TString name=opt;
776 NcJob* parent=(NcJob*)(gROOT->GetListOfTasks()->FindObject(name.Data()));
777
778 if (!parent) return;
779
780 fEvt=(NcEvent*)parent->GetObject("NcEvent");
781 if (!fEvt) return;
782
783 Int_t ntkmax=0; // Max. number of tracks for a certain name
784 Int_t nnames=0; // Number of track names to be processed
785 if (fUseNames) nnames=fUseNames->GetEntries();
786 TObjString* strx=0;
787 TString str;
788
789 if (fFirst)
790 {
791 cout << " *NcEventSelector* Selection parameters." << endl;
792 cout << " Selection types in use :";
793 if (fTrackflag) cout << " track";
794 if (fEventflag) cout << " event";
795 if (fAstroflag) cout << " astro";
796 if (!fTrackflag && !fEventflag && !fAstroflag) cout << " none";
797 cout << endl;
798 cout << " Selection logic in use :";
799 if (fLogic==1) cout << " and";
800 if (fLogic==2) cout << " or";
801 if (fLogic==-1) cout << " nand";
802 if (fLogic==-2) cout << " nor";
803 if (!fLogic) cout << " unknown";
804 cout << endl;
805 if (nnames) cout << " Track name selections to be processed (-1=all)." << endl;
806 for (Int_t i=0; i<nnames; i++)
807 {
808 strx=(TObjString*)fUseNames->At(i);
809 if (!strx) continue;
810 str=strx->GetString();
811 ntkmax=fUseNtk->At(i);
812 cout << " Maximally " << ntkmax << " track(s) per event of name : " << str.Data() << endl;
813 }
814 cout << endl;
815
816 fFirst=0;
817 }
818
819 // Storage of the used parameters in the NcEventSelector device
820 if (!fParams) fParams=new NcDevice();
821 fParams->SetNameTitle("NcEventSelector","NcEventSelector processor parameters");
822
823 fSelect=0;
824 if (fLogic)
825 {
826 if (fEventflag) Event(); // Check criteria for total event observables
827 if (fTrackflag) Track(0); // Check criteria for total track observables
828 if (fAstroflag) Astro(); // Check for matches with external objects
829 }
830
831 if (fLogic<0) fSelect*=-1; // In case of "nand"/"nor" logic
832
833 fParams->AddNamedSlot("Logic");
834 fParams->SetSignal(float(fLogic),"Logic");
835 fParams->AddNamedSlot("Eventflag");
836 fParams->SetSignal(float(fEventflag),"Eventflag");
837 fParams->AddNamedSlot("Trackflag");
838 fParams->SetSignal(float(fTrackflag),"Trackflag");
839 fParams->AddNamedSlot("Astroflag");
840 fParams->SetSignal(float(fAstroflag),"Astroflag");
841 fParams->AddNamedSlot("Select");
842 fParams->SetSignal(float(fSelect),"Select");
843
844 NcDevice* dx=(NcDevice*)fEvt->GetDevice("NcEventSelector");
845 if (dx) fEvt->RemoveDevice(dx);
846 fEvt->AddDevice(fParams);
847
848 fEvt->SetSelectLevel(fSelect);
849}
850
852{
862
863 if (abs(fLogic)==1) fSelect=0; // Selections are made in logical "(n)and"
864
865 if (fSelect>0) return; // Event is already flagged as select
866
867 if (!fUseNames) return;
868
869 if (mode==1 && !fAstroDir) return;
870
871 Int_t nnames=fUseNames->GetEntries(); // Number of track names to be processed
872 Int_t ntkmax=0; // Max. number of tracks for a certain name
873 TObjString* strx=0;
874 TString str;
875 Int_t ntk;
876
877 NcTrack* track=0;
878 NcTimestamp* ts=0;
879 Nc3Vector p;
880 TObjArray* tracks=0;
881 Double_t val;
882 Int_t ival;
883 for (Int_t i=0; i<nnames; i++) // Loop over selected track names
884 {
885 strx=(TObjString*)fUseNames->At(i);
886 if (!strx) continue;
887 str=strx->GetString();
888 ntkmax=fUseNtk->At(i);
889 if (str=="*")
890 {
891 tracks=fEvt->GetTracks();
892 }
893 else
894 {
895 tracks=fEvt->GetTracks(str);
896 }
897 ntk=0;
898 if (tracks) ntk=tracks->GetEntries();
899 if (ntkmax>0 && ntk>ntkmax) ntk=ntkmax;
900
901 for (Int_t jtk=0; jtk<ntk; jtk++) // Loop over tracks of a certain name
902 {
903 track=(NcTrack*)tracks->At(jtk);
904 if (!track) continue;
905
906 if (!mode) // Check track observables
907 {
908 if (fTrackMomenta[1]>=fTrackMomenta[0]) // Selection on P
909 {
910 if (abs(fLogic)==1) fSelect=-1; // Selections are made in logical "(n)and"
911 val=track->GetMomentum(1);
912 if (val>=fTrackMomenta[0] && val<=fTrackMomenta[1])
913 {
914 fSelect=1;
915 if (abs(fLogic)==2) return; // Selections are made in logical "(n)or"
916 }
917 }
918 if (fTrackMomenta[3]>=fTrackMomenta[2]) // Selection on Pt
919 {
920 if (abs(fLogic)==1) fSelect=-1; // Selections are made in logical "(n)and"
921 val=track->GetPt(1);
922 if (val>=fTrackMomenta[2] && val<=fTrackMomenta[3])
923 {
924 fSelect=1;
925 if (abs(fLogic)==2) return; // Selections are made in logical "(n)or"
926 }
927 }
928 if (fTrackMomenta[5]>=fTrackMomenta[4]) // Selection on Pl
929 {
930 if (abs(fLogic)==1) fSelect=-1; // Selections are made in logical "(n)and"
931 val=track->GetPl(1);
932 if (val>=fTrackMomenta[4] && val<=fTrackMomenta[5])
933 {
934 fSelect=1;
935 if (abs(fLogic)==2) return; // Selections are made in logical "(n)or"
936 }
937 }
938 if (fTrackEnergies[1]>=fTrackEnergies[0]) // Selection on E
939 {
940 if (abs(fLogic)==1) fSelect=-1; // Selections are made in logical "(n)and"
941 val=track->GetEnergy(1);
942 if (val>=fTrackEnergies[0] && val<=fTrackEnergies[1])
943 {
944 fSelect=1;
945 if (abs(fLogic)==2) return; // Selections are made in logical "(n)or"
946 }
947 }
948 if (fTrackEnergies[3]>=fTrackEnergies[2]) // Selection on Et
949 {
950 if (abs(fLogic)==1) fSelect=-1; // Selections are made in logical "(n)and"
951 val=track->GetEt(1);
952 if (val>=fTrackEnergies[2] && val<=fTrackEnergies[3])
953 {
954 fSelect=1;
955 if (abs(fLogic)==2) return; // Selections are made in logical "(n)or"
956 }
957 }
958 if (fTrackEnergies[5]>=fTrackEnergies[4]) // Selection on El
959 {
960 if (abs(fLogic)==1) fSelect=-1; // Selections are made in logical "(n)and"
961 val=track->GetEl(1);
962 if (val>=fTrackEnergies[4] && val<=fTrackEnergies[5])
963 {
964 fSelect=1;
965 if (abs(fLogic)==2) return; // Selections are made in logical "(n)or"
966 }
967 }
968 if (fTrackMasses[1]>=fTrackMasses[0]) // Selection on M
969 {
970 if (abs(fLogic)==1) fSelect=-1; // Selections are made in logical "(n)and"
971 val=track->GetMass(1);
972 if (val>=fTrackMasses[0] && val<=fTrackMasses[1])
973 {
974 fSelect=1;
975 if (abs(fLogic)==2) return; // Selections are made in logical "(n)or"
976 }
977 }
978 if (fTrackCharges[1]>=fTrackCharges[0]) // Selection on Q
979 {
980 if (abs(fLogic)==1) fSelect=-1; // Selections are made in logical "(n)and"
981 val=track->GetCharge();
982 if (val>=fTrackCharges[0] && val<=fTrackCharges[1])
983 {
984 fSelect=1;
985 if (abs(fLogic)==2) return; // Selections are made in logical "(n)or"
986 }
987 }
988 if (fTrackRapidities[1]>=fTrackRapidities[0]) // Selection on Y
989 {
990 if (abs(fLogic)==1) fSelect=-1; // Selections are made in logical "(n)and"
991 val=track->GetRapidity();
992 if (val>=fTrackRapidities[0] && val<=fTrackRapidities[1])
993 {
994 fSelect=1;
995 if (abs(fLogic)==2) return; // Selections are made in logical "(n)or"
996 }
997 }
998 if (fTrackRapidities[3]>=fTrackRapidities[2]) // Selection on Eta
999 {
1000 if (abs(fLogic)==1) fSelect=-1; // Selections are made in logical "(n)and"
1001 val=track->GetPseudoRapidity();
1002 if (val>=fTrackRapidities[2] && val<=fTrackRapidities[3])
1003 {
1004 fSelect=1;
1005 if (abs(fLogic)==2) return; // Selections are made in logical "(n)or"
1006 }
1007 }
1008 if (fTrackDevices[1]>=fTrackDevices[0]) // Selection on Ndev
1009 {
1010 if (abs(fLogic)==1) fSelect=-1; // Selections are made in logical "(n)and"
1011 ival=track->GetNsignals(fTrackDevClass.Data());
1012 if (ival>=fTrackDevices[0] && ival<=fTrackDevices[1])
1013 {
1014 fSelect=1;
1015 if (abs(fLogic)==2) return; // Selections are made in logical "(n)or"
1016 }
1017 }
1018 }
1019 if (mode==1) // Check track direction w.r.t. external (astrophysical) objects
1020 {
1021 p=track->Get3Momentum();
1022 if (fAstroDir<0) p*=-1;
1023 ts=track->GetTimestamp();
1024 if (!ts) ts=(NcTimestamp*)fEvt;
1025
1026 SetSignal(&p,"loc","T",ts,0,"Track",1);
1027 TArrayI* arr=MatchRefSignal(fAstroDa,"deg",fAstroDt,"s");
1028 if (arr)
1029 {
1030 fSelect=1;
1031 return;
1032 }
1033 }
1034 } // End of loop over tracks of a certain name
1035 } // End of loop over selected track names
1036}
1037
1039{
1045
1046 if (abs(fLogic)==1) fSelect=0; // Selections are made in logical "(n)and"
1047
1048 if (fSelect>0) return; // Event is already flagged as select
1049
1050 Double_t val=0;
1051 Int_t ival=0;
1052 if (fEventMomenta[1]>=fEventMomenta[0]) // Selection on P
1053 {
1054 if (abs(fLogic)==1) fSelect=-1; // Selections are made in logical "(n)and"
1055 val=fEvt->GetMomentum(1);
1056 if (val>=fEventMomenta[0] && val<=fEventMomenta[1])
1057 {
1058 fSelect=1;
1059 if (abs(fLogic)==2) return; // Selections are made in logical "(n)or"
1060 }
1061 }
1062 if (fEventMomenta[3]>=fEventMomenta[2]) // Selection on Pt
1063 {
1064 if (abs(fLogic)==1) fSelect=-1; // Selections are made in logical "(n)and"
1065 val=fEvt->GetPt(1);
1066 if (val>=fEventMomenta[2] && val<=fEventMomenta[3])
1067 {
1068 fSelect=1;
1069 if (abs(fLogic)==2) return; // Selections are made in logical "(n)or"
1070 }
1071 }
1072 if (fEventMomenta[5]>=fEventMomenta[4]) // Selection on Pl
1073 {
1074 if (abs(fLogic)==1) fSelect=-1; // Selections are made in logical "(n)and"
1075 val=fEvt->GetPl(1);
1076 if (val>=fEventMomenta[4] && val<=fEventMomenta[5])
1077 {
1078 fSelect=1;
1079 if (abs(fLogic)==2) return; // Selections are made in logical "(n)or"
1080 }
1081 }
1082 if (fEventEnergies[1]>=fEventEnergies[0]) // Selection on E
1083 {
1084 if (abs(fLogic)==1) fSelect=-1; // Selections are made in logical "(n)and"
1085 val=fEvt->GetEnergy(1);
1086 if (val>=fEventEnergies[0] && val<=fEventEnergies[1])
1087 {
1088 fSelect=1;
1089 if (abs(fLogic)==2) return; // Selections are made in logical "(n)or"
1090 }
1091 }
1092 if (fEventEnergies[3]>=fEventEnergies[2]) // Selection on Et
1093 {
1094 if (abs(fLogic)==1) fSelect=-1; // Selections are made in logical "(n)and"
1095 val=fEvt->GetEt(1);
1096 if (val>=fEventEnergies[2] && val<=fEventEnergies[3])
1097 {
1098 fSelect=1;
1099 if (abs(fLogic)==2) return; // Selections are made in logical "(n)or"
1100 }
1101 }
1102 if (fEventEnergies[5]>=fEventEnergies[4]) // Selection on El
1103 {
1104 if (abs(fLogic)==1) fSelect=-1; // Selections are made in logical "(n)and"
1105 val=fEvt->GetEl(1);
1106 if (val>=fEventEnergies[4] && val<=fEventEnergies[5])
1107 {
1108 fSelect=1;
1109 if (abs(fLogic)==2) return; // Selections are made in logical "(n)or"
1110 }
1111 }
1112 if (fEventMasses[1]>=fEventMasses[0]) // Selection on Minv
1113 {
1114 if (abs(fLogic)==1) fSelect=-1; // Selections are made in logical "(n)and"
1115 val=fEvt->GetInvmass(1);
1116 if (val>=fEventMasses[0] && val<=fEventMasses[1])
1117 {
1118 fSelect=1;
1119 if (abs(fLogic)==2) return; // Selections are made in logical "(n)or"
1120 }
1121 }
1122 if (fEventCharges[1]>=fEventCharges[0]) // Selection on Q
1123 {
1124 if (abs(fLogic)==1) fSelect=-1; // Selections are made in logical "(n)and"
1125 val=fEvt->GetCharge();
1126 if (val>=fEventCharges[0] && val<=fEventCharges[1])
1127 {
1128 fSelect=1;
1129 if (abs(fLogic)==2) return; // Selections are made in logical "(n)or"
1130 }
1131 }
1132 if (fEventVetos[1]>=fEventVetos[0]) // Selection on Veto Level
1133 {
1134 if (abs(fLogic)==1) fSelect=-1; // Selections are made in logical "(n)and"
1135 NcDevice* veto=fEvt->GetDevice("NcVeto");
1136 val=0;
1137 if (veto) val=veto->GetSignal("VetoLevel");
1138 if (val>=fEventVetos[0] && val<=fEventVetos[1])
1139 {
1140 fSelect=1;
1141 if (abs(fLogic)==2) return; // Selections are made in logical "(n)or"
1142 }
1143 }
1144 if (fEventDevices[1]>=fEventDevices[0]) // Selection on Ndev
1145 {
1146 if (abs(fLogic)==1) fSelect=-1; // Selections are made in logical "(n)and"
1147 ival=fEvt->GetNdevices(fEventDevClass.Data());
1148 if (ival>=fEventDevices[0] && ival<=fEventDevices[1])
1149 {
1150 fSelect=1;
1151 if (abs(fLogic)==2) return; // Selections are made in logical "(n)or"
1152 }
1153 }
1154 if (fEventTracks[1]>=fEventTracks[0]) // Selection on Ntrk
1155 {
1156 if (abs(fLogic)==1) fSelect=-1; // Selections are made in logical "(n)and"
1157 if (fEventTrkName=="*")
1158 {
1159 ival=fEvt->GetNtracks();
1160 }
1161 else
1162 {
1163 ival=fEvt->GetNtracks(fEventTrkName);
1164 }
1165 if (ival>=fEventTracks[0] && ival<=fEventTracks[1])
1166 {
1167 fSelect=1;
1168 if (abs(fLogic)==2) return; // Selections are made in logical "(n)or"
1169 }
1170 }
1171 if (fEventTracks[3]>=fEventTracks[2]) // Selection on Ntkc
1172 {
1173 if (abs(fLogic)==1) fSelect=-1; // Selections are made in logical "(n)and"
1174 ival=fEvt->GetNtracks(0,3,0);
1175 if (ival>=fEventTracks[2] && ival<=fEventTracks[3])
1176 {
1177 fSelect=1;
1178 if (abs(fLogic)==2) return; // Selections are made in logical "(n)or"
1179 }
1180 }
1181 if (fEventTracks[5]>=fEventTracks[4]) // Selection on Ntk0
1182 {
1183 if (abs(fLogic)==1) fSelect=-1; // Selections are made in logical "(n)and"
1184 ival=fEvt->GetNtracks(0,0,0);
1185 if (ival>=fEventTracks[4] && ival<=fEventTracks[5])
1186 {
1187 fSelect=1;
1188 if (abs(fLogic)==2) return; // Selections are made in logical "(n)or"
1189 }
1190 }
1191 if (fEventTracks[7]>=fEventTracks[6]) // Selection on Ntk+
1192 {
1193 if (abs(fLogic)==1) fSelect=-1; // Selections are made in logical "(n)and"
1194 ival=fEvt->GetNtracks(0,1,0);
1195 if (ival>=fEventTracks[6] && ival<=fEventTracks[7])
1196 {
1197 fSelect=1;
1198 if (abs(fLogic)==2) return; // Selections are made in logical "(n)or"
1199 }
1200 }
1201 if (fEventTracks[9]>=fEventTracks[8]) // Selection on Ntk-
1202 {
1203 if (abs(fLogic)==1) fSelect=-1; // Selections are made in logical "(n)and"
1204 ival=fEvt->GetNtracks(0,-1,0);
1205 if (ival>=fEventTracks[8] && ival<=fEventTracks[9])
1206 {
1207 fSelect=1;
1208 if (abs(fLogic)==2) return; // Selections are made in logical "(n)or"
1209 }
1210 }
1211}
1212
1214{
1220
1221 if (abs(fLogic)==1) fSelect=0; // Selections are made in logical "(n)and"
1222
1223 if (fSelect>0) return; // Event is already flagged as select
1224
1225 // Check track directions w.r.t. external (astrophysical) objects
1226 if (fAstroflag==1)
1227 {
1228 Track(1);
1229 return;
1230 }
1231
1232 // Check total event momentum direction w.r.t. external (astrophysical) objects
1233 if (fAstroflag==2)
1234 {
1235 Nc3Vector p;
1236 p=fEvt->Get3Momentum();
1237 if (fAstroDir<0) p*=-1;
1238 SetSignal(&p,"loc","T",(NcTimestamp*)fEvt,0,"Event",1);
1239 TArrayI* arr=MatchRefSignal(fAstroDa,"deg",fAstroDt,"s");
1240 if (arr && fLogic) fSelect=1;
1241 return;
1242 }
1243
1244 // Check event position w.r.t. external (astrophysical) objects
1245 if (fAstroflag==3)
1246 {
1247 SetSignal((Nc3Vector*)fEvt,"loc","T",(NcTimestamp*)fEvt,0,"Event",1);
1248 TArrayI* arr=MatchRefSignal(fAstroDa,"deg",fAstroDt,"s");
1249 if (arr && fLogic) fSelect=1;
1250 return;
1251 }
1252}
1253
1254TObject* NcEventSelector::Clone(const char* name) const
1255{
1264
1265 NcEventSelector* sel=new NcEventSelector(*this);
1266 if (name)
1267 {
1268 if (strlen(name)) sel->SetName(name);
1269 }
1270 return sel;
1271}
1272
ClassImp(NcEventSelector)
Handling of 3-vectors in various reference frames.
Definition Nc3Vector.h:15
Double_t GetPseudoRapidity()
NcAstrolab(const char *name="User", const char *title="Virtual Lab for general use")
TArrayI * MatchRefSignal(Double_t da, TString au, Double_t dt, TString tu, Int_t mode=1)
NcSignal * SetSignal(Double_t d, Double_t a, TString au, Double_t b, TString bu, TString frame, NcTimestamp *ts, Int_t jref, TString mode="T", TString name="", Int_t type=0)
Signal (Hit) handling of a generic device.
Definition NcDevice.h:14
Creation and investigation of an NCFS generic event structure.
Definition NcEvent.h:15
TTask derived class to perform generic event selection.
Float_t fTrackMasses[2]
Double_t fTrackEnergies[6]
NcEventSelector(const char *name="NcEventSelector", const char *title="Event selection")
void SetLogic(TString type)
void Track(Int_t mode)
TObjArray * fUseNames
void SetAstroMatch(Double_t da, Double_t dt, TString dir)
Double_t fEventEnergies[6]
virtual void Exec(Option_t *opt)
Double_t fTrackRapidities[4]
Double_t fTrackMomenta[6]
Float_t fEventCharges[2]
Double_t fEventMomenta[6]
Float_t fEventMasses[2]
Float_t fEventVetos[2]
Int_t fEventTracks[10]
Float_t fTrackCharges[2]
void SetRange(TString type, TString obs, Double_t low, Double_t up)
virtual TObject * Clone(const char *name="") const
void SetSelector(TString type, Int_t flag=1)
void UseTracks(TString name, Int_t n=-1)
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
virtual Float_t GetSignal(Int_t j=1, Int_t mode=0) const
Definition NcSignal.cxx:651
Handling of the attributes of a reconstructed particle track.
Definition NcTrack.h:19
Double_t GetEt(Float_t scale=-1)
Definition NcTrack.cxx:1586
Double_t GetRapidity()
Definition NcTrack.cxx:1670
NcTimestamp * GetTimestamp()
Definition NcTrack.cxx:1985
Double_t GetPl(Float_t scale=-1)
Definition NcTrack.cxx:1552
Int_t GetNsignals() const
Definition NcTrack.cxx:970
Double_t GetEl(Float_t scale=-1)
Definition NcTrack.cxx:1611
Double_t GetEnergy(Float_t scale=-1)
Definition NcTrack.cxx:721
Double_t GetMass(Float_t scale=-1)
Definition NcTrack.cxx:671
Nc3Vector Get3Momentum(Float_t scale=-1) const
Definition NcTrack.cxx:652
Float_t GetCharge() const
Definition NcTrack.cxx:710
Double_t GetPt(Float_t scale=-1)
Definition NcTrack.cxx:1524
Double_t GetMomentum(Float_t scale=-1)
Definition NcTrack.cxx:627