Changeset 12392


Ignore:
Timestamp:
11/05/11 13:32:59 (13 years ago)
Author:
neise
Message:
tidied up tpeak.C and put an entry into README.txt
Location:
fact/tools/rootmacros
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • fact/tools/rootmacros/README.txt

    r12391 r12392  
    105105
    106106
     107-----------------------------------------------------------------------------------------------
     108tpeak.C ROOT macros to produce overlays of data around a found peak in a given
     109window.
     110
     111int tpeak(
     112  char *datafilename    = "data/20111016_013.fits.gz",
     113  const char *drsfilename = "../../20111016_011.drs.fits.gz",
     114  const char *OutRootFileName = "../analysis/fpeak_cdf.Coutput.root",
     115  int firstevent      = 0,
     116  int nevents       = -1,
     117  int firstpixel      = 0,
     118  int npixel        = -1,
     119  bool spikeDebug = false,
     120  int avg1    = 14,
     121  int avg2    = 8,
     122  int OverlayWindowLeft = 50,
     123  int OverlayWindowRight = 150,
     124  int verbosityLevel = 1, // different verbosity levels can be implemented
     125here
     126  bool ProduceGraphic = true
     127  )
     128
     129call it like this, if you want to overlay a certain number of peaks for a
     130single channel
     131tpeak("data/20111029_017.fits.gz","data/20111029_013.drs.fits.gz","test.root",0,1000,333,1,true,0,0,50,150,1,true)
     132
     133set the first bool 'spikeDebug' to false in order to overlay quicker ... every
     13450th event the canvas is updated.
     135depending on what kind of peaks you like to detect the sliding average filters
     136should be set to e.g. 14,8 for singles in a quiet G-APD pedestal run
     137or 0,0 if you want to see just every thing that might be a signal...
     138
     139the window size 50,150 means .. 50 slices to the left of the maximum and 150
     140to the right.
     141
     142there is a bit of cleaning included in the file, maybe you want to switch it
     143off, then just search for the calls of these methods...
     144 removeMaximaBelow( *zXings, 3.0);
     145 removeRegionWithMaxOnEdge( *zXings, 2);
     146 removeRegionOnFallingEdge( *zXings, 100);
     147
     148and comment them out or play with the settings.
     149
     150they are defined in zerosearch.C, which is maybe a bad choice...
     151
     152
     153
  • fact/tools/rootmacros/tpeak.C

    r12366 r12392  
    4242#include "factfir.C"
    4343
     44#include "FOpenDataFile.h"
     45#include "FOpenDataFile.c"
     46
     47#include "DrsCalibration.C"
     48#include "DrsCalibration.h"
     49
     50#include "SpikeRemoval.h"
     51#include "SpikeRemoval.C"
    4452
    4553//-----------------------------------------------------------------------------
    4654// Decleration of variables
    4755//-----------------------------------------------------------------------------
    48 
     56bool breakout=false;
     57
     58int NEvents;
    4959vector<int16_t> AllPixelDataVector;
    5060vector<int16_t> StartCellVector;
    51 
    5261unsigned int CurrentEventID;
    53 
    54 bool breakout=false;
    55 
    56 size_t ROIxNOP;
     62size_t PXLxROI;
     63UInt_t RegionOfInterest;
    5764UInt_t NumberOfPixels;
    58 UInt_t RegionOfInterest;
    59 int NEvents;
    6065
    6166size_t drs_n;
     
    6469vector<float> drs_triggeroffsetmean;
    6570
    66 int FOpenDataFile( fits & );
    67 
    68 
    6971vector<float> Ameas(FAD_MAX_SAMPLES);  // copy of the data (measured amplitude
    70 vector<float> N1mean(FAD_MAX_SAMPLES); // mean of the +1 -1 ch neighbors
    7172vector<float> Vcorr(FAD_MAX_SAMPLES);  // corrected Values
    72 vector<float> Vdiff(FAD_MAX_SAMPLES);  // numerical derivative
    73 
    7473vector<float> Vslide(FAD_MAX_SAMPLES);  // sliding average result
    7574vector<float> Vcfd(FAD_MAX_SAMPLES);    // CDF result
    7675vector<float> Vcfd2(FAD_MAX_SAMPLES);    // CDF result + 2nd sliding average
    77 
    78 
    79 float getValue( int, int );
    80 float correctDrsOffset( int slice, int pixel );
    81 void computeN1mean( int );
    82 void removeSpikes( int );
    8376
    8477// histograms
     
    9588TH1F* h;
    9689TH1F *debugHistos;
    97 TH2F* hStartCell;   // id of the DRS physical pipeline cell where readout starts
    98                     // x = pixel id, y = DRS cell id
    99 
    100 TH1F *hBaseline[ NPIX ]; // histograms for baseline extraction
    101 TH1F *hMeanBsl, *hpltMeanBsl;
    102 TH1F *hRmsBsl, *hpltRmsBsl;
    103 TH2F * hAmplSpek_cfd;
    104 TH2F * hAmplSpek_discri;   
    105 
    10690TH2F *hPeakOverlay;  //histogrammm for overlay of detected Peaks
     91int hPeakOverlayXaxisLeft,hPeakOverlayXaxisRight;
    10792
    10893TObjArray hList;
     
    11095
    11196void BookHistos( );
    112 void SaveHistograms( char * );
    113 
    114 int searchSinglesPeaks = 0;
     97void SaveHistograms( const char * );
    11598
    11699//-----------------------------------------------------------------------------
    117100// Main
    118101//-----------------------------------------------------------------------------
    119 
    120102int tpeak(
    121         char *datafilename      = "../../20111011_055.fits.gz",
    122         const char *drsfilename = "../../20111011_054.drs.fits.gz",
    123         int PixelID             = -1,
    124         int firstevent          = 0,
    125         int nevents             = -1,
    126         bool spikeDebug         = false,
    127         int verbosityLevel      = 1 // different verbosity levels can be implemented here
    128         )
     103  char *datafilename    = "data/20111016_013.fits.gz",
     104  const char *drsfilename = "../../20111016_011.drs.fits.gz",
     105  const char *OutRootFileName = "../analysis/fpeak_cdf.Coutput.root",
     106  int firstevent      = 0,
     107  int nevents       = -1,
     108  int firstpixel      = 0,
     109  int npixel        = -1,
     110  bool spikeDebug = false,
     111  int avg1    = 14,
     112  int avg2    = 8,
     113        int OverlayWindowLeft = 50,
     114        int OverlayWindowRight = 150,
     115  int verbosityLevel = 1, // different verbosity levels can be implemented here
     116  bool ProduceGraphic = true
     117  )
     118
    129119{
     120hPeakOverlayXaxisLeft = OverlayWindowLeft;
     121hPeakOverlayXaxisRight = OverlayWindowRight;
     122
     123        gStyle->SetPalette(1,0);
     124        gROOT->SetStyle("Plain");
    130125
    131126//-----------------------------------------------------------------------------
     
    133128// also in 'non-debug' runs
    134129//-----------------------------------------------------------------------------
    135 
    136         TCanvas * cSpektrum;
    137         TCanvas * cStartCell;
    138         cSpektrum = new TCanvas("cSpektrum","Amplitude Spektra of different discriminators",10,10,400,400);
    139         cSpektrum->Divide(1,2);
    140         cStartCell = new TCanvas("cStartCell ", "The Startcells of this run", 10,410,400,400);
    141 
    142130        // Canvases only need if spike Debug, but I want to deklare
    143131        // the pointers anyway ...
    144         TCanvas *cRawAndSpikeRemoval = NULL;
    145132        TCanvas *cFiltered = NULL;
    146133        if (spikeDebug){
    147                 cRawAndSpikeRemoval = new TCanvas("cRawAndSpikeRemoval","DRS Waveform",410,10,400,400);
    148                 cRawAndSpikeRemoval->Divide(1, 2);
    149                 cFiltered = new TCanvas("cFiltered","filtered DRS Waveforms",410,410,400,400);
    150                 cFiltered->Divide(1, 2);
     134                cFiltered = new TCanvas("cFiltered","filtered DRS Waveforms",1,10,400,300);
     135                cFiltered->Divide(1, 3);
    151136        }
    152137        // Canvases to show the peak template
    153138        TCanvas *cPeakOverlay = NULL;
    154         cPeakOverlay = new TCanvas("cPeakOverlay", "Overlay of detected Peaks", 410, 10, 600, 600);
    155 
    156 gStyle->SetPalette(1,0);
    157 gROOT->SetStyle("Plain");
     139        cPeakOverlay = new TCanvas("cPeakOverlay", "Overlay of detected Peaks", 1, 310, 400, 400);
     140
    158141
    159142//-----------------------------------------------------------------------------
     
    169152// Filter-Settings
    170153//-----------------------------------------------------------------------------
    171 
    172 // sliding window filter settings
    173         int k_slide = 16;
    174         vector<double> a_slide(k_slide, 1); //erzeugt vector der länge k_slide, und füllt die elemente mit 1
    175         double b_slide = k_slide;
    176 
    177154// CFD filter settings
    178155        int k_cfd = 10;
     
    182159        a_cfd[k_cfd-1]=1.;
    183160
    184 // 2nd slinding window filter
    185         int ks2 = 16;
    186         vector<double> as2(ks2, 1);
    187         double bs2 = ks2;
    188 
    189161//-----------------------------------------------------------------------------
    190162// prepare datafile
     
    192164
    193165// Open the data file
    194         fits *datafile = new fits( datafilename );
    195         if (!datafile) {
    196             printf( "Could not open the file: %s\n", datafilename );
    197                   return 1;
    198         }
    199 
    200 // access data
    201         NEvents = FOpenDataFile( *datafile );
    202         printf("number of events in file: %d\n", NEvents);
     166
     167  fits * datafile;
     168  // Opens the raw data file and 'binds' the variables given as
     169  // Parameters to the data file. So they are filled with
     170  // raw data as soon as datafile->GetRow(int) is called.
     171  NEvents = OpenDataFile( datafilename, &datafile,
     172    AllPixelDataVector, StartCellVector, CurrentEventID,
     173    RegionOfInterest, NumberOfPixels, PXLxROI, verbosityLevel);
     174  if (NEvents == 0){
     175    cout << "return code of OpenDataFile:" << datafilename<< endl;
     176    cout << "is zero -> aborting." << endl;
     177    return 1;
     178  }
     179
     180  if (verbosityLevel > 0)
     181    cout <<"number of events in file: "<< NEvents << "\t";
    203182  if ( nevents == -1 || nevents > NEvents ) nevents = NEvents; // -1 means all!
     183  if (verbosityLevel > 0)
     184    cout <<"of, which "<< nevents << "will be processed"<< endl;
     185
     186  if (verbosityLevel > 0)
     187    cout <<"Total # of Pixel: "<< NumberOfPixels << "\t";
     188  if ( npixel == -1 || npixel > (int)NumberOfPixels  ) npixel = (int)NumberOfPixels; // -1 means all!
     189  if (verbosityLevel > 0)
     190    cout <<"of, which "<< npixel << "will be processed"<< endl;
    204191
    205192//Get the DRS calibration
     
    210197                                        drs_n);
    211198
    212 //Check the sizes of the data columns
    213         if (drs_n != 1474560) {
    214                 cerr << "error: DRS calib file has wrong ...erm...size ... drs_n is: "
    215                         << drs_n << endl;
    216                 cerr << " Aborting." << endl;
    217                 return 1;
    218         }
    219 
    220         if(ROIxNOP != 1474560)
    221         {
    222                 cout << "warning: data_n should better be 1440x1024=1474560, but is "
    223                         << ROIxNOP << endl;
    224                 cout << "this script is not guaranteed to run under these "
    225                         <<" circumstances....any way ... it is never guaranteed." << endl;
    226         }
    227 
    228199// Book the histograms
    229 
    230200        BookHistos( );
    231201
    232         float myTHR = 3.5;
    233         float calibratedVoltage;
    234202//-----------------------------------------------------------------------------
    235203// Loops over Every Event and Pixel
     
    243211        //-------------------------------------
    244212
    245                 for ( int pix = 0; pix < 1440; pix++ ){
    246 
    247                         hStartCell->Fill( pix, StartCellVector[pix] );
    248 
    249                         // this is a stupid hack ... there is more code at the
    250                         // end of this loop to complete this hack ...
    251                         // beginning with if (PixelID != -1) as well.
    252                         if (PixelID != -1) {
    253                                 pix = PixelID;
    254                                 if (verbosityLevel > 0){
    255                                         cout << "Processing Event number: " << CurrentEventID << "\t"
    256                                                 << "Pixel number: "<< pix << endl;
    257                                 }
    258                         }
    259 
    260                         if (verbosityLevel > 0){
    261                                 if (pix % 20 ==0){
    262                                         cout << "Processing Event number: " << CurrentEventID << "\t"
    263                                                 << "Pixel number: "<< pix << endl;
    264                                 }
    265                         }
    266 
    267                         // compute the DRs calibrated values and put them into Ameas[]
    268                         for ( unsigned int sl = 0; sl < RegionOfInterest; sl++){
    269                                 calibratedVoltage = getValue( sl, pix);
    270                                 if (verbosityLevel > 10){
    271                                         printf("calibratedVoltage = %f\n", calibratedVoltage);
    272                                 }
    273                                 Ameas[ sl ] = calibratedVoltage;
    274 
    275                                 // in case we want to plot this ... we need to put it into a
    276                                 // Histgramm
    277                                 if (spikeDebug){
    278                                         debugHistos[Ameas_].SetBinContent(sl, calibratedVoltage);
    279                                 }
    280                         }
    281                         // operates on Ameas[] and writes to N1mean[]
    282                         computeN1mean( RegionOfInterest );
    283 
    284                         // operates on Ameas[] and N1mean[], then writes to Vcorr[]
    285                         removeSpikes( RegionOfInterest );
    286 
    287                         // filter Vcorr with sliding average using FIR filter function
    288                         factfir(b_slide , a_slide, k_slide, Vcorr, Vslide);
    289                         // filter Vslide with CFD using FIR filter function
    290                         factfir(b_cfd , a_cfd, k_cfd, Vslide, Vcfd);
    291                         // filter Vcfd with sliding average using FIR filter function
    292                         factfir(bs2 , as2, ks2, Vcfd, Vcfd2);
    293 
    294 
    295                         vector<Region> *Regions =  discriminator( Vslide, myTHR,true , 120);
    296                         for (unsigned int p=0; p<Regions->size(); p++ ){
    297                                         hAmplSpek_discri->Fill(pix , Regions->at(p).maxVal);
    298                         }
     213                for ( int pix = firstpixel; pix < firstpixel + npixel; pix++ ){
     214
     215                                                                                                if (verbosityLevel > 0){
     216                                                                                if (pix == firstpixel){
     217                                                                                  cout << "Processing Event: " << CurrentEventID << "/" << nevents << endl;
     218                                                                                }
     219                                                                              }
     220
     221                                                                                        applyDrsCalibration( Ameas,pix,12,12,
     222                                                                        drs_basemean, drs_gainmean, drs_triggeroffsetmean,
     223                                                                        RegionOfInterest, AllPixelDataVector, StartCellVector);
     224
     225                                                                              // finds spikes in the raw data, and interpolates the value
     226                                                                              // spikes are: 1 or 2 slice wide, positive non physical artifacts
     227                                                                              removeSpikes (Ameas, Vcorr);
     228
     229                                                                                     // filter Vcorr with sliding average using FIR filter function
     230                                                                              sliding_avg(Vcorr, Vslide, avg1);
     231                                                                              // filter Vslide with CFD using FIR filter function
     232                                                                              factfir(b_cfd , a_cfd, k_cfd, Vslide, Vcfd);
     233                                                                              // filter Vcfd with sliding average using FIR filter function
     234                                                                              sliding_avg(Vcfd, Vcfd2, avg2);
    299235
    300236                        // peaks in Ameas[] are found by searching for zero crossings
     
    304240                        vector<Region> * zXings = zerosearch( Vcfd2 , 1 , 1);
    305241                        // zXings means "zero cross ings"
    306                         ShiftRegionBy(*zXings, -ks2/2);
    307242                        EnlargeRegion(*zXings, 10, 10);
    308243                        findAbsMaxInRegions(*zXings, Vslide);
    309 
    310                         for ( unsigned int sl = 0; sl < RegionOfInterest; sl++){
    311                            // hPixelCellData.Fill( sl, Vcorr[sl] );
    312                            hBaseline[pix]->Fill( Vslide[sl] ) ;
    313                         }
     244                                                                              removeMaximaBelow( *zXings, 3.0);
     245                                                                              removeRegionWithMaxOnEdge( *zXings, 2);
     246                                                                              removeRegionOnFallingEdge( *zXings, 100);
    314247
    315248                        //following Code should produce the Overlay of peaks
     
    317250
    318251                                for (it = zXings->begin() ; it < zXings->end() ; it++){
    319                                   int a = it->maxPos-100;
    320                                   int b = it->maxPos+100;
    321                                   if (a < 0)
    322                                     a =0;
    323                                   if (b>1023)
    324                                     b=1023;
    325                                         for ( int pos = a; pos <= b; pos++){
     252                                  int Left = it->maxPos - OverlayWindowLeft;
     253                                  int Right = it->maxPos + OverlayWindowRight;
     254                                  if (Left < 0)
     255                                    Left =0;
     256                                  if (Right > (int)Vcorr.size() )
     257                                    Right=Vcorr.size() ;
     258                                        for ( int pos = Left; pos < Right; pos++){
    326259
    327260                                            hPeakOverlay->Fill( pos - (it->maxPos), Vcorr[pos]) ;
     
    330263
    331264
    332 
    333                         if (zXings->size() != 0 ){
    334                                 for (unsigned int i=0; i<zXings->size(); i++){
    335                                         if (verbosityLevel > 1){
    336                                                 cout << zXings->at(i).maxPos << ":\t"
    337                                                         << zXings->at(i).maxVal <<endl;
    338                                         }
    339                                         hAmplSpek_cfd->Fill(pix, zXings->at(i).maxVal);
    340                                 }
    341                         }
    342 
    343265                        if ( spikeDebug ){
    344                                 for ( unsigned int sl = 0; sl < RegionOfInterest; sl++){
    345                                         debugHistos[Vslide_].SetBinContent( sl, Vslide[sl] );
    346                                         debugHistos[Vcfd_].SetBinContent( sl, Vcfd[sl] );
    347                                         debugHistos[Vcfd2_].SetBinContent( sl, Vcfd2[sl] );
    348                                 }
    349 
    350                                 cRawAndSpikeRemoval->cd( 1);
    351                                 gPad->SetGrid();
    352                                 debugHistos[Ameas_].Draw();
    353 
    354                                 cRawAndSpikeRemoval->cd( 2);
     266
     267
     268                                                                                                          // TODO do this correct. The vectors should be the rigt ones... this is just luck
     269                                                                                  debugHistos[Ameas_].GetXaxis()->Set(Ameas.size() , -0.5 , Ameas.size()-0.5);
     270                                                                                  debugHistos[Vcorr_].GetXaxis()->Set(Ameas.size() , -0.5 , Ameas.size()-0.5);
     271                                                                                  debugHistos[Vslide_].GetXaxis()->Set(Ameas.size() , -0.5 , Ameas.size()-0.5);
     272                                                                                  debugHistos[Vcfd_].GetXaxis()->Set(Ameas.size() , -0.5 , Ameas.size()-0.5);
     273                                                                                  debugHistos[Vcfd2_].GetXaxis()->Set(Ameas.size() , -0.5 , Ameas.size()-0.5);
     274
     275                                                                                        for ( unsigned int sl = 0; sl < RegionOfInterest; sl++){
     276                                                                                          debugHistos[Ameas_].SetBinContent(sl, Ameas[sl]);
     277                                                                                          debugHistos[Vcorr_].SetBinContent(sl, Vcorr[sl]);
     278                                                                                          debugHistos[Vslide_].SetBinContent( sl, Vslide[sl] );
     279                                                                                          debugHistos[Vcfd_].SetBinContent( sl, Vcfd[sl] );
     280                                                                                          debugHistos[Vcfd2_].SetBinContent( sl, Vcfd2[sl] );
     281                                                                                        }
     282
     283
     284                                cFiltered->cd(1);
    355285                                gPad->SetGrid();
    356286                                debugHistos[Vcorr_].Draw();
    357287
    358                                 cFiltered->cd(1);
     288                                cFiltered->cd(2);
    359289                                gPad->SetGrid();
    360290                                debugHistos[Vslide_].Draw();
    361                                 TLine * thrLine = new TLine(0, myTHR, 1024, myTHR);
    362                                 thrLine->SetLineColor(kRed);
    363                                 thrLine->SetLineWidth(2);
    364                                 thrLine->Draw();
    365                                 TLine * OneLine;
    366                                 vector<TLine*> MyLines;
    367                                 for (unsigned int p=0; p<Regions->size(); p++ ){
    368                                         OneLine = new TLine(
    369                                                 Regions->at(p).begin ,
    370                                                 Regions->at(p).maxVal,
    371                                                 Regions->at(p).end,
    372                                                 Regions->at(p).maxVal);
    373                                         OneLine->SetLineColor(kRed);
    374                                         OneLine->SetLineWidth(2);
    375                                         MyLines.push_back(OneLine);
    376                                         OneLine->Draw();
    377                                 }
     291
    378292                                TBox *OneBox;
    379293                                vector<TBox*> MyBoxes;
     
    392306                                }
    393307
    394                                 cFiltered->cd(2);
     308                                cFiltered->cd(3);
    395309                                gPad->SetGrid();
    396310                                debugHistos[Vcfd2_].Draw();
     
    399313                                zeroline->Draw();
    400314
    401                                 cRawAndSpikeRemoval->Update();
    402315                                cFiltered->Update();
    403316
     
    423336                        }// end of if(spikeDebug)
    424337
    425                         delete Regions;
    426338                        delete zXings;
    427 
    428                         // this is the 2nd part of the ugly hack in the beginning.
    429                         // this makes sure, that the loop ends
    430                         if (PixelID != -1){
    431                                 pix = 2000;
    432                         }
    433 
    434339                        if (breakout)
    435340                                break;
     
    439344        // end of loop over pixels
    440345        //-------------------------------------
    441 if (ev % 50 == 0){
    442                 cSpektrum->cd(1);
    443                 hAmplSpek_cfd->Draw("COLZ");
    444                 cSpektrum->cd(2);
    445                 hAmplSpek_discri->Draw("COLZ");
    446                 cSpektrum->Modified();
    447                 cSpektrum->Update();
    448 
    449                 // updating seems not to work ..
    450                 // debug cout
    451                 cStartCell->cd();
    452                 hStartCell->Draw();
    453                 cStartCell->Modified();
    454                 cStartCell->Update();
    455 
     346                                if (ProduceGraphic){
     347                                                if (ev % 50 == 0){
    456348                //OVERLAY PEAKS
    457349                cPeakOverlay->cd();
     
    459351                cPeakOverlay->Modified();
    460352                cPeakOverlay->Update();
    461 
    462 }
    463 
    464 
     353                                                }
     354                                }
    465355                if (breakout)
    466356                        break;
     
    469359// end of loop over Events
    470360//-------------------------------------
    471 
    472 
    473         for (int pix = 0; pix < NumberOfPixels; pix++) {
    474             //printf("Maximum bin pix[%d] %f\n", pix ,hBaseline[pix]->GetMaximumBin() );
    475 
    476             float vmaxprob = hBaseline[pix]->GetXaxis()->GetBinCenter(
    477                 hBaseline[pix]->GetMaximumBin() );
    478 
    479             printf("%8.3f", vmaxprob );
    480 
    481             hMeanBsl->Fill( vmaxprob );
    482             hpltMeanBsl->SetBinContent(pix+1, vmaxprob );
    483 
    484             hRmsBsl->Fill(hBaseline[pix]->GetRMS() );
    485             hpltRmsBsl->SetBinContent( pix+1, hBaseline[pix]->GetRMS() );
    486         }
    487 
    488 
    489         SaveHistograms( datafilename );
     361                                if (ProduceGraphic){
     362                //OVERLAY PEAKS
     363                cPeakOverlay->cd();
     364                hPeakOverlay->Draw("COLZ");
     365                cPeakOverlay->Modified();
     366                cPeakOverlay->Update();
     367                                }
     368
     369        SaveHistograms( OutRootFileName );
    490370
    491371        return( 0 );
    492372}
    493373
    494 void removeSpikes(int Samples){
    495 
    496     const float fract = 0.8;
    497     float x, xp, xpp, x3p;
    498 
    499     // assume that there are no spikes
    500     for ( int i = 0; i <  Samples; i++) Vcorr[i] = Ameas[i];
    501 
    502 // find the spike and replace it by mean value of neighbors
    503     for ( int i = 0; i < Samples; i++) {
    504 
    505     // printf("Vcorr[%d] = %f, Ameas[%d] = %f\n", i, Vcorr[ i ], i, Ameas[ i ] );
    506 
    507     x = Ameas[i] - N1mean[i];
    508 
    509         if ( x < -5. ){ // a spike candidate
    510             // check consistency with a single channel spike
    511             xp = Ameas[i+1] - N1mean[i+1];
    512             xpp = Ameas[i+2] - N1mean[i+2];
    513             x3p = Ameas[i+3] - N1mean[i+3];
    514 
    515             // printf("candidates x[%d] = %f; xp = %f; xpp = %f, x3p = %f\n", i, x, xp, xpp, x3p);
    516 
    517             if ( Ameas[i+2] - ( Ameas[i] + Ameas[i+3] )/2. > 10. ){
    518                 // printf("double spike candidate\n");
    519                 Vcorr[i+1] = ( Ameas[i] + Ameas[i+3] )/2.;
    520                 Vcorr[i+2] = ( Ameas[i] + Ameas[i+3] )/2.;
    521                 // printf("Vcorr[%d] = %f %f %f %f\n", i, Vcorr[i], Vcorr[i+1], Vcorr[i+2], Vcorr[ i+3 ]);
    522                 // printf("Ameas[%d] = %f %f %f %f\n", i, Ameas[ i ], Ameas[ i+1 ], Ameas[ i+2 ], Ameas[i+3]);
    523                 i = i + 3;
    524             }
    525             else{
    526 
    527                 if ( ( xp > -2.*x*fract ) && ( xpp < -10. ) ){
    528                     Vcorr[i+1] = N1mean[i+1];
    529                     // printf("Vcorr[%d] = %f %f %f\n", i, Vcorr[i], Vcorr[i+1], Vcorr[i+2]);
    530                     // N1mean[i+1] = (Ameas[i] - Ameas[i+2] / 2.);
    531                     N1mean[i+2] = (Ameas[i+1] - Ameas[i+3] / 2.);
    532                     i = i + 2;//do not care about the next sample it was the spike
    533                 }
    534                 // treatment for the end of the pipeline must be added !!!
    535             }
    536         }
    537         else{
    538              // do nothing
    539         }
    540     } // end of spike search and correction
    541         for ( int i = 0; i < Samples; i++ ) debugHistos[ Vcorr_ ].SetBinContent( i, Vcorr[i] );
    542 }
    543 /*
    544 void computeN1mean( int Samples ){
    545 cout << "In compute N1mean" << endl;
    546 // compute the mean of the left and right neighbors of a channel
    547 
    548     for( int i = 0; i < Samples; i++){
    549         if (i == 0){ // use right sample es mean
    550             N1mean[i] = Ameas[i+1];
    551         }
    552         else if ( i == Samples-1 ){ //use left sample as mean
    553             N1mean[i] = Ameas[i-1];
    554         }
    555         else{
    556             N1mean[i] = ( Ameas[i-1] + Ameas[i+1] ) / 2.;
    557         }
    558         h[tN1mean].SetBinContent(i, Ameas[i] - N1mean[i]);
    559     }
    560 } // end of computeN1mean computation
    561 */
    562 
    563 void computeN1mean( int Samples ){
    564 // compute the mean of the left and right neighbors of a channel
    565 
    566     for( int i = 2; i < Samples - 2; i++){
    567 /*        if (i == 0){ // use right sample es mean
    568             N1mean[i] = Ameas[i+1];
    569         }
    570         else if ( i == Samples-1 ){ //use left sample as mean
    571             N1mean[i] = Ameas[i-1];
    572         }
    573         else{
    574             N1mean[i] = ( Ameas[i-1] + Ameas[i+1] ) / 2.;
    575         }
    576 */
    577         N1mean[i] = ( Ameas[i-1] + Ameas[i+1] ) / 2.;
    578     }
    579 } // end of computeN1mean computation
    580 
    581 
    582 
    583 /*
    584 // this function takes a vector<float> and tries to apply the DRS calibration to it.
    585 // therfor it uses a DRS calibration file, which must be given as a parameter.
    586 // in case the calibration file can not be opened the function generates a warning on cerr
    587 // and returns an empty vector
    588 //
    589 // the function assumes the first parameter conatins the data of all Pixel
    590 // the RegionOfInterest is deduced from its size().
    591 
    592         //
    593 
    594 vector<float> * calibrateDrsData(
    595         vector<float> & AllPixelData,
    596         vector<float> & AllStartCells,
    597         const char * DrsCalibFilePath,
    598         bool ApplyCalibToSourceVector = false)
    599 {
    600         vector<float> * CalibratedDRSData;
    601 
    602         size_t DrsLengthOfVectors;
    603         vector<float> DrsOffset;
    604         vector<float> DrsGain;
    605         vector<float> DrsOffsetSpecialTrigger;
    606 
    607         // the Total Number of Pixel, we have data of
    608         // is deduced from the size() of AllPixelStartCell
    609         unsigned int NumberOfPixel = AllStartCells.size();
    610         //sanity Check:
    611         if (NumberOfPixel < 1) {
    612                 cerr << "calibrateDrsData - Error: NumberOfPixel=AllStartCells.size() ia:"
    613                         << AllStartCells.size() << " must be >= 1"  << endl;
    614                 return CalibratedDRSData
    615         }
    616 
    617         // The RegionOfInterest is deduced from the size() of AllPixel Data
    618         unsigned int RegionOfInterest = AllPixelData.size() / NumberOfPixel;
    619         // sanity Check
    620         if ( RegionOfInterest < 1){
    621                 cerr << "calibrateDrsData - Error: RegionOfInterest = AllPixelData.size() / NumberOfPixel is:"
    622                         << RegionOfInterest << " must be >= 1"  << endl;
    623                 return CalibratedDRSData
    624         }
    625 
    626         // now lets see if we can find the drs calib file
    627         FOpenCalibFile( DrsCalibFilePath,
    628                 DrsOffset,
    629                 DrsGain,
    630                 DrsOffsetSpecialTrigger,
    631                 DrsLengthOfVectors);
    632         //sanity check is done in FOpenCalibFile, I guess ... check and maybe TODO
    633         // maybe at least the return code of FOpenCalibFile should be checked here ... TODO
    634 
    635 
    636 
    637 
    638 }
    639 
    640 */
    641 
    642 float getValue( int slice, int pixel ){
    643         const float dconv = 2000/4096.0;
    644 
    645         float vraw, vcal;
    646 
    647         unsigned int pixel_pt;
    648         unsigned int slice_pt;
    649         unsigned int cal_pt;
    650         unsigned int drs_cal_offset;
    651 
    652         // printf("pixel = %d, slice = %d\n", slice, pixel);
    653 
    654         pixel_pt = pixel * RegionOfInterest;
    655         slice_pt = pixel_pt + slice;
    656         drs_cal_offset = ( slice + StartCellVector[ pixel ] )%RegionOfInterest;
    657         cal_pt    = pixel_pt + drs_cal_offset;
    658 
    659         vraw = AllPixelDataVector[ slice_pt ] * dconv;
    660         vcal = ( vraw - drs_basemean[ cal_pt ] - drs_triggeroffsetmean[ slice_pt ] ) / drs_gainmean[ cal_pt ]*1907.35;
    661 
    662         return( vcal );
    663 }
    664 
    665 // this is a faster version of getValue, that does not do a full calibration
    666 // was used for a performace test...
    667 float correctDrsOffset( int slice, int pixel ){
    668 
    669         const float dconv = 2000/4096.0;
    670 
    671         // here 1024 is not the RegionOfInterest, but really the lenth of the pipeline
    672         unsigned int physical_slice = ( slice + StartCellVector[ pixel ] ) % 1024;
    673 
    674         unsigned int slice_pt;
    675         unsigned int physical_slice_pt;
    676         slice_pt                        = pixel * RegionOfInterest + slice;
    677         physical_slice_pt       = pixel * RegionOfInterest + physical_slice;
    678 
    679         float vcal = AllPixelDataVector[ slice_pt ] *
    680                 dconv - drs_basemean[ physical_slice_pt ];
    681         return( vcal );
    682 }
    683 
    684374// booking and parameter settings for all histos
    685375void BookHistos( ){
    686         // histograms for baseline extraction
    687         char hName[500];
    688         char hTitle[500];
    689 
    690         TH1F *h;
    691 
    692         for( int i = 0; i < NPIX; i++ ) {
    693                 sprintf(&hTitle[0],"all events all slices of pixel %d", i);
    694                 sprintf(&hName[0],"base%d", i);
    695 
    696                 h = new TH1F( hName, hTitle, 400, -99.5 ,100.5 );
    697 
    698                 h->GetXaxis()->SetTitle( "Sample value (mV)" );
    699                 h->GetYaxis()->SetTitle( "Entries / 0.5 mV" );
    700                 hListBaseline.Add( h );
    701                 hBaseline[i] = h;
    702         }
    703 
    704     hMeanBsl = new TH1F("histo_mean","Value of maximal probability",400,-99.5,100.5);
    705     hMeanBsl->GetXaxis()->SetTitle( "max value (mV)" );
    706     hMeanBsl->GetYaxis()->SetTitle( "Entries / 0.5 mV" );
    707     hList.Add( hMeanBsl );
    708 
    709     hpltMeanBsl = new TH1F("hplt_mean","Value of maximal probability",1440,-0.5,1439.5);
    710     hpltMeanBsl->GetXaxis()->SetTitle( "pixel" );
    711     hpltMeanBsl->GetYaxis()->SetTitle( "max value in mV" );
    712     hList.Add( hpltMeanBsl );
    713 
    714     hRmsBsl = new TH1F("histo_rms","RMS in mV",2000,-99.5,100.5);
    715     hRmsBsl->GetXaxis()->SetTitle( "RMS (mV)" );
    716     hRmsBsl->GetYaxis()->SetTitle( "Entries / 0.5 mV" );
    717     hList.Add( hRmsBsl );
    718 
    719     hpltRmsBsl = new TH1F("hplt_rms","Value of maximal probability",1440,-0.5,1439.5);
    720     hpltRmsBsl->GetXaxis()->SetTitle( "pixel" );
    721     hpltRmsBsl->GetYaxis()->SetTitle( "RMS in mV" );
    722     hList.Add( hpltRmsBsl );
    723 
    724         hAmplSpek_cfd = new TH2F("hAmplSpek_cfd","amplitude spektrum - CFD",1440,-0.5,1439.5, 256, -27.5, 100.5);
    725         hAmplSpek_cfd->GetXaxis()->SetTitle( "pixel" );
    726         hAmplSpek_cfd->GetYaxis()->SetTitle( "amplitude in mV" );
    727         hList.Add( hAmplSpek_cfd );
    728 
    729         hAmplSpek_discri = new TH2F("hAmplSpek_discri","amplitude spektrum - std discriminator",1440,-0.5,1439.5, 256, -27.5, 100.5);
    730         hAmplSpek_discri->GetXaxis()->SetTitle( "pixel" );
    731         hAmplSpek_discri->GetXaxis()->SetTitle( "amplitude in mV" );
    732         hList.Add( hAmplSpek_discri );
    733 
    734         hStartCell = new TH2F("StartCell", "StartCell", 1440, 0., 1440., 1024, 0., 1024);
    735         hStartCell->GetXaxis()->SetTitle( "pixel" );
    736         hStartCell->GetXaxis()->SetTitle( "slice" );
    737         hList.Add( hStartCell );
    738376
    739377        debugHistos = new TH1F[ NumberOfDebugHistoTypes ];
     
    755393                debugHistos[ type ].GetYaxis()->SetTitle("Amplitude (a.u.)");
    756394        }
    757         hPeakOverlay = new TH2F("hPeakOverlay", "Overlay of detected Peaks", 201, -100.5, 100.5, 1024, -99.5, 100.5);
     395        hPeakOverlay = new TH2F("hPeakOverlay", "Overlay of detected Peaks",
     396                                        hPeakOverlayXaxisLeft + hPeakOverlayXaxisRight , (-1*hPeakOverlayXaxisLeft)-0.5, hPeakOverlayXaxisRight-0.5 ,
     397                                        4096, -48.5, 1999.5 );
    758398        hPeakOverlay->GetXaxis()->SetTitle( "Timeslices" );
    759399        hPeakOverlay->GetYaxis()->SetTitle( "Amplitude [a.u.]" );
    760         //hList.Add( hPeakOverlay h);
     400        hList.Add( hPeakOverlay );
    761401
    762402}
    763403
    764 void SaveHistograms( char * loc_fname ){
    765 
    766         TString fName; // name of the histogram file
    767 
    768         // create the filename for the histogram file
    769         fName = loc_fname; // use the name of the tree file
    770         // TODO ... next statement doesn't work for ".fits.gz"
    771         fName.Remove(fName.Length() - 5); // remove the extension .fits
    772         fName += "_discri.root"; // add the new extension
    773 
     404void SaveHistograms(const char * loc_fname ){
    774405        // create the histogram file (replace if already existing)
    775         TFile tf( fName, "RECREATE");
     406        TFile tf( loc_fname, "RECREATE");
    776407
    777408        hList.Write(); // write the major histograms into the top level directory
    778         tf.mkdir("BaselineHisto");
    779         tf.cd("BaselineHisto"); // go to new subdirectory
    780         hListBaseline.Write(); // write histos into subdirectory
    781409
    782410        tf.Close(); // close the file
    783411} // end of SaveHistograms( char * loc_fname )
    784412
    785 int FOpenDataFile(fits &datafile){
    786 
    787 //      cout << "-------------------- Data Header -------------------" << endl;
    788 //      datafile.PrintKeys();
    789 //      cout << "------------------- Data Columns -------------------" << endl;
    790 //      datafile.PrintColumns();
    791 
    792         //Get the size of the data column
    793         RegionOfInterest        = datafile.GetUInt("NROI");
    794         NumberOfPixels          = datafile.GetUInt("NPIX");
    795         //Size of column "Data" = #Pixel x ROI
    796         ROIxNOP                         = datafile.GetN("Data");
    797 
    798         //Set the sizes of the data vectors
    799         AllPixelDataVector.resize(ROIxNOP,0);
    800         StartCellVector.resize(NumberOfPixels,0);
    801 
    802         //Link the data to variables
    803         datafile.SetRefAddress("EventNum",  CurrentEventID);
    804         datafile.SetVecAddress("Data", AllPixelDataVector);
    805         datafile.SetVecAddress("StartCellData", StartCellVector);
    806         datafile.GetRow(0);
    807 
    808         return datafile.GetNumRows() ;
    809 }
    810 
    811 
    812 /////////////////////////////////////////////////////////////////////////////
    813 /// old BookHistos
    814 /*
    815 void BookHistos( int Samples ){
    816 // booking and parameter settings for all histos
    817 
    818     h = new TH1F[ Ntypes ];
    819 
    820     for ( int type = 0; type < Ntypes; type++){
    821 
    822         h[ type ].SetBins(Samples, 0, Samples);
    823         h[ type ].SetLineColor(1);
    824         h[ type ].SetLineWidth(2);
    825 
    826         // set X axis paras
    827         h[ type ].GetXaxis()->SetLabelSize(0.1);
    828         h[ type ].GetXaxis()->SetTitleSize(0.1);
    829         h[ type ].GetXaxis()->SetTitleOffset(1.2);
    830         h[ type ].GetXaxis()->SetTitle(Form("Time slice (%.1f ns/slice)", 1./2.));
    831 
    832         // set Y axis paras
    833         h[ type ].GetYaxis()->SetLabelSize(0.1);
    834         h[ type ].GetYaxis()->SetTitleSize(0.1);
    835         h[ type ].GetYaxis()->SetTitleOffset(0.3);
    836         h[ type ].GetYaxis()->SetTitle("Amplitude (a.u.)");
    837     }
    838         cRawAndSpikeRemoval = new TCanvas("cRawAndSpikeRemoval","DRS Waveform",10,10,800,600);
    839         cRawAndSpikeRemoval->Divide(1, 3);
    840     cFilter = new TCanvas("cFilter","filtered DRS Waveforms",10,10,800,600);
    841     cFilter->Divide(1, 3);
    842 
    843     hStartCell = new TH2F("StartCell", "StartCell", 1440, 0., 1440., 1024, 0., 1024);
    844 
    845 }
    846 */
    847 
Note: See TracChangeset for help on using the changeset viewer.