00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef ST_TRS_PARAMETERIZED_ANALOG_SIGNAL_GENERATOR_HH
00018 #define ST_TRS_PARAMETERIZED_ANALOG_SIGNAL_GENERATOR_HH
00019
00020
00021
00022 #include "StTpcDb/StTpcDb.h"
00023 #include "TRandom.h"
00024 #include <Stiostream.h>
00025 #include "StTrsAnalogSignalGenerator.hh"
00026 class SignalSum_t;
00027 class StTrsParameterizedAnalogSignalGenerator : public StTrsAnalogSignalGenerator {
00028 public:
00029
00030
00031 public:
00032 ~StTrsParameterizedAnalogSignalGenerator();
00033
00034
00035
00036 static StTrsAnalogSignalGenerator* instance();
00037 static StTrsAnalogSignalGenerator* instance(StTpcGeometry*, StTpcSlowControl*, StTpcElectronics*, StTrsSector*);
00038
00039
00040 void inducedChargeOnPad(StTrsWireHistogram*, Int_t sector);
00041
00042
00043 void sampleAnalogSignal();
00044 double signalSampler(double, StTrsAnalogSignal&);
00045 double addNoise(double sigma);
00046 void addNoise(bool l) {StTrsAnalogSignalGenerator::addNoise(l);}
00047 void setNormalFactor(double FudgeFactor);
00048 void addSignal(const int id, const double signal, SignalSum_t &sum);
00049 int SignalId(SignalSum_t &sum);
00050
00051 private:
00052
00053 double realShaperResponse(double, StTrsAnalogSignal&);
00054
00055 void errorFunctionTableBuilder();
00056 void localArrayBuilder();
00057 double erf_fast(double) const;
00058
00059 protected:
00060 StTrsParameterizedAnalogSignalGenerator(StTpcGeometry*, StTpcSlowControl*, StTpcElectronics*, StTrsSector*);
00061
00062 private:
00063 static StTrsAnalogSignalGenerator* mInstance;
00064 StTpcDb* gTpcDbPtr;
00065
00066 double mDriftVelocity;
00067 double mTimeBinWidth;
00068 double mTau;
00069 double mSamplingFrequency;
00070 double mFractionSampled;
00071 double mPadResponseFunctionSigma;
00072 double normalFactor;
00073 const double mPadResponseFunctionSigmaOuter;
00074 const double mPadResponseFunctionSigmaInner;
00075
00076
00077 vector<double, allocator<double> > mChargeFractionOuter;
00078 vector<double, allocator<double> > mChargeFractionInner;
00079 vector<double, allocator<double> > mErrorFunctionTable;
00080 vector<double, allocator<double> > mYb;
00081
00082 double mNumberOfEntriesInTable;
00083 double mRangeOfTable ;
00084 int mPadsAtRow[200];
00085
00086 StTpcPadCoordinate mTpcRaw;
00087 int mCentralPad;
00088 int mCentralRow;
00089 int mNumberOfRows;
00090 int mNumberOfInnerRows;
00091 double mFrischGrid;
00092
00093 double rowNormalization;
00094 double padWidth, padLength;
00095 double zoffset, wire_to_plane_coupling;
00096 double xCentroid[100][500], yCentroid[100],SignalInTimeBin[1000],gain[100][500];
00097 double delx, gridMinusZ, sigma_x, localXDirectionCoupling[500];
00098 double dely, constant, localYDirectionCoupling;
00099 double timeOfSignal, chargeOfSignal;
00100 double t, tzero, K, sigmaLoverTau, lambda,lambdasqr;
00101 double mAdcConversion;
00102 double landauConstant,landauMean,landauSigma,expConstant,expSlope,landauCut,
00103 GausConstant[6], GausMean[6], GausSigma2[6],ExpConstant[6],ExpSlope[6],cutT[6];
00104
00105 };
00106
00107 inline double StTrsParameterizedAnalogSignalGenerator::signalSampler(double tt, StTrsAnalogSignal& sig)
00108 {
00109
00110
00111
00112
00113
00114
00115
00116 return realShaperResponse(tt,sig);
00117
00118 }
00119
00120 inline void StTrsParameterizedAnalogSignalGenerator::setNormalFactor(double FudgeFactor) {normalFactor = FudgeFactor; cout << "TRS::Normal (Fudge) Factor applied to gain = " << normalFactor << endl;}
00121
00122 #endif
00123
00124
00125
00126