ROOT logo
using namespace std;
//*-- Author : Stefano Spataro

//_HADES_CLASS_DESCRIPTION
///////////////////////////////////////////////
// HLvl1EvtFilter
// Emulator of first level trigger.
// How to use it:
//
// HTaskSet *evtfilter = new HTaskSet("","");
// HLvl1EvtFilter *evtflt = new HLvl1EvtFilter("eventfilter","eventfilter",options,multMeta,multTtof);
// evtfilter->connect(evtflt);
// masterTaskSet->add(evtflt);
//
// where options stays for:
// "metamult"   ->  META multiplicity   >= multMeta
// "tofmult"    ->  TOF multiplicity    >= multTof
// "opsec"  ->  Opposite sectors in META
// "sim"        ->  Simulation mode ON

#include "hlvl1evtfilter.h"
#include "hlinearcategory.h"
#include "hmatrixcategory.h"
#include "hevent.h"
#include "hcategory.h"
#include "hiterator.h"
#include "hades.h"
#include "htofraw.h"
#include "tofdef.h"
#include "TFile.h"
#include <iostream>

ClassImp(HLvl1EvtFilter)
    HLvl1EvtFilter::HLvl1EvtFilter(const Text_t *name,const Text_t *title,TString opt,Int_t multMeta, Int_t multTof)
    : HReconstructor(name,title)
{
    // constructor  options:
    // "metamult"   ->  META multiplicity   >= multMeta
    // "tofmult"    ->  TOF multiplicity    >= multTof
    // "opsec"      ->  Opposite sectors in META
    // "sim"        ->  Simulation mode ON

    nMetaMult = 0;
    nTofMult = 0;
    kOpSec = kFALSE;
    isSimulation = kFALSE;
    fTofIter = NULL;
    fTofRaw  = NULL;

    if ((opt.Contains("metamult"))   && (multMeta!=0))   nMetaMult=multMeta;
    if ((opt.Contains("tofmult"))    && (multTof!=0))    nTofMult=multTof;
    if  (opt.Contains("opsec"))      kOpSec = kTRUE;
    if  (opt.Contains("sim"))        isSimulation = kTRUE;

} // end of constructor

HLvl1EvtFilter::HLvl1EvtFilter()
{
    // Default constructor

    nMetaMult = 0;
    nTofMult = 0;
    kOpSec = kFALSE;
    isSimulation = kFALSE;
    fTofIter = NULL;
    fTofRaw  = NULL;

}


HLvl1EvtFilter::~HLvl1EvtFilter(void) {
    // destructor
}

Bool_t HLvl1EvtFilter::init() {
    // initialization function

    if (gHades) {
	HEvent *event=gHades->getCurrentEvent();
	if (event) {

	    fTofRaw=event->getCategory(catTofRaw);
	    if (!fTofRaw) {
		Error("init","No TOF input");
		return kFALSE;
	    }
	    fTofIter=(HIterator *)fTofRaw->MakeIterator();

	} // end of event && rtdb condition
    } // end of gHades

    cout << " HLvl1EvtFilter: *** 1st level trigger event filter initialization ***" << endl;
    cout << " META >= " << nMetaMult << "\tTOF >= " << nTofMult<< "\t Opposite sector " << kOpSec << "\t Simulation: "<< isSimulation << endl;

    resetCounters();

    return kTRUE;
} // end of initialization

Bool_t HLvl1EvtFilter::finalize()
{
    // Finalize: write number of rejected events
    cout<<"Number of rejected evts: "<<nCounterNbRejectedEvts<<endl;
    cout<<"Number of remaining evts: "<<nCntProcessedEvents-nCounterNbRejectedEvts<<endl;
    cout<<"Percentage of rejected evts: "<<(((Float_t)nCounterNbRejectedEvts)/((Float_t)nCntProcessedEvents))*100<<"%"<<endl;

    return kTRUE;

}

Int_t HLvl1EvtFilter::execute()
{
    // Execute function: refer to isFilteredEvt(swt) for filter options
    nCntProcessedEvents++;

    Int_t kReturnValue=0;

    if (isFilteredEvt())
    {
	nCounterNbRejectedEvts++;
	kReturnValue = kSkipEvent;
    }

    return kReturnValue;
}

void HLvl1EvtFilter::resetCounters()
{
    // Reset counters of processed and rejected events

    nCntProcessedEvents=0;
    nCounterNbRejectedEvts=0;
}

