emcOMCalFEMT.h

Go to the documentation of this file.
00001 #ifndef __EMCOMCALFEMT_H__
00002 #define __EMCOMCALFEMT_H__
00003 
00004 #ifndef __EMCOBJECTMANAGER_H__
00005 #include "emcObjectManager.h"
00006 #endif
00007 #ifndef __EMCMANAGEABLE_H__
00008 #include "emcManageable.h"
00009 #endif
00010 #ifndef __EMCDATAMANAGER_H__
00011 #include "emcDataManager.h"
00012 #endif
00013 #ifndef __EMCOBJECTMANAGERREGISTER_H__
00014 #include "emcObjectManagerRegister.h"
00015 #endif
00016 #ifndef __EMCDEFINES_H__
00017 #include "emcDefines.h"
00018 #endif
00019 #ifndef __EMCCALFEM_H__
00020 #include "emcCalFEM.h"
00021 #endif
00022 
00023 //#ifndef __EMCOMCALFEM_H__
00024 //#include "emcOMCalFEM.h"
00025 //#endif
00026 
00027 #include "Pdb.hh"
00028 #include "PdbApplication.hh"
00029 #include "PdbBankManager.hh"
00030 #include "PdbCalBank.hh"
00031 
00054 class emcOMCalFEM : public emcObjectManager
00055 {
00056 public:
00057   emcOMCalFEM(const char* name="", const char* title="")
00058     : emcObjectManager(name,title) {}
00059   virtual ~emcOMCalFEM() {}
00060 
00061   virtual void FromPdbCalBank(emcCalFEM& calfem, PdbCalBank& bank) = 0;
00062 };
00063 
00064 template<class BM>
00065 class emcOMCalFEMT : public emcOMCalFEM
00066 {
00067 public:
00068   emcOMCalFEMT(const char* name="", const char* title="");
00069   virtual ~emcOMCalFEMT();
00070   
00072   virtual emcManageable* Collect(const emcManageable& /*object*/,
00073                                  const PHTimeStamp& /*when*/) 
00074   {
00075     return 0; 
00076   }
00077 
00079   virtual void FromPdbCalBank(emcCalFEM& calfem, PdbCalBank& bank) = 0;
00080 
00082   virtual std::string GetPersistentClassName(void) const = 0;
00083 
00084   using emcObjectManager::Read;
00085 
00087   virtual bool Read(emcManageable& object,
00088                     const PHTimeStamp& time_stamp,
00089                     int code=-1);
00090 
00092   bool ReadPreviousVersion(emcManageable& object, 
00093                            const PHTimeStamp& time_stamp,
00094                            int code=-1,
00095                            int version=0);
00096 
00098   virtual void Reset(void);
00099 
00101   virtual void ToPdbCalBank(const emcCalFEM& calfem, PdbCalBank& bank) = 0;
00102 
00104   virtual bool Write(const emcManageable& object,
00105                      const PHTimeStamp& tdummy,
00106                      int dummy=-1);
00107 
00108 protected:
00109 
00110   emcManageable::EStorage storage() const 
00111   { return fBM->storage(); }
00112 
00113 private:
00114 
00115  class changeName
00116   {
00117   public:
00118     changeName(const char* name)
00119     {
00120       name_ = emcManageable::GetStorageName(BM::storage());
00121       name_ += ":";
00122       name_ += name;
00123     }
00124 
00125     const char* c_str() const
00126     {
00127       return name_.c_str();
00128     }
00129 
00130   private:
00131     std::string name_;
00132   };
00133 
00134 
00135   BM* fBM;
00136 };
00137 
00138 //_____________________________________________________________________________
00139 //_____________________________________________________________________________
00140 //_____________________________________________________________________________
00141 
00142 //_____________________________________________________________________________
00143 template <class BM>
00144 emcOMCalFEMT<BM>::emcOMCalFEMT(const char* name, const char* title)
00145   : emcOMCalFEM(changeName(name).c_str(), title),
00146     fBM(new BM)
00147 {
00148 }
00149 
00150 //_____________________________________________________________________________
00151 template <class BM>
00152 emcOMCalFEMT<BM>::~emcOMCalFEMT()
00153 {
00154   delete fBM;
00155 }
00156 
00157 //_____________________________________________________________________________
00158 template<class BM>
00159 bool 
00160 emcOMCalFEMT<BM>::Read(emcManageable& object,
00161                        const PHTimeStamp& time_stamp,
00162                        int code)
00163 {
00164   // Read object from DB.
00165 
00166   emcCalFEM& calfem = static_cast<emcCalFEM&>(object);
00167 
00168   int femAbsPosition;
00169   int pinNumber;
00170   int idummy;
00171 
00172   if ( code < 0 )
00173     {
00174       code = calfem.AbsolutePosition();
00175     }
00176 
00177   emcCalFEM::FEMDecode(code, femAbsPosition, pinNumber, idummy, idummy);
00178 
00179   if ( femAbsPosition != calfem.AbsolutePosition() )
00180     {
00181       std::cerr << EMC_ERROR_MSG 
00182                 << " emcOMCalFEMT<BM>::Read : you requested the read "
00183                 << " of FEM " << femAbsPosition 
00184                 << " whereas the object you gave "
00185                 << " is FEM " << calfem.AbsolutePosition() << std::endl
00186                 << " Read was NOT done. Object unchanged. " << std::endl;
00187       return false;
00188     }
00189 
00190   calfem.Reset();
00191 
00192   assert(object.GetSource()==fBM->storage());
00193 
00194   if (DM()->GetVerboseLevel())
00195     {
00196       std::cout << EMC_INFO_MSG << " : Entering " << GetName()
00197                 << "::Read for FEM# " << femAbsPosition
00198                 << " flavour=" << calfem.GetCategory()
00199                 << " at time " << time_stamp
00200                 << std::endl;
00201     }
00202 
00203   bool kIsRead = false;
00204 
00205   // Try to open a read transaction
00206   PdbStatus status = true;
00207 
00208   status = fBM->DBApplication()->startRead();
00209 
00210   if (status)
00211     {
00212 
00213       PdbBankID bankID;
00214 
00215       bankID.setInternalValue(femAbsPosition);
00216 
00217       std::string pdb_classname = GetPersistentClassName();
00218       std::string basename = "calib.emc.";
00219       basename += calfem.GetCategory();
00220 
00221       PdbCalBank* emcBank =
00222         fBM->fetchBank(pdb_classname.c_str(),
00223                        bankID,
00224                        basename.c_str(),
00225                        const_cast<PHTimeStamp&>(time_stamp),
00226                        std::string(calfem.GetCategory()));
00227 
00228       if (!emcBank)
00229         {
00230           std::cerr << EMC_ERROR_MSG
00231                     << GetName()
00232                     << "::Read : cannot fetch bank (flavour = "
00233                     << object.GetCategory() << ",absPosition= "
00234                     << femAbsPosition << ") at time " << time_stamp 
00235                     << std::endl
00236                     << "fetchBank(" << pdb_classname.c_str() << ","
00237                     << bankID.getInternalValue() 
00238                     << "," << basename.c_str() << ","
00239                     << const_cast<PHTimeStamp&>(time_stamp) << std::endl;
00240         }
00241       else
00242         {
00243           kIsRead = true;
00244           
00245           calfem.SetValidityPeriod(emcBank->getStartValTime(),
00246                                    emcBank->getEndValTime());
00247           
00248           // Fill the calfem from emcBank.
00249           FromPdbCalBank(calfem, *emcBank);
00250           
00251           calfem.SetDescription(emcBank->getDescription().getString());
00252         }
00253 
00254       bool status_commit = fBM->DBApplication()->commit();
00255 
00256       delete emcBank;
00257 
00258       kIsRead = status_commit && kIsRead;
00259 
00260     }
00261   
00262   if (!kIsRead)
00263     {
00264       calfem.Reset();
00265     }
00266 
00267   return kIsRead;
00268 }
00269 
00270 //_____________________________________________________________________________
00271 template<class BM>
00272 bool
00273 emcOMCalFEMT<BM>::ReadPreviousVersion(emcManageable& object,
00274                                       const PHTimeStamp& time_stamp,
00275                                       int code,
00276                                       int version)
00277 {
00278   emcCalFEM& calfem = static_cast<emcCalFEM&>(object);
00279 
00280   int femAbsPosition;
00281   int pinNumber;
00282   int idummy;
00283 
00284   if ( code < 0 )
00285     {
00286       code = calfem.AbsolutePosition();
00287     }
00288 
00289   emcCalFEM::FEMDecode(code, femAbsPosition, pinNumber, idummy, idummy);
00290 
00291   if ( femAbsPosition != calfem.AbsolutePosition() )
00292     {
00293       std::cerr << EMC_ERROR_MSG 
00294                 << " emcOMCalFEMT<BM>::Read : you requested the read "
00295                 << " of FEM " << femAbsPosition 
00296                 << " whereas the object you gave "
00297                 << " is FEM " << calfem.AbsolutePosition() << std::endl
00298                 << " Read was NOT done. Object unchanged. " << std::endl;
00299       return false;
00300     }
00301 
00302   calfem.Reset();
00303 
00304   assert(object.GetSource()==fBM->storage());
00305 
00306   if (DM()->GetVerboseLevel())
00307     {
00308       std::cout << EMC_INFO_MSG << " : Entering " << GetName()
00309                 << "::Read for FEM# " << femAbsPosition
00310                 << " flavour=" << calfem.GetCategory()
00311                 << " at time " << time_stamp
00312                 << std::endl;
00313     }
00314 
00315   bool kIsRead = false;
00316 
00317   // Try to open a read transaction
00318   PdbStatus status = true;
00319 
00320   status = fBM->DBApplication()->startRead();
00321 
00322   if (status)
00323     {
00324 
00325       PdbBankID bankID;
00326 
00327       bankID.setInternalValue(femAbsPosition);
00328 
00329       std::string pdb_classname = GetPersistentClassName();
00330       std::string basename = "calib.emc.";
00331       basename += calfem.GetCategory();
00332 
00333       PdbCalBank* emcBank =
00334         fBM->fetchPreviousVersionBank(pdb_classname.c_str(),
00335                                       bankID,
00336                                       basename.c_str(),
00337                                       const_cast<PHTimeStamp&>(time_stamp),
00338                                       std::string(calfem.GetCategory()),
00339                                       version);
00340 
00341 
00342       if (!emcBank)
00343         {
00344           std::cerr << EMC_ERROR_MSG
00345                     << GetName()
00346                     << "::ReadPreviousVersion : cannot fetch bank (flavour = "
00347                     << object.GetCategory() << ",absPosition= "
00348                     << femAbsPosition << ") at time " << time_stamp 
00349                     << std::endl
00350                     << "fetchBank(" << pdb_classname.c_str() << ","
00351                     << bankID.getInternalValue() 
00352                     << "," << basename.c_str() << ","
00353                     << const_cast<PHTimeStamp&>(time_stamp) << std::endl;
00354         }
00355       else
00356         {
00357 
00358           kIsRead = true;
00359 
00360           calfem.SetValidityPeriod(emcBank->getStartValTime(),
00361                                    emcBank->getEndValTime());
00362 
00363           // Fill the calfem from emcBank.
00364           FromPdbCalBank(calfem, *emcBank);
00365 
00366           calfem.SetDescription(emcBank->getDescription().getString());
00367         }
00368 
00369       bool status_commit = fBM->DBApplication()->commit();
00370 
00371       kIsRead = status_commit && kIsRead;
00372 
00373       delete emcBank;
00374     }
00375 
00376   if (!kIsRead)
00377     {
00378       calfem.Reset();
00379     }
00380 
00381   return kIsRead;
00382 }
00383 
00384 //_____________________________________________________________________________
00385 template<class BM>
00386 void
00387 emcOMCalFEMT<BM>::Reset(void)
00388 {
00389   fBM->Reset();
00390 }
00391 
00392 //_____________________________________________________________________________
00393 template<class BM>
00394 bool 
00395 emcOMCalFEMT<BM>::Write(const emcManageable& object,
00396                         const PHTimeStamp&,int)
00397 {
00398   // Write a manageable object to db.
00399 
00400   bool kWritten = false;
00401 
00402   const emcCalFEM& calfem = static_cast<const emcCalFEM&>(object);
00403 
00404   if (DM()->GetVerboseLevel())
00405     {
00406       std::cout << EMC_INFO_MSG << " : Entering "
00407                 << GetName() << "::Write for FEM "
00408                 << calfem.AbsolutePosition()
00409                 << " flavour=" << calfem.GetCategory()
00410                 << " valid from " << calfem.GetStartValTime()
00411                 << " up to " << calfem.GetEndValTime()
00412                 << std::endl;
00413     }
00414 
00415   PdbStatus status = true;
00416 
00417   assert(object.GetDestination() == fBM->storage());
00418     
00419   status = fBM->DBApplication()->startUpdate();
00420 
00421   if (!status)
00422     {
00423       if ( DM()->GetVerboseLevel() )
00424         {
00425           std::cerr << EMC_ERROR_MSG << "emcOMCalFEMT<BM>::Write : "
00426                     << "Cannot open a write transaction to Objy" 
00427                     << std::endl;
00428         }
00429       fBM->DBApplication()->abort();
00430       return false;
00431     }
00432 
00433   PdbCalBank* emcBank = 0;
00434   PHTimeStamp begin, end;
00435   PdbBankID bankID;
00436 
00437   bankID.setInternalValue(calfem.AbsolutePosition());
00438 
00439   std::string pdb_classname = GetPersistentClassName();
00440   std::string description = calfem.Description();
00441   std::string basename = "calib.emc.";
00442   basename += calfem.GetCategory();
00443 
00444   begin = calfem.GetStartValTime();
00445   end = calfem.GetEndValTime();
00446 
00447   // Is calfem is a draft, we first look if we find in the DB
00448   // a fem for this time, being also a draft...
00449   // in which case we'll _overwrite_ it.
00450 
00451   if (calfem.IsDraft())
00452     {
00453       emcBank = fBM->BankManager()->fetchBank(pdb_classname.c_str(),
00454                                               bankID,
00455                                               basename.c_str(),
00456                                               const_cast<PHTimeStamp&>(begin));
00457 
00458       if (emcBank && emcBank->getUserName() == "draft")
00459         {
00460           emcBank->setEndValTime(end);
00461           emcBank->setStartValTime(begin);
00462           PHTimeStamp now;
00463           now.setToSystemTime();
00464           emcBank->setInsertTime(now);
00465         }
00466       else
00467         {
00468           delete emcBank;
00469           emcBank = 0;
00470         }
00471     }
00472 
00473   if (!emcBank)
00474     {
00475 
00476       if (!calfem.IsDraft())
00477         {
00478 #if 1
00479           emcBank = fBM->BankManager()->createBank(pdb_classname.c_str(),
00480                                                    bankID,
00481                                                    description.c_str(),
00482                                                    begin, end,
00483                                                    basename.c_str());
00484 #endif
00485 
00486 #if 0
00487           // disconnect this to speed up writing, so
00488           // it's useable for online calibrations (OnlCal framework)
00489           emcBank = fBM->createBankWithUpdate(pdb_classname.c_str(),
00490                                               bankID,
00491                                               description.c_str(),
00492                                               begin, end,
00493                                               basename.c_str());
00494 #endif   
00495         }
00496       else
00497         {
00498           
00499           emcBank = fBM->BankManager()->createBank(pdb_classname.c_str(),
00500                                                    bankID,
00501                                                    description.c_str(),
00502                                                    begin, end,
00503                                                    basename.c_str());
00504           
00505           emcBank->setUserName("draft");
00506         }
00507     }
00508   
00509   assert(emcBank != 0);
00510 
00511   // We then fill the PdbCalBank from the values in calfem.
00512   ToPdbCalBank(calfem, *emcBank);
00513   
00514   status = fBM->DBApplication()->commit();
00515 
00516   if (status)
00517     {
00518       kWritten = true;
00519     }
00520   else
00521     {
00522       std::cerr << EMC_INFO_MSG << GetName() 
00523                 << "::Write : commit failed ?!" << std::endl;
00524       kWritten = false;
00525     }
00526 
00527   delete emcBank;
00528 
00529   return kWritten;
00530 }
00531 
00532 
00533 
00534 
00535 #endif