CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_6_1_2_SLHC2/src/Fireworks/FWInterface/src/FWPSetCellEditor.cc

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 //
00003 // Package:     FWInterface
00004 // Class  :     FWPSetCellEditor
00005 // 
00006 // Implementation:
00007 //     [Notes on implementation]
00008 //
00009 // Original Author:  
00010 //         Created:  Mon Feb 28 20:44:59 CET 2011
00011 // $Id: FWPSetCellEditor.cc,v 1.7 2012/09/08 06:27:35 amraktad Exp $
00012 //
00013 #include <boost/algorithm/string.hpp>
00014 #include <sstream>
00015 #include "KeySymbols.h"
00016 
00017 // user include files
00018 #include "Fireworks/FWInterface/src/FWPSetCellEditor.h"
00019 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00020 #include "Fireworks/Core/interface/fwLog.h"
00021 
00022 #include "FWCore/Utilities/interface/Parse.h"
00023 
00024 //______________________________________________________________________________
00025 
00026 template <class T>
00027 bool editNumericParameter(edm::ParameterSet &ps, bool tracked, 
00028                           const std::string &label, 
00029                           const std::string &value) 
00030 {
00031    std::stringstream  str(value);
00032    T v;
00033    str >> v;
00034    bool fail = str.fail();
00035    if (tracked)
00036       ps.addParameter(label, v);
00037    else
00038       ps.addUntrackedParameter(label, v);
00039          
00040    return fail;
00041 }
00042 //______________________________________________________________________________
00043 
00044 void editStringParameter(edm::ParameterSet &ps, bool tracked,
00045                          const std::string &label,
00046                          const std::string &value)
00047 {
00048    if (tracked)
00049       ps.addParameter(label, value);
00050    else
00051       ps.addUntrackedParameter(label, value);
00052 }
00053 
00054 //______________________________________________________________________________
00055 
00056 void editBoolParameter(edm::ParameterSet &ps, bool tracked,
00057                        const std::string &label,
00058                        const std::string &value)
00059 {
00060    bool x = false;
00061 
00062    if (boost::iequals(value, "true")) {
00063       x = true;
00064    }
00065    else if (boost::iequals(value, "false")){
00066       x = false;
00067    }
00068    else {
00069       fwLog(fwlog::kError) << "Invalid value. Possible values are true/false case insensitive." << std::endl;
00070       return;
00071    }
00072    if (tracked)
00073       ps.addParameter<bool>(label, x);
00074    else
00075       ps.addUntrackedParameter<bool>(label, x);
00076 }
00077 
00078 //______________________________________________________________________________
00079 void editFileInPath(edm::ParameterSet &ps, bool tracked,
00080                     const std::string &label,
00081                     const std::string &value)
00082 {
00083    if (tracked)
00084       ps.addParameter(label, edm::FileInPath(value));
00085    else
00086       ps.addUntrackedParameter(label, edm::FileInPath(value));
00087 }
00088 
00089 //______________________________________________________________________________
00090 
00091 bool editVInputTag(edm::ParameterSet &ps, bool tracked,
00092                    const std::string &label,
00093                    const std::string &value)
00094 { 
00095    std::vector<edm::InputTag> inputTags;
00096    std::stringstream iss(value);
00097    std::string vitem;
00098    bool fail = false;
00099    size_t fst, lst;
00100 
00101    while (getline(iss, vitem, ','))
00102    {
00103       fst = vitem.find("[");
00104       lst = vitem.find("]");
00105         
00106       if ( fst != std::string::npos )
00107          vitem.erase(fst,1);
00108       if ( lst != std::string::npos )
00109          vitem.erase(lst,1);
00110         
00111       std::vector<std::string> tokens = edm::tokenize(vitem, ":");
00112       size_t nwords = tokens.size();
00113         
00114       if ( nwords > 3 )
00115       {
00116          fail = true;
00117          return fail;
00118       }
00119       else 
00120       {
00121          std::string it_label("");
00122          std::string it_instance("");
00123          std::string it_process("");
00124 
00125          if ( nwords > 0 ) 
00126             it_label = tokens[0];
00127          if ( nwords > 1 ) 
00128             it_instance = tokens[1];
00129          if ( nwords > 2 ) 
00130             it_process  = tokens[2];
00131         
00132          inputTags.push_back(edm::InputTag(it_label, it_instance, it_process));
00133       }
00134    }
00135      
00136    if (tracked)
00137       ps.addParameter(label, inputTags);
00138    else
00139       ps.addUntrackedParameter(label, inputTags);
00140 
00141    return fail;
00142 }
00143 
00144 //______________________________________________________________________________
00145 
00146 bool editInputTag(edm::ParameterSet &ps, bool tracked,
00147                   const std::string &label,
00148                   const std::string &value)
00149 {
00150    std::vector<std::string> tokens = edm::tokenize(value, ":");
00151    size_t nwords = tokens.size();
00152      
00153    bool fail;
00154 
00155    if ( nwords > 3 ) 
00156    {
00157       fail = true;
00158    }
00159    else
00160    {           
00161       std::string it_label("");
00162       std::string it_instance("");
00163       std::string it_process("");
00164 
00165       if ( nwords > 0 ) 
00166          it_label = tokens[0];
00167       if ( nwords > 1 ) 
00168          it_instance = tokens[1];
00169       if ( nwords > 2 ) 
00170          it_process  = tokens[2];
00171 
00172       if ( tracked )
00173          ps.addParameter(label, edm::InputTag(it_label, it_instance, it_process));
00174       else
00175          ps.addUntrackedParameter(label, edm::InputTag(it_label, it_instance, it_process));
00176             
00177       fail = false;
00178    }
00179            
00180    return fail;
00181 }
00182 
00183 //______________________________________________________________________________
00184 
00185 bool editESInputTag(edm::ParameterSet &ps, bool tracked,
00186                     const std::string &label,
00187                     const std::string &value)
00188 {
00189    std::vector<std::string> tokens = edm::tokenize(value, ":");
00190    size_t nwords = tokens.size();
00191       
00192    bool fail;
00193   
00194    if ( nwords > 2 )
00195    {
00196       fail = true;    
00197    }
00198    else
00199    {             
00200       std::string it_module("");
00201       std::string it_data("");
00202 
00203       if ( nwords > 0 ) 
00204          it_module = tokens[0];
00205       if ( nwords > 1 ) 
00206          it_data = tokens[1];
00207 
00208       if ( tracked )
00209          ps.addParameter(label, edm::ESInputTag(it_module, it_data));
00210       else
00211          ps.addUntrackedParameter(label, edm::ESInputTag(it_module, it_data));
00212         
00213       fail = false;
00214    }
00215 
00216    return fail;
00217 }
00218   
00219 //______________________________________________________________________________
00220 template <typename T>
00221 void editVectorParameter(edm::ParameterSet &ps, bool tracked,
00222                          const std::string &label,
00223                          const std::string &value)
00224 {
00225    std::vector<T> valueVector;
00226       
00227    std::stringstream iss(value);
00228    std::string vitem;
00229       
00230    size_t fst, lst;
00231 
00232    while (getline(iss, vitem, ','))
00233    {
00234       fst = vitem.find("[");
00235       lst = vitem.find("]");
00236         
00237       if ( fst != std::string::npos )
00238          vitem.erase(fst,1);
00239       if ( lst != std::string::npos )
00240          vitem.erase(lst,1);
00241         
00242       std::stringstream oss(vitem);
00243       T on;
00244       oss >> on;
00245 
00246       valueVector.push_back(on);
00247    }
00248      
00249    if (tracked)
00250       ps.addParameter(label, valueVector);
00251    else
00252       ps.addUntrackedParameter(label, valueVector);
00253 }
00254 
00255 //______________________________________________________________________________
00256 
00257 bool FWPSetCellEditor::apply(FWPSetTableManager::PSetData &data, FWPSetTableManager::PSetData &parent)
00258 {
00259    switch (data.type)
00260    {
00261       case 'I':
00262          editNumericParameter<int32_t>(*parent.pset, data.tracked, data.label, GetText());
00263          break;
00264        case 'B':
00265          editBoolParameter(*parent.pset, data.tracked, data.label, GetText());
00266          break;
00267       case 'U':
00268          editNumericParameter<uint32_t>(*parent.pset, data.tracked, data.label, GetText());
00269          break;
00270       case 'D':
00271          editNumericParameter<double>(*parent.pset, data.tracked, data.label, GetText());
00272          break;
00273       case 'L':
00274          editNumericParameter<long long>(*parent.pset, data.tracked, data.label, GetText());
00275          break;
00276       case 'X':
00277          editNumericParameter<unsigned long long>(*parent.pset, data.tracked, data.label, GetText());
00278          break;
00279       case 'S':
00280          editStringParameter(*parent.pset, data.tracked, data.label, GetText());
00281          break;
00282       case 'i':
00283          editVectorParameter<int32_t>(*parent.pset, data.tracked, data.label, GetText());
00284          break;
00285       case 'u':
00286          editVectorParameter<uint32_t>(*parent.pset, data.tracked, data.label, GetText());
00287          break;
00288       case 'l':
00289          editVectorParameter<long long>(*parent.pset, data.tracked, data.label, GetText());
00290          break;
00291       case 'x':
00292          editVectorParameter<unsigned long long>(*parent.pset, data.tracked, data.label, GetText());
00293          break;
00294       case 'd':
00295          editVectorParameter<double>(*parent.pset, data.tracked, data.label, GetText());
00296          break;
00297       case 's':
00298          editVectorParameter<std::string>(*parent.pset, data.tracked, data.label, GetText());
00299          break; 
00300       case 't':
00301          editInputTag(*parent.pset, data.tracked, data.label, GetText());
00302          break;
00303       case 'g':
00304          editESInputTag(*parent.pset, data.tracked, data.label, GetText());
00305          break;
00306       case 'v':
00307          editVInputTag(*parent.pset, data.tracked, data.label, GetText());
00308          break;
00309       case 'F':
00310          editFileInPath(*parent.pset, data.tracked, data.label, GetText());
00311          break;
00312       default:
00313          fwLog(fwlog::kError) << "unsupported parameter" << std::endl;
00314          UnmapWindow();
00315          return false;
00316    }
00317    return true;
00318 }
00319 
00320 //______________________________________________________________________________
00321 
00322 bool FWPSetCellEditor::HandleKey(Event_t*event)
00323 {
00324    UInt_t keysym = event->fCode;
00325 
00326    if (keysym == (UInt_t) gVirtualX->KeysymToKeycode(kKey_Escape))
00327    {
00328       TGFrame *p = dynamic_cast<TGFrame*>(const_cast<TGWindow*>(GetParent()));
00329       while (p)
00330       {
00331          TGMainFrame *mp = dynamic_cast<TGMainFrame*>(p);
00332          //   printf("editor find parent %p, %s, %p\n", p, p->ClassName(), mp);
00333          if (mp)
00334          {
00335             return mp->HandleKey(event);
00336          }
00337          p = dynamic_cast<TGFrame*>(const_cast<TGWindow*>(p->GetParent()));
00338       }
00339    }
00340 
00341    return TGTextEntry::HandleKey(event);
00342 }