Bool_t HLvl1EvtFilter::isFilteredEvt()
{
    // if function returns kTRUE evt is skipped

    Int_t TofLeftMult[6] = {0,0,0,0,0,0};
    Int_t TofRightMult[6] = {0,0,0,0,0,0};
    Bool_t MetaMult[6]   = {kFALSE,kFALSE,kFALSE,kFALSE,kFALSE,kFALSE};
    Int_t tofraw_count = 0,  meta_mult = 0, tof_mult = 0;
    Bool_t opposite_sector = kFALSE;
    Bool_t kSwitch = kFALSE;


    if(!fTofIter ) return kSwitch;
    HTofRaw *TofRaw = 0;

    fTofIter->Reset();
    while ((TofRaw=(HTofRaw *)fTofIter->Next()) != 0) // start TofRaw Loop
    {
	if (TofRaw->getRightTime()>0.)
	{
	    TofRightMult[(Int_t)TofRaw->getSector()]++;
	    tofraw_count++;
	}
	if (TofRaw->getLeftTime()>0.)
	{
	    TofLeftMult[(Int_t)TofRaw->getSector()]++;
	    tofraw_count++;
	}
    } // end of HTofRaw loop


    for (Int_t yyy=0; yyy<6; yyy++) MetaMult[yyy]=(((TofRightMult[yyy]+TofLeftMult[yyy])>=2));

    opposite_sector = ((MetaMult[0]&&MetaMult[3]) || (MetaMult[1]&&MetaMult[4]) || (MetaMult[2]&&MetaMult[5]));
    meta_mult = int(tofraw_count/2);
    tof_mult = int(tofraw_count/2);

    if ((meta_mult<nMetaMult) || (tof_mult<nTofMult) || (!opposite_sector&&kOpSec))
	kSwitch = kTRUE; // if at least one condition is not fulfilled, turn on skip flag

    return kSwitch;
}

 hlvl1evtfilter.cc:1
 hlvl1evtfilter.cc:2
 hlvl1evtfilter.cc:3
 hlvl1evtfilter.cc:4
 hlvl1evtfilter.cc:5
 hlvl1evtfilter.cc:6
 hlvl1evtfilter.cc:7
 hlvl1evtfilter.cc:8
 hlvl1evtfilter.cc:9
 hlvl1evtfilter.cc:10
 hlvl1evtfilter.cc:11
 hlvl1evtfilter.cc:12
 hlvl1evtfilter.cc:13
 hlvl1evtfilter.cc:14
 hlvl1evtfilter.cc:15
 hlvl1evtfilter.cc:16
 hlvl1evtfilter.cc:17
 hlvl1evtfilter.cc:18
 hlvl1evtfilter.cc:19
 hlvl1evtfilter.cc:20
 hlvl1evtfilter.cc:21
 hlvl1evtfilter.cc:22
 hlvl1evtfilter.cc:23
 hlvl1evtfilter.cc:24
 hlvl1evtfilter.cc:25
 hlvl1evtfilter.cc:26
 hlvl1evtfilter.cc:27
 hlvl1evtfilter.cc:28
 hlvl1evtfilter.cc:29
 hlvl1evtfilter.cc:30
 hlvl1evtfilter.cc:31
 hlvl1evtfilter.cc:32
 hlvl1evtfilter.cc:33
 hlvl1evtfilter.cc:34
 hlvl1evtfilter.cc:35
 hlvl1evtfilter.cc:36
 hlvl1evtfilter.cc:37
 hlvl1evtfilter.cc:38
 hlvl1evtfilter.cc:39
 hlvl1evtfilter.cc:40
 hlvl1evtfilter.cc:41
 hlvl1evtfilter.cc:42
 hlvl1evtfilter.cc:43
 hlvl1evtfilter.cc:44
 hlvl1evtfilter.cc:45
 hlvl1evtfilter.cc:46
 hlvl1evtfilter.cc:47
 hlvl1evtfilter.cc:48
 hlvl1evtfilter.cc:49
 hlvl1evtfilter.cc:50
 hlvl1evtfilter.cc:51
 hlvl1evtfilter.cc:52
 hlvl1evtfilter.cc:53
 hlvl1evtfilter.cc:54
 hlvl1evtfilter.cc:55
 hlvl1evtfilter.cc:56
 hlvl1evtfilter.cc:57
 hlvl1evtfilter.cc:58
 hlvl1evtfilter.cc:59
 hlvl1evtfilter.cc:60
 hlvl1evtfilter.cc:61
 hlvl1evtfilter.cc:62
 hlvl1evtfilter.cc:63
 hlvl1evtfilter.cc:64
 hlvl1evtfilter.cc:65
 hlvl1evtfilter.cc:66
 hlvl1evtfilter.cc:67
 hlvl1evtfilter.cc:68
 hlvl1evtfilter.cc:69
 hlvl1evtfilter.cc:70
 hlvl1evtfilter.cc:71
 hlvl1evtfilter.cc:72
 hlvl1evtfilter.cc:73
 hlvl1evtfilter.cc:74
 hlvl1evtfilter.cc:75
 hlvl1evtfilter.cc:76
 hlvl1evtfilter.cc:77
 hlvl1evtfilter.cc:78
 hlvl1evtfilter.cc:79
 hlvl1evtfilter.cc:80
 hlvl1evtfilter.cc:81
 hlvl1evtfilter.cc:82
 hlvl1evtfilter.cc:83
 hlvl1evtfilter.cc:84
 hlvl1evtfilter.cc:85
 hlvl1evtfilter.cc:86
 hlvl1evtfilter.cc:87
 hlvl1evtfilter.cc:88
 hlvl1evtfilter.cc:89
 hlvl1evtfilter.cc:90
 hlvl1evtfilter.cc:91
 hlvl1evtfilter.cc:92
 hlvl1evtfilter.cc:93
 hlvl1evtfilter.cc:94
 hlvl1evtfilter.cc:95
 hlvl1evtfilter.cc:96
 hlvl1evtfilter.cc:97
 hlvl1evtfilter.cc:98
 hlvl1evtfilter.cc:99
 hlvl1evtfilter.cc:100
 hlvl1evtfilter.cc:101
 hlvl1evtfilter.cc:102
 hlvl1evtfilter.cc:103
 hlvl1evtfilter.cc:104
 hlvl1evtfilter.cc:105
 hlvl1evtfilter.cc:106
 hlvl1evtfilter.cc:107
 hlvl1evtfilter.cc:108
 hlvl1evtfilter.cc:109
 hlvl1evtfilter.cc:110
 hlvl1evtfilter.cc:111
 hlvl1evtfilter.cc:112
 hlvl1evtfilter.cc:113
 hlvl1evtfilter.cc:114
 hlvl1evtfilter.cc:115
 hlvl1evtfilter.cc:116
 hlvl1evtfilter.cc:117
 hlvl1evtfilter.cc:118
 hlvl1evtfilter.cc:119
 hlvl1evtfilter.cc:120
 hlvl1evtfilter.cc:121
 hlvl1evtfilter.cc:122
 hlvl1evtfilter.cc:123
 hlvl1evtfilter.cc:124
 hlvl1evtfilter.cc:125
 hlvl1evtfilter.cc:126
 hlvl1evtfilter.cc:127
 hlvl1evtfilter.cc:128
 hlvl1evtfilter.cc:129
 hlvl1evtfilter.cc:130
 hlvl1evtfilter.cc:131
 hlvl1evtfilter.cc:132
 hlvl1evtfilter.cc:133
 hlvl1evtfilter.cc:134
 hlvl1evtfilter.cc:135
 hlvl1evtfilter.cc:136
 hlvl1evtfilter.cc:137
 hlvl1evtfilter.cc:138
 hlvl1evtfilter.cc:139
 hlvl1evtfilter.cc:140
 hlvl1evtfilter.cc:141
 hlvl1evtfilter.cc:142
 hlvl1evtfilter.cc:143
 hlvl1evtfilter.cc:144
 hlvl1evtfilter.cc:145
 hlvl1evtfilter.cc:146
 hlvl1evtfilter.cc:147
 hlvl1evtfilter.cc:148
 hlvl1evtfilter.cc:149
 hlvl1evtfilter.cc:150
 hlvl1evtfilter.cc:151
 hlvl1evtfilter.cc:152
 hlvl1evtfilter.cc:153
 hlvl1evtfilter.cc:154
 hlvl1evtfilter.cc:155
 hlvl1evtfilter.cc:156
 hlvl1evtfilter.cc:157
 hlvl1evtfilter.cc:158
 hlvl1evtfilter.cc:159
 hlvl1evtfilter.cc:160
 hlvl1evtfilter.cc:161
 hlvl1evtfilter.cc:162
 hlvl1evtfilter.cc:163
 hlvl1evtfilter.cc:164
 hlvl1evtfilter.cc:165
 hlvl1evtfilter.cc:166
 hlvl1evtfilter.cc:167
 hlvl1evtfilter.cc:168
 hlvl1evtfilter.cc:169
 hlvl1evtfilter.cc:170
 hlvl1evtfilter.cc:171
 hlvl1evtfilter.cc:172
 hlvl1evtfilter.cc:173
 hlvl1evtfilter.cc:174
 hlvl1evtfilter.cc:175
 hlvl1evtfilter.cc:176
 hlvl1evtfilter.cc:177