#include "TPulseViewer.h" TPulseViewer::~TPulseViewer() { fMain->Cleanup(); delete fMain; } void TPulseViewer::Init() { fMain = new TGMainFrame(gClient->GetRoot(),850,600); fEcanvas = new TRootEmbeddedCanvas("Ecanvas",fMain,650,400); fChain = nullptr; fEventList = nullptr; fEntryCutExpression = nullptr; fTCutExpression = ""; fEventIndex = 0; fEventListIndex = 0; fEventNumber = 0; fEventListNumber = 0; fRecordLenght = 32824; fSample = 16384; fMain->AddFrame(fEcanvas, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,10)); //TGHorizontalFrame *fMain = new TGHorizontalFrame(fMain,200,40); TGTextButton *draw = new TGTextButton(fMain,"&Draw"); draw->Connect("Clicked()","TPulseViewer",this,"LoadEvent()"); fMain->AddFrame(draw, new TGLayoutHints(kLHintsCenterX,5,5,3,4)); TGTextButton *previous = new TGTextButton(fMain,"&Previous"); previous->Connect("Clicked()","TPulseViewer",this,"Previous()"); fMain->AddFrame(previous, new TGLayoutHints(kLHintsCenterX,5,5,3,4)); TGTextButton *next = new TGTextButton(fMain,"&Next"); next->Connect("Clicked()","TPulseViewer",this,"Next()"); fMain->AddFrame(next, new TGLayoutHints(kLHintsCenterX,5,5,3,4)); fEntryCutExpression = new TGTextEntry(fMain,"TCut Expression"); fMain->AddFrame(fEntryCutExpression, new TGLayoutHints(kLHintsCenterX,5,5,3,4)); fEntryCutExpression->SetWidth(500); fEntryCutExpression->SetMaxLength(100); fEntryCutExpression->Connect("ReturnPressed()","TPulseViewer",this,"Apply()"); //GTextButton *apply = new TGTextButton(fMain,"&Apply"); //apply->Connect("Clicked()","TPulseViewer",this,"Apply()"); //apply->(); //fMain->AddFrame(apply, new TGLayoutHints(kLHintsCenterX,5,5,3,4)); fMain->Connect("CloseWindow()", "TPulseViewer", this, "~TPulseViewer()"); // Set a name to the main frame fMain->SetWindowName("Pulse Viewer CRESST - 3"); // Map all subwindows of main frame fMain->MapSubwindows(); // Initialize the layout algorithm fMain->Resize(fMain->GetDefaultSize()); // Map main frame fMain->MapWindow(); } TPulseViewer::TPulseViewer() { Init(); } TPulseViewer::TPulseViewer(TChain *input_chain) { Init(); fChain=input_chain; fChain->Draw(">>list",fTCutExpression); fEventList=(TEventList*)gROOT->FindObject("list"); fEventIndex = 0; fEventListIndex = 0; fEventNumber = fChain->GetEntries(); if(fEventList!=nullptr) fEventListNumber = fEventList->GetN(); else fEventListNumber = 0; } //Getter method Long64_t TPulseViewer::GetEventIndex(){ return fEventIndex; } Long64_t TPulseViewer::GetEventListIndex(){ return fEventListIndex; } Long64_t TPulseViewer::GetEventNumber(){ return fEventNumber; } Long64_t TPulseViewer::GetEventListNumber(){ return fEventListNumber; } TCut TPulseViewer::GetCutExpression(){ return fTCutExpression; } //Setter method void TPulseViewer::SetEventIndex(Long64_t i){ fEventIndex=i; } void TPulseViewer::SetEventListIndex(Long64_t i){ fEventListIndex=i; } void TPulseViewer::SetEventNumber( Long64_t i){ fEventNumber=i; } void TPulseViewer::SetEventListNumber(Long64_t i){ fEventListNumber=i; } void TPulseViewer::SetCutExpression(TCut cut_expression){ fTCutExpression=cut_expression; } //Apply cut void TPulseViewer::Apply() { fTCutExpression = fEntryCutExpression->GetText(); fChain->Draw(">>list",fTCutExpression)) fEventList=(TEventList*)gROOT->FindObject("list"); if(fEventList->GetN()>0) fEventListIndex = 0; } //Draw method void TPulseViewer::Previous() { if(fEventListIndex-1<0) fEventListIndex=fEventListNumber-1; else fEventListIndex--; LoadEvent(); } void TPulseViewer::Next() { if(fEventListIndex+1>=fEventListNumber) fEventListIndex=0; else fEventListIndex++; LoadEvent(); return; } void TPulseViewer::LoadEvent() { if(fChain==nullptr) { printf("No Chain\n"); return; } if(fEventList==0) { printf("No Event in the Cut\n"); return; } SetEventIndex(fEventList->GetEntry(fEventListIndex)); std::vector *RecordNumber = {nullptr}; std::vector *ChannelID = {nullptr}; std::string *FileName = {nullptr}; fChain->SetBranchAddress("RecordNumber",&RecordNumber); fChain->SetBranchAddress("FileName",&FileName); fChain->SetBranchAddress("ChannelID",&ChannelID); fChain->GetEntry(fEventIndex); short volt=0; int skip_int=0; struct tm * timeinfo; time_t time=0; Int_t ChannelNumber = RecordNumber->size(); std::vector GraphVector; std::vector LegendVector; GraphVector.resize(ChannelNumber); LegendVector.resize(ChannelNumber); FILE *fid=fopen(FileName[0].c_str(),"rb"); for(Int_t k=0;kSetEditable(false); fseek(fid,fRecordLenght*RecordNumber->at(k),SEEK_SET); for(Int_t i=0;i<4;i++) fread(&skip_int,sizeof(int),1,fid); fread(&time,sizeof(int),1,fid); timeinfo = gmtime(&time); GraphVector[k]->SetTitle(Form("Evento %lld, Time : %s",fEventIndex, asctime(timeinfo) )); for(Int_t i=0;i<2;i++) fread(&skip_int,sizeof(int),1,fid); for(Int_t i=0;i<3;i++) fread(&skip_int,sizeof(int ),1,fid); for(Int_t i=0;i<4;i++) fread(&skip_int,sizeof(int ),1,fid); for(Int_t j=0;jSetPoint(j,j*0.04,-10. +double(volt +32768 )*20./65536.) ; } } TCanvas *fCanvas = fEcanvas->GetCanvas(); fCanvas->cd(); fCanvas->Clear(); Double_t Xmin,Xmax; if(ChannelNumber==1) fCanvas->Divide(1,1); if(ChannelNumber==2) fCanvas->Divide(2,1); if(ChannelNumber==3) fCanvas->Divide(2,2); for(Int_t k=0;kcd(k+1); Xmin = GraphVector[k]->GetYaxis()->GetXmin(); Xmax = GraphVector[k]->GetYaxis()->GetXmax(); GraphVector[k]->GetYaxis()->SetRangeUser(Xmin,(Xmax-Xmin)*1.25 + Xmin); GraphVector[k]->SetFillColor(kWhite); LegendVector[k]=new TLegend(0.65,0.83,0.93,0.93); LegendVector[k]->AddEntry(GraphVector[k],Form("Channel %2d",ChannelID->at(k))); GraphVector[k]->DrawClone("AL"); LegendVector[k]->Draw("same"); } fCanvas->Update(); fclose(fid); } TChain *ch=nullptr; TCut DetA="PulseData.ModuleID==0"; TPulseViewer *p=nullptr; void example() { //TChain *ch=nullptr; ch=new TChain("PulseData"); ch->Add("ncal1_000.root"); p=new TPulseViewer(ch); }