CTriggerServer.h
//-----------------------------------------------------------------------------
// $Header: /asis/offline/ceres/cool/project/RCS/CTriggerServer.h,v 3.0 1996/10/02 09:39:49 voigt Exp $
//
// COOL Program Library
// Copyright (C) CERES collaboration, 1996
//
// Declaration of class CTriggerServer.
//
//-----------------------------------------------------------------------------
#ifndef CTRIGGERSERVER_H
#define CTRIGGERSERVER_H
#include <iostream.h>
#include "cool.h"
#include "rw/tvhdict.h"
#include "rw/tvordvec.h"
#include "CEventServer.h"
#include "CMultDetector.h"
#include "CTriggerSetup.h"
#define C_SETUPFILE_TRIGGER "setup.trigger"
#define C_SETUPFILE_TRIGGERPATTERN "trigger.pattern"
const int TriggerWord1Position = 13-4; // trigger pattern in event label
const int TriggerWord2Position = 14-4; // skip 4 header words...
const int MaxTriggerPatterns = 2; // max. number of trigger patterns
enum CTriggerLevel { trigFLT, trigMAIN }; // 'names' of trigger patterns
const int MaxHTDCChannels = 15; // max. channel-number in history TDC
class CTriggerServer {
public:
enum CHTDCChan { htdcBC1, htdcBC2,
htdcVetoCounter, htdcVetoWall,
htdcMultDet, htdcMinBias,
htdcDownStream, htdcBC3,
htdcN1, htdcN2,
htdcN3, htdcN4,
htdcSAC1, htdcSAC2,
htdcBC1Low };
enum N2Type { good = 0, noBeamParticle, noN2Interaction, noMinBias, beamPileUp,
minBiasPileUp, downstramInteractionPileUp };
public:
CTriggerServer(const char* = 0); // creates CTriggerServer according to setup file
~CTriggerServer();
public:
CBoolean update(CEventServer&); // unpack all detectors and other relevant info
void listSetup(ostream& = cout) const; // list current trigger setup
//
// information from multiplicity detector
//
float getMultiplicity();
const CPaddle& getPaddles(int i) const { return md.getPaddles(i); }
CTriggerSetup* getSetup() const { return setup; }
//
// history TDC information
//
inline float getHTDCLength(CHTDCChan);
inline float getHTDCData (CHTDCChan, int);
inline int getTimeOfSecondBeamParticle() const;
int getBeamInWindow(int tlow, int tup); // get # of beam particles from HTDC
int getN2InWindow (int tlow, int tup); // get # of interactions from HTDC
int getMinTime(int, int, int); // get min time difference betw, HTDC channel and t0
int isBadN2Interaction(int tBC=1500, int tMB=3500);
// check if interaction is a good N2 trigger with
// no pile up of beamparticle within +/- tBC1 (ns) (default 1500 ns) and
// no min. bias or down stream interaction within +/- tMB (ns) (default 3500 ns)
// return values: 0=ok, 1=noBeam, 2=noN2, 3=noMinBias, 4=dbleBeam, 5=dbleN2, 6=dbleDownStream
void printTriggerPattern(ostream& os = cout); // prints formatted trigger pattern
inline CBoolean mainIsUV();
inline CBoolean mainIsMT();
inline CBoolean mainIsBeam();
inline CBoolean mainIsFLT();
inline CBoolean fltIsUV();
inline CBoolean fltIsMT();
inline CBoolean fltIsBeam();
inline CBoolean fltIsMult();
inline CBoolean multIsN4();
inline CBoolean multIsN3();
inline CBoolean multIsN2();
inline CBoolean multIsN1();
inline CBoolean beamIsHalo();
inline CBoolean beamIsMinBias();
inline CBoolean beamIsBeam();
inline CBoolean beamIsMuon();
inline CBoolean mtIsSoft();
inline CBoolean mtIs50Hz();
inline CBoolean mtIsClock();
inline CBoolean mtIsRndm();
inline CBoolean UVIsUV1lamp();
inline CBoolean UVIsUV2lamp();
protected:
CTriggerServer(const CTriggerServer &);
CTriggerServer & operator = (const CTriggerServer &);
protected:
CMultDetector md; // multiplicity detector info
int triggerPattern[MaxTriggerPatterns]; // trigger pattern 1 from event header
RWTValHashDictionary<RWCString, unsigned long> // lookup table for names of trigger patterns
*trigPatt[MaxTriggerPatterns];
RWTValOrderedVector<float> hTDC[MaxHTDCChannels];
protected:
void readTriggerConfiguration(); // set pattern maps
void unpackTriggerPattern(CEventServer&); // update protected member from event-header info
int getNumberInWindow(int, int, int); // number of entries in channel within time window
CBoolean unpackHTDC(CEventServer&);
private:
CTriggerSetup *setup;
int timeOfSecondBeamParticle;
CBoolean warned[100];
};
//
// Access functions for trigger
//
CBoolean CTriggerServer::mainIsUV() { return (triggerPattern[trigMAIN] & (*trigPatt[trigMAIN])["main-uv-lamp"]); }
CBoolean CTriggerServer::mainIsMT() { return (triggerPattern[trigMAIN] & (*trigPatt[trigMAIN])["main-mt"] ); }
CBoolean CTriggerServer::mainIsBeam() { return (triggerPattern[trigMAIN] & (*trigPatt[trigMAIN])["main-beam"] ); }
CBoolean CTriggerServer::mainIsFLT() { return (triggerPattern[trigMAIN] & (*trigPatt[trigMAIN])["main-flt"] ); }
CBoolean CTriggerServer::fltIsUV() { return (triggerPattern[trigMAIN]& (*trigPatt[trigMAIN])["flt-uv-lamp"]); }
CBoolean CTriggerServer::fltIsMT() { return (triggerPattern[trigMAIN]& (*trigPatt[trigMAIN])["flt-mt"] ); }
CBoolean CTriggerServer::fltIsBeam() { return (triggerPattern[trigMAIN]& (*trigPatt[trigMAIN])["flt-beam"] ); }
CBoolean CTriggerServer::fltIsMult() { return (triggerPattern[trigMAIN]& (*trigPatt[trigMAIN])["flt-mult"] ); }
CBoolean CTriggerServer::multIsN1() { return (triggerPattern[trigFLT ] & (*trigPatt[trigFLT ])["n1"] ); }
CBoolean CTriggerServer::multIsN2() { return (triggerPattern[trigFLT ] & (*trigPatt[trigFLT ])["n2"] ); }
CBoolean CTriggerServer::multIsN3() { return (triggerPattern[trigFLT ] & (*trigPatt[trigFLT ])["n3"] ); }
CBoolean CTriggerServer::multIsN4() { return (triggerPattern[trigFLT ] & (*trigPatt[trigFLT ])["n4"] ); }
CBoolean CTriggerServer::beamIsHalo() { return (triggerPattern[trigFLT ] & (*trigPatt[trigFLT ])["halo"] ); }
CBoolean CTriggerServer::beamIsMinBias() { return (triggerPattern[trigFLT ] & (*trigPatt[trigFLT ])["min-bias"]); }
CBoolean CTriggerServer::beamIsBeam() { return (triggerPattern[trigFLT ] & (*trigPatt[trigFLT ])["beam"] ); }
CBoolean CTriggerServer::beamIsMuon() { return (triggerPattern[trigFLT ] & (*trigPatt[trigFLT ])["muon"] ); }
CBoolean CTriggerServer::mtIsSoft() { return (triggerPattern[trigFLT ] & (*trigPatt[trigFLT ])["soft"] ); }
CBoolean CTriggerServer::mtIs50Hz() { return (triggerPattern[trigFLT ] & (*trigPatt[trigFLT ])["50Hz"] ); }
CBoolean CTriggerServer::mtIsClock() { return (triggerPattern[trigFLT ] & (*trigPatt[trigFLT ])["clock"] ); }
CBoolean CTriggerServer::mtIsRndm() { return (triggerPattern[trigFLT ] & (*trigPatt[trigFLT ])["rndm"] ); }
CBoolean CTriggerServer::UVIsUV1lamp() { return (triggerPattern[trigFLT ] & (*trigPatt[trigFLT ])["uv1-lamp"]); }
CBoolean CTriggerServer::UVIsUV2lamp() { return (triggerPattern[trigFLT ] & (*trigPatt[trigFLT ])["uv2-lamp"]); }
//
// Access functions to history TDC values
//
float CTriggerServer::getHTDCLength(CHTDCChan chan) { return hTDC[chan].length(); }
float CTriggerServer::getHTDCData (CHTDCChan chan, int index) { return hTDC[chan](index); }
int CTriggerServer::getTimeOfSecondBeamParticle() const { return timeOfSecondBeamParticle; }
#endif /* CTRIGGERSERVER_H */