ROOT logo

#include "flipPCB.h"

#include "AliMpDataMap.h"
#include "AliMpDataProcessor.h"
#include "AliMpDataStreams.h"
#include "AliMpMotif.h"
#include "AliMpMotifType.h"
#include "AliMpMotifPosition.h"
#include "AliMpExMap.h"
#include "AliMpPCB.h"
#include "AliMpConnection.h"
#include "AliMpSt345Reader.h"
#include "Riostream.h"
#include "TCanvas.h"
#include "AliMpVPainter.h"
#include "AliMpConnection.h"
#include "AliMpSlatMotifMap.h"

const char* NameIt(const TString& baseName)
{
  return Form("%sR",baseName.Data());
}

//______________________________________________________________________________
AliMpPCB* Duplicate(const AliMpPCB& src, AliMpSlatMotifMap& motifMap)
{
  AliMpPCB* dest = new AliMpPCB(&motifMap,NameIt(src.GetID()),
                                src.PadSizeX(),src.PadSizeY(),
                                src.DX()*2,src.DY()*2);
  
  for ( Int_t i = 0; i < src.GetSize(); ++i )
  {
    AliMpMotifPosition* srcMotifPosition = src.GetMotifPosition(i);
    AliMpMotifType* motifType = srcMotifPosition->GetMotif()->GetMotifType();
    AliMpMotifType* mt = motifMap.FindMotifType(motifType->GetID());
    if (!mt)
    {
      mt = static_cast<AliMpMotifType*>(motifType->Clone());
      motifMap.AddMotifType(mt);
    }
    dest->Add(mt,
              srcMotifPosition->GetLowIndicesLimit().GetFirst(),
              srcMotifPosition->GetLowIndicesLimit().GetSecond());
  }
  return dest;
}

//______________________________________________________________________________
AliMpConnection* getConnection(const AliMpPCB& pcb, Int_t ix, Int_t iy)
{
  AliMpMotifPosition* pos = pcb.FindMotifPosition(ix,iy);
  if (pos)
  {
    AliMpMotifType* type = pos->GetMotif()->GetMotifType();
    return type->FindConnectionByLocalIndices(AliMpIntPair(ix,iy)-pos->GetLowIndicesLimit());
  }
  return 0x0;
}
                                                      
//______________________________________________________________________________
AliMpPCB* flipX(const AliMpPCB& src,
                AliMpSlatMotifMap& destMotifs)
{
  AliMpPCB* dest = Duplicate(src,destMotifs);

  for ( Int_t iy = dest->Iymin(); iy <= dest->Iymax(); ++iy )
  {
    for ( Int_t ix = dest->Ixmin(); ix <= dest->Ixmax(); ++ix )
    {
      AliMpConnection* srcConnection = getConnection(src,ix,iy);
      Int_t dix = dest->Ixmax() - ix;
      AliMpConnection* destConnection = getConnection(*dest,dix,iy);
      if ( srcConnection && destConnection )
      {
        destConnection->SetGassiNum(srcConnection->GetManuChannel());
      }
      else
      {
        if ( srcConnection && !destConnection )
        {
          cout << Form("Got no connection in dest for ix,iy=%d,%d src "
                       "ix,iy=%d,%d in PCB %s",
                       dix,iy,ix,iy,dest->GetID()) << endl;
          dest->Print("M");
          cout << "---------- src=" << endl;
          src.Print("M");
          delete dest;
          return 0x0;
        }
      }
    }
  }
  return dest;
}

