CREAM TEA -- ROOT MCP

McpTargetDisplay.cxx

00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 //System includes
00009 #include <fstream>
00010 #include <iostream>
00011 
00012 //McpTarget Display Includes
00013 #include "McpTargetDisplay.h"
00014 #include "WaveformGraph.h"
00015 #include "FFTtools.h"
00016 
00017 //ROOT Includes
00018 #include "TROOT.h"
00019 #include "TCanvas.h"
00020 #include "TTree.h"
00021 #include "TFile.h"
00022 #include "TH1.h"
00023 #include "TButton.h"
00024 #include "TGroupButton.h"
00025 #include "TThread.h"
00026 #include "TStyle.h"
00027 #include "TLatex.h"
00028 #include "TPaveText.h"
00029 #include <TGClient.h>
00030 
00031 using namespace std;
00032 
00033 McpTargetDisplay*  McpTargetDisplay::fgInstance = 0;
00034 //Leave these as global variables for now
00035 
00036 McpTargetDisplay::McpTargetDisplay(int offlineMode,TFile *inputFile)
00037   :fTheMcpTarget(offlineMode),fOfflineMode(offlineMode)
00038 {
00039   //Default constructor
00040   fInEventPlayMode=0;
00041   fEventPlaySleepMs=0;
00042   fgInstance=this;
00043   fMcpTargetCanvas=0;
00044   fMcpTargetEventInfoPad=0;
00045   fMcpTargetMainPad=0;
00046   fView=1;
00047 
00048   fTheOfflineFile=0;
00049   fTheOfflineTree=0;
00050   fTheTargetDataPtr=0;
00051   fTheRawTargetDataPtr=0;
00052   fTheOfflineEntry=0;
00053   if(inputFile) {
00054     setOfflineMode(inputFile);
00055   }
00056   fFarRightPave=0;
00057   fFarLeftPave=0;
00058   fMidLeftPave=0;
00059   fMidMidPave=0;
00060   fMidRightPave=0;
00061   
00062 }
00063 
00064 McpTargetDisplay::~McpTargetDisplay()
00065 {
00066 }
00067 
00068 
00069 
00070 
00071 
00072 //______________________________________________________________________________
00073 McpTargetDisplay*  McpTargetDisplay::Instance()
00074 {
00075    //static function
00076    return (fgInstance) ? (McpTargetDisplay*) fgInstance : new McpTargetDisplay();
00077 }
00078 
00079 
00080 void McpTargetDisplay::setOfflineMode(TFile *inputFile)
00081 {
00082   fOfflineMode=1;
00083   fTheOfflineFile = inputFile;
00084   if(!fTheOfflineFile) {
00085     std::cerr << "No input file -- giving up\n";
00086     exit(0);
00087   }
00088   fTheOfflineTree = (TTree*) fTheOfflineFile->Get("mcpTree");
00089   if(!fTheOfflineTree) {
00090     std::cerr << "No input tree -- giving up\n";
00091     exit(0);
00092   }
00093   fTheOfflineTree->SetBranchAddress("target",&fTheRawTargetDataPtr);
00094     
00095 
00096 }
00097 
00098 void McpTargetDisplay::startEventDisplay()
00099 { 
00100   //Read junk event
00101   if(!fOfflineMode) {
00102     fTheMcpTarget.readEvent();
00103     fTheTargetDataPtr=fTheMcpTarget.getTargetData(); //Do not delete
00104   }
00105   else {
00106   }
00107   this->displayNextEvent();   
00108 }
00109 
00110 
00111 
00112 void McpTargetDisplay::refreshEventDisplay()
00113 {
00114    if(!fMcpTargetCanvas) {
00115       fMcpTargetCanvas = new TCanvas("canMcpTarget","canMcpTarget",1200,800);
00116       fMcpTargetCanvas->cd();
00117       fMcpTargetCanvas->SetBottomMargin(0);
00118       drawEventButtons();
00119    }
00120    if(!fMcpTargetMainPad) {
00121       fMcpTargetCanvas->cd();
00122       fMcpTargetMainPad= new TPad("canMcpTargetMain","canMcpTargetMain",0,0,1,0.9);
00123       fMcpTargetMainPad->Draw();
00124       fMcpTargetCanvas->Update();
00125    }
00126    if(!fMcpTargetEventInfoPad) {
00127       fMcpTargetCanvas->cd();
00128       fMcpTargetEventInfoPad= new TPad("canMcpTargetEventInfo","canMcpTargetEventInfo",0.15,0.91,0.85,0.99);
00129       fMcpTargetEventInfoPad->Draw();
00130       fMcpTargetCanvas->Update();
00131    } 
00132 
00133    //Update info pad with tings of interest
00134    char textLabel[180];
00135    fMcpTargetEventInfoPad->Clear();
00136    fMcpTargetEventInfoPad->Divide(5,1);
00137    fMcpTargetEventInfoPad->cd(1);
00138    if(fFarLeftPave) delete fFarLeftPave;
00139    fFarLeftPave = new TPaveText(0,0.01,1,1);
00140    fFarLeftPave->SetName("farLeftPave");
00141    fFarLeftPave->SetBorderSize(0);
00142    fFarLeftPave->SetFillColor(0);
00143    fFarLeftPave->SetTextAlign(13);
00144    for(int chip=0;chip<NUM_TARGETS;chip++) {
00145      sprintf(textLabel,"Mem. Addr. %d -- %#x ",chip,fTheTargetDataPtr->memAddrSpace[chip]);
00146      fFarLeftPave->AddText(textLabel);
00147    }
00148    fFarLeftPave->Draw();
00149    fMcpTargetEventInfoPad->cd(2);
00150    if(fMidLeftPave) delete fMidLeftPave;
00151    fMidLeftPave = new TPaveText(0,0.01,1,1);
00152    fMidLeftPave->SetName("midLeftPave");
00153    fMidLeftPave->SetBorderSize(0);
00154    fMidLeftPave->SetFillColor(0);
00155    fMidLeftPave->SetTextAlign(13);
00156    sprintf(textLabel,"Row -- %d,%d,%d,%d",
00157            fTheTargetDataPtr->rowLoc[0],
00158            fTheTargetDataPtr->rowLoc[1],
00159            fTheTargetDataPtr->rowLoc[2],
00160            fTheTargetDataPtr->rowLoc[3]);
00161    fMidLeftPave->AddText(textLabel);
00162    sprintf(textLabel,"Col -- %d,%d,%d,%d",
00163            fTheTargetDataPtr->colLoc[0],
00164            fTheTargetDataPtr->colLoc[1],
00165            fTheTargetDataPtr->colLoc[2],
00166            fTheTargetDataPtr->colLoc[3]);
00167    fMidLeftPave->AddText(textLabel);
00168    sprintf(textLabel,"HITBIT -- %d,%d,%d,%d",
00169            fTheTargetDataPtr->hitBit[0],
00170            fTheTargetDataPtr->hitBit[1],
00171            fTheTargetDataPtr->hitBit[2],
00172            fTheTargetDataPtr->hitBit[3]);
00173    fMidLeftPave->AddText(textLabel);
00174    sprintf(textLabel,"Thresh -- %d,%d,%d,%d",
00175            fTheTargetDataPtr->thresh[0],
00176            fTheTargetDataPtr->thresh[1],
00177            fTheTargetDataPtr->thresh[2],
00178            fTheTargetDataPtr->thresh[3]);
00179    fMidLeftPave->AddText(textLabel);
00180    fMidLeftPave->Draw();
00181    fMcpTargetEventInfoPad->cd(3);
00182    if(fMidMidPave) delete fMidMidPave;
00183    fMidMidPave = new TPaveText(0,0.01,1,1);
00184    fMidMidPave->SetName("midMidPave");
00185    fMidMidPave->SetBorderSize(0);
00186    fMidMidPave->SetFillColor(0);
00187    fMidMidPave->SetTextAlign(13);
00188    sprintf(textLabel,"ROVDD -- %2.2f,%2.2f,%2.2f,%2.2f",
00189            fTheTargetDataPtr->rovdd[0],
00190            fTheTargetDataPtr->rovdd[1],
00191            fTheTargetDataPtr->rovdd[2],
00192            fTheTargetDataPtr->rovdd[3]);
00193    fMidMidPave->AddText(textLabel);
00194    sprintf(textLabel,"Scaler0 -- %3.2f,%3.2f,%3.2f,%3.2f",
00195            fTheTargetDataPtr->scaler[0][0],
00196            fTheTargetDataPtr->scaler[1][0],
00197            fTheTargetDataPtr->scaler[2][0],
00198            fTheTargetDataPtr->scaler[3][0]);
00199    fMidMidPave->AddText(textLabel);
00200    sprintf(textLabel,"Scaler1 -- %3.2f,%3.2f,%3.2f,%3.2f",
00201            fTheTargetDataPtr->scaler[0][0],
00202            fTheTargetDataPtr->scaler[1][1],
00203            fTheTargetDataPtr->scaler[2][1],
00204            fTheTargetDataPtr->scaler[3][1]);
00205    fMidMidPave->AddText(textLabel);
00206    sprintf(textLabel,"Scaler2 -- %3.1f,%3.1f,%3.1f,%3.1f",
00207            fTheTargetDataPtr->scaler[0][2],
00208            fTheTargetDataPtr->scaler[1][2],
00209            fTheTargetDataPtr->scaler[2][2],
00210            fTheTargetDataPtr->scaler[3][2]);
00211    fMidMidPave->AddText(textLabel);
00212    fMidMidPave->Draw();
00213    fMcpTargetEventInfoPad->cd(4);
00214    if(fMidRightPave) delete fMidRightPave;
00215    fMidRightPave = new TPaveText(0,0.01,1,1);
00216    fMidRightPave->SetName("midRightPave");
00217    fMidRightPave->SetBorderSize(0);
00218    fMidRightPave->SetFillColor(0);
00219    fMidRightPave->SetTextAlign(13);
00220    sprintf(textLabel,"FB -- %#x,%#x,%#x,%#x",
00221            fTheTargetDataPtr->feedback[0],
00222            fTheTargetDataPtr->feedback[1],
00223            fTheTargetDataPtr->feedback[2],
00224            fTheTargetDataPtr->feedback[3]);
00225    fMidRightPave->AddText(textLabel);
00226    sprintf(textLabel,"WB -- %d,%d,%d,%d",
00227            fTheTargetDataPtr->wbias[0],
00228            fTheTargetDataPtr->wbias[1],
00229            fTheTargetDataPtr->wbias[2],
00230            fTheTargetDataPtr->wbias[3]);
00231    fMidRightPave->AddText(textLabel);
00232    sprintf(textLabel,"EnPed -- %d,%d,%d,%d",
00233            fTheTargetDataPtr->enPed[0],
00234            fTheTargetDataPtr->enPed[1],
00235            fTheTargetDataPtr->enPed[2],
00236            fTheTargetDataPtr->enPed[3]);
00237    fMidRightPave->AddText(textLabel);
00238    sprintf(textLabel,"Term -- %d,%d,%d,%d",
00239            fTheTargetDataPtr->term[0],
00240            fTheTargetDataPtr->term[1],
00241            fTheTargetDataPtr->term[2],
00242            fTheTargetDataPtr->term[3]);
00243    fMidRightPave->AddText(textLabel);
00244    fMidRightPave->Draw();
00245    fMcpTargetEventInfoPad->cd(5);
00246    if(fFarRightPave) delete fFarRightPave;
00247    fFarRightPave = new TPaveText(0,0.01,1,1);
00248    fFarRightPave->SetName("farRightPave");
00249    fFarRightPave->SetBorderSize(0);
00250    fFarRightPave->SetFillColor(0);
00251    fFarRightPave->SetTextAlign(13);
00252    sprintf(textLabel,"Temp - %3.1f,%3.1f,%3.1f,%3.1fC",
00253            fTheTargetDataPtr->temperature[0],
00254            fTheTargetDataPtr->temperature[1],
00255            fTheTargetDataPtr->temperature[2],
00256            fTheTargetDataPtr->temperature[3]);
00257    fFarRightPave->AddText(textLabel);
00258    sprintf(textLabel,"Sign -- %d,%d,%d,%d",
00259            fTheTargetDataPtr->sign[0],
00260            fTheTargetDataPtr->sign[1],
00261            fTheTargetDataPtr->sign[2],
00262            fTheTargetDataPtr->sign[3]);
00263    fFarRightPave->AddText(textLabel);
00264    sprintf(textLabel,"PedRowAddr -- %d,%d,%d,%d",
00265            fTheTargetDataPtr->pedRowAddr[0],
00266            fTheTargetDataPtr->pedRowAddr[1],
00267            fTheTargetDataPtr->pedRowAddr[2],
00268            fTheTargetDataPtr->pedRowAddr[3]);
00269    fFarRightPave->AddText(textLabel);
00270    sprintf(textLabel,"PedColAddr -- %d,%d,%d,%d",
00271            fTheTargetDataPtr->pedColAddr[0],
00272            fTheTargetDataPtr->pedColAddr[1],
00273            fTheTargetDataPtr->pedColAddr[2],
00274            fTheTargetDataPtr->pedColAddr[3]);
00275    fFarRightPave->AddText(textLabel);
00276    fFarRightPave->Draw();
00277    
00278    
00279 
00280 
00281 
00282    static TGraph *gr[NUM_TOTAL_CHANNELS]={0};
00283    static WaveformGraph *wv[NUM_TOTAL_CHANNELS]={0};
00284    static TGraph *fft[NUM_TOTAL_CHANNELS]={0};
00285 
00286    //For now lets be lazy
00287    fMcpTargetMainPad->Clear();
00288    fMcpTargetMainPad->cd();
00289    fMcpTargetMainPad->SetBottomMargin(0);
00290    TPad *padGraphs = new TPad("padGraphs","padGraphs",0.05,0.,1,0.95);
00291    padGraphs->Draw();
00292    padGraphs->Divide(8,8,0,0);
00293 
00294    //Now add labels
00295    TLatex texy;
00296    texy.SetTextSize(0.03); 
00297    texy.SetTextAlign(12);  
00298    for(int column=0;column<8;column++) {
00299      sprintf(textLabel,"%d",1+column);
00300      texy.DrawTextNDC((column+1)*0.115,0.97,textLabel);
00301    }
00302    for(int row=0;row<8;row++) {
00303      sprintf(textLabel,"%d",1+(8*row));
00304      texy.DrawTextNDC(0.02,1-((row+1)*0.114),textLabel);
00305   }
00306    
00307 
00308    //   fMcpTargetMainPad->Divide(8,8,0,0);
00309    Double_t maxVal=0;
00310    char graphName[180];
00311    Double_t minTime=0;
00312    Double_t maxTime=64;
00313    //   Double_t minFreq=0;
00314    //   Double_t maxFreq=500;
00315    for(int chan=0;chan<NUM_TOTAL_CHANNELS;chan++) {
00316      sprintf(graphName,"Channel %d",chan+1);
00317      if(gr[chan]) delete gr[chan];
00318      if(wv[chan]) delete wv[chan];
00319      if(fft[chan]) delete fft[chan];
00320      gr[chan] = fTheTargetDataPtr->getChannel(chan);
00321      wv[chan] = new WaveformGraph(gr[chan]);
00322      wv[chan]->setChannel(chan);
00323      wv[chan]->SetLineColor(9);
00324      fft[chan] = (wv[chan]->getFFT());
00325      fft[chan]->SetLineColor(9);
00326 
00327      Double_t sqVal=FFTtools::getPeakSqVal(wv[chan]);
00328      //     std::cout << chan << "\t" << sqVal << "\n"; 
00329      if(sqVal>maxVal)
00330        maxVal=sqVal;
00331      wv[chan]->SetTitle(graphName);
00332      fft[chan]->SetTitle(graphName);
00333      
00334 
00335    }
00336    gStyle->SetTitle(0);
00337    gStyle->SetLabelSize(0.1,"xy");
00338    gStyle->SetTitleSize(0.1,"x");
00339    maxVal=TMath::Sqrt(maxVal);
00340    if(maxVal>4000) maxVal=4000;
00341    for(int chan=0;chan<NUM_TOTAL_CHANNELS;chan++) {
00342      padGraphs->cd(chan+1);
00343      if((chan+1)%8==0)
00344        gPad->SetRightMargin(0.01);
00345      if(chan>=56) {
00346        gPad->SetBottomMargin(0.2);       
00347      }
00348      wv[chan]->SetMaximum(maxVal*1.2);
00349      wv[chan]->SetMinimum(-1.2*maxVal);
00350      if(fView==1)  {
00351        TH1F *framey = gPad->DrawFrame(minTime,-1.2*maxVal,maxTime,1.2*maxVal);
00352        if(chan>=56) {
00353          framey->GetYaxis()->SetLabelSize(0.08);
00354        }
00355        framey->SetXTitle("Time (ns)");       
00356        wv[chan]->Draw("l");
00357      }
00358      if(fView==2)
00359        fft[chan]->Draw("al");
00360      
00361 
00362    }
00363 
00364   
00365   fMcpTargetCanvas->Update();
00366 }
00367 
00368 int McpTargetDisplay::displayNextEvent()
00369 {  
00370   Int_t gotEvent=0;
00371   if(!fOfflineMode) {
00372     gotEvent=fTheMcpTarget.readEvent();
00373     fTheTargetDataPtr=fTheMcpTarget.getTargetData(); //Do not delete
00374   }
00375   else {
00376     if(fTheOfflineEntry<fTheOfflineTree->GetEntries()) {
00377       fTheOfflineTree->GetEntry(fTheOfflineEntry);
00378       if(fTheTargetDataPtr) 
00379         delete fTheTargetDataPtr;
00380       //      std::cerr << fTheTargetDataPtr << "\t" <<fTheRawTargetDataPtr << "\n";
00381       fTheTargetDataPtr=new TargetData(fTheRawTargetDataPtr);
00382       fTheMcpTarget.fillVoltageArray(fTheTargetDataPtr);
00383       fTheOfflineEntry++;
00384       gotEvent=1;
00385     }    
00386   }
00387   if(gotEvent==1)
00388     refreshEventDisplay(); 
00389   else {
00390     //Didn't got event
00391   }
00392   return gotEvent;
00393 }
00394 
00395 
00396 
00397 
00398 void McpTargetDisplay::drawEventButtons() {
00399    TButton *butNext = new TButton("Next ","McpTargetDisplay::Instance()->displayNextEvent();",0.95,0.975,1,1);
00400    butNext->SetTextSize(0.5);
00401    butNext->SetFillColor(kGreen-10);
00402    butNext->Draw();
00403    
00404 
00405    TButton *butPlay = new TButton("Play","McpTargetDisplay::Instance()->startEventPlaying();",0.9,0.95,0.95,1);
00406    butPlay->SetTextSize(0.5);
00407    butPlay->SetFillColor(kGreen-10);
00408    butPlay->Draw();
00409    TButton *butStop = new TButton("Stop","McpTargetDisplay::Instance()->stopEventPlaying();",0.90,0.90,0.95,0.94);
00410    butStop->SetTextSize(0.5);
00411    butStop->SetFillColor(kRed-10);
00412    butStop->Draw();
00413 
00414 
00415    //NEW BUTTONS
00416    fWaveformButton = new TButton("Waveform View","McpTargetDisplay::Instance()->toggleView(1); McpTargetDisplay::Instance()->refreshEventDisplay();",0.05,0.95,0.14,1);
00417    fWaveformButton->SetTextSize(0.4);
00418    fWaveformButton->SetFillColor(kGray+3);
00419    fWaveformButton->Draw();
00420    fPowerButton = new TButton("FFT View","McpTargetDisplay::Instance()->toggleView(2); McpTargetDisplay::Instance()->refreshEventDisplay();",0.05,0.9,0.14,0.95);
00421    fPowerButton->SetTextSize(0.4);
00422    fPowerButton->SetFillColor(kGray);
00423    fPowerButton->Draw();
00424 
00425 }
00426 
00427 
00428 
00429 void McpTargetDisplay::startEventPlaying()
00430 {
00431 
00432   fInEventPlayMode=1;
00433   do {
00434     gSystem->ProcessEvents();
00435     if(!fInEventPlayMode) break;
00436     if(fEventPlaySleepMs>0)
00437       gSystem->Sleep(fEventPlaySleepMs);
00438   }
00439   while(this->displayNextEvent()==1);
00440 }
00441 
00442 
00443 
00444 
00445 void McpTargetDisplay::stopEventPlaying() 
00446 {
00447   fInEventPlayMode=0;
00448 }
00449 

Generated on Tue Nov 24 19:05:00 2009 for CREAM TEA -- MCP/TARGET Readout by doxygen 1.3.9.1