/* * qTabDataOutput.cpp * * Created on: May 10, 2012 * Author: l_maliakal_d */ /********************************************************************** * ********************************************************************/ #include "qTabDataOutput.h" // Project Class Headers #include "slsDetector.h" #include "multiSlsDetector.h" // Qt Include Headers #include #include // C++ Include Headers #include #include using namespace std; //------------------------------------------------------------------------------------------------------------------------------------------------- qTabDataOutput::qTabDataOutput(QWidget *parent,multiSlsDetector*& detector): QWidget(parent),myDet(detector){ setupUi(this); SetupWidgetWindow(); Refresh(); } //------------------------------------------------------------------------------------------------------------------------------------------------- qTabDataOutput::~qTabDataOutput(){ delete myDet; } //------------------------------------------------------------------------------------------------------------------------------------------------- void qTabDataOutput::SetupWidgetWindow(){ // Detector Type detType=myDet->getDetectorsType(); widgetEiger->setVisible(false); //rate correction - not for charge integrating detectors if((detType == slsDetectorDefs::MYTHEN)||(detType == slsDetectorDefs::EIGER)) chkRate->setEnabled(true); if((detType == slsDetectorDefs::MYTHEN)||(detType == slsDetectorDefs::GOTTHARD)) chkAngular->setEnabled(true); if(detType == slsDetectorDefs::EIGER){ chkRate->setEnabled(true); chkTenGiga->setEnabled(true); widgetEiger->setVisible(true); } /** error message **/ red = QPalette(); red.setColor(QPalette::Active,QPalette::WindowText,Qt::red); black = QPalette(); black.setColor(QPalette::Active,QPalette::WindowText,Qt::black); red1 = new QPalette(); red1->setColor(QPalette::Text,Qt::red); black1 = new QPalette(); black1->setColor(QPalette::Text,Qt::black); flatFieldTip = dispFlatField->toolTip(); errFlatFieldTip = QString("Flat field corrections.
" " #flatfield# filename

