TpcCluster.cxx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include "TpcCommon.h"
  2. #include "TpcCluster.h"
  3. #include "TpcSequence.h"
  4. #include "TpcTimeBin.h"
  5. #include "TpcPad.h"
  6. ClassImp(TpcCluster)
  7. TpcCluster::TpcCluster(void)
  8. : fPadRow(NULL),
  9. fSequences(NULL),
  10. fRegion(NULL),
  11. fLoPad(0), fHiPad(0), fLoBin(0), fHiBin(0)
  12. {
  13. fSequences = new TObjArray( 1 );
  14. fRegion = new TObjArray( 1 );
  15. }
  16. TpcCluster::~TpcCluster(void)
  17. {
  18. if ( fSequences ) {
  19. delete fSequences;
  20. }
  21. if ( fRegion )
  22. delete fRegion;
  23. }
  24. Bool_t TpcCluster::RecalcBounds()
  25. {
  26. if ( !fSequences ) {
  27. Error(__FUNCTION__, "fSequences == NULL");
  28. return kFALSE;
  29. }
  30. if ( fSequences->IsEmpty() ) {
  31. Error(__FUNCTION__, "Cluster has no sequences");
  32. fLoPad = fHiPad = fLoBin = fHiBin = 0;
  33. return kFALSE;
  34. }
  35. fLoPad = fLoBin = kMaxInt;
  36. fHiPad = fHiBin = kMinInt;
  37. for ( Int_t i = 0; i < fSequences->GetEntriesFast(); ++i )
  38. {
  39. TpcSequence *seq = (TpcSequence *)fSequences->At(i);
  40. fLoPad = TMath::Min(fLoPad, seq->GetPadId());
  41. fHiPad = TMath::Max(fHiPad, seq->GetPadId() + 1);
  42. fLoBin = TMath::Min(fLoBin, seq->GetBegin());
  43. fHiBin = TMath::Max(fHiBin, seq->GetEnd());
  44. }
  45. return kTRUE;
  46. }
  47. void TpcCluster::BeginCluster(TpcPadRow *aPadRow)
  48. {
  49. fSequences->Delete();
  50. }
  51. void TpcCluster::AddSequence(TpcSequence *aSequence)
  52. {
  53. if ( !aSequence ) {
  54. Error(__FUNCTION__, "Invalid argument. aSequence == NULL");
  55. return;
  56. }
  57. fSequences->Add( aSequence );
  58. }
  59. void TpcCluster::EndCluster()
  60. {
  61. if ( !RecalcBounds() )
  62. return;
  63. MakeRegion();
  64. }
  65. void TpcCluster::MakeRegion()
  66. {
  67. fRegion->Clear();
  68. fRegion->Expand( (fHiPad-fLoPad) * (fHiBin-fLoBin) );
  69. for (Int_t i = 0; i < fRegion->GetSize(); ++i ) {
  70. fRegion->AddAt(&fBinStub, i);
  71. }
  72. for ( Int_t i = 0; i < fSequences->GetEntriesFast(); ++i )
  73. {
  74. TpcSequence *seq = (TpcSequence *)fSequences->At(i);
  75. TpcPad *pad = seq->GetPad();
  76. for ( Int_t ibin = seq->GetBegin(); ibin < seq->GetEnd(); ++ibin )
  77. {
  78. TpcTimeBin *bin = pad->GetTimeBin(ibin);
  79. fRegion->AddAt( bin,
  80. (pad->GetPadId() - fLoPad) * (fHiBin - fLoBin) + ibin - fLoBin
  81. );
  82. }
  83. }
  84. }
  85. const TpcTimeBin * TpcCluster::GetTimeBin(Int_t ipad, Int_t ibin)
  86. {
  87. if ( ipad < fLoPad || ipad >= fHiPad) {
  88. Error(__FUNCTION__, "Invalid argument. Pad number exceed range");
  89. return NULL;
  90. }
  91. if ( ibin < fLoBin || ibin >= fHiBin) {
  92. Error(__FUNCTION__, "Invalid argument. Bin number exceed range");
  93. return NULL;
  94. }
  95. Int_t i = (ipad - fLoPad) * (fHiBin - fLoBin) + (ibin - fLoBin);
  96. return (TpcTimeBin *)fRegion->At(i);
  97. }