ROOT logo
/**************************************************************************
* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
*                                                                        *
* Author: The ALICE Off-line Project.                                    *
* Contributors are mentioned in the code where appropriate.              *
*                                                                        *
* Permission to use, copy, modify and distribute this software and its   *
* documentation strictly for non-commercial purposes is hereby granted   *
* without fee, provided that the above copyright notice appears in all   *
* copies and that both the copyright notice and this permission notice   *
* appear in the supporting documentation. The authors make no claims     *
* about the suitability of this software for any purpose. It is          *
* provided "as is" without express or implied warranty.                  *
**************************************************************************/

// $Id$

/// \class AliMUONManuContourMaker
///
/// Maker of manu contours. 
///
/// Make use of the AliMUONContourMaker class, but this one contains
/// specific things for MUON (as the mapping, for instance), hence its
/// separation from AliMUONContourMaker.
///
/// This class requires that the mapping is loaded before anything can be done.
///
/// \author Laurent Aphecetche, Subatech

#include "AliMUONManuContourMaker.h"

#include "AliCodeTimer.h"
#include "AliLog.h"
#include "AliMUONContour.h"
#include "AliMUONContourMaker.h"
#include "AliMUONPolygon.h"
#include "AliMpCathodType.h"
#include "AliMpConnection.h"
#include "AliMpConstants.h"
#include "AliMpDDLStore.h"
#include "AliMpDEManager.h"
#include "AliMpIntPair.h"
#include "AliMpMotifPosition.h"
#include "AliMpMotifType.h"
#include "AliMpManuIterator.h"
#include "AliMpPlaneType.h"
#include "AliMpSegmentation.h"
#include "AliMpUID.h"
#include "AliMpVMotif.h"
#include "AliMpVSegmentation.h"
#include "TGeoMatrix.h"
#include "TObjArray.h"
#include "TObjString.h"
#include "TString.h"
#include "TVector2.h"

///\cond CLASSIMP
ClassImp(AliMUONManuContourMaker)
///\endcond

//_____________________________________________________________________________
AliMUONManuContourMaker::AliMUONManuContourMaker(AliMpExMap* deTransformations)
: TObject(), fDETransformations(deTransformations), fLocalManuContours(222,1)
{
/// Standard constructor

  fLocalManuContours.SetOwnerKeyValue(kTRUE,kTRUE);  
}

//_____________________________________________________________________________
AliMUONManuContourMaker::~AliMUONManuContourMaker()
{
/// Destructor
}

//_____________________________________________________________________________
AliMUONContour* 
AliMUONManuContourMaker::CreateManuContour(Int_t detElemId, Int_t manuId, const char* name) const
{
  /// Create the contour of a given manu (global coordinates)
 
  AliCodeTimerAuto("",0);
  
  TString sname(name);
  
  if ( sname.Length()==0 )
  {
    sname = ManuPathName(detElemId,manuId);
  }
  
  const AliMpVSegmentation* seg = AliMpSegmentation::Instance()->GetMpSegmentationByElectronics(detElemId,manuId);
  const AliMpMotifPosition* motifPos = seg->MotifPosition(manuId);

  AliMUONContour* contour = CreateMotifContour(*motifPos);
  
  if (!contour)
  {
    AliError(Form("Could not build contour %s",sname.Data()));
    return 0x0;
  }
  
  contour->SetName(sname.Data());
  
  contour->Offset(motifPos->GetPositionX()-seg->GetPositionX(),
                  motifPos->GetPositionY()-seg->GetPositionY());
  
  TGeoHMatrix* matrix = 0x0;
  
  if ( fDETransformations ) 
  {
    matrix = static_cast<TGeoHMatrix*>(fDETransformations->GetValue(detElemId));
    if ( matrix ) contour->Transform(*matrix);
  }
  
  return contour;
}


