X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TRD%2FAliTRDmcmSim.h;h=d7cb067355233e3d6420af677e3ebc7a356c49e6;hb=ed6324e57cdd2db9ef0ebc5d2fedc6d49fd74ae3;hp=d81c1f2630ed6cfbbcce28abb1b51c8d225ef07a;hpb=6e5d4cb26852d287dde038e4ba28dd71bd20d661;p=u%2Fmrichter%2FAliRoot.git diff --git a/TRD/AliTRDmcmSim.h b/TRD/AliTRDmcmSim.h index d81c1f2630e..d7cb0673552 100644 --- a/TRD/AliTRDmcmSim.h +++ b/TRD/AliTRDmcmSim.h @@ -11,78 +11,226 @@ // // /////////////////////////////////////////////////////// -#include +#include +class TObject; +class TClonesArray; +class TH2F; + +class AliRunLoader; class AliTRDfeeParam; -class AliTRDSimParam; -class AliTRDcalibDB; -class AliTRDgeometry; +class AliTRDtrapConfig; +class AliTRDarrayADC; +class AliTRDarrayDictionary; +class AliTRDdigitsManager; class AliTRDmcmSim : public TObject { - public: - AliTRDmcmSim(); - AliTRDmcmSim(const AliTRDmcmSim &m); virtual ~AliTRDmcmSim(); - AliTRDmcmSim &operator=(const AliTRDmcmSim &m); - virtual void Copy(TObject &m) const; + void Init(Int_t det, Int_t rob, Int_t mcm, Bool_t newEvent = kFALSE); + // Initialize MCM by the position parameters + + void Reset(); + // clears filter registers and internal data + + Bool_t LoadMCM(AliRunLoader* const runloader, Int_t det, Int_t rob, Int_t mcm); + + void NoiseTest(Int_t nsamples, Int_t mean, Int_t sigma, Int_t inputGain = 1, Int_t inputTail = 2); + + Int_t GetDataRaw(Int_t iadc, Int_t timebin) const { return (fADCR[iadc][timebin] >> 2); } + // Get unfiltered ADC data + Int_t GetDataFiltered(Int_t iadc, Int_t timebin) const { return (fADCF[iadc][timebin] >> 2); } + // Get filtered ADC data - void Init( Int_t cha, Int_t rob, Int_t mcm ); // Initialize MCM by the position parameters void SetData(Int_t iadc, Int_t *adc); // Set ADC data with array - void SetData(Int_t iadc, Int_t it, Int_t adc ); // Set ADC data - void SetDataPedestal(Int_t iadc ); // Fill ADC data with pedestal values - - Int_t GetChaId() { return fChaId; }; // Returns Chamber ID (0-539) - Int_t GetRobPos() { return fRobPos; }; // Returns ROB position (0-7) - Int_t GetMcmPos() { return fMcmPos; }; // Returns MCM position (0-17) (16,17 are mergers) - Int_t GetRow() { return fRow; }; // Returns Row number on chamber where the MCM is sitting - Int_t GetCol( Int_t iadc ); // Get corresponding column (0-143) from for ADC channel iadc = [0:20] + void SetData(Int_t iadc, Int_t it, Int_t adc); // Set ADC data + void SetData(AliTRDarrayADC * const adcArray, + AliTRDdigitsManager * const digitsManager = 0x0); // Set ADC data from adcArray + void SetDataByPad(AliTRDarrayADC *const adcArray, + AliTRDdigitsManager * const digitsManager = 0x0); // Set ADC data from adcArray + void SetDataPedestal(Int_t iadc); // Fill ADC data with pedestal values + + static Bool_t GetApplyCut() { return fgApplyCut; } + static void SetApplyCut(Bool_t applyCut) { fgApplyCut = applyCut; } + + static Int_t GetAddBaseline() { return fgAddBaseline; } + static void SetAddBaseline(Int_t baseline) { fgAddBaseline = baseline; } + // Additional baseline which is added for the processing + // in the TRAP and removed when writing back the data. + // This is needed to run with TRAP parameters set for a + // different baseline but it will not change the baseline + // of the output. + + Int_t GetDetector() const { return fDetector; }; // Returns Chamber ID (0-539) + Int_t GetRobPos() const { return fRobPos; }; // Returns ROB position (0-7) + Int_t GetMcmPos() const { return fMcmPos; }; // Returns MCM position (0-17) (16,17 are mergers) + Int_t GetRow() const { return fRow; }; // Returns Row number on chamber where the MCM is sitting + Int_t GetCol( Int_t iadc ); // Get corresponding column (0-143) from for ADC channel iadc = [0:20] // for the ADC/Col mapping, see: http://wiki.kip.uni-heidelberg.de/ti/TRD/index.php/Image:ROB_MCM_numbering.pdf - Int_t ProduceRawStream( UInt_t *buf, Int_t bufsize ); // Produce raw data stream from this MCM - void Filter(); // Apply digital filters for existing data - void ZSMapping(); // Do ZS mapping for existing data - void DumpData( char *f, char *target ); // Dump data stored (only for debugging) + void WriteData(AliTRDarrayADC *digits); + Bool_t StoreTracklets(); // Stores tracklets via runloader + TString GetTrklBranchName() { return fTrklBranchName; } + void SetTrklBranchName(TString name) { fTrklBranchName = name; } - protected: + Int_t ProduceRawStream( UInt_t *buf, Int_t bufsize, UInt_t iEv = 0 ) const; // Produce raw data stream - Real data format + Int_t ProduceTrackletStream( UInt_t *buf, Int_t bufsize ); // produce the tracklet stream for this MCM + + // different stages of processing in the TRAP + void Filter(); // Apply digital filters for existing data (according to configuration) + void ZSMapping(); // Do ZS mapping for existing data + void Tracklet(); // Run tracklet preprocessor and perform tracklet fit - Bool_t fInitialized; // Status whether the class is initialized or not - Int_t fChaId; // Chamber ID - Int_t fSector; // Sector number of the supermodule - Int_t fStack; // Chamber stack ID - Int_t fLayer; // Chamber layer ID - Int_t fRobPos; // ROB Position on chamber - Int_t fMcmPos; // MCM Position on chamber - Int_t fNADC; // Number of ADC (usually 21) - Int_t fNTimeBin; // Number of Timebins (variable) - Int_t fRow; // Pad row number (0-11 or 0-15) of the MCM on chamber - Int_t **fADCR; // Array with MCM ADC values (Raw) - Int_t **fADCF; // Array with MCM ADC values (Filtered) - Int_t **fZSM; // Zero suppression map - Int_t *fZSM1Dim; // Zero suppression map (1 dimensional projection) - - // parameter classes - AliTRDfeeParam *fFeeParam; - AliTRDSimParam *fSimParam; - AliTRDcalibDB *fCal; - AliTRDgeometry *fGeo; - - Bool_t CheckInitialized(); // Check whether the class is initialized + // apply individual filters to all channels and timebins void FilterPedestal(); // Apply pedestal filter void FilterGain(); // Apply gain filter void FilterTail(); // Apply tail filter - // Here are the several sub functions used only in FilterTail - void FilterSimDeConvExpA(Int_t *source, Double_t *target, Int_t n, Int_t nexp); - void FilterSimDeConvExpD(Int_t *source, Int_t *target, Int_t n, Int_t nexp); - void FilterSimDeConvExpMI(Int_t *source, Double_t *target, Int_t n); - void FilterSimTailMakerSpline(Double_t *ampin, Double_t *ampout, Double_t lambda, Int_t n); - void FilterSimTailCancelationMI(Double_t *ampin, Double_t *ampout, Double_t norm, Double_t lambda, Int_t n); - - ClassDef(AliTRDmcmSim,3) + // filter initialization (resets internal registers) + void FilterPedestalInit(Int_t baseline = 10); + void FilterGainInit(); + void FilterTailInit(Int_t baseline = -1); + + // feed single sample to individual filter + // this changes the internal registers + // all filters operate on (10+2)-bit values! + UShort_t FilterPedestalNextSample(Int_t adc, Int_t timebin, UShort_t value); + UShort_t FilterGainNextSample(Int_t adc, UShort_t value); + UShort_t FilterTailNextSample(Int_t adc, UShort_t value); + + // tracklet calculation + void AddHitToFitreg(Int_t adc, UShort_t timebin, UShort_t qtot, Short_t ypos, Int_t label[]); + void CalcFitreg(); + void TrackletSelection(); + void FitTracklet(); + + Int_t GetNHits() const { return fNHits; } + Bool_t GetHit(Int_t index, Int_t &channel, Int_t &timebin, Int_t &qtot, Int_t &ypos, Float_t &y, Int_t &label) const; + TClonesArray* GetTrackletArray() const { return fTrackletArray; } + + // data display + void Print(Option_t* const option="") const; // print stored data to stdout + void Draw(Option_t* const option =""); // draw data (ADC data, hits and tracklets) + + friend std::ostream& operator<<(std::ostream &os, const AliTRDmcmSim &mcm); // data output using ostream (e.g. cout << mcm;) + static ostream& Cfdat(ostream &os); // manipulator to activate cfdat output + static ostream& Raw (ostream &os); // manipulator to activate raw output + static ostream& Text (ostream &os); // manipulator to activate text output + + // PID + Int_t GetPID(Int_t q0, Int_t q1); + void PrintPidLutHuman(); + + // I/O + void PrintFitRegXml(ostream& os) const; + void PrintTrackletsXml(ostream& os) const; + void PrintAdcDatHuman(ostream& os) const; + void PrintAdcDatXml(ostream& os) const; + void PrintAdcDatDatx(ostream& os, Bool_t broadcast=kFALSE) const; + protected: + Bool_t CheckInitialized() const; // Check whether the class is initialized + + void SetNTimebins(Int_t ntimebins); // allocate data arrays corr. to the no. of timebins + + static const Int_t fgkFormatIndex; // index for format settings in stream + + static const Int_t fgkNADC; // Number of ADC + static const Int_t fgkMaxTracklets = 4; // maximum number of tracklet-words submitted per MCM (one per CPU) + static const Int_t fgkAddDigits = 2; // additional digits used for internal representation of ADC data + // all internal data as after data control block (i.e. 12 bit), s. TRAP manual + static const Int_t fgkNCPU = 4; // Number of CPUs in the TRAP + static const Int_t fgkNHitsMC = 100; // maximum number of hits for which MC information is kept + + static const UShort_t fgkFPshifts[4]; // shifts for pedestal filter + + + Bool_t fInitialized; // memory is allocated if initialized + Int_t fDetector; // Chamber ID + Int_t fRobPos; // ROB Position on chamber + Int_t fMcmPos; // MCM Position on chamber + Int_t fRow; // Pad row number (0-11 or 0-15) of the MCM on chamber + Int_t fNTimeBin; // Number of timebins currently allocated + Int_t **fADCR; // Array with MCM ADC values (Raw, 12 bit) + Int_t **fADCF; // Array with MCM ADC values (Filtered, 12 bit) + UInt_t *fMCMT; // tracklet word for one mcm/trap-chip + TClonesArray *fTrackletArray; // Array of AliTRDtrackletMCM which contains MC information in addition to the tracklet word + Int_t *fZSMap; // Zero suppression map (1 dimensional projection) + + Int_t fFitPtr[fgkNCPU]; // pointer to the tracklet to be calculated by CPU i + + TString fTrklBranchName; // name of the tracklet branch to right to + + // Parameter classes + AliTRDfeeParam *fFeeParam; // FEE parameters + AliTRDtrapConfig *fTrapConfig; // TRAP config + + AliTRDdigitsManager *fDigitsManager; // pointer to digits manager used for MC label calculation + AliTRDarrayDictionary* fDict[3]; // pointers to label dictionaries + + + // internal filter registers + UInt_t* fPedAcc; // Accumulator for pedestal filter + UInt_t* fGainCounterA; // Counter for values above FGTA in the gain filter + UInt_t* fGainCounterB; // Counter for values above FGTB in the gain filter + UShort_t* fTailAmplLong; // Amplitude of the long component in the tail filter + UShort_t* fTailAmplShort; // Amplitude of the short component in the tail filter + + // hit detection + // individual hits can be stored as MC info + struct Hit_t { // Array of detected hits (only available in MC) + Hit_t() : fChannel(0), fTimebin(0), fQtot(0), fYpos(0) { fLabel[0] = 0; fLabel[1] = 0; fLabel[2] = 0; } + Int_t fChannel; // ADC channel of the hit + Int_t fTimebin; // timebin of the hit + Int_t fQtot; // total charge of the hit + Int_t fYpos; // calculated y-position + Int_t fLabel[3]; // up to 3 labels (only in MC) + } fHits[fgkNHitsMC]; + Int_t fNHits; // Number of detected hits + + // tracklet calculation + struct FitReg_t { // pointer to the 18 fit registers + Int_t fNhits; // number of hits + UInt_t fQ0; // charge accumulated in first window + UInt_t fQ1; // charge accumulated in second window + UInt_t fSumX; // sum x + Int_t fSumY; // sum y + UInt_t fSumX2; // sum x**2 + UInt_t fSumY2; // sum y**2 + Int_t fSumXY; // sum x*y + } *fFitReg; + + // Sort functions as in TRAP + void Sort2(UShort_t idx1i, UShort_t idx2i, UShort_t val1i, UShort_t val2i, + UShort_t * const idx1o, UShort_t * const idx2o, UShort_t * const val1o, UShort_t * const val2o) const; + void Sort3(UShort_t idx1i, UShort_t idx2i, UShort_t idx3i, + UShort_t val1i, UShort_t val2i, UShort_t val3i, + UShort_t * const idx1o, UShort_t * const idx2o, UShort_t * const idx3o, + UShort_t * const val1o, UShort_t * const val2o, UShort_t * const val3o); + void Sort6To4(UShort_t idx1i, UShort_t idx2i, UShort_t idx3i, UShort_t idx4i, UShort_t idx5i, UShort_t idx6i, + UShort_t val1i, UShort_t val2i, UShort_t val3i, UShort_t val4i, UShort_t val5i, UShort_t val6i, + UShort_t * const idx1o, UShort_t * const idx2o, UShort_t * const idx3o, UShort_t * const idx4o, + UShort_t * const val1o, UShort_t * const val2o, UShort_t * const val3o, UShort_t * const val4o); + void Sort6To2Worst(UShort_t idx1i, UShort_t idx2i, UShort_t idx3i, UShort_t idx4i, UShort_t idx5i, UShort_t idx6i, + UShort_t val1i, UShort_t val2i, UShort_t val3i, UShort_t val4i, UShort_t val5i, UShort_t val6i, + UShort_t * const idx5o, UShort_t * const idx6o); + + UInt_t AddUintClipping(UInt_t a, UInt_t b, UInt_t nbits) const; + // Add a and b (unsigned) with clipping to the maximum value representable by nbits + + private: + AliTRDmcmSim(const AliTRDmcmSim &m); // not implemented + AliTRDmcmSim &operator=(const AliTRDmcmSim &m); // not implemented + + static Bool_t fgApplyCut; // apply cut on deflection length + + static Int_t fgAddBaseline; // add baseline to the ADC values + + ClassDef(AliTRDmcmSim,6) }; +std::ostream& operator<<(std::ostream& os, const AliTRDmcmSim& mcm); + #endif