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
1.3.9.1