")+ QString("" "Enter a valid file to enable Flat Field."); outDirTip = lblOutputDir->toolTip(); //not used at all, later used for gappixels chkUnused->setEnabled(false); //enabling file format depending on detector type SetupFileFormat(); Initialization(); disconnect(comboDetector, SIGNAL(currentIndexChanged(int)), this, SLOT(GetOutputDir())); PopulateDetectors(); connect(comboDetector, SIGNAL(currentIndexChanged(int)), this, SLOT(GetOutputDir())); //flat field correction from server #ifdef VERBOSE cout << "Getting flat field" << endl; #endif UpdateFlatFieldFromServer(); //rate correction - not for charge integrating detectors if((detType == slsDetectorDefs::MYTHEN)||(detType == slsDetectorDefs::EIGER)){ #ifdef VERBOSE cout << "Getting rate correction" << endl; #endif UpdateRateCorrectionFromServer(); } //update angular conversion from server if((detType == slsDetectorDefs::MYTHEN)||(detType == slsDetectorDefs::GOTTHARD)){ #ifdef VERBOSE cout << "Getting angular conversion" << endl; #endif int ang; if(myDet->getAngularConversion(ang)) chkAngular->setChecked(true); emit AngularConversionSignal(chkAngular->isChecked()); } //discard bad channels from server #ifdef VERBOSE cout << "Getting bad channel correction:" << myDet->getBadChannelCorrection() << endl; #endif disconnect(chkDiscardBad, SIGNAL(toggled(bool))); if(myDet->getBadChannelCorrection()) chkDiscardBad->setChecked(true); else chkDiscardBad->setChecked(false); connect(chkDiscardBad, SIGNAL(toggled(bool)), this, SLOT(DiscardBadChannels())); /* if(detType == slsDetectorDefs::MYTHEN){ comboDetector->hide(); } */ qDefs::checkErrorMessage(myDet,"qTabDataOutput::SetupWidgetWindow"); } //------------------------------------------------------------------------------------------------------------------------------------------------- void qTabDataOutput::Initialization(){ //output dir connect(comboDetector, SIGNAL(currentIndexChanged(int)), this, SLOT(GetOutputDir())); connect(dispOutputDir, SIGNAL(editingFinished()), this, SLOT(SetOutputDir())); //overwrite enable connect(chkOverwriteEnable, SIGNAL(toggled(bool)), this, SLOT(SetOverwriteEnable(bool))); //file format connect(comboFileFormat, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFileFormat(int))); connect(btnOutputBrowse, SIGNAL(clicked()), this, SLOT(BrowseOutputDir())); //flat field correction connect(chkFlatField, SIGNAL(toggled(bool)), this, SLOT(SetFlatField())); connect(btnFlatField, SIGNAL(clicked()), this, SLOT(BrowseFlatFieldPath())); //rate correction connect(chkRate, SIGNAL(toggled(bool)), this, SLOT(SetRateCorrection())); connect(btnDefaultRate, SIGNAL(clicked()), this, SLOT(SetDefaultRateCorrection())); connect(spinDeadTime, SIGNAL(editingFinished()), this, SLOT(SetRateCorrection())); //angular correction connect(chkAngular, SIGNAL(toggled(bool)), this, SLOT(SetAngularCorrection())); //discard bad channels connect(chkDiscardBad, SIGNAL(toggled(bool)), this, SLOT(DiscardBadChannels())); //10GbE connect(chkTenGiga, SIGNAL(toggled(bool)), this, SLOT(EnableTenGigabitEthernet(bool))); //eiger if(widgetEiger->isVisible()){ //speed connect(comboEigerClkDivider,SIGNAL(currentIndexChanged(int)), this, SLOT(SetSpeed())); //flags connect(comboEigerFlags1, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFlags())); connect(comboEigerFlags2, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFlags())); } } //------------------------------------------------------------------------------------------------------------------------------------------------- void qTabDataOutput::BrowseOutputDir() { QString directory = QFileDialog::getExistingDirectory(this,tr("Choose Output Directory "),dispOutputDir->text()); if (!directory.isEmpty()) dispOutputDir->setText(directory); SetOutputDir(); } //------------------------------------------------------------------------------------------------------------------------------------------------- void qTabDataOutput::SetFlatField(){ #ifdef VERYVERBOSE cout << "Entering Set Flat Field Correction Function" << endl; #endif // so that it doesnt call it twice disconnect(dispFlatField, SIGNAL(editingFinished()), this, SLOT(SetFlatField())); //enable/disable dispFlatField->setEnabled(chkFlatField->isChecked()); btnFlatField->setEnabled(chkFlatField->isChecked()); if(chkFlatField->isChecked()){ if(dispFlatField->text().isEmpty()){ chkFlatField->setToolTip(errFlatFieldTip); dispFlatField->setToolTip(errFlatFieldTip); chkFlatField->setPalette(red); chkFlatField->setText("Flat Field File:*"); #ifdef VERBOSE cout << "Flat Field File is not set." << endl; #endif }else{ QString fName = dispFlatField->text(); QString file = fName.section('/',-1); QString dir = fName.section('/',0,-2,QString::SectionIncludeLeadingSep); chkFlatField->setToolTip(flatFieldTip); dispFlatField->setToolTip(flatFieldTip); chkFlatField->setPalette(chkDiscardBad->palette()); chkFlatField->setText("Flat Field File:"); //set ff dir myDet->setFlatFieldCorrectionDir(dir.toAscii().constData()); //set ff file and catch error if -1 if(myDet->setFlatFieldCorrectionFile(file.toAscii().constData())<0){ string sDir = dir.toAscii().constData(),sFile = file.toAscii().constData(); if(sDir.length()<1) {sDir = string(QDir::current().absolutePath().toAscii().constData()); /*"/home/";*/} qDefs::Message(qDefs::WARNING,"Invalid Flat Field file: "+sDir+"/"+sFile+ ".\nUnsetting Flat Field.","qTabDataOutput::SetFlatField"); //Unsetting flat field myDet->setFlatFieldCorrectionFile(""); dispFlatField->setText(""); chkFlatField->setToolTip(errFlatFieldTip); dispFlatField->setToolTip(errFlatFieldTip); chkFlatField->setPalette(red); chkFlatField->setText("Flat Field File:*"); #ifdef VERBOSE cout << "Invalid Flat Field File - "<< sDir << sFile << ". Unsetting Flat Field." << endl; #endif } else{ #ifdef VERBOSE cout << "Setting flat field file to "<< dispFlatField->text().toAscii().constData() << endl; #endif } } }else{ chkFlatField->setToolTip(flatFieldTip); dispFlatField->setToolTip(flatFieldTip); chkFlatField->setPalette(chkDiscardBad->palette()); chkFlatField->setText("Flat Field File:"); //Unsetting flat field myDet->setFlatFieldCorrectionFile(""); dispFlatField->setText(""); #ifdef VERBOSE cout << "Unsetting flat field correction file" << endl; #endif } connect(dispFlatField,SIGNAL(editingFinished()),this,SLOT(SetFlatField())); qDefs::checkErrorMessage(myDet,"qTabDataOutput::SetFlatField"); } //------------------------------------------------------------------------------------------------------------------------------------------------- void qTabDataOutput::UpdateFlatFieldFromServer(){ disconnect(dispFlatField, SIGNAL(editingFinished()), this, SLOT(SetFlatField())); dispFlatField->setText(QString(myDet->getFlatFieldCorrectionDir().c_str())+"/"+QString(myDet->getFlatFieldCorrectionFile().c_str())); #ifdef VERBOSE cout << "Getting flat field correction file" << dispFlatField->text().toAscii().constData() << endl; #endif //calls setflatfield to ensure the file still exists or disable it if(!QString(myDet->getFlatFieldCorrectionFile().c_str()).compare("none")){ dispFlatField->setText(""); chkFlatField->setChecked(false); #ifdef VERBOSE cout << "Flat Field is not set." << endl; #endif } else chkFlatField->setChecked(true); chkFlatField->setToolTip(flatFieldTip); dispFlatField->setToolTip(flatFieldTip); chkFlatField->setPalette(chkDiscardBad->palette()); chkFlatField->setText("Flat Field File:"); connect(dispFlatField, SIGNAL(editingFinished()), this, SLOT(SetFlatField())); qDefs::checkErrorMessage(myDet,"qTabDataOutput::UpdateFlatFieldFromServer"); } //------------------------------------------------------------------------------------------------------------------------------------------------- void qTabDataOutput::BrowseFlatFieldPath(){ QString fName = dispFlatField->text(); QString dir = fName.section('/',0,-2,QString::SectionIncludeLeadingSep); if(dir.isEmpty()) dir = QString(myDet->getFlatFieldCorrectionDir().c_str());/*"/home/";*/ fName = QFileDialog::getOpenFileName(this, tr("Load Flat Field Correction File"),dir, tr("Data Files(*.raw *.dat);; All Files (*.*)"),0,QFileDialog::ShowDirsOnly); if (!fName.isEmpty()){ dispFlatField->setText(fName); SetFlatField(); } qDefs::checkErrorMessage(myDet,"qTabDataOutput::BrowseFlatFieldPath"); } //------------------------------------------------------------------------------------------------------------------------------------------------- void qTabDataOutput::SetRateCorrection(int deadtime){ disconnect(btnDefaultRate, SIGNAL(clicked()), this, SLOT(SetDefaultRateCorrection())); disconnect(spinDeadTime, SIGNAL(editingFinished()), this, SLOT(SetRateCorrection())); #ifdef VERBOSE cout << "Entering Set Rate Correction function" << endl; #endif if(chkRate->isChecked()){ if(!btnDefaultRate->isEnabled()){ btnDefaultRate->setEnabled(true); lblDeadTime->setEnabled(true); spinDeadTime->setEnabled(true); } if(deadtime!=-1){ deadtime = (double)spinDeadTime->value(); #ifdef VERBOSE cout << "Setting rate corrections with custom dead time: " << deadtime << endl; #endif }else{; #ifdef VERBOSE cout << "Setting rate corrections with default dead time" << endl; #endif } myDet->setRateCorrection(deadtime); }//unsetting rate correction else{ btnDefaultRate->setEnabled(false); lblDeadTime->setEnabled(false); spinDeadTime->setEnabled(false); myDet->setRateCorrection(0); #ifdef VERBOSE cout << "Unsetting rate correction" << endl; #endif } qDefs::checkErrorMessage(myDet,"qTabDataOutput::SetRateCorrection"); //update just the value double rate = (double)myDet->getRateCorrectionTau(); spinDeadTime->setValue((double)rate); if(rate == -1){ qDefs::Message(qDefs::WARNING,"Dead time is inconsistent for all detectors. Returned Value: -1.","qTabDataOutput::UpdateRateCorrectionFromServer"); QString errorTip = QString("Rate Corrections.
" " #ratecorr# tau in seconds

