ROOT logo
// $Id$
// Main authors: Matevz Tadel & Alja Mrak-Tadel & Bogdan Vulpescu: 2006, 2007

/**************************************************************************
 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
 * full copyright notice.                                                 *
 **************************************************************************/

#include "AliMpVSegmentation.h"
#include "AliEveMUONChamberData.h"

#include <AliMUONGeometryTransformer.h>
#include <mapping/AliMpDEIterator.h>
#include <mapping/AliMpSector.h>
#include <mapping/AliMpPad.h>
#include <mapping/AliMpSegmentation.h>
#include <mapping/AliMpVSegmentation.h>

#include <TVector2.h>

#include <EveBase/AliEveEventManager.h>

///////////////////////////////////////////////////////////////////////////////
///
/// AliEveMUONChamberData: geometry and digits
///
///////////////////////////////////////////////////////////////////////////////


ClassImp(AliEveMUONChamberData)

AliMUONGeometryTransformer* AliEveMUONChamberData::fgTransformer = 0;

//______________________________________________________________________________
AliEveMUONChamberData::AliEveMUONChamberData(Int_t chamber) :
  TObject(),
  fChamberID(0),
  fNDetElem(0),
  fNDigits(0),
  fNClusters(0),
  fNHits(0)
{
  //
  // constructor
  //

  fChamberID = chamber;
  fNDetElem  = 0;
  fNDigits   = 0;
  fNClusters = 0;
  fNHits     = 0;

  for (Int_t i = 0; i < 26; i++) {
    for (Int_t j = 0; j < 4; j++) {
      fFrameCoord[i][j] = 0.0;
    }
  }
  for (Int_t i = 0; i < 7*4096; i++) {
    fDigitBuffer[i] = 0.0;
  }
  for (Int_t i = 0; i < 5*256; i++) {
    fClusterBuffer[i] = 0.0;
  }
  for (Int_t i = 0; i < 3*256; i++) {
    fHitBuffer[i] = 0.0;
  }

  for (Int_t i = 0; i < 3; i++) {
    fChamberBox[i*2  ] = +9999;
    fChamberBox[i*2+1] = -9999;
  }

  if (fgTransformer == 0) {
    AliEveEventManager::AssertGeometry();
    fgTransformer = new AliMUONGeometryTransformer();
    fgTransformer->LoadGeometryData();
  }

  Init(chamber);
}

//______________________________________________________________________________
AliEveMUONChamberData::~AliEveMUONChamberData()
{
  //
  // destructor
  //

}

//______________________________________________________________________________
void AliEveMUONChamberData::DropData()
{
  //
  // release the chamber data
  //

  fNDigits   = 0;
  fNClusters = 0;
  fNHits     = 0;

  return;

}

