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
00024
00025
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& ,
00073 const PHTimeStamp& )
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
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
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
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
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
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
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
00448
00449
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
00488
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
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