Rev 167 | Details | Compare with Previous | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 146 | f9daq | 1 | #include "../include/sipmscan.h" |
| 2 | #include "../include/workstation.h" |
||
| 3 | |||
| 4 | #include <stdio.h> |
||
| 5 | #include <stdlib.h> |
||
| 6 | |||
| 7 | // Layout hints |
||
| 8 | TGLayoutHints *f0centerX = new TGLayoutHints(kLHintsCenterX,2,2,2,2); |
||
| 9 | TGLayoutHints *f0leftX = new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2); |
||
| 10 | TGLayoutHints *f0leftXnoleft = new TGLayoutHints(kLHintsLeft | kLHintsTop,0,2,2,2); |
||
| 11 | TGLayoutHints *f0leftXnopad = new TGLayoutHints(kLHintsLeft | kLHintsTop,0,0,0,0); |
||
| 12 | TGLayoutHints *f0leftXpad = new TGLayoutHints(kLHintsLeft | kLHintsTop,12,12,2,2); |
||
| 13 | TGLayoutHints *f0rightX = new TGLayoutHints(kLHintsRight | kLHintsTop,2,2,2,2); |
||
| 14 | TGLayoutHints *f0rightXpad = new TGLayoutHints(kLHintsRight | kLHintsTop,12,12,2,2); |
||
| 15 | TGLayoutHints *f0centerY = new TGLayoutHints(kLHintsCenterY,2,2,2,2); |
||
| 16 | TGLayoutHints *f0center2d = new TGLayoutHints(kLHintsCenterX | kLHintsCenterY,2,2,2,2); |
||
| 17 | TGLayoutHints *f1expandX = new TGLayoutHints(kLHintsExpandX,2,2,2,2); |
||
| 18 | TGLayoutHints *f1expand2d = new TGLayoutHints(kLHintsExpandX | kLHintsExpandY,2,2,2,2); |
||
| 19 | TGLayoutHints *f1expandXpad = new TGLayoutHints(kLHintsExpandX,12,12,2,2); |
||
| 20 | |||
| 21 | // Edit file window --------------------------------------------------- |
||
| 22 | |||
| 23 | // Open a new tab for editing datafile headers |
||
| 24 | void TGAppMainFrame::HeaderEditTab(TGTab *mainTab, bool create, int *tabid) |
||
| 25 | { |
||
| 26 | unsigned int nrfiles; |
||
| 27 | ULong_t rcolor, bcolor; |
||
| 28 | gClient->GetColorByName("red", rcolor); |
||
| 29 | gClient->GetColorByName("black", bcolor); |
||
| 30 | |||
| 31 | if(create) |
||
| 32 | { |
||
| 33 | TGCompositeFrame *fH1, *fV1; |
||
| 34 | TGHorizontalFrame *fTitle; |
||
| 35 | TGGroupFrame *fG1; |
||
| 36 | TGLabel *lab; |
||
| 37 | |||
| 38 | int startTab = mainTab->GetCurrent(); |
||
| 39 | int newTab = mainTab->GetNumberOfTabs(); |
||
| 40 | if(DBGSIG > 1) printf("HeaderEditTab(): Current tab = %d, Nr. of tabs = %d\n", startTab, newTab ); |
||
| 41 | |||
| 42 | double numform[6]; |
||
| 43 | |||
| 44 | int subgroup[2]; |
||
| 45 | subgroup[0] = mainTab->GetWidth()-10; |
||
| 46 | subgroup[1] = mainTab->GetHeight()-10; |
||
| 47 | |||
| 48 | TGCompositeFrame *fT1; |
||
| 49 | fT1 = fTab->AddTab("File header editor"); |
||
| 50 | |||
| 51 | // Title label |
||
| 52 | fTitle = new TGHorizontalFrame(fT1, 100, 25, kFixedHeight | kSunkenFrame); |
||
| 53 | TGTitleLabel(fT1, fTitle, "File header editor", (Pixel_t)FORECOLOR, (Pixel_t)BACKCOLOR, FONT); |
||
| 54 | fT1->AddFrame(fTitle, new TGLayoutHints(kLHintsExpandX | kLHintsTop)); |
||
| 55 | |||
| 56 | // List view of files that we will edit |
||
| 57 | if(DBGSIG > 1) printf("HeaderEditTab(): Creating TGListBox *editList -> List box for editing files\n"); |
||
| 58 | editList = new TGListBox(fT1,1); |
||
| 59 | editList->GetVScrollbar(); |
||
| 60 | editList->Resize(300, (3*subgroup[1]/7)-10 ); |
||
| 61 | fT1->AddFrame(editList, f1expandXpad); |
||
| 62 | |||
| 63 | editList->SetMultipleSelections((multiSelect->widgetChBox[0]->IsOn())); |
||
| 64 | |||
| 65 | // Copy the file list from the analysis tab for clearer view |
||
| 66 | nrfiles = fileList->GetNumberOfEntries(); |
||
| 67 | printf("Nr. files = %d\n", nrfiles); |
||
| 68 | for(int i = 0; i < nrfiles; i++) |
||
| 69 | editList->AddEntry(fileList->GetEntry(i)->GetTitle(), i); |
||
| 70 | |||
| 71 | fH1 = new TGCompositeFrame(fT1, subgroup[0], subgroup[1], kHorizontalFrame); |
||
| 72 | fV1 = new TGCompositeFrame(fH1, subgroup[0]/2, subgroup[1], kVerticalFrame); |
||
| 73 | // Time stamp display |
||
| 74 | if(DBGSIG > 1) printf("HeaderEditTab(): Creating TSubStructure *timeEditDisplay -> Display text Entry (time stamp)\n"); |
||
| 75 | timeEditDisplay = new TSubStructure(); |
||
| 76 | if(timeEditDisplay->TGLabelTEntry(fV1, subgroup[0]/2-4, 30, "Time of measurement:", "", "oneline")) |
||
| 77 | fV1->AddFrame(timeEditDisplay->outsidebox, f0leftXpad); |
||
| 78 | timeEditDisplay->widgetTE->SetState(kFALSE); |
||
| 79 | |||
| 80 | // Bias voltage edit |
||
| 81 | if(DBGSIG > 1) printf("HeaderEditTab(): Creating TSubStructure *biasEdit -> Number entry for bias voltage edit\n"); |
||
| 82 | biasEdit = new TSubStructure(); |
||
| 83 | for(int i = 0; i < 6; i++) numform[i] = 0; |
||
| 84 | numform[0] = 7; numform[1] = 2; |
||
| 85 | if(biasEdit->TGCheckNEntry(fV1, subgroup[0]/2, 30, "Bias voltage edit:", 0, 0.00, numform, "left")) |
||
| 86 | fV1->AddFrame(biasEdit->outsidebox, f0leftXpad); |
||
| 87 | |||
| 88 | // Position edits |
||
| 89 | if(DBGSIG > 1) printf("HeaderEditTab(): Creating TSubStructure *xPosEdit, *yPosEdit, *zPosEdit -> Number entries for position edit\n"); |
||
| 90 | xPosEdit = new TSubStructure(); |
||
| 91 | for(int i = 0; i < 6; i++) numform[i] = 0; |
||
| 92 | numform[0] = 9; numform[3] = 2; numform[4] = -100; numform[5] = 215000; |
||
| 93 | if(xPosEdit->TGCheckNEntry(fV1, subgroup[0]/2, 30, "X position edit:", 0, 0, numform, "left")) |
||
| 94 | fV1->AddFrame(xPosEdit->outsidebox, f0leftXpad); |
||
| 95 | |||
| 96 | yPosEdit = new TSubStructure(); |
||
| 97 | if(yPosEdit->TGCheckNEntry(fV1, subgroup[0]/2, 30, "Y position edit:", 0, 0, numform, "left")) |
||
| 98 | fV1->AddFrame(yPosEdit->outsidebox, f0leftXpad); |
||
| 99 | |||
| 100 | zPosEdit = new TSubStructure(); |
||
| 101 | numform[5] = 375000; |
||
| 102 | if(zPosEdit->TGCheckNEntry(fV1, subgroup[0]/2, 30, "Z position edit:", 0, 0, numform, "left")) |
||
| 103 | fV1->AddFrame(zPosEdit->outsidebox, f0leftXpad); |
||
| 104 | |||
| 105 | // Temperature edit |
||
| 106 | if(DBGSIG > 1) printf("HeaderEditTab(): Creating TSubStructure *tempEdit -> Number entry for temperature edit\n"); |
||
| 107 | tempEdit = new TSubStructure(); |
||
| 108 | for(int i = 0; i < 6; i++) numform[i] = 0; |
||
| 109 | numform[0] = 6; numform[1] = 1; |
||
| 110 | if(tempEdit->TGCheckNEntry(fV1, subgroup[0]/2, 30, "Temperature edit:", 0, 0.0, numform, "left")) |
||
| 111 | fV1->AddFrame(tempEdit->outsidebox, f0leftXpad); |
||
| 112 | |||
| 113 | // Angle edit |
||
| 114 | if(DBGSIG > 1) printf("HeaderEditTab(): Creating TSubStructure *angleEdit -> Number entry for angle edit\n"); |
||
| 115 | angleEdit = new TSubStructure(); |
||
| 116 | for(int i = 0; i < 6; i++) numform[i] = 0; |
||
| 117 | numform[0] = 7; numform[1] = 2; |
||
| 118 | if(angleEdit->TGCheckNEntry(fV1, subgroup[0]/2, 30, "Incidence angle edit:", 0, 0.00, numform, "left")) |
||
| 119 | fV1->AddFrame(angleEdit->outsidebox, f0leftXpad); |
||
| 120 | |||
| 121 | // Laser settings edit |
||
| 122 | if(DBGSIG > 1) printf("HeaderEditTab(): Creating TSubStructure *laserEdit -> Display text Entry for laser edit\n"); |
||
| 123 | laserEdit = new TSubStructure(); |
||
| 124 | if(laserEdit->TGCheckTEntry(fV1, subgroup[0]/2, 30, "Laser settings edit:", 0, "", "oneline")) |
||
| 125 | fV1->AddFrame(laserEdit->outsidebox, f0leftXpad); |
||
| 126 | |||
| 127 | // Edit and close buttons |
||
| 128 | if(DBGSIG > 1) printf("HeaderEditTab(): Creating TSubStructure *editHead -> 2 buttons for either editing the head or closing the tab\n"); |
||
| 129 | editHead = new TSubStructure(); |
||
| 130 | const char *selnames[512] = {"Edit header","Close"}; |
||
| 131 | if(editHead->TGMultiButton(fV1, subgroup[0]/2, 30, 2, selnames, "center")) |
||
| 132 | fV1->AddFrame(editHead->outsidebox, f0leftXpad); |
||
| 133 | fH1->AddFrame(fV1, f0leftXnopad); |
||
| 134 | |||
| 135 | fV1 = new TGCompositeFrame(fH1, subgroup[0]/2, subgroup[1], kVerticalFrame); |
||
| 136 | // Multiple file select |
||
| 137 | if(DBGSIG > 1) printf("HeaderEditTab(): Creating TSubStructure *editMulti -> 1 Check button to set multi select or not\n"); |
||
| 138 | editMulti = new TSubStructure(); |
||
| 139 | int *checksel; |
||
| 140 | checksel = new int; |
||
| 141 | *checksel = multiSelect->widgetChBox[0]->IsDown(); |
||
| 142 | selnames[0] = "Select multiple files"; |
||
| 143 | if(editMulti->TGCheckList(fV1, subgroup[0]/2, 30, 1, selnames, checksel, "vertical", "center")) |
||
| 144 | fV1->AddFrame(editMulti->outsidebox, f0centerX); |
||
| 145 | |||
| 146 | // Warning information |
||
| 147 | fG1 = new TGGroupFrame(fV1, "Warnings"); |
||
| 148 | lab = new TGLabel(fG1, "Note: Tick checkbox in front of each header information you wish to change\n(to avoid any unwanted changes, they are unticked by default)."); |
||
| 149 | fG1->AddFrame(lab, f0leftXpad); |
||
| 150 | lab = new TGLabel(fG1, "Note: When selecting files in the list, the entry fields will update accordingly\nwith information from the selected file (only for those where check\nboxes are not turned on)."); |
||
| 151 | fG1->AddFrame(lab, f0leftXpad); |
||
| 152 | lab = new TGLabel(fG1, "Warning: Using button \"Edit header\" will edit headers in all files currently\nselected in the above selection list."); |
||
| 153 | lab->SetTextColor(rcolor); |
||
| 154 | fG1->AddFrame(lab, f0leftXpad); |
||
| 155 | if((editMulti->widgetChBox[0]->IsOn())) |
||
| 156 | { |
||
| 157 | selectWarn = new TGLabel(fG1, "Warning: Multiple files selected!"); |
||
| 158 | selectWarn->SetTextColor(rcolor); |
||
| 159 | fG1->AddFrame(selectWarn, f0leftXpad); |
||
| 160 | } |
||
| 161 | else |
||
| 162 | { |
||
| 163 | selectWarn = new TGLabel(fG1, "Note: Single file selected. "); |
||
| 164 | selectWarn->SetTextColor(bcolor); |
||
| 165 | fG1->AddFrame(selectWarn, f0leftXpad); |
||
| 166 | } |
||
| 167 | fV1->AddFrame(fG1, f0centerX); |
||
| 168 | fH1->AddFrame(fV1, f0centerX); |
||
| 169 | |||
| 170 | // Actions for header editor |
||
| 171 | editList->Connect("Selected(Int_t)", "TGAppMainFrame", this, "ShowHeaderEdit(Int_t)"); |
||
| 172 | biasEdit->widgetChBox[0]->Connect("Clicked()", "TGAppMainFrame", this, "EditTickToggle(=1)"); |
||
| 173 | xPosEdit->widgetChBox[0]->Connect("Clicked()", "TGAppMainFrame", this, "EditTickToggle(=2)"); |
||
| 174 | yPosEdit->widgetChBox[0]->Connect("Clicked()", "TGAppMainFrame", this, "EditTickToggle(=3)"); |
||
| 175 | zPosEdit->widgetChBox[0]->Connect("Clicked()", "TGAppMainFrame", this, "EditTickToggle(=4)"); |
||
| 176 | tempEdit->widgetChBox[0]->Connect("Clicked()", "TGAppMainFrame", this, "EditTickToggle(=5)"); |
||
| 177 | angleEdit->widgetChBox[0]->Connect("Clicked()", "TGAppMainFrame", this, "EditTickToggle(=6)"); |
||
| 178 | laserEdit->widgetChBox[0]->Connect("Clicked()", "TGAppMainFrame", this, "EditTickToggle(=7)"); |
||
| 179 | editMulti->widgetChBox[0]->Connect("Clicked()", "TGAppMainFrame", this, "SetWarnings()"); |
||
| 180 | editHead->widgetTB[0]->Connect("Clicked()", "TGAppMainFrame", this, "StartHeaderEdit()"); |
||
| 181 | char cTemp[512]; |
||
| 182 | sprintf(cTemp, "CloseEditTab(=%d)", newTab*100+startTab); |
||
| 183 | editHead->widgetTB[1]->Connect("Clicked()", "TGAppMainFrame", this, cTemp); |
||
| 184 | |||
| 185 | fT1->AddFrame(fH1, f1expand2d); |
||
| 186 | fMain->MapSubwindows(); |
||
| 187 | fMain->MapWindow(); |
||
| 188 | fMain->Layout(); |
||
| 189 | |||
| 190 | // Initialize the values |
||
| 191 | for(int i = 0; i < 8; i++) |
||
| 192 | EditTickToggle(i); |
||
| 193 | |||
| 194 | // Switch to new tab |
||
| 195 | fTab->SetTab(newTab); |
||
| 196 | |||
| 197 | if(DBGSIG > 1) |
||
| 198 | { |
||
| 199 | printf("HeaderEditTab(): New tab objects (Edit Header)\n"); |
||
| 200 | gObjectTable->Print(); |
||
| 201 | } |
||
| 202 | } |
||
| 203 | else |
||
| 204 | { |
||
| 205 | if(multiSelect->widgetChBox[0]->IsDown()) |
||
| 206 | editMulti->widgetChBox[0]->SetState(kButtonDown); |
||
| 207 | else |
||
| 208 | editMulti->widgetChBox[0]->SetState(kButtonUp); |
||
| 209 | |||
| 210 | editList->SetMultipleSelections((editMulti->widgetChBox[0]->IsDown())); |
||
| 211 | |||
| 212 | // Recopy the file list from the analysis tab |
||
| 213 | nrfiles = fileList->GetNumberOfEntries(); |
||
| 214 | printf("Nr. files = %d\n", nrfiles); |
||
| 215 | for(int i = 0; i < nrfiles; i++) |
||
| 216 | editList->AddEntry(fileList->GetEntry(i)->GetTitle(), i); |
||
| 217 | |||
| 218 | SetWarnings(); |
||
| 219 | |||
| 220 | // Switch to new tab |
||
| 221 | fTab->SetTab(*tabid); |
||
| 222 | } |
||
| 223 | } |
||
| 224 | |||
| 225 | // Change the warning when selecting multiple files |
||
| 226 | void TGAppMainFrame::SetWarnings() |
||
| 227 | { |
||
| 228 | ULong_t rcolor, bcolor; |
||
| 229 | gClient->GetColorByName("red", rcolor); |
||
| 230 | gClient->GetColorByName("black", bcolor); |
||
| 231 | |||
| 232 | editList->SetMultipleSelections((editMulti->widgetChBox[0]->IsDown())); |
||
| 233 | |||
| 234 | // Set the warnings |
||
| 235 | if(editMulti->widgetChBox[0]->IsDown()) |
||
| 236 | { |
||
| 237 | selectWarn->SetText("Warning: Multiple files selected!"); |
||
| 238 | selectWarn->SetTextColor(rcolor); |
||
| 239 | selectWarn->SetWrapLength(-1); |
||
| 240 | } |
||
| 241 | else |
||
| 242 | { |
||
| 243 | selectWarn->SetText("Note: Single file selected. "); |
||
| 244 | selectWarn->SetTextColor(bcolor); |
||
| 245 | selectWarn->SetWrapLength(-1); |
||
| 246 | } |
||
| 247 | } |
||
| 248 | |||
| 249 | // Actions for editing the header |
||
| 250 | void TGAppMainFrame::EditTickToggle(int type) |
||
| 251 | { |
||
| 252 | // Toggle the edit possibility for header entries |
||
| 253 | |||
| 254 | // Bias voltage |
||
| 255 | if(type == 1) |
||
| 256 | { |
||
| 257 | if(biasEdit->widgetChBox[0]->IsDown()) biasEdit->widgetNE[0]->SetState(kTRUE); |
||
| 258 | else biasEdit->widgetNE[0]->SetState(kFALSE); |
||
| 259 | } |
||
| 260 | // X position |
||
| 261 | else if(type == 2) |
||
| 262 | { |
||
| 263 | if(xPosEdit->widgetChBox[0]->IsDown()) xPosEdit->widgetNE[0]->SetState(kTRUE); |
||
| 264 | else xPosEdit->widgetNE[0]->SetState(kFALSE); |
||
| 265 | } |
||
| 266 | // Y position |
||
| 267 | else if(type == 3) |
||
| 268 | { |
||
| 269 | if(yPosEdit->widgetChBox[0]->IsDown()) yPosEdit->widgetNE[0]->SetState(kTRUE); |
||
| 270 | else yPosEdit->widgetNE[0]->SetState(kFALSE); |
||
| 271 | } |
||
| 272 | // Z position |
||
| 273 | else if(type == 4) |
||
| 274 | { |
||
| 275 | if(zPosEdit->widgetChBox[0]->IsDown()) zPosEdit->widgetNE[0]->SetState(kTRUE); |
||
| 276 | else zPosEdit->widgetNE[0]->SetState(kFALSE); |
||
| 277 | } |
||
| 278 | // Temperature |
||
| 279 | else if(type == 5) |
||
| 280 | { |
||
| 281 | if(tempEdit->widgetChBox[0]->IsDown()) tempEdit->widgetNE[0]->SetState(kTRUE); |
||
| 282 | else tempEdit->widgetNE[0]->SetState(kFALSE); |
||
| 283 | } |
||
| 284 | // Angle |
||
| 285 | else if(type == 6) |
||
| 286 | { |
||
| 287 | if(angleEdit->widgetChBox[0]->IsDown()) angleEdit->widgetNE[0]->SetState(kTRUE); |
||
| 288 | else angleEdit->widgetNE[0]->SetState(kFALSE); |
||
| 289 | } |
||
| 290 | // Laser info |
||
| 291 | else if(type == 7) |
||
| 292 | { |
||
| 293 | if(laserEdit->widgetChBox[0]->IsDown()) laserEdit->widgetTE->SetState(kTRUE); |
||
| 294 | else laserEdit->widgetTE->SetState(kFALSE); |
||
| 295 | } |
||
| 296 | } |
||
| 297 | |||
| 298 | void TGAppMainFrame::StartHeaderEdit() |
||
| 299 | { |
||
| 300 | unsigned int nrfiles = editList->GetNumberOfEntries(); |
||
| 301 | TList *files; |
||
| 302 | // Changelist: Bias, X, Y, Z Positions, Temperature, Angle, Laser info |
||
| 303 | bool changelist[] = { biasEdit->widgetChBox[0]->IsDown(), xPosEdit->widgetChBox[0]->IsDown(), yPosEdit->widgetChBox[0]->IsDown(), zPosEdit->widgetChBox[0]->IsDown(), tempEdit->widgetChBox[0]->IsDown(), angleEdit->widgetChBox[0]->IsDown(), laserEdit->widgetChBox[0]->IsDown() }; |
||
| 304 | |||
| 305 | if( nrfiles > 0 ) |
||
| 306 | { |
||
| 307 | // check the selected file/files and return its name/their names |
||
| 308 | files = new TList(); |
||
| 309 | editList->GetSelectedEntries(files); |
||
| 310 | if(files) |
||
| 311 | { |
||
| 312 | for(int i = 0; i < (int)nrfiles; i++) |
||
| 313 | { |
||
| 314 | if(files->At(i)) |
||
| 315 | { |
||
| 316 | if(DBGSIG) |
||
| 317 | printf("StartHeaderEdit(): Filename: %s\n", files->At(i)->GetTitle()); |
||
| 318 | |||
| 319 | HeaderChange( (char*)(files->At(i)->GetTitle()), changelist ); |
||
| 320 | } |
||
| 321 | } |
||
| 322 | } |
||
| 323 | } |
||
| 324 | } |
||
| 325 | |||
| 326 | void TGAppMainFrame::ShowHeaderEdit(int id) |
||
| 327 | { |
||
| 328 | char cTemp[512]; |
||
| 329 | |||
| 330 | // Preparing input file |
||
| 331 | inroot = TFile::Open(editList->GetEntry(id)->GetTitle(), "READ"); |
||
| 332 | |||
| 333 | // Header tree |
||
| 334 | TTree *header_data; |
||
| 335 | inroot->GetObject("header_data", header_data); |
||
| 336 | |||
| 337 | // Display branches from header in the entry fields |
||
| 338 | header_data->SetBranchAddress("timestamp", &evtheader.timestamp); |
||
| 339 | header_data->GetEntry(0); |
||
| 340 | header_data->SetBranchAddress("biasvolt", &evtheader.biasvolt); |
||
| 341 | header_data->GetEntry(0); |
||
| 342 | header_data->SetBranchAddress("xpos", &evtheader.xpos); |
||
| 343 | header_data->GetEntry(0); |
||
| 344 | header_data->SetBranchAddress("ypos", &evtheader.ypos); |
||
| 345 | header_data->GetEntry(0); |
||
| 346 | header_data->SetBranchAddress("zpos", &evtheader.zpos); |
||
| 347 | header_data->GetEntry(0); |
||
| 348 | header_data->SetBranchAddress("temperature", &evtheader.temperature); |
||
| 349 | header_data->GetEntry(0); |
||
| 350 | if( header_data->FindBranch("angle") ) |
||
| 351 | { |
||
| 352 | header_data->SetBranchAddress("angle", &evtheader.angle); |
||
| 353 | header_data->GetEntry(0); |
||
| 354 | } |
||
| 355 | header_data->SetBranchAddress("laserinfo", &evtheader.laserinfo); |
||
| 356 | header_data->GetEntry(0); |
||
| 357 | |||
| 358 | GetTime(evtheader.timestamp, cTemp); |
||
| 359 | |||
| 360 | timeEditDisplay->widgetTE->SetText(cTemp); |
||
| 361 | if(!biasEdit->widgetChBox[0]->IsDown()) |
||
| 362 | biasEdit->widgetNE[0]->SetNumber(evtheader.biasvolt); |
||
| 363 | if(!xPosEdit->widgetChBox[0]->IsDown()) |
||
| 364 | xPosEdit->widgetNE[0]->SetNumber(evtheader.xpos); |
||
| 365 | if(!yPosEdit->widgetChBox[0]->IsDown()) |
||
| 366 | yPosEdit->widgetNE[0]->SetNumber(evtheader.ypos); |
||
| 367 | if(!zPosEdit->widgetChBox[0]->IsDown()) |
||
| 368 | zPosEdit->widgetNE[0]->SetNumber(evtheader.zpos); |
||
| 369 | if(!tempEdit->widgetChBox[0]->IsDown()) |
||
| 370 | tempEdit->widgetNE[0]->SetNumber(evtheader.temperature); |
||
| 371 | if(!angleEdit->widgetChBox[0]->IsDown()) |
||
| 372 | { |
||
| 373 | if( header_data->FindBranch("angle") ) |
||
| 374 | tempEdit->widgetNE[0]->SetNumber(evtheader.angle); |
||
| 375 | else |
||
| 376 | tempEdit->widgetNE[0]->SetNumber(0.); |
||
| 377 | } |
||
| 378 | if(!laserEdit->widgetChBox[0]->IsDown()) |
||
| 379 | laserEdit->widgetTE->SetText(evtheader.laserinfo); |
||
| 380 | |||
| 381 | delete header_data; |
||
| 382 | delete inroot; |
||
| 383 | } |
||
| 384 | |||
| 385 | void TGAppMainFrame::HeaderChange(char *histfile, bool *changetype) |
||
| 386 | { |
||
| 387 | int scopeTemp; |
||
| 388 | |||
| 389 | if(DBGSIG) |
||
| 390 | printf("HeaderChange(): Selected file: %s\n", histfile); |
||
| 391 | |||
| 392 | // Preparing input file and the temporary output file |
||
| 393 | inroot = TFile::Open(histfile, "READ"); |
||
| 394 | |||
| 395 | scopeTemp = inroot->GetListOfKeys()->Contains("scope_data"); |
||
| 396 | |||
| 397 | char outname[256]; |
||
| 398 | sprintf(outname, "%s/results/temp.root", rootdir); |
||
| 399 | outroot = TFile::Open(outname, "RECREATE"); |
||
| 400 | |||
| 401 | // Tree structure of input file and output file |
||
| 402 | TTree *header_data, *meas_data, *scope_data; |
||
| 403 | |||
| 404 | printf("%d\n", inroot->GetListOfKeys()->Contains("header_data")); |
||
| 405 | printf("%d\n", inroot->GetListOfKeys()->Contains("meas_data")); |
||
| 406 | printf("%d\n", scopeTemp); |
||
| 407 | |||
| 408 | TTree *new_meas_data, *new_scope_data; |
||
| 409 | inroot->GetObject("header_data", header_data); |
||
| 410 | inroot->GetObject("meas_data", meas_data); |
||
| 411 | new_meas_data = meas_data->CloneTree(); |
||
| 412 | //TTree *new_scope_data; |
||
| 413 | if(scopeTemp) |
||
| 414 | { |
||
| 415 | inroot->GetObject("scope_data", scope_data); |
||
| 416 | new_scope_data = scope_data->CloneTree(); |
||
| 417 | } |
||
| 418 | else |
||
| 419 | printf("No scope_data header found.\n"); |
||
| 420 | |||
| 421 | // Save branches from the old header to temporary variables |
||
| 422 | header_data->SetBranchAddress("nrch", &evtheader.nrch); |
||
| 423 | header_data->GetEntry(0); |
||
| 424 | header_data->SetBranchAddress("timestamp", &evtheader.timestamp); |
||
| 425 | header_data->GetEntry(0); |
||
| 426 | header_data->SetBranchAddress("biasvolt", &evtheader.biasvolt); |
||
| 427 | header_data->GetEntry(0); |
||
| 428 | header_data->SetBranchAddress("xpos", &evtheader.xpos); |
||
| 429 | header_data->GetEntry(0); |
||
| 430 | header_data->SetBranchAddress("ypos", &evtheader.ypos); |
||
| 431 | header_data->GetEntry(0); |
||
| 432 | header_data->SetBranchAddress("zpos", &evtheader.zpos); |
||
| 433 | header_data->GetEntry(0); |
||
| 434 | header_data->SetBranchAddress("temperature", &evtheader.temperature); |
||
| 435 | header_data->GetEntry(0); |
||
| 436 | if( header_data->FindBranch("angle") ) |
||
| 437 | { |
||
| 438 | header_data->SetBranchAddress("angle", &evtheader.angle); |
||
| 439 | header_data->GetEntry(0); |
||
| 440 | } |
||
| 441 | header_data->SetBranchAddress("laserinfo", &evtheader.laserinfo); |
||
| 442 | header_data->GetEntry(0); |
||
| 443 | |||
| 444 | int itemp[5] = {0,0,0,0,0}; |
||
| 445 | double dtemp[3] = {0.,0.,0.}; |
||
| 446 | char ctemp[256]; |
||
| 447 | |||
| 448 | itemp[0] = evtheader.nrch; |
||
| 449 | itemp[1] = evtheader.timestamp; |
||
| 450 | itemp[2] = evtheader.xpos; |
||
| 451 | itemp[3] = evtheader.ypos; |
||
| 452 | itemp[4] = evtheader.zpos; |
||
| 453 | dtemp[0] = evtheader.biasvolt; |
||
| 454 | dtemp[1] = evtheader.temperature; |
||
| 455 | if( header_data->FindBranch("angle") ) |
||
| 456 | dtemp[2] = evtheader.angle; |
||
| 457 | else |
||
| 458 | dtemp[2] = 0.; |
||
| 459 | sprintf(ctemp, "%s", evtheader.laserinfo); |
||
| 460 | |||
| 461 | delete header_data; |
||
| 462 | delete meas_data; |
||
| 463 | if(scopeTemp) |
||
| 464 | delete scope_data; |
||
| 465 | delete inroot; |
||
| 466 | |||
| 167 | f9daq | 467 | //printf("HeaderChange(): 6\n"); |
| 146 | f9daq | 468 | // Prepare branches for the new header |
| 469 | TTree *new_header_data = new TTree("header_data", "Header information for the measurement."); |
||
| 470 | new_header_data->Branch("nrch", &evtheader.nrch, "nrch/I"); |
||
| 471 | new_header_data->Branch("timestamp", &evtheader.timestamp, "timestamp/I"); |
||
| 472 | new_header_data->Branch("biasvolt", &evtheader.biasvolt, "biasvolt/D"); |
||
| 473 | new_header_data->Branch("xpos", &evtheader.xpos, "xpos/I"); |
||
| 474 | new_header_data->Branch("ypos", &evtheader.ypos, "ypos/I"); |
||
| 475 | new_header_data->Branch("zpos", &evtheader.zpos, "zpos/I"); |
||
| 476 | new_header_data->Branch("temperature", &evtheader.temperature, "temperature/D"); |
||
| 477 | new_header_data->Branch("angle", &evtheader.angle, "temperature/D"); |
||
| 478 | new_header_data->Branch("laserinfo", &evtheader.laserinfo, "laserinfo/C"); |
||
| 479 | |||
| 167 | f9daq | 480 | //printf("HeaderChange(): 7\n"); |
| 146 | f9daq | 481 | // Save new values (and old ones where we don't want to edit anything) |
| 482 | evtheader.nrch = itemp[0]; |
||
| 483 | evtheader.timestamp = itemp[1]; |
||
| 484 | // Bias voltage |
||
| 485 | if(changetype[0]) |
||
| 486 | evtheader.biasvolt = (double)biasEdit->widgetNE[0]->GetNumber(); |
||
| 487 | else |
||
| 488 | evtheader.biasvolt = dtemp[0]; |
||
| 489 | // X pos |
||
| 490 | if(changetype[1]) |
||
| 491 | evtheader.xpos = (int)xPosEdit->widgetNE[0]->GetNumber(); |
||
| 492 | else |
||
| 493 | evtheader.xpos = itemp[2]; |
||
| 494 | // Y pos |
||
| 495 | if(changetype[2]) |
||
| 496 | evtheader.ypos = (int)yPosEdit->widgetNE[0]->GetNumber(); |
||
| 497 | else |
||
| 498 | evtheader.ypos = itemp[3]; |
||
| 499 | // Z pos |
||
| 500 | if(changetype[3]) |
||
| 501 | evtheader.zpos = (int)zPosEdit->widgetNE[0]->GetNumber(); |
||
| 502 | else |
||
| 503 | evtheader.zpos = itemp[4]; |
||
| 504 | // Temperature |
||
| 505 | if(changetype[4]) |
||
| 506 | evtheader.temperature = (double)tempEdit->widgetNE[0]->GetNumber(); |
||
| 507 | else |
||
| 508 | evtheader.temperature = dtemp[1]; |
||
| 509 | // Angle |
||
| 510 | if(changetype[5]) |
||
| 511 | evtheader.angle = (double)angleEdit->widgetNE[0]->GetNumber(); |
||
| 512 | else |
||
| 513 | evtheader.angle = dtemp[2]; |
||
| 514 | // Laser info |
||
| 515 | if(changetype[6]) |
||
| 516 | sprintf(evtheader.laserinfo, "%s", laserEdit->widgetTE->GetText()); |
||
| 517 | else |
||
| 518 | sprintf(evtheader.laserinfo, "%s", ctemp); |
||
| 519 | |||
| 167 | f9daq | 520 | //printf("HeaderChange(): 8\n"); |
| 146 | f9daq | 521 | new_header_data->Fill(); |
| 522 | |||
| 523 | // Write down the temporary output file |
||
| 524 | new_header_data->Write(); |
||
| 525 | new_meas_data->Write(); |
||
| 526 | if(scopeTemp) |
||
| 527 | new_scope_data->Write(); |
||
| 528 | |||
| 167 | f9daq | 529 | //printf("HeaderChange(): 9\n"); |
| 146 | f9daq | 530 | delete new_header_data; |
| 531 | delete new_meas_data; |
||
| 532 | if(scopeTemp) |
||
| 533 | delete new_scope_data; |
||
| 534 | delete outroot; |
||
| 535 | |||
| 536 | // Replace the original file with temporary output file (and delete temporary file) |
||
| 537 | sprintf(outname, "cp -f %s/results/temp.root %s", rootdir, histfile); |
||
| 538 | system(outname); |
||
| 539 | sprintf(outname, "rm -f %s/results/temp.root", rootdir); |
||
| 540 | system(outname); |
||
| 541 | |||
| 542 | printf("Edited header in file: %s\n", histfile); |
||
| 543 | } |
||
| 544 | |||
| 545 | void TGAppMainFrame::CloseEditTab(int tabval) |
||
| 546 | { |
||
| 547 | int curtab = (int)TMath::Floor(tabval/100.); |
||
| 548 | int oldtab = tabval - curtab*100; |
||
| 549 | |||
| 550 | if(DBGSIG > 1) printf("CloseEditTab(): New tab = %d, old tab = %d\n", curtab, oldtab); |
||
| 551 | |||
| 552 | fTab->RemoveTab(curtab); |
||
| 553 | |||
| 554 | delete editList; |
||
| 555 | delete timeEditDisplay; |
||
| 556 | delete biasEdit; |
||
| 557 | delete xPosEdit; |
||
| 558 | delete yPosEdit; |
||
| 559 | delete zPosEdit; |
||
| 560 | delete tempEdit; |
||
| 561 | delete angleEdit; |
||
| 562 | delete laserEdit; |
||
| 563 | delete editHead; |
||
| 564 | delete selectWarn; |
||
| 565 | |||
| 566 | for(int i = 0; i < fTab->GetNumberOfTabs(); i++) |
||
| 567 | if(DBGSIG > 1) printf("CloseEditTab(): Name of tab (%d) = %s\n", i, fTab->GetTabTab(i)->GetString() ); |
||
| 568 | |||
| 569 | fTab->SetTab(oldtab); |
||
| 570 | } |
||
| 571 | |||
| 572 | // Edit file window --------------------------------------------------- |
||
| 573 | |||
| 574 | // Temporary analysis window ------------------------------------------ |
||
| 575 | |||
| 576 | // Open a new tab for editing datafile headers |
||
| 577 | void TGAppMainFrame::TempAnalysisTab(TGTab *mainTab, bool create, int *tabid, int analtype) |
||
| 578 | { |
||
| 579 | if(create) |
||
| 580 | { |
||
| 581 | TGCompositeFrame *fH1, *fV1; |
||
| 582 | TGHorizontalFrame *fTitle; |
||
| 583 | TGGroupFrame *fG1; |
||
| 584 | TGLabel *lab; |
||
| 585 | |||
| 586 | int startTab = mainTab->GetCurrent(); |
||
| 587 | int newTab = mainTab->GetNumberOfTabs(); |
||
| 588 | if(DBGSIG > 1) printf("TempAnalysisTab(): Current tab = %d, Nr. of tabs = %d\n", startTab, newTab ); |
||
| 589 | |||
| 590 | double numform[6]; |
||
| 172 | f9daq | 591 | double numform2[6]; |
| 146 | f9daq | 592 | |
| 593 | int subgroup[2]; |
||
| 594 | subgroup[0] = mainTab->GetWidth()-10; |
||
| 595 | subgroup[1] = mainTab->GetHeight()-10; |
||
| 596 | |||
| 597 | TGCompositeFrame *fT1; |
||
| 598 | fT1 = fTab->AddTab("Analysis edit"); |
||
| 599 | |||
| 600 | // Title label |
||
| 601 | fTitle = new TGHorizontalFrame(fT1, 100, 25, kFixedHeight | kSunkenFrame); |
||
| 602 | TGTitleLabel(fT1, fTitle, "Analysis edit", (Pixel_t)FORECOLOR, (Pixel_t)BACKCOLOR, FONT); |
||
| 603 | fT1->AddFrame(fTitle, new TGLayoutHints(kLHintsExpandX | kLHintsTop)); |
||
| 604 | |||
| 605 | fV1 = new TGCompositeFrame(fT1, subgroup[0], subgroup[1], kVerticalFrame); |
||
| 606 | // Temporary analysis canvas |
||
| 607 | if( (analTab->GetCurrent() == 3) || ((analTab->GetCurrent() == 0) && (intSpect->widgetChBox[0]->IsDown() || intSpect->widgetChBox[1]->IsDown())) ) |
||
| 608 | { |
||
| 609 | tempAnalysisCanvas = new TRootEmbeddedCanvas("tempAnalysisCanvas",fV1,subgroup[1],5*subgroup[1]/6); |
||
| 610 | fV1->AddFrame(tempAnalysisCanvas, f0centerX); |
||
| 611 | } |
||
| 612 | else |
||
| 613 | { |
||
| 614 | tempAnalysisCanvas = new TRootEmbeddedCanvas("tempAnalysisCanvas",fV1,3*subgroup[0]/4,3*subgroup[1]/4); |
||
| 615 | fV1->AddFrame(tempAnalysisCanvas, f1expandXpad); |
||
| 616 | } |
||
| 617 | tempAnalysisCanvas->GetCanvas()->SetGrid(); |
||
| 618 | |||
| 172 | f9daq | 619 | // Specific options for plotting (analtype: 0 = Normal integration, 1 = Edge scans, 2 = Relative PDE, 3 = Breakdown voltage, 4 = Surface scan, 5 = Timing,...) |
| 146 | f9daq | 620 | // Normal integration |
| 621 | if(analtype == 0) |
||
| 622 | { |
||
| 623 | } |
||
| 624 | // Edge scans |
||
| 625 | else if(analtype == 1) |
||
| 626 | { |
||
| 627 | } |
||
| 628 | // Relative PDE |
||
| 629 | else if(analtype == 2) |
||
| 630 | { |
||
| 631 | // Running average offset |
||
| 632 | if(DBGSIG > 1) printf("TempAnalysisTab(): Creating TSubStructure *runningOff -> Set running average offset.\n"); |
||
| 633 | runningOff = new TSubStructure(); |
||
| 634 | for(int i = 0; i < 6; i++) numform[i] = 0; |
||
| 635 | numform[0] = 5; numform[2] = 2; |
||
| 636 | if(runningOff->TGLabelNEntry(fV1, subgroup[0]/2-24, 30, "Running average offset:", 0, numform, "center")) |
||
| 637 | fV1->AddFrame(runningOff->outsidebox, f1expandXpad); |
||
| 638 | |||
| 639 | // Running average setting for plot |
||
| 640 | if(DBGSIG > 1) printf("TempAnalysisTab(): Creating TSubStructure *runningAver -> Produce running average of a graph.\n"); |
||
| 641 | runningAver = new TSubStructure(); |
||
| 642 | for(int i = 0; i < 6; i++) numform[i] = 0; |
||
| 643 | numform[0] = 5; numform[2] = 2; |
||
| 644 | if(runningAver->TGLabelNEntry(fV1, subgroup[0]/2-24, 30, "Running average type (0 to disable):", 0, numform, "center")) |
||
| 645 | fV1->AddFrame(runningAver->outsidebox, f1expandXpad); |
||
| 646 | |||
| 647 | // Putting a second y-axis to the plot for mean number of photons histogram |
||
| 648 | if(DBGSIG > 1) printf("TempAnalysisTab(): Creating TSubStructure *secondAxis -> Create second y-axis for mean number of photons.\n"); |
||
| 649 | secondAxis = new TSubStructure(); |
||
| 650 | for(int i = 0; i < 6; i++) numform[i] = 0; |
||
| 651 | numform[0] = 5; numform[1] = 1; numform[2] = 2; |
||
| 652 | if(secondAxis->TGLabelNEntry(fV1, subgroup[0]/2-24, 30, "Scale second axis:", 0, numform, "center")) |
||
| 653 | fV1->AddFrame(secondAxis->outsidebox, f1expandXpad); |
||
| 654 | |||
| 655 | runningAver->widgetNE[0]->Connect("ValueSet(Long_t)", "TGAppMainFrame", this, "ApplyRunningAver()"); |
||
| 656 | runningOff->widgetNE[0]->Connect("ValueSet(Long_t)", "TGAppMainFrame", this, "ApplyRunningAver()"); |
||
| 172 | f9daq | 657 | |
| 658 | ToolTipSetRelativePDE(); |
||
| 146 | f9daq | 659 | } |
| 172 | f9daq | 660 | // Breakdown voltage |
| 661 | else if(analtype == 3) |
||
| 662 | { |
||
| 663 | } |
||
| 664 | // Surface scan |
||
| 665 | else if(analtype == 4) |
||
| 666 | { |
||
| 667 | fH1 = new TGCompositeFrame(fV1, subgroup[0], subgroup[1], kHorizontalFrame); |
||
| 146 | f9daq | 668 | |
| 172 | f9daq | 669 | // Values to create a crop of the graph |
| 670 | if(DBGSIG > 1) printf("TempAnalysisTab(): Creating TSubStructure *xCrop -> Set how many X parts of the surface scan to crop.\n"); |
||
| 671 | xCrop = new TSubStructure(); |
||
| 672 | for(int i = 0; i < 6; i++) { numform[i] = 0; numform2[i] = 0; } |
||
| 673 | if(posUnitsPlot->widgetCB->GetSelected() == 0) { numform[0] = 8; numform[2] = 2; numform2[0] = 8; numform2[2] = 2; } |
||
| 674 | else if(posUnitsPlot->widgetCB->GetSelected() == 1) { numform[0] = 8; numform[1] = 2; numform[2] = 2; numform2[0] = 8; numform2[1] = 2; numform2[2] = 2; } |
||
| 675 | if(xCrop->TGLabelDoubleNEntry(fH1, subgroup[0]/4-50, 30, "X axis crop values:", 0, numform, 0, numform2, "center")) |
||
| 676 | fH1->AddFrame(xCrop->outsidebox, f1expandXpad); |
||
| 677 | |||
| 678 | if(DBGSIG > 1) printf("TempAnalysisTab(): Creating TSubStructure *yCrop -> Set how many Y parts of the surface scan to crop.\n"); |
||
| 679 | yCrop = new TSubStructure(); |
||
| 680 | for(int i = 0; i < 6; i++) { numform[i] = 0; numform2[i] = 0; } |
||
| 681 | if(posUnitsPlot->widgetCB->GetSelected() == 0) { numform[0] = 8; numform[2] = 2; numform2[0] = 8; numform2[2] = 2; } |
||
| 682 | else if(posUnitsPlot->widgetCB->GetSelected() == 1) { numform[0] = 8; numform[1] = 2; numform[2] = 2; numform2[0] = 8; numform2[1] = 2; numform2[2] = 2; } |
||
| 683 | if(yCrop->TGLabelDoubleNEntry(fH1, subgroup[0]/4-50, 30, "Y axis crop values:", 0, numform, 0, numform2, "center")) |
||
| 684 | fH1->AddFrame(yCrop->outsidebox, f1expandXpad); |
||
| 685 | |||
| 686 | if(DBGSIG > 1) printf("TempAnalysisTab(): Creating TSubStructure *interpolSize -> Set the interpolation step size of the 2D graph.\n"); |
||
| 687 | interpolSize = new TSubStructure(); |
||
| 688 | for(int i = 0; i < 6; i++) { numform[i] = 0; numform2[i] = 0; } |
||
| 689 | if(posUnitsPlot->widgetCB->GetSelected() == 0) { numform[0] = 8; numform[2] = 2; numform2[0] = 8; numform2[2] = 2; } |
||
| 690 | else if(posUnitsPlot->widgetCB->GetSelected() == 1) { numform[0] = 8; numform[1] = 2; numform[2] = 2; numform2[0] = 8; numform2[1] = 2; numform2[2] = 2; } |
||
| 691 | if(interpolSize->TGLabelDoubleNEntry(fH1, subgroup[0]/4+20, 30, "Interpol. step size:", 500, numform, 500, numform2, "center")) |
||
| 692 | fH1->AddFrame(interpolSize->outsidebox, f1expandXpad); |
||
| 693 | |||
| 694 | if(DBGSIG > 1) printf("TempAnalysisTab(): Creating TSubStructure *updateCrop -> 2 buttons for either updating the crop or making an integral\n"); |
||
| 695 | updateCrop = new TSubStructure(); |
||
| 696 | const char *selnames[512] = {"Update","Integrate surface scan"}; |
||
| 697 | if(updateCrop->TGMultiButton(fH1, subgroup[0]/4-50, 30, 2, selnames, "center")) |
||
| 698 | fH1->AddFrame(updateCrop->outsidebox, f1expandXpad); |
||
| 699 | |||
| 700 | fV1->AddFrame(fH1, f1expandXpad); |
||
| 701 | |||
| 702 | updateCrop->widgetTB[0]->Connect("Clicked()", "TGAppMainFrame", this, "UpdateIntegrateSurface(=0)"); |
||
| 703 | updateCrop->widgetTB[1]->Connect("Clicked()", "TGAppMainFrame", this, "UpdateIntegrateSurface(=1)"); |
||
| 704 | |||
| 705 | ToolTipSetSurfaceScan(); |
||
| 706 | } |
||
| 707 | |||
| 146 | f9daq | 708 | // Export and close buttons |
| 709 | if(DBGSIG > 1) printf("TempAnalysisTab(): Creating TSubStructure *exportExitAnalysis -> 2 buttons for either exporting the plot or closing the tab\n"); |
||
| 710 | exportExitAnalysis = new TSubStructure(); |
||
| 711 | const char *selnames[512] = {"Export","Close"}; |
||
| 712 | if(exportExitAnalysis->TGMultiButton(fV1, subgroup[0]/2, 30, 2, selnames, "center")) |
||
| 713 | fV1->AddFrame(exportExitAnalysis->outsidebox, f1expandXpad); |
||
| 714 | |||
| 715 | // Actions for header editor |
||
| 716 | char cTemp[512]; |
||
| 167 | f9daq | 717 | exportExitAnalysis->widgetTB[0]->Connect("Clicked()", "TGAppMainFrame", this, "ExportTempAnalysisPlot()"); |
| 146 | f9daq | 718 | sprintf(cTemp, "CloseTempAnalysisTab(=%d)", newTab*100+startTab); |
| 719 | exportExitAnalysis->widgetTB[1]->Connect("Clicked()", "TGAppMainFrame", this, cTemp); |
||
| 720 | |||
| 721 | fT1->AddFrame(fV1, f1expand2d); |
||
| 722 | |||
| 723 | fMain->MapSubwindows(); |
||
| 724 | fMain->MapWindow(); |
||
| 725 | fMain->Layout(); |
||
| 726 | |||
| 172 | f9daq | 727 | ToolTipSetTempAnalysis(); |
| 728 | |||
| 146 | f9daq | 729 | // Set tab ID |
| 730 | *tabid = newTab; |
||
| 731 | |||
| 732 | if(DBGSIG > 1) |
||
| 733 | { |
||
| 734 | printf("TempAnalysisTab(): New tab objects (Temporary Analysis Header)\n"); |
||
| 735 | gObjectTable->Print(); |
||
| 736 | } |
||
| 737 | } |
||
| 738 | else |
||
| 739 | { |
||
| 740 | // Switch to new tab |
||
| 741 | fTab->SetTab(*tabid); |
||
| 742 | } |
||
| 743 | } |
||
| 744 | |||
| 745 | void TGAppMainFrame::CloseTempAnalysisTab(int tabval) |
||
| 746 | { |
||
| 747 | int curtab = (int)TMath::Floor(tabval/100.); |
||
| 748 | int oldtab = tabval - curtab*100; |
||
| 749 | |||
| 750 | if(DBGSIG > 1) printf("CloseTempAnalysisTab(): New tab = %d, old tab = %d\n", curtab, oldtab); |
||
| 751 | |||
| 752 | fTab->RemoveTab(curtab); |
||
| 753 | |||
| 754 | delete tempAnalysisCanvas; |
||
| 755 | delete exportExitAnalysis; |
||
| 756 | |||
| 757 | for(int i = 0; i < fTab->GetNumberOfTabs(); i++) |
||
| 758 | if(DBGSIG > 1) printf("CloseTempAnalysisTab(): Name of tab (%d) = %s\n", i, fTab->GetTabTab(i)->GetString() ); |
||
| 759 | |||
| 760 | fTab->SetTab(oldtab); |
||
| 761 | } |
||
| 762 | |||
| 763 | void TGAppMainFrame::ApplyRunningAver() |
||
| 764 | { |
||
| 765 | TCanvas *gCanvas = tempAnalysisCanvas->GetCanvas(); |
||
| 766 | TList *funcList = (TList*)gCanvas->GetListOfPrimitives(); |
||
| 767 | unsigned int nrfunc = funcList->GetSize(); |
||
| 768 | TGraph *baseGr; |
||
| 769 | char funcname[512]; |
||
| 770 | int runav = runningAver->widgetNE[0]->GetNumber(); |
||
| 771 | int offx = runningOff->widgetNE[0]->GetNumber(); |
||
| 772 | |||
| 773 | if(runav == 0) // If running average is disabled, don't update the plot |
||
| 774 | return; |
||
| 775 | |||
| 776 | for(int i = 0; i < nrfunc; i++) |
||
| 777 | { |
||
| 778 | sprintf(funcname, "%s", funcList->At(i)->GetName()); |
||
| 779 | if(DBGSIG) printf("ApplyRunningAver(): Function is: %s\n", funcname); |
||
| 780 | |||
| 781 | if(strcmp(funcname,"runaver") == 0) |
||
| 782 | { |
||
| 783 | gCanvas->GetPrimitive(funcname)->Delete(); |
||
| 784 | gCanvas->Modified(); |
||
| 785 | gCanvas->Update(); |
||
| 786 | } |
||
| 787 | else if(strcmp(funcname,"pde") == 0) |
||
| 788 | { |
||
| 789 | baseGr = (TGraph*)gCanvas->GetPrimitive(funcname); |
||
| 790 | int nrpoints = baseGr->GetN(); |
||
| 791 | TGraph *runaver = new TGraph((int)(nrpoints-2*offx)/runav); |
||
| 792 | runaver->SetName("runaver"); |
||
| 793 | runaver->SetFillColor(1); |
||
| 794 | runaver->SetLineColor(kBlack); |
||
| 795 | runaver->SetLineWidth(2); |
||
| 796 | runaver->SetMarkerColor(kBlack); |
||
| 797 | int nr = 0, j = 0; |
||
| 798 | double averx = 0, avery = 0; |
||
| 799 | double *xval, *yval; |
||
| 800 | xval = new double[runav]; |
||
| 801 | yval = new double[runav]; |
||
| 802 | while(1) |
||
| 803 | { |
||
| 804 | if((nr == (int)nrpoints/runav) || (runav*nr+j+offx > nrpoints-offx)) break; |
||
| 805 | baseGr->GetPoint(runav*nr+j+offx,xval[j],yval[j]); |
||
| 806 | if(DBGSIG) printf("ApplyRunningAver(): j = %d: X = %lf, Y = %lf\n", j, xval[j], yval[j]); |
||
| 807 | averx += xval[j]; |
||
| 808 | avery += yval[j]; |
||
| 809 | j++; |
||
| 810 | if((j == runav) && (runav*nr+j+offx <= nrpoints-offx)) |
||
| 811 | { |
||
| 812 | runaver->SetPoint(nr,averx/runav,avery/runav); |
||
| 813 | if(DBGSIG) printf("ApplyRunningAver(): \t%d: averX = %lf, averY = %lf\n", nr, averx/runav, avery/runav); |
||
| 814 | nr++; |
||
| 815 | averx = 0; |
||
| 816 | avery = 0; |
||
| 817 | j = 0; |
||
| 818 | } |
||
| 819 | } |
||
| 820 | gCanvas->cd(); |
||
| 821 | runaver->Draw("l same"); |
||
| 822 | gCanvas->Modified(); |
||
| 823 | gCanvas->Update(); |
||
| 824 | delete[] xval; |
||
| 825 | delete[] yval; |
||
| 826 | } |
||
| 827 | } |
||
| 828 | } |
||
| 829 | |||
| 172 | f9daq | 830 | void TGAppMainFrame::UpdateIntegrateSurface(int val) |
| 831 | { |
||
| 832 | TCanvas *gCanvas = tempAnalysisCanvas->GetCanvas(); |
||
| 833 | TList *funcList = (TList*)gCanvas->GetListOfPrimitives(); |
||
| 834 | unsigned int nrfunc = funcList->GetSize(); |
||
| 835 | TGraph2D *baseGr; |
||
| 836 | char funcname[512]; |
||
| 837 | |||
| 838 | double integralValue; |
||
| 839 | int pointCount; |
||
| 840 | double xStepsize, yStepsize; |
||
| 841 | int xInterpol, yInterpol; |
||
| 842 | |||
| 843 | for(int i = 0; i < nrfunc; i++) |
||
| 844 | { |
||
| 845 | sprintf(funcname, "%s", funcList->At(i)->GetName()); |
||
| 846 | if(DBGSIG) printf("UpdateIntegrateSurface(): Function is: %s\n", funcname); |
||
| 847 | |||
| 848 | if(strcmp(funcname,"surfscan") == 0) |
||
| 849 | { |
||
| 850 | baseGr = (TGraph2D*)gCanvas->GetPrimitive(funcname); |
||
| 851 | |||
| 852 | // Just set the initial things for the surface scan |
||
| 853 | if(val == -1) |
||
| 854 | { |
||
| 855 | xCrop->widgetNE[0]->SetNumber(baseGr->GetXaxis()->GetXmin()); |
||
| 856 | xCrop->widgetNE[1]->SetNumber(baseGr->GetXaxis()->GetXmax()); |
||
| 857 | yCrop->widgetNE[0]->SetNumber(baseGr->GetYaxis()->GetXmin()); |
||
| 858 | yCrop->widgetNE[1]->SetNumber(baseGr->GetYaxis()->GetXmax()); |
||
| 859 | |||
| 860 | xCrop->widgetNE[0]->SetLimits(TGNumberFormat::kNELLimitMinMax, baseGr->GetXaxis()->GetXmin(), baseGr->GetXaxis()->GetXmax()); |
||
| 861 | xCrop->widgetNE[1]->SetLimits(TGNumberFormat::kNELLimitMinMax, baseGr->GetXaxis()->GetXmin(), baseGr->GetXaxis()->GetXmax()); |
||
| 862 | yCrop->widgetNE[0]->SetLimits(TGNumberFormat::kNELLimitMinMax, baseGr->GetYaxis()->GetXmin(), baseGr->GetYaxis()->GetXmax()); |
||
| 863 | yCrop->widgetNE[1]->SetLimits(TGNumberFormat::kNELLimitMinMax, baseGr->GetYaxis()->GetXmin(), baseGr->GetYaxis()->GetXmax()); |
||
| 864 | } |
||
| 865 | // Update the cropping |
||
| 866 | else if(val == 0) |
||
| 867 | { |
||
| 868 | baseGr->GetXaxis()->SetRange(xCrop->widgetNE[0]->GetNumber(), xCrop->widgetNE[1]->GetNumber()); |
||
| 869 | baseGr->GetXaxis()->SetRangeUser(xCrop->widgetNE[0]->GetNumber(), xCrop->widgetNE[1]->GetNumber()); |
||
| 870 | baseGr->GetYaxis()->SetRange(yCrop->widgetNE[0]->GetNumber(), yCrop->widgetNE[1]->GetNumber()); |
||
| 871 | baseGr->GetYaxis()->SetRangeUser(yCrop->widgetNE[0]->GetNumber(), yCrop->widgetNE[1]->GetNumber()); |
||
| 872 | |||
| 873 | gCanvas->Modified(); |
||
| 874 | gCanvas->Update(); |
||
| 875 | } |
||
| 876 | // Make an integral over all histogram values in range |
||
| 877 | else if(val == 1) |
||
| 878 | { |
||
| 879 | integralValue = 0; |
||
| 880 | pointCount = 0; |
||
| 881 | |||
| 882 | xStepsize = interpolSize->widgetNE[0]->GetNumber(); |
||
| 883 | yStepsize = interpolSize->widgetNE[1]->GetNumber(); |
||
| 884 | xInterpol = (int)((xCrop->widgetNE[1]->GetNumber() - xCrop->widgetNE[0]->GetNumber())/xStepsize); |
||
| 885 | yInterpol = (int)((yCrop->widgetNE[1]->GetNumber() - yCrop->widgetNE[0]->GetNumber())/yStepsize); |
||
| 886 | |||
| 887 | for(int j = 0; j < xInterpol; j++) |
||
| 888 | { |
||
| 889 | for(int k = 0; k < yInterpol; k++) |
||
| 890 | { |
||
| 891 | if((xCrop->widgetNE[0]->GetNumber()+j*xStepsize+xStepsize/2. <= xCrop->widgetNE[1]->GetNumber()) && (yCrop->widgetNE[0]->GetNumber()+k*yStepsize+yStepsize/2. <= yCrop->widgetNE[1]->GetNumber())) |
||
| 892 | { |
||
| 893 | if(DBGSIG) cout << "Interpolation at (" << xCrop->widgetNE[0]->GetNumber()+j*xStepsize+xStepsize/2. << "," << yCrop->widgetNE[0]->GetNumber()+k*yStepsize+yStepsize/2. << ") is " << baseGr->Interpolate(xCrop->widgetNE[0]->GetNumber()+j*xStepsize+xStepsize/2., yCrop->widgetNE[0]->GetNumber()+k*yStepsize+yStepsize/2.) << endl; |
||
| 894 | integralValue += baseGr->Interpolate(xCrop->widgetNE[0]->GetNumber()+j*xStepsize+xStepsize/2., yCrop->widgetNE[0]->GetNumber()+k*yStepsize+yStepsize/2.); |
||
| 895 | pointCount++; |
||
| 896 | } |
||
| 897 | } |
||
| 898 | } |
||
| 899 | |||
| 900 | cout << "Total integral value (" << pointCount << " points) = " << integralValue << endl << "Total normated integral value = " << (double)integralValue/pointCount << endl; |
||
| 901 | |||
| 902 | } |
||
| 903 | } |
||
| 904 | } |
||
| 905 | } |
||
| 906 | |||
| 167 | f9daq | 907 | void TGAppMainFrame::ExportTempAnalysisPlot() |
| 908 | { |
||
| 909 | TCanvas *gCanvas = tempAnalysisCanvas->GetCanvas(); |
||
| 910 | |||
| 911 | TGFileInfo file_info; |
||
| 912 | const char *filetypes[] = {"PDF","*.pdf","Encapsulated PostScript (.eps)","*.eps", "JPG/JPEG", "*.jpg", "PNG", "*.png",0,0}; |
||
| 913 | char *cTemp; |
||
| 914 | file_info.fFileTypes = filetypes; |
||
| 915 | cTemp = new char[1024]; |
||
| 916 | // sprintf(cTemp, "%s/results", rootdir); |
||
| 917 | // file_info.fIniDir = StrDup(cTemp); |
||
| 172 | f9daq | 918 | file_info.fIniDir = StrDup(currentAnalDir); |
| 167 | f9daq | 919 | new TGFileDialog(gClient->GetDefaultRoot(), fMain, kFDSave, &file_info); |
| 920 | delete[] cTemp; |
||
| 921 | |||
| 922 | if(file_info.fFilename != NULL) |
||
| 923 | gCanvas->SaveAs(file_info.fFilename); |
||
| 924 | } |
||
| 925 | |||
| 146 | f9daq | 926 | // Temporary analysis window ------------------------------------------ |