//_____________________________________________________________________________
AliMUONContour* 
AliMUONManuContourMaker::CreateMotifContour(const AliMpMotifPosition& motifPosition) const
{
  /// Create the contour of a given MOTIF (i.e. local coordinates only).
  
  AliCodeTimerAuto("",0);
  
  TString mpName(NameIt(motifPosition));
  
  AliMUONContour* contour = static_cast<AliMUONContour*>(fLocalManuContours.GetValue(mpName.Data()));
  
  if ( contour ) 
  {
    // if we have already done the job, just have to clone it and we are done
    return static_cast<AliMUONContour*>(contour->Clone());
  }
  
  TObjArray polygons(AliMpConstants::ManuNofChannels()); // array of AliMUONPolygon objects
  polygons.SetOwner(kTRUE);
  
  AliMpVMotif* motif = motifPosition.GetMotif();
  
  AliMpMotifType* motifType = motif->GetMotifType();
  
  if ( motifType->IsFull() ) 
  {
    // motif is a simple rectangle. No need to loop over pads, we can
    // compute the contour right here and now.
    polygons.Add(new AliMUONPolygon(0.0,0.0,motif->DimensionX(),motif->DimensionY()));
  }
  else
  {
    for ( Int_t i = 0; i <= AliMpConstants::ManuNofChannels(); ++i ) 
    {
      AliMpConnection* connection = motifType->FindConnectionByGassiNum(i);
      
      if ( connection ) 
      {
        Int_t ix = connection->GetLocalIx();
        Int_t iy = connection->GetLocalIy();
        
        Double_t x,y,dx,dy;
        
        motif->GetPadDimensionsByIndices(ix,iy,dx,dy);
        motif->PadPositionLocal(ix,iy,x,y);
        
        AliMUONPolygon* pol = new AliMUONPolygon(x,y,dx,dy);
        polygons.Add(pol);
      }
    }
  }
  
  AliMUONContourMaker maker;
  
  contour = maker.CreateContour(polygons);
  
  if (!contour || !contour->IsValid() ) 
  {
    AliError(Form("Failed to properly create contour %s contour = %p",mpName.Data(),contour));
    if ( contour ) 
    {
      AliError(Form("nofVertices=%d area.isvalid=%d",contour->NumberOfVertices(),contour->Area().IsValid()));
      StdoutToAliError(contour->Area().Print(););
    }
    delete contour;
    return 0x0;
  }
  
  {
    AliCodeTimerAuto("localmanucontour.add",1);
    fLocalManuContours.Add(new TObjString(mpName),contour);
  }
  
  return static_cast<AliMUONContour*>(contour->Clone());
}

//_____________________________________________________________________________
TObjArray* 
AliMUONManuContourMaker::GenerateManuContours(Bool_t stopAtError)
{
  /// Generate the contours for all the manus, taking into account the given transformation
  /// (to go from local to global). That transformation need not be the real one (i.e.
  /// it can be an "exploded" one to ease visualization).
  
  AliCodeTimerAuto("",0);
  
  TObjArray* manuContours = new TObjArray;
  
  manuContours->SetOwner(kTRUE);
  
  AliMpManuIterator it;
  Int_t detElemId, manuId;
  Int_t nmanus(0);
  Int_t nok(0);

  while ( it.Next(detElemId,manuId) ) 
  {
    ++nmanus;
    AliMUONContour* contour = CreateManuContour(detElemId,manuId);
    if (contour)
    {
      manuContours->Add(contour);
    }
    else
    {
      if ( stopAtError )
      {
        break;
      }
    }
    ++nok;
  }
  
  AliDebug(1,Form("%d manus. %d contours successfully created",nmanus,nok));
  
  return manuContours;
}

//_____________________________________________________________________________
TString
AliMUONManuContourMaker::NameIt(const AliMpMotifPosition& motifPosition) const
{
  /// Get the name of an AliMpMotifPosition
  
  AliMpVMotif* motif = motifPosition.GetMotif();
  TString name(Form("%s",motif->GetID().Data()));
  
  for ( Int_t i = 0; i < motif->GetNofPadDimensions(); ++i )
  {
    name += Form("/%7.3f-%7.3f:",motif->GetPadDimensionX(i),motif->GetPadDimensionY(i));
  }
  
  return name;
}

//_____________________________________________________________________________
TString
AliMUONManuContourMaker::ManuPathName(Int_t detElemId, Int_t manuId, Bool_t withCathodeName)
{
  /// Get the name of a manu
  
  AliMp::PlaneType planeType;
  if ( manuId & AliMpConstants::ManuMask(AliMp::kNonBendingPlane) )
  {
    planeType = AliMp::kNonBendingPlane;
  }
  else
  {
    planeType = AliMp::kBendingPlane;
  }
  AliMp::CathodType cathodeType = AliMpDEManager::GetCathod(detElemId,planeType);
  
  Int_t chamberId = AliMpDEManager::GetChamberId(detElemId);
  Int_t stationId = chamberId/2;
  
  Int_t busPatchId = AliMpDDLStore::Instance()->GetBusPatchId(detElemId, manuId);
  
  AliMpUID id(cathodeType,stationId,chamberId,detElemId,busPatchId,manuId);
  
  if ( withCathodeName ) return id.PathName();
  
  TString name(id.PathName());
  
  name.ReplaceAll("Cathode0/","");
  name.ReplaceAll("Cathode1/","");
  
  return name;
}




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