//______________________________________________________________________________
void AliEveMUONChamberData::Init(Int_t chamber)
{
  //
  // initialize the drawing coordinates of the chamber
  //

  Float_t locP[3], gloP[3], locD[3], gloD[3];
  Float_t deltax, deltay;
  AliMpDEIterator it;
  const AliMpVSegmentation *vseg;
  const AliMpSector *sector;
  TVector2 position;
  TVector2 dimension;

  for ( it.First(chamber); ! it.IsDone(); it.Next() ) {

    Int_t detElemId = it.CurrentDEId();

    if (chamber < 4) {

      sector = AliMpSegmentation::Instance()->GetSector(detElemId,AliMp::kCath0);

      position  = TVector2(sector->GetPositionX(), sector->GetPositionY());
      dimension = TVector2(sector->GetDimensionX(), sector->GetDimensionY()); // half length

      locP[0] =  position.Px();
      locP[1] =  position.Py();
      locD[0] =  dimension.Px() * 2.;
      locD[1] =  dimension.Py() * 2.;

      locP[2] = 0.0;
      locD[2] = 0.0;

      fgTransformer->Local2Global(detElemId,
				  locP[0], locP[1], locP[2],
				  gloP[0], gloP[1], gloP[2]);

      fgTransformer->Local2Global(detElemId,
				  locD[0], locD[1], locD[2],
				  gloD[0], gloD[1], gloD[2]);

      fFrameCoord[fNDetElem][0] = gloP[0];
      fFrameCoord[fNDetElem][1] = gloP[1];
      fFrameCoord[fNDetElem][2] = gloD[0];
      fFrameCoord[fNDetElem][3] = gloD[1];
      fFrameCoord[fNDetElem][4] = gloP[2]; // Z position

      fChamberBox[0] = TMath::Min(fChamberBox[0],gloP[0]-gloD[0]);
      fChamberBox[1] = TMath::Max(fChamberBox[1],gloP[0]+gloD[0]);
      fChamberBox[2] = TMath::Min(fChamberBox[2],gloP[1]-gloD[1]);
      fChamberBox[3] = TMath::Max(fChamberBox[3],gloP[1]+gloD[1]);
      fChamberBox[4] = TMath::Min(fChamberBox[4],gloP[2]);
      fChamberBox[5] = TMath::Max(fChamberBox[5],gloP[2]);

    } else {

//      if (!fgSegmentation->HasDE(detElemId)) {
//	printf("Segmentation has no %d detElemId! \n",detElemId);
//	continue;
//      }

      vseg = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId,AliMp::kCath0);

      if (vseg == 0) {
	printf("No MpVSegmentation for %d detElemId! \n",detElemId);
	continue;
      }

      deltax = vseg->GetDimensionX();
      deltay = vseg->GetDimensionY();
      locP[0] =  -deltax;
      locP[1] =  -deltay;
      locD[0] =  +deltax;
      locD[1] =  +deltay;

      locP[2] = 0.0;
      locD[2] = 0.0;

      fgTransformer->Local2Global(detElemId,
				  locP[0], locP[1], locP[2],
				  gloP[0], gloP[1], gloP[2]);

      fgTransformer->Local2Global(detElemId,
				  locD[0], locD[1], locD[2],
				  gloD[0], gloD[1], gloD[2]);

      fFrameCoord[fNDetElem][0] = gloP[0];
      fFrameCoord[fNDetElem][1] = gloP[1];
      fFrameCoord[fNDetElem][2] = gloD[0];
      fFrameCoord[fNDetElem][3] = gloD[1];
      fFrameCoord[fNDetElem][4] = gloP[2]; // Z position

      fChamberBox[0] = TMath::Min(fChamberBox[0],gloP[0]);
      fChamberBox[0] = TMath::Min(fChamberBox[0],gloD[0]);
      fChamberBox[1] = TMath::Max(fChamberBox[1],gloP[0]);
      fChamberBox[1] = TMath::Max(fChamberBox[1],gloD[0]);
      fChamberBox[2] = TMath::Min(fChamberBox[0],gloP[1]);
      fChamberBox[2] = TMath::Min(fChamberBox[0],gloD[1]);
      fChamberBox[3] = TMath::Max(fChamberBox[1],gloP[1]);
      fChamberBox[3] = TMath::Max(fChamberBox[1],gloD[1]);
      fChamberBox[4] = TMath::Min(fChamberBox[4],gloP[2]);
      fChamberBox[5] = TMath::Max(fChamberBox[5],gloP[2]);

    }

    fNDetElem++;

  }  // end detElemId loop

}

//______________________________________________________________________________
void AliEveMUONChamberData::RegisterDigit(Int_t detElemId, Int_t cathode, Int_t ix, Int_t iy, Int_t charge)
{
  //
  // add a digit to this chamber
  //

  if ((fNDigits/7) == (4096-1)) return;

  Float_t locP[3], gloP[3], locD[3], gloD[3];

  const AliMpVSegmentation* vseg = AliMpSegmentation::Instance()
    ->GetMpSegmentation(detElemId,AliMp::GetCathodType(cathode));

  AliMpPad pad = vseg->PadByIndices(ix,iy,kTRUE);

  locP[0] = pad.GetPositionX();
  locP[1] = pad.GetPositionY();
  locD[0] = pad.GetDimensionX();
  locD[1] = pad.GetDimensionY();

  locP[2] = 0.0;
  locD[2] = 0.0;

  fgTransformer->Local2Global(detElemId,
			      locP[0], locP[1], locP[2],
			      gloP[0], gloP[1], gloP[2]);

  gloD[0] = locD[0];
  gloD[1] = locD[1];
  gloD[2] = gloP[2];

  if (cathode == 0) gloP[2] += 0.1;
  if (cathode == 1) gloP[2] -= 0.1;

  fDigitBuffer[fNDigits  ] = gloP[0];
  fDigitBuffer[fNDigits+1] = gloP[1];
  fDigitBuffer[fNDigits+2] = gloD[0];
  fDigitBuffer[fNDigits+3] = gloD[1];
  fDigitBuffer[fNDigits+4] = gloP[2];
  fDigitBuffer[fNDigits+5] = charge;
  fDigitBuffer[fNDigits+6] = cathode;

  fNDigits += 7;

}

