CSidc.h
//-----------------------------------------------------------------------------
// $Header: /asis/offline/ceres/cool/project/RCS/CSidc.h,v 3.15 1997/07/16 15:12:05 messer Exp $
//
// COOL Program Library
// Copyright (C) CERES collaboration, 1996
//
// Declarations of CSidc class.
//
//-----------------------------------------------------------------------------
#ifndef CSIDC_H
#define CSIDC_H
#include "cool.h"
#include "CMCcool.h"
#include "CDetector.h"
#include "CCyclicCollection.h"
#include "CDrawable.h"
#include "CCell.h"
#include "CSidcHit.h"
#include "CCoGPulse.h"
#include "CSidcCluster.h"
#include "CSidcLookupItem.h"
#include "CLookupDeltaRadius.h"
#include "CMCSplittedHit.h"
#include "CSortedList.h"
#include "CSidcSetup.h"
#include "CList.h"
#include <rw/tpordvec.h>
#include <rw/tpsrtvec.h>
class CSidcDeltaR;
class CMCServer;
class CEventServer;
class CCoordinate;
class CSidc : public CDetector, public CDrawable {
public:
CSidc();
virtual ~CSidc();
public:
virtual CBoolean unpack(CEventServer&);
virtual CBoolean makeClusters(float = 1.0);
virtual CBoolean makeCoGHits(); // also makes cog-pulses
virtual CBoolean makeFittedHits(); // uses pulse-fitting
void printHitSummary(ostream& = cout);
void transform(CSidcCellCoord&, const CLabCylinderCoord&) const; // see CCoordinate.h
void transform(CLabCylinderCoord&, const CSidcCellCoord&) const; // see CCoordinate.h
const CCyclicCollection<CCell>& getCells() const { return cells; }
const RWTPtrOrderedVector<CSidcCluster>& getClusters() const { return clusters; }
const CSortedList<CCoGPulse>& getPulses() const { return pulses; }
const CSortedList<CSidcHit>& getHits() const { return hits; }
const RWTPtrOrderedVector<CSidcLookupItem>& getLookupItems() const { return lookupItems; }
double getStopPulseCoG(int i) const { return stopPulseCoG[i]; }
double getReadoutThreshold() const { return readoutThreshold; }
CSidcSetup* getSetup() const { return setup; }
CBoolean writeLookupItemsToFile(const char*);
void setLookupItemsToDefault();
public:
virtual void makeDigiHits(CMCServer&);
virtual CBoolean digitize(CMCServer&, CMCDigiMode);
virtual CBoolean makeHitsFromMC(CMCServer&, CMCDigiMode);
virtual double calculateAmplitude(double, double, double, double) = 0;
inline const RWTPtrOrderedVector<CLookupDeltaRadius>& getDeltaRadius() const { return deltaRLookupTable; };
private:
double ballisticDeficitFunction(double);
public:
//
// The following member functions are needed in order
// to allow drawing. They are declared pure virtual in
// the CDrawable base class.
//
virtual void draw(const char*);
float getLeft() const;
float getRight() const;
float getBottom() const;
float getTop() const;
const CString& getName() const { return name; }
protected:
CBoolean readLookupItemsFromFile(const char*);
virtual CBoolean unpackPedestals(CEventServer&);
virtual void getNextNeighbourCells(CCell*, CSidcCluster*, float);
virtual CBoolean appendCellToCluster(CCell*, CSidcCluster*, float);
virtual void makePulses(CSidcCluster*, CList<CCoGPulse>&);
virtual void makeSplittedPulses(CSidcCluster*, CList<CCoGPulse>&);
virtual void getHitsFromPulses(CSidcCluster*, CList<CCoGPulse>&);
virtual CBoolean doBallisticDeficitCorrection();
protected:
//
// Collections:
// Note the order and ranges:
// cells(anode, time bin) where anode [0-359], time bin [0-255]
// nims(nim, time bin) where nim [0-23]
//
RWTPtrOrderedVector<CSidcLookupItem> lookupItems; // pedestal and sigma
CCyclicCollection<CCell> cells; // circular array and list (anode, time bin)
CCollection<CCell> nims; // stop pulses array and list (nim, time bin)
protected:
int *lookupSidcAnode; // anode lookup table (used for unpacking)
double stopPulseCoG[4]; // center-of-gravity of stop pulses for the 4 crates
double stopPulseCoGOffset[4]; // offset of stop pulses
double stopPulsePedestal[4];
double readoutThreshold;
double stopPulsePhaseCorrection; // TDC value to correct for stop pulse phase
RWTPtrOrderedVector<CSidcCluster> clusters;
CSortedList<CCoGPulse> pulses; // pulse list sorted in anodes
CSortedList<CSidcHit> hits; // hit list sorted by phi
protected:
CSidcSetup *setup;
CSidcDeltaR *deltaRcorrection;
CBoolean readDeltaRadiusFromFile(const char*);
RWTPtrOrderedVector<CLookupDeltaRadius> deltaRLookupTable;
protected:
inline int MarkerSet(unsigned short u) {return (u & 0x8000) != 0;}
};
#endif /* CSIDC_H */