Changeset 10117 for fact/FADctrl
- Timestamp:
- 01/24/11 16:48:50 (14 years ago)
- Location:
- fact/FADctrl
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
fact/FADctrl/FAD.cc
r10114 r10117 37 37 //{"rmode", &FAD::cmd_rmode, 0, "<first|stop>", "Readout start at first bin or stop position (DRS4)"}, 38 38 //{"dmode", &FAD::cmd_dmode, 0, "<single|continuous>", "Domino wave single shot or continuous"}, 39 {" cancel", &FAD::cmd_cancel, false, 0, "", "Cancelcurrent operation/run"},39 {"stop", &FAD::cmd_stop, false, 0, "", "Stop current operation/run"}, 40 40 {"update", &FAD::cmd_update, false, 1, "<sec>", "Minimum delay between updates to DIM event service"}, 41 41 {"socketmode", &FAD::cmd_socketmode, true, 1, "<com|daq>", "Choose which Sockets are used for data transmission"}, … … 167 167 // Check if idle mode required 168 168 if (CommandList[i].NeedIdle && Mode != idle) { 169 PrintMessage("Current mode is not idle (' cancel' will stop current operation)\n");169 PrintMessage("Current mode is not idle ('stop' will stop current operation)\n"); 170 170 return; 171 171 } … … 285 285 if (Match(Parameter[1],"enable")) PrintMessage("all active boards accept now incoming triggers\n"); 286 286 else if (Match(Parameter[1],"disable")) PrintMessage("no active board accepts any incoming trigger anymore.\n"); 287 // else PrintUsage();288 289 290 287 } 291 288 … … 483 480 void FAD::cmd_acalib() { 484 481 485 pthread_t Thread; 486 int Code, Count; 482 int Count; 487 483 FILE *File; 488 484 vector<string> Items; … … 495 491 496 492 // Read calibration data from file? 497 if (Parameter.size() == 2 && !ConvertToInt(Parameter[1], &NumCalibEvents)) { 493 //if (Parameter.size() == 2 && !ConvertToInt(Parameter[1], &NumCalibEvents)) { 494 if (Parameter.size() == 2 && !ConvertToInt(Parameter[1], &NumEventsRequested)) { 498 495 // Open file 499 496 if ((File = fopen(Parameter[1].c_str(), "r")) == NULL) { … … 546 543 547 544 // Set number of events required for calibration 548 if (Parameter.size()==1 || !ConvertToInt(Parameter[1], &Num CalibEvents) || NumCalibEvents<=0) {549 Num CalibEvents= DEFAULT_NUM_CALIB_EVENTS;550 } 551 552 // S et mode before launching thread545 if (Parameter.size()==1 || !ConvertToInt(Parameter[1], &NumEventsRequested) || NumEventsRequested<=0) { 546 NumEventsRequested = DEFAULT_NUM_CALIB_EVENTS; 547 } 548 549 // Start ca;ibration by setting mode 553 550 Mode = acalib; 554 Cancel = false;555 556 // Create detached thread557 if ((Code = pthread_create(&Thread, NULL, (void * (*)(void *)) FAD::LaunchAmplitudeCalibration,(void *) this)) != 0) {558 Message(ERROR, "pthread_create() failed in FAD::cmd_acalib() (%s)\n", strerror(Code));559 Mode = idle;560 return;561 }562 563 if ((Code = pthread_detach(Thread)) != 0) {564 Message(ERROR, "pthread_detach() failed in FAD::cmd_acalib() (%s)\n", strerror(Code));565 }566 551 } 567 552 … … 590 575 if (Boards[i]->Active) PrintMessage(" %d", i); 591 576 } 577 578 // Current mode 579 if (Mode == idle) PrintMessage("Current mode is IDLE\n"); 580 else if (Mode == acalib) PrintMessage("Current mode is ACALIB (3x%d events)\n", NumEventsRequested); 581 else if (Mode == datarun) PrintMessage("Current mode is DATARUN (%d events requested, %d events taken)\n", NumEventsRequested, NumEvents); 582 592 583 return; 593 584 } … … 711 702 // Cancel current operation 712 703 // 713 void FAD::cmd_ cancel() {704 void FAD::cmd_stop() { 714 705 715 706 static char Stop[] = "stop"; 716 707 717 if (Mode == idle) PrintMessage("Nothing to cancel\n"); 718 else { 708 if (Mode == idle) { 709 PrintMessage("Nothing to stop\n"); 710 return; 711 } 712 713 if (Mode == acalib) Mode = idle; 714 715 if (Mode == datarun) { 719 716 // Inform event thread to stop run in case datarun active 720 717 if (write(Pipe[1], Stop, strlen(Stop)+1) == -1) { 721 718 Message(ERROR, "write() to Pipe[1] failed in FAD::cmd_cancel() (%s)", strerror(errno)); 722 719 } 723 Cancel = true;724 PrintMessage("Requested cancelation of current operation\n");725 }720 } 721 722 PrintMessage("Requested stopping of current operation\n"); 726 723 } 727 724 … … 741 738 742 739 // 743 // Amplitude calibration (lauched as thread by cmd_acalib()) 744 // 745 void FAD::AmplitudeCalibration() { 746 747 vector<struct FADBoard::BoardStatus> Status; 748 vector<unsigned short> ROICmd; 749 unsigned short DACCmd[] = {htons(CMD_Write | (BADDR_DAC + 1)), 0, htons(CMD_Write | (BADDR_DAC + 2)), 0, htons(CMD_Write | (BADDR_DAC + 3)), 0}; 750 751 PrintMessage("Staring amplitude calibration of all active boards (%d events)\n" 752 " Note: No input signals must be connected\n", NumCalibEvents); 753 754 // Prepare command to set all ROIs to 1024 755 for (unsigned int i=0; i<NChips*NChannels; i++) { 756 ROICmd.push_back(htons(CMD_Write | (BADDR_ROI + i))); 757 ROICmd.push_back(htons(NBins)); 758 } 759 760 // ====== Part A: Baseline measurement ===== 761 762 // Initialise settings for baseline measurement 763 for (unsigned int Brd=0; Brd<Boards.size(); Brd++) { 764 765 // Invalidate current calibration 766 Boards[Brd]->ACalibTime = -1; 767 768 // Save initial board status 769 Status.push_back(Boards[Brd]->GetStatus()); 770 771 // Set all ROI to 1024 772 Boards[Brd]->Send(&ROICmd[0], ROICmd.size()*sizeof(unsigned short)); 773 774 // Set DAC values and start accumulation 775 DACCmd[1] = htons(0); 776 DACCmd[3] = htons(0); 777 DACCmd[5] = htons(0); 778 Boards[Brd]->Send(DACCmd, sizeof(DACCmd)); 779 780 Boards[Brd]->AccumulateSum(NumCalibEvents, true); 781 } 782 783 // Wait until data for all boards taken 784 bool Done = false; 785 while (!Done && !Cancel) { 786 usleep(300000); 787 for (unsigned int Brd=0; Brd<Boards.size(); Brd++) { 788 Done = true; 789 if (Boards[Brd]->Active && Boards[Brd]->DoSum) Done = false; 790 } 791 } 792 793 // Determine baseline 794 for (unsigned int Brd=0; Brd<Boards.size(); Brd++) { 795 for (unsigned int i=0; i<NChips; i++) for (unsigned int j=0; j<NChannels; j++) { 796 for (unsigned int k=0; k<NBins; k++) { 797 Boards[Brd]->Baseline[i][j][k] = Boards[Brd]->Sum[i][j][k] / NumCalibEvents; 798 } 799 } 800 } 801 PrintMessage("Baseline measurement finished, next is gain measurement\n"); 802 803 // ====== Part B: Gain measurement ===== 804 805 // Set new DAC values and start accumulation 806 for (unsigned int Brd=0; Brd<Boards.size(); Brd++) { 807 DACCmd[1] = htons(50000); 808 DACCmd[3] = htons(50000); 809 DACCmd[5] = htons(50000); 810 Boards[Brd]->Send(DACCmd, sizeof(DACCmd)); 811 812 Boards[Brd]->AccumulateSum(NumCalibEvents, true); 813 } 814 815 // Wait until data for all boards taken 816 Done = false; 817 while (!Done && !Cancel) { 818 usleep(300000); 819 for (unsigned int Brd=0; Brd<Boards.size(); Brd++) { 820 Done = true; 821 if (Boards[Brd]->Active && Boards[Brd]->DoSum) Done = false; 822 } 823 } 824 825 // Determine gain 826 for (unsigned int Brd=0; Brd<Boards.size(); Brd++) { 827 for (unsigned int i=0; i<NChips; i++) for (unsigned int j=0; j<NChannels; j++) { 828 for (unsigned int k=0; k<NBins; k++) { 829 Boards[Brd]->Gain[i][j][k] = (Boards[Brd]->Sum[i][j][k] / NumCalibEvents)-Boards[Brd]->Baseline[i][j][k]; 830 } 831 } 832 } 833 PrintMessage("Gain measurement finished, next is secondary calibration\n"); 834 835 // ====== Part C: Secondary calibration ===== 836 837 // Initialise settings for secondary calibration and start accumulation 838 for (unsigned int Brd=0; Brd<Boards.size(); Brd++) { 839 DACCmd[1] = htons(0); 840 DACCmd[3] = htons(0); 841 DACCmd[5] = htons(0); 842 Boards[Brd]->Send(DACCmd, sizeof(DACCmd)); 843 844 Boards[Brd]->AccumulateSum(NumCalibEvents, false); 845 } 846 847 // Wait until data for all boards taken 848 Done = false; 849 while (!Done && !Cancel) { 850 usleep(300000); 851 for (unsigned int Brd=0; Brd<Boards.size(); Brd++) { 852 Done = true; 853 if (Boards[Brd]->Active && Boards[Brd]->DoSum) Done = false; 854 } 855 } 856 857 // Determine secondary calibration 858 for (unsigned int Brd=0; Brd<Boards.size(); Brd++) { 859 for (unsigned int i=0; i<NChips; i++) for (unsigned int j=0; j<NChannels; j++) { 860 for (unsigned int k=0; k<NBins; k++) { 861 Boards[Brd]->SecondaryBaseline[i][j][k] = Boards[Brd]->Sum[i][j][k] / (double) NumCalibEvents; 862 } 863 } 864 } 865 866 // ===== Part D: Finish calibration ===== 867 868 // Write back original ROI and DAC settings 869 for (unsigned int Brd=0; Brd<Boards.size(); Brd++) { 870 871 // Determine gain 872 for (unsigned int i=0; i<NChips; i++) for (unsigned int j=0; j<NChannels; j++) { 873 for (unsigned int k=0; k<NBins; k++) { 874 Boards[Brd]->Gain[i][j][k] = (Boards[Brd]->Sum[i][j][k] / NumCalibEvents)-Boards[Brd]->Baseline[i][j][k]; 875 } 876 } 877 878 ROICmd.clear(); 879 for (unsigned int i=0; i<NChips*NChannels; i++) { 880 ROICmd.push_back(htons(CMD_Write | (BADDR_ROI + i))); 881 ROICmd.push_back(htons(Status[Brd].ROI[i/NChannels][i%NChannels])); 882 } 883 Boards[Brd]->Send(&ROICmd[0], ROICmd.size()*sizeof(unsigned short)); 884 885 DACCmd[1] = htons(Status[Brd].DAC[1]); 886 DACCmd[3] = htons(Status[Brd].DAC[2]); 887 DACCmd[5] = htons(Status[Brd].DAC[3]); 888 Boards[Brd]->Send(DACCmd, sizeof(DACCmd)); 889 890 // Store calibration time and temperature 891 Boards[Brd]->ACalibTime = Cancel ? -1 : time(NULL); 892 Boards[Brd]->ACalibTemp = 0; 893 for (unsigned int i=0; i<NTemp; i++) Boards[Brd]->ACalibTemp += Status[Brd].Temp[i] / NTemp; 894 } 895 896 Mode = idle; 897 898 if (Cancel) { 899 PrintMessage("Amplitude calibration cancelled\n"); 900 return; 901 } 902 740 // Save amplitude calibration data to file 741 // 742 void FAD::SaveAmplitudeCalibration() { 743 903 744 PrintMessage("Amplitude calibration of all active boards finished, original ROI and DAC set\n"); 904 745 … … 942 783 } 943 784 944 // Launch read thread inside class945 void FAD::LaunchAmplitudeCalibration(class FAD *m) {946 947 m->AmplitudeCalibration();948 }949 950 951 785 // 952 786 // Event thread (publishes/writes M0 format) … … 958 792 struct FADBoard::BoardStatus S; 959 793 vector<unsigned long> EventNumbers(Boards.size()); 794 vector<bool> AcalibDone(Boards.size()); 960 795 double Temp; 961 796 string IDString; … … 1012 847 IDString = string(Buffer, Ret); 1013 848 849 // If amplitude calibration mode, check if board finished procedure 850 if (Mode == acalib) { 851 bool Done = true; 852 for (unsigned int i=0; i<Boards.size(); i++) { 853 if (IDString.find(string("ACALIBDONE")+Boards[i]->Name) != string::npos) AcalibDone[i] = true; 854 if (!AcalibDone[i]) Done = false; 855 } 856 // Amplitude calibration finished? 857 if (Done) { 858 SaveAmplitudeCalibration(); 859 Mode = idle; 860 } 861 } 862 else for (unsigned int i=0; i<Boards.size(); i++) AcalibDone[i] = false; 863 1014 864 // Update run and event header with current time 1015 865 gettimeofday(&Time, NULL); … … 1053 903 for (unsigned int Brd=0; Brd<Boards.size(); Brd++) { 1054 904 // Identify board 1055 if (IDString.find( Boards[Brd]->Name) == string::npos) continue;905 if (IDString.find(string("EVENT")+Boards[Brd]->Name) == string::npos) continue; 1056 906 1057 907 // Fill M0 BoardStructure … … 1140 990 NumEvents++; 1141 991 FileSize += EventSize-Offset; 1142 1143 printf("Wrote event %d\n", NumEvents-1);1144 992 } 1145 993 -
fact/FADctrl/FAD.h
r10114 r10117 24 24 const char CALIB_DIRECTORY[] = "~/"; 25 25 26 enum ModeType {idle, datarun, acalib};27 26 28 27 class FAD: public EvidenceServer { 29 28 29 public: 30 enum ModeType {idle, datarun, acalib}; 31 ModeType Mode; 32 33 private: 30 34 pthread_t MainThread; 31 35 DimCommand *Command; … … 33 37 char *ConsoleText; 34 38 std::vector<std::string> Parameter; 35 ModeType Mode;36 volatile bool Cancel;37 39 void PrintUsage(); 38 40 void commandHandler(); 39 41 bool Match(std::string, const char *); 40 void AmplitudeCalibration();41 static void LaunchAmplitudeCalibration(class FAD *);42 42 void EventThread(); 43 43 static void LaunchEventThread(class FAD *); … … 47 47 int Datafile; 48 48 int NumEvents; // Number of event taken 49 int NumEventsRequested; // Number of events requested50 int NumCalibEvents;51 49 52 50 std::vector<std::string> BoardList; … … 76 74 void cmd_roi(); void cmd_address(); 77 75 void cmd_phase(); void cmd_send(); 78 void cmd_ cancel(); void cmd_update();76 void cmd_stop(); void cmd_update(); 79 77 void cmd_take(); 80 78 … … 82 80 void DisableDomino(); 83 81 void SoftTrigger(); 84 void SetDOMINOMode(int);85 void SetDOMINOReadMode(int);86 void SetDOMINOWaveMode(int);87 bool ReadCalibration();82 //void SetDOMINOMode(int); 83 //void SetDOMINOReadMode(int); 84 //void SetDOMINOWaveMode(int); 85 void SaveAmplitudeCalibration(); 88 86 void PrintMessage(const char*, ...); 89 87 90 88 int Pipe[2]; 89 int NumEventsRequested; // Number of events requested 91 90 }; 92 91 -
fact/FADctrl/FADBoard.cc
r10114 r10117 173 173 } 174 174 175 // 176 // Initiate average 177 // 178 void FADBoard::AccumulateSum(unsigned int n, bool Rotate) { 179 180 if (!Active) return; 175 176 // 177 // Perform amplitude calibration in steps 178 // 179 void FADBoard::AmplitudeCalibration() { 180 181 enum StateType {wait, init, baseline, gain, secondary}; 182 183 static struct BoardStatus InitialStatus; 184 static vector<unsigned short> ROICmd; 185 static unsigned short DACCmd[] = {htons(CMD_Write | (BADDR_DAC + 1)), 0, htons(CMD_Write | (BADDR_DAC + 2)), 0, htons(CMD_Write | (BADDR_DAC + 3)), 0}; 186 static StateType State = wait; 187 static int Count = 0; 188 189 // Check if mode is amplitude calibration 190 if (m->Mode != m->acalib) { 191 State = init; 192 return; 193 } 194 195 switch (State) { 196 // ====== Part A: Initialization ===== 197 case init: 198 // Invalidate current calibration 199 ACalibTime = -1; 200 201 // Save initial board status, set all ROIs to 1024 and set DAC values 202 InitialStatus = GetStatus(); 203 204 for (unsigned int i=0; i<NChips*NChannels; i++) { 205 ROICmd.push_back(htons(CMD_Write | (BADDR_ROI + i))); 206 ROICmd.push_back(htons(NBins)); 207 } 208 Send(&ROICmd[0], ROICmd.size()*sizeof(unsigned short)); 209 210 DACCmd[1] = htons(0); 211 DACCmd[3] = htons(0); 212 DACCmd[5] = htons(0); 213 Send(DACCmd, sizeof(DACCmd)); 214 215 // Clear sum vector and set state to accumulate 216 memset(Sum, 0, sizeof(Sum)); 217 State = baseline; 218 break; 219 220 // ====== Part B: Baseline calibration ===== 221 case baseline: 222 for (unsigned int Chip=0; Chip<NChips; Chip++) { 223 for (unsigned int Chan=0; Chan<NChannels; Chan++) { 224 for (int i=0; i<Status.ROI[Chip][Chan]; i++) { 225 Sum[Chip][Chan][(i+Status.TriggerCell[Chip]) % NBins] += Data[Chip][Chan][i]; 226 } 227 } 228 } 229 Count++; 230 231 // Determine baseline if integration finished 232 if (Count == m->NumEventsRequested) { 233 for (unsigned int i=0; i<NChips; i++) { 234 for (unsigned int j=0; j<NChannels; j++) { 235 for (unsigned int k=0; k<NBins; k++) { 236 Baseline[i][j][k] = Sum[i][j][k] / m->NumEventsRequested; 237 } 238 } 239 } 240 241 // Set new DAC values and start accumulation 242 DACCmd[1] = htons(50000); 243 DACCmd[3] = htons(50000); 244 DACCmd[5] = htons(50000); 245 Send(DACCmd, sizeof(DACCmd)); 246 247 // Clear sum vector and set state to accumulate 248 memset(Sum, 0, sizeof(Sum)); 249 Count = 0; 250 State = gain; 251 } 252 break; 253 254 // ====== Part C: Gain calibration ===== 255 case gain: 256 for (unsigned int Chip=0; Chip<NChips; Chip++) { 257 for (unsigned int Chan=0; Chan<NChannels; Chan++) { 258 for (int i=0; i<Status.ROI[Chip][Chan]; i++) { 259 Sum[Chip][Chan][(i+Status.TriggerCell[Chip]) % NBins] += Data[Chip][Chan][i]; 260 } 261 } 262 } 263 Count++; 264 265 // Determine gain if integration finished 266 if (Count == m->NumEventsRequested) { 267 for (unsigned int i=0; i<NChips; i++) { 268 for (unsigned int j=0; j<NChannels; j++) { 269 for (unsigned int k=0; k<NBins; k++) { 270 Gain[i][j][k] = (Sum[i][j][k] / m->NumEventsRequested) - Baseline[i][j][k]; 271 } 272 } 273 } 274 275 // Set new DAC values and start accumulation 276 DACCmd[1] = htons(0); 277 DACCmd[3] = htons(0); 278 DACCmd[5] = htons(0); 279 Send(DACCmd, sizeof(DACCmd)); 280 281 // Clear sum vector and set state to accumulate 282 memset(Sum, 0, sizeof(Sum)); 283 Count = 0; 284 State = secondary; 285 } 286 break; 287 288 // ====== Part D: Secondary calibration ===== 289 case secondary: 290 for (unsigned int Chip=0; Chip<NChips; Chip++) { 291 for (unsigned int Chan=0; Chan<NChannels; Chan++) { 292 for (int i=0; i<Status.ROI[Chip][Chan]; i++) { 293 Sum[Chip][Chan][i] = Data[Chip][Chan][i] - Baseline[Chip][Chan][(i-Status.TriggerCell[Chip]) % NBins]; 294 } 295 } 296 } 297 Count++; 298 299 // Determine secondary baseline if integration finished 300 if (Count == m->NumEventsRequested) { 301 for (unsigned int i=0; i<NChips; i++) { 302 for (unsigned int j=0; j<NChannels; j++) { 303 for (unsigned int k=0; k<NBins; k++) { 304 SecondaryBaseline[i][j][k] = Sum[i][j][k] / (double) m->NumEventsRequested; 305 } 306 } 307 } 308 309 // Write back original ROI and DAC settings 310 ROICmd.clear(); 311 for (unsigned int i=0; i<NChips*NChannels; i++) { 312 ROICmd.push_back(htons(CMD_Write | (BADDR_ROI + i))); 313 ROICmd.push_back(htons(InitialStatus.ROI[i/NChannels][i%NChannels])); 314 } 315 Send(&ROICmd[0], ROICmd.size()*sizeof(unsigned short)); 316 317 DACCmd[1] = htons(InitialStatus.DAC[1]); 318 DACCmd[3] = htons(InitialStatus.DAC[2]); 319 DACCmd[5] = htons(InitialStatus.DAC[3]); 320 Send(DACCmd, sizeof(DACCmd)); 321 322 // Store calibration time and temperature 323 ACalibTime = time(NULL); 324 ACalibTemp = 0; 325 for (unsigned int i=0; i<NTemp; i++) ACalibTemp += Status.Temp[i] / NTemp; 326 327 // Inform event thread that calibration is finished 328 string Message = string("ACALIBDONE")+Name; 329 if (write(m->Pipe[1], Message.data(), Message.size()) == -1) { 330 m->Message(m->ERROR, "write() to Pipe[1] failed in class FADBoard::AmplitudeCalibration (%s)", strerror(errno)); 331 } 332 333 State = wait; 334 } 335 break; 336 337 // ====== Wait for Mode not being acalib ===== 338 case wait: 339 if (m->Mode != m->acalib) State = init; 340 break; 341 } 342 } 181 343 182 Lock();183 SumPhysPipeline = Rotate;184 memset(Sum, 0, sizeof(Sum));185 NumForSum = n;186 DoSum = true;187 Unlock();188 }189 190 191 344 // 192 345 // Read data from board … … 305 458 } 306 459 307 // If requested for calibration, add rotated data for later averaging 308 if (DoSum && NumForSum>0) { 309 for (unsigned int Chip=0; Chip<NChips; Chip++) for (unsigned int Chan=0; Chan<NChannels; Chan++) { 310 for (int i=0; i<Status.ROI[Chip][Chan]; i++) { 311 if (SumPhysPipeline) Sum[Chip][Chan][(i+Status.TriggerCell[Chip]) % NBins] += Data[Chip][Chan][i]; 312 else Sum[Chip][Chan][i] = Data[Chip][Chan][i]-Baseline[Chip][Chan][(i-Status.TriggerCell[Chip]) % NBins]; 313 } 314 } 315 NumForSum--; 316 if (NumForSum == 0) DoSum = false; 317 } 318 460 // Prepare predicate for condition variable 319 461 Continue = false; 320 462 Unlock(); 321 463 464 // Amplitude calibration (will check if Mode is acalib) 465 AmplitudeCalibration(); 466 322 467 // Update DIM services if necessary 323 468 if (memcmp(PrevStatus.Temp, Status.Temp, sizeof(Status.Temp)) != 0) { … … 337 482 338 483 // Inform event thread of new data 339 if (write(m->Pipe[1], Name, strlen(Name)+1) == -1) { 484 string Message = string("EVENT")+Name; 485 if (write(m->Pipe[1], Message.data(), Message.size()) == -1) { 340 486 m->Message(m->ERROR, "write() to Pipe[1] failed in class FADBoard (%s)", strerror(errno)); 341 487 m->ExitRequest = true; -
fact/FADctrl/FADBoard.h
r10114 r10117 53 53 54 54 short Data[NChips][NChannels][NBins]; 55 long int Sum[NChips][NChannels][NBins]; 55 56 short Baseline[NChips][NChannels][NBins]; 56 57 double Gain[NChips][NChannels][NBins]; … … 59 60 time_t ACalibTime; 60 61 61 long int Sum[NChips][NChannels][NBins];62 unsigned int NumForSum;63 bool DoSum;64 bool SumPhysPipeline;65 62 66 63 void Send(const void *, size_t); 67 64 void Send(unsigned short); 68 65 struct BoardStatus GetStatus(); 69 void A ccumulateSum(unsigned int, bool);66 void AmplitudeCalibration(); 70 67 void Lock(); 71 68 void Unlock(); -
fact/FADctrl/History.txt
r10114 r10117 7 7 21/1/2011 DIM event thread now informed through pipe of new data 8 8 23/1/2011 Data can be written to disk in M0 format 9 24/1/2011 Integrated amplitude calibration into FADBoard class
Note:
See TracChangeset
for help on using the changeset viewer.