//______________________________________________________________________________
void AliEveMUONChamberData::RegisterCluster(Int_t /*detElemId*/, Int_t cathode, Float_t clsX, Float_t clsY, Float_t clsZ, Float_t charge)
{
  //
  // add a reconstructed point (cluster) to this chamber
  //
  // identical clusters are registered for both cathode planes ...
  //

  if ((fNClusters/5) == (256-1)) return;

  fClusterBuffer[fNClusters  ] = clsX;
  fClusterBuffer[fNClusters+1] = clsY;
  fClusterBuffer[fNClusters+2] = clsZ;
  fClusterBuffer[fNClusters+3] = charge;
  fClusterBuffer[fNClusters+4] = cathode;

  fNClusters += 5;

}

//______________________________________________________________________________
void AliEveMUONChamberData::RegisterHit(Int_t /*detElemId*/, Float_t hitX, Float_t hitY, Float_t hitZ)
{
  //
  // add a simulation hit to this chamber
  //

  if ((fNHits/3) == (256-1)) return;

  fHitBuffer[fNHits  ] = hitX;
  fHitBuffer[fNHits+1] = hitY;
  fHitBuffer[fNHits+2] = hitZ;

  fNHits += 3;

}
 AliEveMUONChamberData.cxx:1
 AliEveMUONChamberData.cxx:2
 AliEveMUONChamberData.cxx:3
 AliEveMUONChamberData.cxx:4
 AliEveMUONChamberData.cxx:5
 AliEveMUONChamberData.cxx:6
 AliEveMUONChamberData.cxx:7
 AliEveMUONChamberData.cxx:8
 AliEveMUONChamberData.cxx:9
 AliEveMUONChamberData.cxx:10
 AliEveMUONChamberData.cxx:11
 AliEveMUONChamberData.cxx:12
 AliEveMUONChamberData.cxx:13
 AliEveMUONChamberData.cxx:14
 AliEveMUONChamberData.cxx:15
 AliEveMUONChamberData.cxx:16
 AliEveMUONChamberData.cxx:17
 AliEveMUONChamberData.cxx:18
 AliEveMUONChamberData.cxx:19
 AliEveMUONChamberData.cxx:20
 AliEveMUONChamberData.cxx:21
 AliEveMUONChamberData.cxx:22
 AliEveMUONChamberData.cxx:23
 AliEveMUONChamberData.cxx:24
 AliEveMUONChamberData.cxx:25
 AliEveMUONChamberData.cxx:26
 AliEveMUONChamberData.cxx:27
 AliEveMUONChamberData.cxx:28
 AliEveMUONChamberData.cxx:29
 AliEveMUONChamberData.cxx:30
 AliEveMUONChamberData.cxx:31
 AliEveMUONChamberData.cxx:32
 AliEveMUONChamberData.cxx:33
 AliEveMUONChamberData.cxx:34
 AliEveMUONChamberData.cxx:35
 AliEveMUONChamberData.cxx:36
 AliEveMUONChamberData.cxx:37
 AliEveMUONChamberData.cxx:38
 AliEveMUONChamberData.cxx:39
 AliEveMUONChamberData.cxx:40
 AliEveMUONChamberData.cxx:41
 AliEveMUONChamberData.cxx:42
 AliEveMUONChamberData.cxx:43
 AliEveMUONChamberData.cxx:44
 AliEveMUONChamberData.cxx:45
 AliEveMUONChamberData.cxx:46
 AliEveMUONChamberData.cxx:47
 AliEveMUONChamberData.cxx:48
 AliEveMUONChamberData.cxx:49
 AliEveMUONChamberData.cxx:50
 AliEveMUONChamberData.cxx:51
 AliEveMUONChamberData.cxx:52
 AliEveMUONChamberData.cxx:53
 AliEveMUONChamberData.cxx:54
 AliEveMUONChamberData.cxx:55
 AliEveMUONChamberData.cxx:56
 AliEveMUONChamberData.cxx:57
 AliEveMUONChamberData.cxx:58
 AliEveMUONChamberData.cxx:59
 AliEveMUONChamberData.cxx:60
 AliEveMUONChamberData.cxx:61
 AliEveMUONChamberData.cxx:62
 AliEveMUONChamberData.cxx:63
 AliEveMUONChamberData.cxx:64
 AliEveMUONChamberData.cxx:65
 AliEveMUONChamberData.cxx:66
 AliEveMUONChamberData.cxx:67
 AliEveMUONChamberData.cxx:68
 AliEveMUONChamberData.cxx:69
 AliEveMUONChamberData.cxx:70
 AliEveMUONChamberData.cxx:71
 AliEveMUONChamberData.cxx:72
 AliEveMUONChamberData.cxx:73
 AliEveMUONChamberData.cxx:74
 AliEveMUONChamberData.cxx:75
 AliEveMUONChamberData.cxx:76
 AliEveMUONChamberData.cxx:77
 AliEveMUONChamberData.cxx:78
 AliEveMUONChamberData.cxx:79
 AliEveMUONChamberData.cxx:80
 AliEveMUONChamberData.cxx:81
 AliEveMUONChamberData.cxx:82
 AliEveMUONChamberData.cxx:83
 AliEveMUONChamberData.cxx:84
 AliEveMUONChamberData.cxx:85
 AliEveMUONChamberData.cxx:86
 AliEveMUONChamberData.cxx:87
 AliEveMUONChamberData.cxx:88
 AliEveMUONChamberData.cxx:89
 AliEveMUONChamberData.cxx:90
 AliEveMUONChamberData.cxx:91
 AliEveMUONChamberData.cxx:92
 AliEveMUONChamberData.cxx:93
 AliEveMUONChamberData.cxx:94
 AliEveMUONChamberData.cxx:95
 AliEveMUONChamberData.cxx:96
 AliEveMUONChamberData.cxx:97
 AliEveMUONChamberData.cxx:98
 AliEveMUONChamberData.cxx:99
 AliEveMUONChamberData.cxx:100
 AliEveMUONChamberData.cxx:101
 AliEveMUONChamberData.cxx:102
 AliEveMUONChamberData.cxx:103
 AliEveMUONChamberData.cxx:104
 AliEveMUONChamberData.cxx:105
 AliEveMUONChamberData.cxx:106
 AliEveMUONChamberData.cxx:107
 AliEveMUONChamberData.cxx:108
 AliEveMUONChamberData.cxx:109
 AliEveMUONChamberData.cxx:110
 AliEveMUONChamberData.cxx:111
 AliEveMUONChamberData.cxx:112
 AliEveMUONChamberData.cxx:113
 AliEveMUONChamberData.cxx:114
 AliEveMUONChamberData.cxx:115
 AliEveMUONChamberData.cxx:116
 AliEveMUONChamberData.cxx:117
 AliEveMUONChamberData.cxx:118
 AliEveMUONChamberData.cxx:119
 AliEveMUONChamberData.cxx:120
 AliEveMUONChamberData.cxx:121
 AliEveMUONChamberData.cxx:122
 AliEveMUONChamberData.cxx:123
 AliEveMUONChamberData.cxx:124
 AliEveMUONChamberData.cxx:125
 AliEveMUONChamberData.cxx:126
 AliEveMUONChamberData.cxx:127
 AliEveMUONChamberData.cxx:128
 AliEveMUONChamberData.cxx:129
 AliEveMUONChamberData.cxx:130
 AliEveMUONChamberData.cxx:131
 AliEveMUONChamberData.cxx:132
 AliEveMUONChamberData.cxx:133
 AliEveMUONChamberData.cxx:134
 AliEveMUONChamberData.cxx:135
 AliEveMUONChamberData.cxx:136
 AliEveMUONChamberData.cxx:137
 AliEveMUONChamberData.cxx:138
 AliEveMUONChamberData.cxx:139
 AliEveMUONChamberData.cxx:140
 AliEveMUONChamberData.cxx:141
 AliEveMUONChamberData.cxx:142
 AliEveMUONChamberData.cxx:143
 AliEveMUONChamberData.cxx:144
 AliEveMUONChamberData.cxx:145
 AliEveMUONChamberData.cxx:146
 AliEveMUONChamberData.cxx:147
 AliEveMUONChamberData.cxx:148
 AliEveMUONChamberData.cxx:149
 AliEveMUONChamberData.cxx:150
 AliEveMUONChamberData.cxx:151
 AliEveMUONChamberData.cxx:152
 AliEveMUONChamberData.cxx:153
 AliEveMUONChamberData.cxx:154
 AliEveMUONChamberData.cxx:155
 AliEveMUONChamberData.cxx:156
 AliEveMUONChamberData.cxx:157
 AliEveMUONChamberData.cxx:158
 AliEveMUONChamberData.cxx:159
 AliEveMUONChamberData.cxx:160
 AliEveMUONChamberData.cxx:161
 AliEveMUONChamberData.cxx:162
 AliEveMUONChamberData.cxx:163
 AliEveMUONChamberData.cxx:164
 AliEveMUONChamberData.cxx:165
 AliEveMUONChamberData.cxx:166
 AliEveMUONChamberData.cxx:167
 AliEveMUONChamberData.cxx:168
 AliEveMUONChamberData.cxx:169
 AliEveMUONChamberData.cxx:170
 AliEveMUONChamberData.cxx:171
 AliEveMUONChamberData.cxx:172
 AliEveMUONChamberData.cxx:173
 AliEveMUONChamberData.cxx:174
 AliEveMUONChamberData.cxx:175
 AliEveMUONChamberData.cxx:176
 AliEveMUONChamberData.cxx:177
 AliEveMUONChamberData.cxx:178
 AliEveMUONChamberData.cxx:179
 AliEveMUONChamberData.cxx:180
 AliEveMUONChamberData.cxx:181
 AliEveMUONChamberData.cxx:182
 AliEveMUONChamberData.cxx:183
 AliEveMUONChamberData.cxx:184
 AliEveMUONChamberData.cxx:185
 AliEveMUONChamberData.cxx:186
 AliEveMUONChamberData.cxx:187
 AliEveMUONChamberData.cxx:188
 AliEveMUONChamberData.cxx:189
 AliEveMUONChamberData.cxx:190
 AliEveMUONChamberData.cxx:191
 AliEveMUONChamberData.cxx:192
 AliEveMUONChamberData.cxx:193
 AliEveMUONChamberData.cxx:194
 AliEveMUONChamberData.cxx:195
 AliEveMUONChamberData.cxx:196
 AliEveMUONChamberData.cxx:197
 AliEveMUONChamberData.cxx:198
 AliEveMUONChamberData.cxx:199
 AliEveMUONChamberData.cxx:200
 AliEveMUONChamberData.cxx:201
 AliEveMUONChamberData.cxx:202
 AliEveMUONChamberData.cxx:203
 AliEveMUONChamberData.cxx:204
 AliEveMUONChamberData.cxx:205
 AliEveMUONChamberData.cxx:206
 AliEveMUONChamberData.cxx:207
 AliEveMUONChamberData.cxx:208
 AliEveMUONChamberData.cxx:209
 AliEveMUONChamberData.cxx:210
 AliEveMUONChamberData.cxx:211
 AliEveMUONChamberData.cxx:212
 AliEveMUONChamberData.cxx:213
 AliEveMUONChamberData.cxx:214
 AliEveMUONChamberData.cxx:215
 AliEveMUONChamberData.cxx:216
 AliEveMUONChamberData.cxx:217
 AliEveMUONChamberData.cxx:218
 AliEveMUONChamberData.cxx:219
 AliEveMUONChamberData.cxx:220
 AliEveMUONChamberData.cxx:221
 AliEveMUONChamberData.cxx:222
 AliEveMUONChamberData.cxx:223
 AliEveMUONChamberData.cxx:224
 AliEveMUONChamberData.cxx:225
 AliEveMUONChamberData.cxx:226
 AliEveMUONChamberData.cxx:227
 AliEveMUONChamberData.cxx:228
 AliEveMUONChamberData.cxx:229
 AliEveMUONChamberData.cxx:230
 AliEveMUONChamberData.cxx:231
 AliEveMUONChamberData.cxx:232
 AliEveMUONChamberData.cxx:233
 AliEveMUONChamberData.cxx:234
 AliEveMUONChamberData.cxx:235
 AliEveMUONChamberData.cxx:236
 AliEveMUONChamberData.cxx:237
 AliEveMUONChamberData.cxx:238
 AliEveMUONChamberData.cxx:239
 AliEveMUONChamberData.cxx:240
 AliEveMUONChamberData.cxx:241
 AliEveMUONChamberData.cxx:242
 AliEveMUONChamberData.cxx:243
 AliEveMUONChamberData.cxx:244
 AliEveMUONChamberData.cxx:245
 AliEveMUONChamberData.cxx:246
 AliEveMUONChamberData.cxx:247
 AliEveMUONChamberData.cxx:248
 AliEveMUONChamberData.cxx:249
 AliEveMUONChamberData.cxx:250
 AliEveMUONChamberData.cxx:251
 AliEveMUONChamberData.cxx:252
 AliEveMUONChamberData.cxx:253
 AliEveMUONChamberData.cxx:254
 AliEveMUONChamberData.cxx:255
 AliEveMUONChamberData.cxx:256
 AliEveMUONChamberData.cxx:257
 AliEveMUONChamberData.cxx:258
 AliEveMUONChamberData.cxx:259
 AliEveMUONChamberData.cxx:260
 AliEveMUONChamberData.cxx:261
 AliEveMUONChamberData.cxx:262
 AliEveMUONChamberData.cxx:263
 AliEveMUONChamberData.cxx:264
 AliEveMUONChamberData.cxx:265
 AliEveMUONChamberData.cxx:266
 AliEveMUONChamberData.cxx:267
 AliEveMUONChamberData.cxx:268
 AliEveMUONChamberData.cxx:269
 AliEveMUONChamberData.cxx:270
 AliEveMUONChamberData.cxx:271
 AliEveMUONChamberData.cxx:272
 AliEveMUONChamberData.cxx:273
 AliEveMUONChamberData.cxx:274
 AliEveMUONChamberData.cxx:275
 AliEveMUONChamberData.cxx:276
 AliEveMUONChamberData.cxx:277
 AliEveMUONChamberData.cxx:278
 AliEveMUONChamberData.cxx:279
 AliEveMUONChamberData.cxx:280
 AliEveMUONChamberData.cxx:281
 AliEveMUONChamberData.cxx:282
 AliEveMUONChamberData.cxx:283
 AliEveMUONChamberData.cxx:284
 AliEveMUONChamberData.cxx:285
 AliEveMUONChamberData.cxx:286
 AliEveMUONChamberData.cxx:287
 AliEveMUONChamberData.cxx:288
 AliEveMUONChamberData.cxx:289
 AliEveMUONChamberData.cxx:290
 AliEveMUONChamberData.cxx:291
 AliEveMUONChamberData.cxx:292
 AliEveMUONChamberData.cxx:293
 AliEveMUONChamberData.cxx:294
 AliEveMUONChamberData.cxx:295
 AliEveMUONChamberData.cxx:296
 AliEveMUONChamberData.cxx:297
 AliEveMUONChamberData.cxx:298
 AliEveMUONChamberData.cxx:299
 AliEveMUONChamberData.cxx:300
 AliEveMUONChamberData.cxx:301
 AliEveMUONChamberData.cxx:302