MpdMultiField.cxx 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. // -------------------------------------------------------------------------
  2. // MpdMultiField source file -----
  3. // Created 23/07/13 by P. Batyuk (MPD) <batyuk@jinr.ru> -----
  4. // from MpdMultiField (PNDROOT) -----
  5. // -------------------------------------------------------------------------
  6. /// Last modified: 24.07.2013, P.B.
  7. #include <iomanip>
  8. #include <iostream>
  9. #include <fstream>
  10. #include "MpdMultiField.h"
  11. #include "MpdRegion.h"
  12. #include "MpdConstField.h"
  13. #include "MpdFieldMap.h"
  14. #include "TObjArray.h"
  15. #include "MpdMapPar.h"
  16. #include "MpdMultiFieldPar.h"
  17. using namespace std;
  18. // ------------- Default constructor ----------------------------------
  19. MpdMultiField::MpdMultiField() {
  20. fMaps= new TObjArray(10);
  21. fNoOfMaps=0;
  22. fType = 5;
  23. }
  24. // ------------ Constructor from MpdFieldPar --------------------------
  25. MpdMultiField::MpdMultiField(MpdMultiFieldPar* fieldPar) {
  26. fType = 5;
  27. fMaps= new TObjArray(10);
  28. fNoOfMaps=0;
  29. TObjArray *fArray= fieldPar->GetParArray();
  30. if(fArray->IsEmpty()) fType=-1;
  31. }
  32. // ------------ Destructor --------------------------------------------
  33. MpdMultiField::~MpdMultiField() { }
  34. // ----------- Adding fields ------------------------------------------
  35. void MpdMultiField::AddField(FairField *field) {
  36. if(field){
  37. fMaps->AddLast(field);
  38. fNoOfMaps++;
  39. }
  40. }
  41. // ----------- Intialisation ------------------------------------------
  42. void MpdMultiField::Init() {
  43. MpdConstField *field=0;
  44. MpdFieldMap *fieldMap=0;
  45. for (Int_t n=0; n<=fNoOfMaps; n++){
  46. fieldMap = dynamic_cast<MpdFieldMap *>(fMaps->At(n));
  47. field = dynamic_cast<MpdConstField *>(fMaps->At(n));
  48. if(fieldMap){
  49. fieldMap->Init();
  50. fFieldMaps.insert( pair<MpdRegion*, FairField*>(new MpdRegion(fieldMap->GetZmin(),fieldMap->GetZmax()) , fieldMap ));
  51. }else if(field){
  52. field->Init();
  53. fFieldMaps.insert( pair<MpdRegion*, FairField*>(new MpdRegion(field->GetZmin(),field->GetZmax() ), field ));
  54. }
  55. }
  56. }
  57. // ----------- Get x component of the field ---------------------------
  58. Double_t MpdMultiField::GetBx(Double_t x, Double_t y, Double_t z) {
  59. MpdRegion *fReg=0;
  60. FairField *fField=0;
  61. std::map <MpdRegion*, FairField* >::iterator fMapIter;
  62. for (fMapIter=fFieldMaps.begin(); fMapIter!= fFieldMaps.end();fMapIter++ ){
  63. fReg=fMapIter->first;
  64. if(fReg->IsInside(z)){
  65. fField=fMapIter->second;
  66. break;
  67. }
  68. }
  69. if(fField) return fField->GetBx( x, y, z);
  70. else return 0;
  71. }
  72. // ----------- Get y component of the field ---------------------------
  73. Double_t MpdMultiField::GetBy(Double_t x, Double_t y, Double_t z) {
  74. MpdRegion *fReg=0;
  75. FairField *fField=0;
  76. std::map <MpdRegion*, FairField* >::iterator fMapIter;
  77. for (fMapIter=fFieldMaps.begin(); fMapIter!= fFieldMaps.end();fMapIter++ ){
  78. fReg=fMapIter->first;
  79. if(fReg->IsInside(z)){
  80. fField=fMapIter->second;
  81. break;
  82. }
  83. }
  84. if(fField) return fField->GetBy( x, y, z);
  85. else return 0;
  86. }
  87. // ----------- Get z component of the field ---------------------------
  88. Double_t MpdMultiField::GetBz(Double_t x, Double_t y, Double_t z) {
  89. MpdRegion *fReg=0;
  90. FairField *fField=0;
  91. std::map <MpdRegion*, FairField* >::iterator fMapIter;
  92. for (fMapIter=fFieldMaps.begin(); fMapIter!= fFieldMaps.end();fMapIter++ ){
  93. fReg=fMapIter->first;
  94. if(fReg->IsInside(z)){
  95. fField=fMapIter->second;
  96. break;
  97. }
  98. }
  99. if(fField) return fField->GetBz( x, y, z);
  100. else return 0;
  101. }
  102. //---------------------------------------------------------------------------
  103. void MpdMultiField::GetFieldValue(const Double_t point[3], Double_t* bField)
  104. {
  105. MpdRegion *fReg=0;
  106. FairField *fField=0;
  107. std::map <MpdRegion*, FairField* >::iterator fMapIter;
  108. for (fMapIter=fFieldMaps.begin(); fMapIter!= fFieldMaps.end();fMapIter++ ){
  109. fReg=fMapIter->first;
  110. if(fReg->IsInside(point[2])){
  111. fField=fMapIter->second;
  112. break;
  113. }
  114. }
  115. if(fField){
  116. /* bField[0] = fField->GetBx(point[0], point[1], point[2]);
  117. bField[1] = fField->GetBy(point[0], point[1], point[2]);
  118. bField[2] = fField->GetBz(point[0], point[1], point[2]);
  119. */
  120. fField->GetBxyz(point, bField);
  121. }
  122. else{
  123. bField[0] = 0;
  124. bField[1] = 0;
  125. bField[2] = 0;
  126. }
  127. }
  128. // --------- Screen output --------------------------------------------
  129. void MpdMultiField::Print() {
  130. for (Int_t n=0; n<=fNoOfMaps; n++){
  131. FairField *fieldMap = dynamic_cast<FairField *>(fMaps->At(n));
  132. if(fieldMap) fieldMap->Print("");
  133. }
  134. }
  135. ClassImp(MpdMultiField)