")+ QString("" "Dead time is inconsistent for all detectors."); chkRate->setToolTip(errorTip); spinDeadTime->setToolTip(errorTip); chkRate->setPalette(red); chkRate->setText("Rate:*"); }else{ QString normalTip = QString("Rate Corrections.
" " #ratecorr# tau in seconds

"); chkRate->setToolTip(normalTip); spinDeadTime->setToolTip(normalTip); chkRate->setPalette(chkDiscardBad->palette()); chkRate->setText("Rate:"); } connect(btnDefaultRate, SIGNAL(clicked()), this, SLOT(SetDefaultRateCorrection())); connect(spinDeadTime, SIGNAL(editingFinished()), this, SLOT(SetRateCorrection())); } //------------------------------------------------------------------------------------------------------------------------------------------------- void qTabDataOutput::SetDefaultRateCorrection(){ SetRateCorrection(-1); } //------------------------------------------------------------------------------------------------------------------------------------------------- void qTabDataOutput::UpdateRateCorrectionFromServer(){ disconnect(chkRate, SIGNAL(toggled(bool)), this, SLOT(SetRateCorrection())); disconnect(btnDefaultRate, SIGNAL(clicked()), this, SLOT(SetDefaultRateCorrection())); disconnect(spinDeadTime, SIGNAL(editingFinished()), this, SLOT(SetRateCorrection())); double rate; rate = (double)myDet->getRateCorrectionTau(); qDefs::checkErrorMessage(myDet,"qTabDataOutput::UpdateRateCorrectionFromServer"); #ifdef VERBOSE cout << "Getting rate correction from server: " << rate << endl; #endif if(rate==0){ chkRate->setChecked(false); btnDefaultRate->setEnabled(false); lblDeadTime->setEnabled(false); spinDeadTime->setEnabled(false); } else{ chkRate->setChecked(true); btnDefaultRate->setEnabled(true); lblDeadTime->setEnabled(true); spinDeadTime->setEnabled(true); spinDeadTime->setValue((double)rate); } if(rate == -1){ qDefs::Message(qDefs::WARNING,"Dead time is inconsistent for all detectors. Returned Value: -1.","qTabDataOutput::UpdateRateCorrectionFromServer"); QString errorTip = QString("Rate Corrections.
" " #ratecorr# tau in seconds