//______________________________________________________________________________
void flipPCB(const char* srcName)
{
  // flip PCB in X-direction

//  AliMpSlatMotifMap* srcMotifs = new AliMpSlatMotifMap;
//  AliMpSlatMotifMap* destMotifs = new AliMpSlatMotifMap;

  AliMpDataProcessor mp;
  AliMpDataMap* dataMap = mp.CreateDataMap("data");
  AliMpDataStreams dataStream(dataMap);
  
  AliMpSt345Reader reader(dataStream);

  AliMpPCB* src = reader.ReadPCB(srcName);
  
  if (!src) return;

  AliMpSlatMotifMap* destMotifs = reader.MotifMap();
  
  AliMpPCB* dest = flipX(*src,*destMotifs);
    
  if (!dest)
  {
    cout << "Flipping failed" << endl;
  }
  
  TCanvas* csrc = new TCanvas("src","src");
  csrc->Draw();
  AliMpVPainter* psrc = AliMpVPainter::CreatePainter(src);
  psrc->Draw("MZT");

  if ( dest ) 
  {
    TCanvas* cdest = new TCanvas("dest","dest");
    cdest->Draw();
    AliMpVPainter* pdest = AliMpVPainter::CreatePainter(dest);
    pdest->Draw("MZT");
    dest->Save();

  }
  
 flipPCB.C:1
 flipPCB.C:2
 flipPCB.C:3
 flipPCB.C:4
 flipPCB.C:5
 flipPCB.C:6
 flipPCB.C:7
 flipPCB.C:8
 flipPCB.C:9
 flipPCB.C:10
 flipPCB.C:11
 flipPCB.C:12
 flipPCB.C:13
 flipPCB.C:14
 flipPCB.C:15
 flipPCB.C:16
 flipPCB.C:17
 flipPCB.C:18
 flipPCB.C:19
 flipPCB.C:20
 flipPCB.C:21
 flipPCB.C:22
 flipPCB.C:23
 flipPCB.C:24
 flipPCB.C:25
 flipPCB.C:26
 flipPCB.C:27
 flipPCB.C:28
 flipPCB.C:29
 flipPCB.C:30
 flipPCB.C:31
 flipPCB.C:32
 flipPCB.C:33
 flipPCB.C:34
 flipPCB.C:35
 flipPCB.C:36
 flipPCB.C:37
 flipPCB.C:38
 flipPCB.C:39
 flipPCB.C:40
 flipPCB.C:41
 flipPCB.C:42
 flipPCB.C:43
 flipPCB.C:44
 flipPCB.C:45
 flipPCB.C:46
 flipPCB.C:47
 flipPCB.C:48
 flipPCB.C:49
 flipPCB.C:50
 flipPCB.C:51
 flipPCB.C:52
 flipPCB.C:53
 flipPCB.C:54
 flipPCB.C:55
 flipPCB.C:56
 flipPCB.C:57
 flipPCB.C:58
 flipPCB.C:59
 flipPCB.C:60
 flipPCB.C:61
 flipPCB.C:62
 flipPCB.C:63
 flipPCB.C:64
 flipPCB.C:65
 flipPCB.C:66
 flipPCB.C:67
 flipPCB.C:68
 flipPCB.C:69
 flipPCB.C:70
 flipPCB.C:71
 flipPCB.C:72
 flipPCB.C:73
 flipPCB.C:74
 flipPCB.C:75
 flipPCB.C:76
 flipPCB.C:77
 flipPCB.C:78
 flipPCB.C:79
 flipPCB.C:80
 flipPCB.C:81
 flipPCB.C:82
 flipPCB.C:83
 flipPCB.C:84
 flipPCB.C:85
 flipPCB.C:86
 flipPCB.C:87
 flipPCB.C:88
 flipPCB.C:89
 flipPCB.C:90
 flipPCB.C:91
 flipPCB.C:92
 flipPCB.C:93
 flipPCB.C:94
 flipPCB.C:95
 flipPCB.C:96
 flipPCB.C:97
 flipPCB.C:98
 flipPCB.C:99
 flipPCB.C:100
 flipPCB.C:101
 flipPCB.C:102
 flipPCB.C:103
 flipPCB.C:104
 flipPCB.C:105
 flipPCB.C:106
 flipPCB.C:107
 flipPCB.C:108
 flipPCB.C:109
 flipPCB.C:110
 flipPCB.C:111
 flipPCB.C:112
 flipPCB.C:113
 flipPCB.C:114
 flipPCB.C:115
 flipPCB.C:116
 flipPCB.C:117
 flipPCB.C:118
 flipPCB.C:119
 flipPCB.C:120
 flipPCB.C:121
 flipPCB.C:122
 flipPCB.C:123
 flipPCB.C:124
 flipPCB.C:125
 flipPCB.C:126
 flipPCB.C:127
 flipPCB.C:128
 flipPCB.C:129
 flipPCB.C:130
 flipPCB.C:131
 flipPCB.C:132
 flipPCB.C:133
 flipPCB.C:134
 flipPCB.C:135
 flipPCB.C:136
 flipPCB.C:137
 flipPCB.C:138
 flipPCB.C:139