///////////////////////////////////////////////////////////////// // // MFadc // // #include "MFadc.hxx" #include "MMcEvt.h" #include "TROOT.h" #include #include #include #include "TH1.h" #include "TObjArray.h" #include "MGFadcSignal.hxx" MFadc::MFadc() { // // default constructor // // 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 = MFADC_RESPONSE_FWHM ; ampl_resp = MFADC_RESPONSE_AMPLITUDE ; // // set up the response shape // Int_t i,j ; 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 () ; // // set all the booleans used to FALSE, indicating that the pixel is not // used in this event. // 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 < 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 ; 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., 2.) ; } } } } 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; ipSetBinContent (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 ; } Float_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]); }