//////////////////////////////////////////////////////////////// // // MFadc // // #include "MFadc.hxx" #include "MMcEvt.hxx" #include "TROOT.h" #include #include #include #include "TH1.h" #include "TObjArray.h" #include "MGFadcSignal.hxx" MFadc::MFadc(Float_t ampl, Float_t fwhm) { // // Constructor overloaded II // // The procedure is the following: // 1. some parameters of the trigger are set to default. // this parameters of the trigger may be changed // 3. Then the all signals are set to zero fwhm_resp = fwhm ; ampl_resp = ampl ; // // set up the response shape // Int_t i ; Float_t sigma ; Float_t x, x0 ; sigma = fwhm_resp / 2.35 ; x0 = 3*sigma ; Float_t dX, dX2 ; dX = WIDTH_FADC_TIMESLICE / SUBBINS ; dX2 = dX/2. ; for (i=0; i< RESPONSE_SLICES_MFADC ; i++ ) { x = i * dX + dX2 ; // // the value 0.125 was introduced to normalize the things // sing_resp[i] = 0.125 * ampl_resp * expf(-0.5 * (x-x0)*(x-x0) / (sigma*sigma) ) ; } // // init the Random Generator for Electonic Noise // GenElec = new TRandom () ; Reset(); // // set all pedestals to 0 // for ( i =0 ; i CAMERA_PIXELS ) { cout << " WARNING: MFadc::Fill() : iPix greater than CAMERA_PIXELS" << endl ; exit(987) ; } if ( used[iPix] == FALSE ) { used [iPix] = TRUE ; for (i=0; i < (Int_t) SLICES_MFADC; i++ ) { sig[iPix][i] = 0. ; } } // // then select the time slice to use (ican) // if ( time < 0. ) { cout << " WARNING! Fadc::Fill " << time << " below ZERO!! Very strange!!" << endl ; } else if ( time < TOTAL_TRIGGER_TIME ) { // // determine the slices number assuming the WIDTH_RESPONSE_MFADC // ichan = (Int_t) ( time / ((Float_t) WIDTH_RESPONSE_MFADC )); // // putting the response slices in the right sig slices. // Be carefull, because both slices have different widths. // for ( i = 0 ; i CAMERA_PIXELS ) { cout << " WARNING: MFadc::Fill() : iPix greater than CAMERA_PIXELS" << endl ; exit(987) ; } if ( used[iPix] == FALSE ) { used [iPix] = TRUE ; for (i=0; i < (Int_t)SLICES_MFADC; i++ ) { sig[iPix][i] = 0. ; } } for ( i = 0 ; i<(Int_t)SLICES_MFADC; i++ ) { sig[iPix][i] = resp[i] ; } } void MFadc::AddSignal( Int_t iPix, Float_t resp[(Int_t) SLICES_MFADC]) { // // Adds signals to the fadc reponse from a given array // // parameter is the number of the pixel and the values to be added // // Int_t i ; // // first we have to check if the pixel iPix is used or not until now // if this is the first use, reset all signal for that pixels // if ( iPix > CAMERA_PIXELS ) { cout << " WARNING: MFadc::Fill() : iPix greater than CAMERA_PIXELS" << endl ; exit(987) ; } if ( used[iPix] == FALSE ) { used [iPix] = TRUE ; for (i=0; i < (Int_t)SLICES_MFADC; i++ ) { sig[iPix][i] = 0. ; } } for ( i = 0 ; i<(Int_t)SLICES_MFADC; i++ ) { sig[iPix][i] += resp[i] ; } } void MFadc::SetPedestals( Int_t ped) { // It sets pedestal for each pixel flat randomly dstributed between 0 and ped // It uses the instance of TRandom GenElec. Int_t i; for(i=0;iRndm()); } } void MFadc::SetPedestals( Float_t ped[CAMERA_PIXELS]) { // It sets pedestal for each pixel from ped array Int_t i; for(i=0;iRndm()); for(j=0;j<(Int_t) SLICES_MFADC;j++) sig[i][j]=+fdum; } } } else { // The program will put the specifies offset to the pixel "pixel". if (used[pixel]){ fdum=(10*GenOff->Rndm()); for(j=0;j<(Int_t) SLICES_MFADC;j++) sig[pixel][j]=+fdum; } } }else { // The "offset" will be the offset for the FADC if (pixel<0) { // It does not exist, so all pixels will have the same offset for(i=0;iGaus(0., value) ; } } } void MFadc::Scan() { for ( Int_t ip=0; ip 0. ) { printf (" %4.1f/", sig[ip][is] ) ; } else { printf ("----/" ) ; } } printf ("\n"); } } } void MFadc::Scan(Float_t time) { // // first of all we subtract from the time a offset (8 ns) // Float_t t ; (0 > time - TIME_BEFORE_TRIGGER)? t=0: t=(time-TIME_BEFORE_TRIGGER) ; // to show also the start of the pulse before the trigger time if ( t < 0. ) { cout << " WARNING!! FROM MFADC::SCAN(t) " << endl ; exit (776) ; } // // calculate the first slice to write out // Int_t iFirstSlice ; iFirstSlice = (Int_t) ( t / WIDTH_FADC_TIMESLICE ) ; for ( Int_t ip=0; iptime-TIME_BEFORE_TRIGGER)? t=0: t=(time-TIME_BEFORE_TRIGGER) ; // to show also the start of the pulse before the trigger time if ( t < 0. ) { cout << " WARNING!! FROM MFADC::SCAN(t) " << endl ; exit (776) ; } // // calculate the first slice to write out // Int_t iFirstSlice ; Int_t i; iFirstSlice = (Int_t) ( t / WIDTH_FADC_TIMESLICE ) ; for ( Int_t ip=0; ip0.0) output[ip][i++]=(UChar_t) (sig[ip][is]+0.5); else output[ip][i++]= 0; } } } } void MFadc::ShowSignal (MMcEvt *McEvt, Float_t trigTime) { // ============================================================ // // This method is used to book the histogramm to show the signal in // a special gui frame (class MGTriggerSignal). After the look onto the // signals for a better understanding of the things we will expect // the gui frame and all histogramms will be destroyed. // // // first of all create a list of the histograms to show // // take only that one with a entry TH1F *hist ; Char_t dumm[10]; Char_t name[256]; TObjArray *AList ; AList = new TObjArray(10) ; // the list of analog signal histograms // at the beginning we initalise 10 elements // but this array expand automaticly if neccessay Int_t ic = 0 ; for ( Int_t i=0 ; i < CAMERA_PIXELS; i++ ) { if ( used [i] == TRUE ) { sprintf (dumm, "FADC_%d", i ) ; sprintf (name, "fadc signal %d", i ) ; hist = new TH1F(dumm, name, SLICES_MFADC, 0., TOTAL_TRIGGER_TIME); // // fill the histogram // for (Int_t ibin=1; ibin <=(Int_t)SLICES_MFADC; ibin++) { hist->SetBinContent (ibin, sig[i][ibin-1]) ; } // hist->SetMaximum( 5.); // hist->SetMinimum(-10.); hist->SetStats(kFALSE); // hist->SetAxisRange(0., 80. ) ; AList->Add(hist) ; ic++ ; } } // // create the Gui Tool // // new MGFadcSignal(McEvt, AList, trigTime, gClient->GetRoot(), gClient->GetRoot(), 400, 400 ) ; // // delete the List of histogramms // AList->Delete() ; delete AList ; } UChar_t MFadc::GetFadcSignal(Int_t pixel, Int_t slice){ // It returns the analog signal for a given pixel and a given FADC // time slice which would be read. return (output[pixel][slice]); }