")+ QString("" "Dead time is inconsistent for all detectors."); chkRate->setToolTip(errorTip); spinDeadTime->setToolTip(errorTip); chkRate->setPalette(red); chkRate->setText("Rate:*"); }else{ QString normalTip = QString("Rate Corrections.
" " #ratecorr# tau in seconds

"); chkRate->setToolTip(normalTip); spinDeadTime->setToolTip(normalTip); chkRate->setPalette(chkDiscardBad->palette()); chkRate->setText("Rate:"); } connect(chkRate, SIGNAL(toggled(bool)), this, SLOT(SetRateCorrection())); connect(btnDefaultRate, SIGNAL(clicked()), this, SLOT(SetDefaultRateCorrection())); connect(spinDeadTime, SIGNAL(editingFinished()), this, SLOT(SetRateCorrection())); } //------------------------------------------------------------------------------------------------------------------------------------------------- void qTabDataOutput::SetAngularCorrection(){ disconnect(chkAngular, SIGNAL(toggled(bool)), this, SLOT(SetAngularCorrection())); #ifdef VERYVERBOSE cout << "Entering Set Angular Correction function" << endl; #endif bool enabled = chkAngular->isChecked(); //set if(myDet->setAngularCorrectionMask(enabled) == enabled){ #ifdef VERBOSE cout << "Angular Conversion mask:" << enabled << endl; #endif } //error else{ #ifdef VERBOSE cout << "Could not set angular conversion to default" << endl; #endif qDefs::Message(qDefs::WARNING,"Angular Conversion could not be set/reset. Please set the default file name using the command line, if you want to set it.","qTabDataOutput::SetAngularCorrection"); chkAngular->setChecked(!enabled); } emit AngularConversionSignal(chkAngular->isChecked()); connect(chkAngular, SIGNAL(toggled(bool)), this, SLOT(SetAngularCorrection())); qDefs::checkErrorMessage(myDet,"qTabDataOutput::SetAngularCorrection"); } //------------------------------------------------------------------------------------------------------------------------------------------------- void qTabDataOutput::DiscardBadChannels(){ #ifdef VERBOSE cout << "Entering Discard bad channels function" << endl; #endif if(chkDiscardBad->isChecked()){ #ifdef VERBOSE cout << "Setting bad channel correction to default" << endl; #endif myDet->setBadChannelCorrection("default"); }else{ #ifdef VERBOSE cout << "Unsetting bad channel correction" << endl; #endif myDet->setBadChannelCorrection(""); } qDefs::checkErrorMessage(myDet,"qTabDataOutput::DiscardBadChannels"); } //------------------------------------------------------------------------------------------------------------------------------------------------- void qTabDataOutput::PopulateDetectors(){ #ifdef VERBOSE cout << "Populating detectors" << endl; #endif comboDetector->clear(); comboDetector->addItem("All"); lblOutputDir->setText("Path:"); //add specific detector options only if more than 1 detector if(myDet->getNumberOfDetectors()>1){ for(int i=0;igetNumberOfDetectors();i++) comboDetector->addItem(QString(myDet->getHostname(i).c_str())); } GetOutputDir(); } //------------------------------------------------------------------------------------------------------------------------------------------------- void qTabDataOutput::GetOutputDir(){ #ifdef VERBOSE cout << "Getting output directory" << endl; #endif disconnect(dispOutputDir, SIGNAL(editingFinished()), this, SLOT(SetOutputDir())); //all if(!comboDetector->currentIndex()) { dispOutputDir->setText(QString(myDet->getFilePath().c_str())); //multi file path blank means sls file paths are different if (dispOutputDir->text().isEmpty()) { qDefs::Message(qDefs::INFORMATION,"The file path for individual units are different.\n" "Hence, leaving the common field blank.","qTabDataOutput::GetOutputDir"); #ifdef VERBOSE cout << "The file path for individual units are different.\n" "Hence, leaving the common field blank." << endl; #endif QString errTip = QString("
" "Output Directory Information only: The file path for individual units are different.
" "Hence, leaving the common field blank.
"); lblOutputDir->setText("Path*:"); lblOutputDir->setPalette(red); lblOutputDir->setToolTip(errTip); btnOutputBrowse->setToolTip(errTip); dispOutputDir->setToolTip(errTip); } else { lblOutputDir->setText("Path:"); lblOutputDir->setPalette(*black1); lblOutputDir->setToolTip(outDirTip); btnOutputBrowse->setToolTip(outDirTip); dispOutputDir->setToolTip(outDirTip); } } //specific else{ slsDetector *det = myDet->getSlsDetector(comboDetector->currentIndex()-1); qDefs::checkErrorMessage(myDet,"qTabDataOutput::GetOutputDir"); dispOutputDir->setText(QString(det->getFilePath().c_str())); } connect(dispOutputDir, SIGNAL(editingFinished()), this, SLOT(SetOutputDir())); } //------------------------------------------------------------------------------------------------------------------------------------------------- int qTabDataOutput::VerifyOutputDirectory(){ #ifdef VERBOSE cout << "Verifying output directory" << endl; #endif GetOutputDir(); bool error = false; string detName = ""; string mess = ""; //common myDet->setFilePath(myDet->getFilePath()); if(!qDefs::checkErrorMessage(myDet,"qTabDataOutput::VerifyOutputDirectory").empty()) error = true; //for each detector for(int i=0;igetNumberOfDetectors();i++){ slsDetector *det = myDet->getSlsDetector(i); qDefs::checkErrorMessage(myDet,"qTabDataOutput::VerifyOutputDirectory"); detName = string("\n - ") + string(comboDetector->itemText(i+1).toAscii().constData()); det->setFilePath(det->getFilePath()); if(!qDefs::checkErrorMessage(det,"qTabDataOutput::VerifyOutputDirectory").empty()) { mess. append(detName); error = true; } } //invalid if(error){ qDefs::Message(qDefs::WARNING,string("Invalid Output Directory ")+ mess ,"qTabDataOutput::VerifyOutputDirectory"); #ifdef VERBOSE cout << "The output path doesnt exist anymore" << endl; #endif //replace all \n with
size_t pos = 0; while((pos = mess.find("\n", pos)) != string::npos){ mess.replace(pos, 1, "
"); pos += 1; } QString errTip = outDirTip + QString("
" "Invalid Output Directory") + QString(mess.c_str()) + QString( "."); lblOutputDir->setText("Path*:"); lblOutputDir->setPalette(red); lblOutputDir->setToolTip(errTip); btnOutputBrowse->setToolTip(errTip); dispOutputDir->setToolTip(errTip); return slsDetectorDefs::FAIL; } //valid else{ #ifdef VERBOSE cout << "The output pathid valid" << endl; #endif lblOutputDir->setText("Path:"); lblOutputDir->setPalette(*black1); lblOutputDir->setToolTip(outDirTip); btnOutputBrowse->setToolTip(outDirTip); dispOutputDir->setToolTip(outDirTip); } return slsDetectorDefs::OK; } //------------------------------------------------------------------------------------------------------------------------------------------------- void qTabDataOutput::SetOutputDir(){ #ifdef VERBOSE cout << "Setting output directory" << endl; #endif disconnect(dispOutputDir, SIGNAL(editingFinished()), this, SLOT(SetOutputDir())); bool error = false; QString path = dispOutputDir->text(); //empty if(path.isEmpty()) { qDefs::Message(qDefs::WARNING,"Invalid Output Path. Must not be empty.","qTabDataOutput::SetOutputDir"); #ifdef VERBOSE cout << "Invalid Output Path. Must not be empty." << endl; #endif error = true; } //gets rid of the end '/'s else if (path.endsWith('/')){ while(path.endsWith('/')) path.chop(1); dispOutputDir->setText(path); } //specific if(comboDetector->currentIndex()){ slsDetector *det = myDet->getSlsDetector(comboDetector->currentIndex()-1); qDefs::checkErrorMessage(myDet,"qTabDataOutput::SetOutputDir"); det->setFilePath(string(dispOutputDir->text().toAscii().constData())); if(!qDefs::checkErrorMessage(det,"qTabDataOutput::SetOutputDir").empty()) error = true; } //multi else{ myDet->setFilePath(string(path.toAscii().constData())); if(!qDefs::checkErrorMessage(myDet,"qTabDataOutput::SetOutputDir").empty()) error = true; } if(error){ #ifdef VERBOSE cout << "The output path could not be set" << endl; #endif QString errTip = outDirTip + QString("
" "Invalid File Path"); lblOutputDir->setText("Path*:"); lblOutputDir->setPalette(red); lblOutputDir->setToolTip(errTip); btnOutputBrowse->setToolTip(errTip); dispOutputDir->setToolTip(errTip); } else{ #ifdef VERBOSE cout << "The output path has been modified" << endl; #endif lblOutputDir->setText("Path:"); lblOutputDir->setPalette(*black1); lblOutputDir->setToolTip(outDirTip); btnOutputBrowse->setToolTip(outDirTip); dispOutputDir->setToolTip(outDirTip); } connect(dispOutputDir, SIGNAL(editingFinished()), this, SLOT(SetOutputDir())); } //------------------------------------------------------------------------------------------------------------------------------------------------- void qTabDataOutput::EnableTenGigabitEthernet(bool enable,int get){ #ifdef VERBOSE cout << endl << "Enabling/Disabling 10GbE" << endl; #endif disconnect(chkTenGiga, SIGNAL(toggled(bool)), this, SLOT(EnableTenGigabitEthernet(bool))); int ret; if(get) ret = myDet->enableTenGigabitEthernet(-1); else ret = myDet->enableTenGigabitEthernet(enable); if(ret > 0) chkTenGiga->setChecked(true); else chkTenGiga->setChecked(false); connect(chkTenGiga, SIGNAL(toggled(bool)), this, SLOT(EnableTenGigabitEthernet(bool))); qDefs::checkErrorMessage(myDet,"qTabDataOutput::EnableTenGigabitEthernet"); } //------------------------------------------------------------------------------------------------------------------------------------------------- void qTabDataOutput::SetSpeed(){ #ifdef VERBOSE cout << endl << "Setting Speed" << endl; #endif if(widgetEiger->isVisible()){ myDet->setSpeed(slsDetectorDefs::CLOCK_DIVIDER,comboEigerClkDivider->currentIndex()); qDefs::checkErrorMessage(myDet,"qTabDataOutput::SetSpeed"); UpdateSpeedFromServer(); } } //------------------------------------------------------------------------------------------------------------------------------------------------- void qTabDataOutput::SetFlags(){ #ifdef VERBOSE cout << endl << "Setting Readout Flags" << endl; #endif slsDetectorDefs::readOutFlags val = slsDetectorDefs::GET_READOUT_FLAGS; if(widgetEiger->isVisible()){ //set to continous or storeinram switch(comboEigerFlags1->currentIndex()){ case Storeinram: val = slsDetectorDefs::STORE_IN_RAM; break; default: val = slsDetectorDefs::CONTINOUS_RO; break; } myDet->setReadOutFlags(val); qDefs::checkErrorMessage(myDet,"qTabDataOutput::setFlags"); //set to parallel, nonparallel or safe switch(comboEigerFlags2->currentIndex()){ case Parallel: val = slsDetectorDefs::PARALLEL; break; case Safe: val = slsDetectorDefs::SAFE; break; default: val = slsDetectorDefs::NONPARALLEL; break; } myDet->setReadOutFlags(val); qDefs::checkErrorMessage(myDet,"qTabDataOutput::setFlags"); //update flags UpdateFlagsFromServer(); } } //------------------------------------------------------------------------------------------------------------------------------------------------- void qTabDataOutput::UpdateSpeedFromServer(){ int ret; if(widgetEiger->isVisible()){ disconnect(comboEigerClkDivider, SIGNAL(currentIndexChanged(int)), this, SLOT(SetSpeed())); //get speed ret = myDet->setSpeed(slsDetectorDefs::CLOCK_DIVIDER, -1); qDefs::checkErrorMessage(myDet,"qTabDataOutput::updateSpeedFromServer"); //valid speed if(ret >= 0 && ret < NumberofSpeeds) comboEigerClkDivider->setCurrentIndex(ret); //invalid speed else{ qDefs::Message(qDefs::WARNING,"Inconsistent value from clock divider.\n" "Setting it for all detectors involved to half speed.","qTabDataOutput::updateSpeedFromServer"); //set to default comboEigerClkDivider->setCurrentIndex(HalfSpeed); myDet->setSpeed(slsDetectorDefs::CLOCK_DIVIDER,HalfSpeed); qDefs::checkErrorMessage(myDet,"qTabDataOutput::updateSpeedFromServer"); } connect(comboEigerClkDivider, SIGNAL(currentIndexChanged(int)), this, SLOT(SetSpeed())); } } //------------------------------------------------------------------------------------------------------------------------------------------------- void qTabDataOutput::UpdateFlagsFromServer(){ int ret; if(widgetEiger->isVisible()){ disconnect(comboEigerFlags1, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFlags())); disconnect(comboEigerFlags2, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFlags())); //get speed ret = myDet->setReadOutFlags(slsDetectorDefs::GET_READOUT_FLAGS); qDefs::checkErrorMessage(myDet,"qTabDataOutput::updateFlagsFromServer"); //invalid flags if(ret==-1){ qDefs::Message(qDefs::WARNING,"Inconsistent value for readout flags.\n" "Setting it for all detectors involved to continous nonparallel mode.", "qTabDataOutput::updateFlagsFromServer"); //set to default comboEigerFlags1->setCurrentIndex(Continous); myDet->setReadOutFlags(slsDetectorDefs::CONTINOUS_RO); qDefs::checkErrorMessage(myDet,"qTabDataOutput::updateFlagsFromServer"); comboEigerFlags2->setCurrentIndex(NonParallel); myDet->setReadOutFlags(slsDetectorDefs::NONPARALLEL); qDefs::checkErrorMessage(myDet,"qTabDataOutput::updateFlagsFromServer"); } //valid flags else{ if(ret & slsDetectorDefs::STORE_IN_RAM) comboEigerFlags1->setCurrentIndex(Storeinram); else if(ret & slsDetectorDefs::CONTINOUS_RO) comboEigerFlags1->setCurrentIndex(Continous); if(ret & slsDetectorDefs::PARALLEL) comboEigerFlags2->setCurrentIndex(Parallel); else if(ret & slsDetectorDefs::NONPARALLEL) comboEigerFlags2->setCurrentIndex(NonParallel); else if(ret & slsDetectorDefs::SAFE) comboEigerFlags2->setCurrentIndex(Safe); } connect(comboEigerFlags1, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFlags())); connect(comboEigerFlags2, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFlags())); } } //------------------------------------------------------------------------------------------------------------------------------------------------- void qTabDataOutput::SetupFileFormat(){ //To be able to index items on a combo box QStandardItemModel* model = qobject_cast(comboFileFormat->model()); QModelIndex index[slsReceiverDefs::NUM_FILE_FORMATS]; QStandardItem* item[slsReceiverDefs::NUM_FILE_FORMATS]; if (model) { for(int i=0;iindex(i, comboFileFormat->modelColumn(), comboFileFormat->rootModelIndex()); item[i] = model->itemFromIndex(index[i]); } //Enabling/Disabling depending on the detector type switch(detType){ case slsDetectorDefs::MYTHEN: item[(int)slsReceiverDefs::BINARY]->setEnabled(false); item[(int)slsReceiverDefs::ASCII]->setEnabled(true); item[(int)slsReceiverDefs::HDF5]->setEnabled(false); break; case slsDetectorDefs::EIGER: case slsDetectorDefs::MOENCH: case slsDetectorDefs::PROPIX: case slsDetectorDefs::GOTTHARD: case slsDetectorDefs::JUNGFRAU: case slsDetectorDefs::JUNGFRAUCTB: item[(int)slsReceiverDefs::BINARY]->setEnabled(true); item[(int)slsReceiverDefs::ASCII]->setEnabled(false); item[(int)slsReceiverDefs::HDF5]->setEnabled(true); break; default: cout << "Unknown detector type " << endl; qDefs::Message(qDefs::CRITICAL,"Unknown detector type.","qTabDataOutput::SetupFileFormat"); exit(-1); break; } } comboFileFormat->setCurrentIndex((int)myDet->getFileFormat()); } //------------------------------------------------------------------------------------------------------------------------------------------------- void qTabDataOutput::UpdateFileFormatFromServer(){ #ifdef VERBOSE cout << endl << "Getting File Format" << endl; #endif disconnect(comboFileFormat, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFileFormat(int))); comboFileFormat->setCurrentIndex((int)myDet->getFileFormat()); connect(comboFileFormat, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFileFormat(int))); } //------------------------------------------------------------------------------------------------------------------------------------------------- void qTabDataOutput::SetFileFormat(int format){ #ifdef VERBOSE cout << endl << "Setting File Format" << endl; #endif disconnect(comboFileFormat, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFileFormat(int))); int ret = (int)myDet->setFileFormat((slsReceiverDefs::fileFormat)comboFileFormat->currentIndex()); if (ret != comboFileFormat->currentIndex()) { qDefs::Message(qDefs::WARNING,"Could not set file format.","qTabDataOutput::SetFileFormat"); comboFileFormat->setCurrentIndex((int)ret); } connect(comboFileFormat, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFileFormat(int))); } //------------------------------------------------------------------------------------------------------------------------------------------------- void qTabDataOutput::UpdateFileOverwriteFromServer(){ #ifdef VERBOSE cout << endl << "Getting File Over Write Enable" << endl; #endif disconnect(chkOverwriteEnable, SIGNAL(toggled(bool)), this, SLOT(SetOverwriteEnable(bool))); chkOverwriteEnable->setChecked(myDet->overwriteFile()); connect(chkOverwriteEnable, SIGNAL(toggled(bool)), this, SLOT(SetOverwriteEnable(bool))); } //------------------------------------------------------------------------------------------------------------------------------------------------- void qTabDataOutput::SetOverwriteEnable(bool enable){ #ifdef VERBOSE cout << endl << "Setting File Over Write Enable" << endl; #endif disconnect(chkOverwriteEnable, SIGNAL(toggled(bool)), this, SLOT(SetOverwriteEnable(bool))); int valid = (enable?1:0); if (myDet->overwriteFile(enable) != valid) qDefs::Message(qDefs::WARNING,"Could not over write enable.","qTabDataOutput::SetOverwriteEnable"); connect(chkOverwriteEnable, SIGNAL(toggled(bool)), this, SLOT(SetOverwriteEnable(bool))); UpdateFileOverwriteFromServer(); } //------------------------------------------------------------------------------------------------------------------------------------------------- void qTabDataOutput::Refresh(){ #ifdef VERBOSE cout << endl << "**Updating DataOutput Tab" << endl; #endif if (!myDet->enableWriteToFile()) boxFileWriteEnabled->setEnabled(false); else boxFileWriteEnabled->setEnabled(true); // output dir #ifdef VERBOSE cout << "Getting output directory" << endl; #endif disconnect(comboDetector, SIGNAL(currentIndexChanged(int)), this, SLOT(GetOutputDir())); PopulateDetectors(); connect(comboDetector, SIGNAL(currentIndexChanged(int)), this, SLOT(GetOutputDir())); //file format UpdateFileFormatFromServer(); //overwrite UpdateFileOverwriteFromServer(); //file name dispFileName->setText(QString(myDet->getFileName().c_str())); //flat field correction from server #ifdef VERBOSE cout << "Getting flat field" << endl; #endif UpdateFlatFieldFromServer(); //rate correction - not for charge integrating detectors if((detType == slsDetectorDefs::MYTHEN)||(detType == slsDetectorDefs::EIGER)){ #ifdef VERBOSE cout << "Getting rate correction" << endl; #endif UpdateRateCorrectionFromServer(); } //update angular conversion from server if((detType == slsDetectorDefs::MYTHEN)||(detType == slsDetectorDefs::GOTTHARD)){ #ifdef VERBOSE cout << "Getting angular conversion" << endl; #endif int ang; if(myDet->getAngularConversion(ang)) chkAngular->setChecked(true); emit AngularConversionSignal(chkAngular->isChecked()); } //discard bad channels from server #ifdef VERBOSE cout << "Getting bad channel correction" << endl;//cout << "ff " << myDet->getBadChannelCorrection() << endl; #endif disconnect(chkDiscardBad, SIGNAL(toggled(bool))); if(myDet->getBadChannelCorrection()) chkDiscardBad->setChecked(true); else chkDiscardBad->setChecked(false); connect(chkDiscardBad, SIGNAL(toggled(bool)), this, SLOT(DiscardBadChannels())); if(myDet->setReceiverOnline()==slsDetectorDefs::ONLINE_FLAG){ btnOutputBrowse->setEnabled(false); btnOutputBrowse->setToolTip("This button is disabled as receiver PC is different from " "client PC and hence different directory structures.

" + dispOutputDir->toolTip()); }else{ btnOutputBrowse->setEnabled(true); btnOutputBrowse->setToolTip(dispOutputDir->toolTip()); } //getting 10GbE if(chkTenGiga->isEnabled()){ #ifdef VERBOSE cout << "Getting 10GbE enable" << endl; #endif EnableTenGigabitEthernet(-1,1); } //Eiger specific if(widgetEiger->isVisible()){ //speed #ifdef VERBOSE cout << "Getting Speed" << endl; #endif UpdateSpeedFromServer(); //flags #ifdef VERBOSE cout << "Getting Readout Flags" << endl; #endif UpdateFlagsFromServer(); } #ifdef VERBOSE cout << "**Updated DataOutput Tab" << endl << endl; #endif qDefs::checkErrorMessage(myDet,"qTabDataOutput::Refresh"); } //-------------------------------------------------------------------------------------------------------------------------------------------------