X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MUON%2Fmapping%2FAliMpPCB.cxx;h=13441a93e5bd570db33d37f800ce48119df1cd62;hb=fb2d9d49abc001f645ffd650eef1cc9e533a6378;hp=3b1300c67516bea3919578b06f90a61809d4beb9;hpb=efb408b39b6c11e5321ad20c820a869103eecc8c;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/mapping/AliMpPCB.cxx b/MUON/mapping/AliMpPCB.cxx index 3b1300c6751..13441a93e5b 100644 --- a/MUON/mapping/AliMpPCB.cxx +++ b/MUON/mapping/AliMpPCB.cxx @@ -14,124 +14,199 @@ **************************************************************************/ // $Id$ -// $MpId: AliMpPCB.cxx,v 1.6 2006/03/17 16:42:33 ivana Exp $ +// $MpId: AliMpPCB.cxx,v 1.8 2006/05/24 13:58:50 ivana Exp $ #include "AliMpPCB.h" #include "AliMpMotif.h" +#include "AliMpSlatMotifMap.h" #include "AliMpMotifPosition.h" #include "AliMpMotifSpecial.h" #include "AliMpMotifType.h" #include "AliLog.h" #include "Riostream.h" +#include "TList.h" +#include "TObjString.h" #include "TMath.h" #include + +//----------------------------------------------------------------------------- +/// \class AliMpPCB +/// +/// A PCB for station 3,4 or 5 +/// +/// A PCB is a group of pads having the same size +/// Pads are grouped in motifs, where 1 motif = 1 MANU +/// +/// The notion of PCB enveloppe is due to the fact that not all PCBs are +/// "full" of pads, e.g. the rounded or short ones miss some pads, +/// but the enveloppe is a virtual size that should be constant +/// across the slats, and is 400x400 mm. +/// It's a usefull notion to compute e.g. slat center in a uniform way, +/// considering that a slat is N PCBs, of the same "virtual" size, that of +/// the enveloppe. +/// +/// \author L. Aphecetche +//----------------------------------------------------------------------------- + +/// \cond CLASSIMP ClassImp(AliMpPCB) +/// \endcond //_____________________________________________________________________________ AliMpPCB::AliMpPCB() - : TObject(), fId(""), - fPadSizeX(0), fPadSizeY(0), - fEnveloppeSizeX(0), fEnveloppeSizeY(0), - fXoffset(0), - fActiveXmin(0), fActiveXmax(0), - fIxmin(99999), fIxmax(0), fIymin(99999), fIymax(0), - fNofPads(0) -{ - // - // Default ctor. - // -} - -//_____________________________________________________________________________ -AliMpPCB::AliMpPCB(const char* id, Double_t padSizeX, Double_t padSizeY, +: TObject(), + fId(""), + fPadSizeX(0), + fPadSizeY(0), + fEnveloppeSizeX(0), + fEnveloppeSizeY(0), + fXoffset(0), + fActiveXmin(0), + fActiveXmax(0), + fIxmin(99999), + fIxmax(0), + fIymin(99999), + fIymax(0), + fMotifPositions(), + fNofPads(0), + fMotifMap(0) +{ + /// + /// Default ctor. + /// + fMotifPositions.SetOwner(kTRUE); + AliDebug(1,Form("this=%p",this)); +} + +//_____________________________________________________________________________ +AliMpPCB::AliMpPCB(AliMpSlatMotifMap* motifMap, const char* id, Double_t padSizeX, Double_t padSizeY, Double_t enveloppeSizeX, Double_t enveloppeSizeY) - : TObject(), fId(id), - fPadSizeX(padSizeX), fPadSizeY(padSizeY), - fEnveloppeSizeX(enveloppeSizeX), fEnveloppeSizeY(enveloppeSizeY), - fXoffset(0), - fActiveXmin(0), fActiveXmax(0), - fIxmin(99999), fIxmax(0), fIymin(99999), fIymax(0), - fNofPads(0) -{ - // - // Normal ctor. Must be fed with the PCB's name (id), the pad dimensions - // and the global dimension of the virtual enveloppe of the PCB - // (usually 400x400 mm) +: TObject(), + fId(id), + fPadSizeX(padSizeX), + fPadSizeY(padSizeY), + fEnveloppeSizeX(enveloppeSizeX), + fEnveloppeSizeY(enveloppeSizeY), + fXoffset(0), + fActiveXmin(0), + fActiveXmax(0), + fIxmin(99999), + fIxmax(0), + fIymin(99999), + fIymax(0), + fMotifPositions(), + fNofPads(0), + fMotifMap(motifMap) +{ + /// + /// Normal ctor. Must be fed with the PCB's name (id), the pad dimensions + /// and the global dimension of the virtual enveloppe of the PCB + /// (usually 400x400 mm) + fMotifPositions.SetOwner(kTRUE); + AliDebug(1,Form("this=%p id=%s",this,id)); } //_____________________________________________________________________________ AliMpPCB::AliMpPCB(const AliMpPCB& o) - : TObject(o), - fPadSizeX(0), fPadSizeY(0), - fEnveloppeSizeX(0), fEnveloppeSizeY(0), - fXoffset(0), - fActiveXmin(0), fActiveXmax(0), - fIxmin(99999), fIxmax(0), fIymin(99999), fIymax(0), - fNofPads(0) -{ +: TObject(o), + fId(0), + fPadSizeX(0), + fPadSizeY(0), + fEnveloppeSizeX(0), + fEnveloppeSizeY(0), + fXoffset(0), + fActiveXmin(0), + fActiveXmax(0), + fIxmin(99999), + fIxmax(0), + fIymin(99999), + fIymax(0), + fMotifPositions(), + fNofPads(0), + fMotifMap(0x0) +{ + /// + /// Copy constructor + + fMotifPositions.SetOwner(kTRUE); + + AliDebug(1,Form("this=%p (copy ctor) : begin",this)); o.Copy(*this); + AliDebug(1,Form("this=%p (copy ctor) : end",this)); } //_____________________________________________________________________________ AliMpPCB::AliMpPCB(const char* id, AliMpMotifSpecial* ms) -: TObject(), fId(id), fPadSizeX(-1.0), fPadSizeY(-1.0), - fXoffset(0) -{ - // - // Very special ctor to be used by trigger stations only (and for a very - // specific case). - // - // Note that in this very case, we only allow one (special) motif per PCB. - // This limitation might not be justified, except that it's all we need - // so far ;-) - // - fXoffset = 0.0; - fEnveloppeSizeX = ms->Dimensions().X()*2.0; - fEnveloppeSizeY = ms->Dimensions().Y()*2.0; - fActiveXmin = 0.0; - fActiveXmax = fEnveloppeSizeX; - fIxmin = fIymin = 0; - fIxmax = ms->GetMotifType()->GetNofPadsX()-1; - fIymax = ms->GetMotifType()->GetNofPadsY()-1; - TVector2 position(ms->Dimensions()); - AliMpMotifPosition* mp = new AliMpMotifPosition(-1,ms,position); - mp->SetLowIndicesLimit(AliMpIntPair(fIxmin,fIymin)); - mp->SetHighIndicesLimit(AliMpIntPair(fIxmax,fIymax)); -#ifdef WITH_ROOT - fMotifs.AddLast(mp); -#else - fMotifs.push_back(mp); -#endif - fNofPads = ms->GetMotifType()->GetNofPads(); +: TObject(), + fId(id), + fPadSizeX(-1.0), + fPadSizeY(-1.0), + fEnveloppeSizeX(ms->DimensionX()*2.0), + fEnveloppeSizeY(ms->DimensionY()*2.0), + fXoffset(0.0), + fActiveXmin(0.0), + fActiveXmax(fEnveloppeSizeX), + fIxmin(0), + fIxmax(ms->GetMotifType()->GetNofPadsX()-1), + fIymin(0), + fIymax(ms->GetMotifType()->GetNofPadsY()-1), + fMotifPositions(), + fNofPads(ms->GetMotifType()->GetNofPads()), + fMotifMap(0x0) +{ + /// + /// Very special ctor to be used by trigger stations only (and for a very + /// specific case). + /// + /// Note that in this very case, we only allow one (special) motif per PCB. + /// This limitation might not be justified, except that it's all we need + /// so far ;-) + /// + + AliDebug(1,Form("this=%p (ctor special motif)",this)); + + fMotifPositions.SetOwner(kTRUE); + + Double_t posx = ms->DimensionX(); + Double_t posy = ms->DimensionY(); + AliMpMotifPosition* mp = new AliMpMotifPosition(-1,ms,posx,posy); + mp->SetLowIndicesLimit(fIxmin,fIymin); + mp->SetHighIndicesLimit(fIxmax,fIymax); + fMotifPositions.AddLast(mp); } //_____________________________________________________________________________ AliMpPCB& AliMpPCB::operator=(const AliMpPCB& o) { + /// Assignment operator + + AliDebug(1,Form("this=%p (assignment op) : begin",this)); o.Copy(*this); + AliDebug(1,Form("this=%p (assignment op) : end",this)); return *this; } //_____________________________________________________________________________ AliMpPCB::~AliMpPCB() { - // - // Dtor. - // + /// + /// Dtor. + /// + AliDebug(1,Form("this=%p",this)); } //_____________________________________________________________________________ Double_t AliMpPCB::ActiveXmin() const { - // - // Returns the mininum x for which there is a pad in this PCB. - // Different from Xmin only for PCB which are not full of pads. - // + /// + /// Returns the mininum x for which there is a pad in this PCB. + /// Different from Xmin only for PCB which are not full of pads. + /// return fActiveXmin; } @@ -140,10 +215,10 @@ AliMpPCB::ActiveXmin() const Double_t AliMpPCB::ActiveXmax() const { - // - // Returns the maximum x for which there is a pad in this PCB. - // Different from Xmax only for PCB which are not full of pads. - // + /// + /// Returns the maximum x for which there is a pad in this PCB. + /// Different from Xmax only for PCB which are not full of pads. + /// return fActiveXmax; } @@ -152,98 +227,127 @@ AliMpPCB::ActiveXmax() const void AliMpPCB::Add(AliMpMotifType* mt, Int_t ix, Int_t iy) { - // - // Add a motif to this PCB. (ix,iy) indicates one corner position of the motif - // where the sign of ix and iy is used to indicate which corner is the - // reference (then for values, abs(ix) and abs(iy) are used indeed) : - // - // (ix>0,iy>0) : bottom-left corner - // (ix<0,iy>0) : bottom-right corner - // (ix<0,iy<0) : top-right corner - // (ix>0,iy<0) : top-left corner. - - AliMpVMotif* motif = - new AliMpMotif(mt->GetID(),mt,TVector2(PadSizeX()/2.0,PadSizeY()/2.0)); - TVector2 position; + /// + /// Add a motif to this PCB. (ix,iy) indicates one corner position of the motif + /// where the sign of ix and iy is used to indicate which corner is the + /// reference (then for values, abs(ix) and abs(iy) are used indeed) : + /// + /// (ix>0,iy>0) : bottom-left corner + /// (ix<0,iy>0) : bottom-right corner + /// (ix<0,iy<0) : top-right corner + /// (ix>0,iy<0) : top-left corner. + + TString id(Form("%s-%e-%e",mt->GetID().Data(),PadSizeX(),PadSizeY())); + + AliMpVMotif* motif = fMotifMap->FindMotif(id); + + if (!motif) + { + motif = new AliMpMotif(id,mt,PadSizeX()/2.0,PadSizeY()/2.0); + AliDebug(1,Form("Adding motif %s to motifMap",id.Data())); + fMotifMap->AddMotif(motif); + } + else + { + AliDebug(1,Form("Got motif %s from motifMap",id.Data())); + } + + Double_t posx(0.); + Double_t posy(0.); Int_t ixmin(-1); Int_t iymin(-1); if ( ix >= 0 && iy >= 0 ) { - position.Set(ix*PadSizeX(),iy*PadSizeY()); + posx = ix*PadSizeX(); + posy = iy*PadSizeY(); ixmin = ix; iymin = iy; } else if ( ix >= 0 && iy < 0 ) { - position.Set(ix*PadSizeX(),Ymax()+iy*PadSizeY()); + posx = ix*PadSizeX(); + posy = Ymax()+iy*PadSizeY(); ixmin = ix; iymin = TMath::Nint(Ymax()/PadSizeY()) + iy; } else if ( ix < 0 && iy < 0 ) { - position.Set(Xmax()+ix*PadSizeX(),Ymax()+iy*PadSizeY()); + posx = Xmax()+ix*PadSizeX(); + posy = Ymax()+iy*PadSizeY(); ixmin = TMath::Nint(Xmax()/PadSizeX()) + ix; iymin = TMath::Nint(Ymax()/PadSizeY()) + iy; } else if ( ix < 0 && iy >=0 ) { - position.Set(Xmax()+ix*PadSizeX(),iy*PadSizeY()); + posx = Xmax()+ix*PadSizeX(); + posy = iy*PadSizeY(); ixmin = TMath::Nint(Xmax()/PadSizeX()) + ix; iymin = iy; } - position += motif->Dimensions(); + posx += motif->DimensionX(); + posy += motif->DimensionY(); + AliMpMotifPosition* mp + = new AliMpMotifPosition(-1,motif,posx, posy); - AliMpMotifPosition* mp = new AliMpMotifPosition(-1,motif,position); - Int_t ixmax = ixmin + mt->GetNofPadsX() - 1; + Int_t ixmax = ixmin + mt->GetNofPadsX() - 1; Int_t iymax = iymin + mt->GetNofPadsY() - 1; + mp->SetLowIndicesLimit(ixmin,iymin); + mp->SetHighIndicesLimit(ixmax,iymax); - mp->SetLowIndicesLimit(AliMpIntPair(ixmin,iymin)); - mp->SetHighIndicesLimit(AliMpIntPair(ixmax,iymax)); + fMotifPositions.AddLast(mp); -#ifdef WITH_ROOT - fMotifs.AddLast(mp); -#else - fMotifs.push_back(mp); -#endif - - fIxmin = std::min(fIxmin,ixmin); - fIxmax = std::max(fIxmax,ixmax); - fIymin = std::min(fIymin,iymin); - fIymax = std::max(fIymax,iymax); + fIxmin = TMath::Min(fIxmin,ixmin); + fIxmax = TMath::Max(fIxmax,ixmax); + fIymin = TMath::Min(fIymin,iymin); + fIymax = TMath::Max(fIymax,iymax); fActiveXmin = fIxmin*PadSizeX(); fActiveXmax = (fIxmax+1)*PadSizeX(); fNofPads += mt->GetNofPads(); } +//_____________________________________________________________________________ +AliMpArea +AliMpPCB::Area() const +{ + /// Return the area of this PCB + + return AliMpArea((Xmin()+Xmax())/2.0,DY(), DX(), DY() ); +} + //_____________________________________________________________________________ TObject* AliMpPCB::Clone(const char* /*newname*/) const { - // - // Return a full copy of this object. - // - return new AliMpPCB(*this); + /// + /// Return a full copy of this object. + /// + AliDebug(1,"begin"); + TObject* object = new AliMpPCB(*this); + AliDebug(1,"end"); + return object; } //_____________________________________________________________________________ AliMpPCB* AliMpPCB::Clone(const TArrayI& manuids, Int_t ixOffset, Double_t xOffset) const { - // - // Get a full copy of *this, and then apply 2 changes to it : - // - // a) define the relationship motifType <-> manu id - // b) define the x-offset - // c) shift ix indices backwards to insure that e.g. the first - // pcb of a slat will start at ix=0 (only relevant for rounded pcbs). - // + /// + /// Get a full copy of *this, and then apply 2 changes to it : + /// + /// a) define the relationship motifType <-> manu id + /// b) define the x-offset + /// c) shift ix indices backwards to insure that e.g. the first + /// pcb of a slat will start at ix=0 (only relevant for rounded pcbs). + /// + AliDebug(1,"begin"); + // First get a full clone. AliMpPCB* pcb = static_cast(Clone()); @@ -255,30 +359,34 @@ AliMpPCB::Clone(const TArrayI& manuids, Int_t ixOffset, Double_t xOffset) const return 0; } - AliMpIntPair shift(-fIxmin,0); + MpPair_t shift = AliMp::Pair(-fIxmin+ixOffset,0); // Then change the internal MotifPositions wrt manu id // and position (offset in x). - for ( Size_t i = 0; i < pcb->GetSize(); ++i ) + for ( Int_t i = 0; i < pcb->GetSize(); ++i ) { AliMpMotifPosition* mp = pcb->GetMotifPosition(i); mp->SetID(manuids[i]); - mp->SetPosition(mp->Position() + TVector2(xOffset,0)); - mp->SetLowIndicesLimit(mp->GetLowIndicesLimit()+ - shift+ - AliMpIntPair(ixOffset,0)); - mp->SetHighIndicesLimit(mp->GetHighIndicesLimit()+ - shift+ - AliMpIntPair(ixOffset,0)); + Double_t posx = mp->GetPositionX() + xOffset; + Double_t posy = mp->GetPositionY(); + mp->SetPosition(posx, posy); + MpPair_t low = mp->GetLowIndicesLimit(); + low += shift; + mp->SetLowIndicesLimit(low); + MpPair_t high = mp->GetHighIndicesLimit(); + high += shift; + mp->SetHighIndicesLimit(high); } - pcb->fIxmin += ixOffset + shift.GetFirst(); - pcb->fIxmax += ixOffset + shift.GetFirst(); + pcb->fIxmin += AliMp::PairFirst(shift); + pcb->fIxmax += AliMp::PairFirst(shift); pcb->fXoffset = xOffset; pcb->fActiveXmin += xOffset; pcb->fActiveXmax += xOffset; + AliDebug(1,"end"); + return pcb; } @@ -286,6 +394,10 @@ AliMpPCB::Clone(const TArrayI& manuids, Int_t ixOffset, Double_t xOffset) const void AliMpPCB::Copy(TObject& o) const { + /// Copy *this into o + + AliDebug(1,"begin"); + TObject::Copy(o); AliMpPCB& pcb = static_cast(o); pcb.fId = fId; @@ -301,40 +413,35 @@ AliMpPCB::Copy(TObject& o) const pcb.fActiveXmin = fActiveXmin; pcb.fActiveXmax = fActiveXmax; -#ifdef WITH_ROOT - pcb.fMotifs.Clear(); -#else - pcb.fMotifs.clear(); -#endif - -#ifdef WITH_ROOT - for ( Size_t i = 0; i < fMotifs.GetEntriesFast(); ++i ) -#else - for ( Size_t i = 0; i < fMotifs.size(); ++i ) -#endif + AliDebug(1,"Deleting pcb.fMotifPositions"); + pcb.fMotifPositions.Delete(); + AliDebug(1,"Deleting pcb.fMotifPositions : done"); + + for ( Int_t i = 0; i < fMotifPositions.GetEntriesFast(); ++i ) { - AliMpMotifPosition* pos = (AliMpMotifPosition*)fMotifs[i]; - AliMpMotifPosition* pcbpos = - new AliMpMotifPosition(pos->GetID(),pos->GetMotif(),pos->Position()); + AliMpMotifPosition* pos = (AliMpMotifPosition*)fMotifPositions[i]; + AliMpMotifPosition* pcbpos + = new AliMpMotifPosition(pos->GetID(), pos->GetMotif(), + pos->GetPositionX(), pos->GetPositionY()); pcbpos->SetLowIndicesLimit(pos->GetLowIndicesLimit()); pcbpos->SetHighIndicesLimit(pos->GetHighIndicesLimit()); -#ifdef WITH_ROOT - pcb.fMotifs.AddLast(pcbpos); -#else - pcb.fMotifs.push_back(pcbpos); -#endif + pcb.fMotifPositions.AddLast(pcbpos); } pcb.fNofPads = fNofPads; + + pcb.fMotifMap = fMotifMap; // warning : we do share the motifmap. + + AliDebug(1,"end"); } //_____________________________________________________________________________ Double_t AliMpPCB::ActiveDX() const { - // - // Half-length (in x-direction) occupied by pads - // + /// + /// Half-length (in x-direction) occupied by pads + /// return GetNofPadsX()*fPadSizeX/2.0; } @@ -343,13 +450,13 @@ AliMpPCB::ActiveDX() const Double_t AliMpPCB::DX() const { - // - // Half-length (in x-direction) of the PCB. - // This length is the one of the virtual enveloppe of the PCB and might - // be bigger than the length occupied by pads (e.g. for rounded or short - // PCBs). - // See also ActiveDX(). - // + /// + /// Half-length (in x-direction) of the PCB. + /// This length is the one of the virtual enveloppe of the PCB and might + /// be bigger than the length occupied by pads (e.g. for rounded or short + /// PCBs). + /// See also ActiveDX(). + /// return fEnveloppeSizeX/2.0; } @@ -358,9 +465,9 @@ AliMpPCB::DX() const Double_t AliMpPCB::ActiveDY() const { - // - // Half-length (in y-direction) occupied by pads - // + /// + /// Half-length (in y-direction) occupied by pads + /// return GetNofPadsY()*fPadSizeY/2.0; } @@ -369,13 +476,13 @@ AliMpPCB::ActiveDY() const Double_t AliMpPCB::DY() const { - // - // Half-length (in y-direction) of the PCB. - // This length is the one of the virtual enveloppe of the PCB and might - // be bigger than the length occupied by pads (e.g. for rounded or short - // PCBs). - // See also ActiveDY(). - // + /// + /// Half-length (in y-direction) of the PCB. + /// This length is the one of the virtual enveloppe of the PCB and might + /// be bigger than the length occupied by pads (e.g. for rounded or short + /// PCBs). + /// See also ActiveDY(). + /// return fEnveloppeSizeY/2.0; } @@ -384,19 +491,15 @@ AliMpPCB::DY() const AliMpMotifPosition* AliMpPCB::FindMotifPosition(Int_t ix, Int_t iy) const { - // - // Returns the motifPosition located at the position referenced by - // integer indices (ix,iy). - // + /// + /// Returns the motifPosition located at the position referenced by + /// integer indices (ix,iy). + /// -#ifdef WITH_ROOT - for (Size_t i = 0; i < fMotifs.GetEntriesFast(); ++i ) -#else - for (Size_t i = 0; i < fMotifs.size(); ++i ) -#endif + for (Int_t i = 0; i < fMotifPositions.GetEntriesFast(); ++i ) { - AliMpMotifPosition* mp = (AliMpMotifPosition*)fMotifs[i]; - if ( mp->HasPad(AliMpIntPair(ix,iy)) ) + AliMpMotifPosition* mp = (AliMpMotifPosition*)fMotifPositions[i]; + if ( mp->HasPadByIndices(AliMp::Pair(ix,iy)) ) { return mp; } @@ -408,23 +511,22 @@ AliMpPCB::FindMotifPosition(Int_t ix, Int_t iy) const AliMpMotifPosition* AliMpPCB::FindMotifPosition(Double_t x, Double_t y) const { - // - // Returns the motifPosition located at position (x,y) - // + /// + /// Returns the motifPosition located at position (x,y) + /// -#ifdef WITH_ROOT - for (Size_t i = 0; i < fMotifs.GetEntriesFast(); ++i ) -#else - for (Size_t i = 0; i < fMotifs.size(); ++i ) -#endif + for (Int_t i = 0; i < fMotifPositions.GetEntriesFast(); ++i ) { - AliMpMotifPosition* mp = (AliMpMotifPosition*)fMotifs[i]; + AliMpMotifPosition* mp = (AliMpMotifPosition*)fMotifPositions[i]; - TVector2 localPos( TVector2(x,y) - mp->Position() ); + Double_t localPosX = x - mp->GetPositionX(); + Double_t localPosY = y - mp->GetPositionY(); - AliMpIntPair localIndices(mp->GetMotif()->PadIndicesLocal(localPos)); + MpPair_t localIndices( + mp->GetMotif()->PadIndicesLocal(localPosX, localPosY)); - if ( localIndices.IsValid() && mp->GetMotif()->GetMotifType()->HasPad(localIndices) ) + if ( localIndices >= 0 && + mp->GetMotif()->GetMotifType()->HasPadByLocalIndices(localIndices) ) { return mp; } @@ -436,36 +538,33 @@ AliMpPCB::FindMotifPosition(Double_t x, Double_t y) const const char* AliMpPCB::GetID() const { - // - // Returns the name of this PCB. - // + /// + /// Returns the name of this PCB. + /// return fId.Data(); } //_____________________________________________________________________________ AliMpMotifPosition* -AliMpPCB::GetMotifPosition(AliMpPCB::Size_t i) const +AliMpPCB::GetMotifPosition(Int_t i) const { - // - // Get the i-th motifPosition stored in this PCB's internal array. - // + /// + /// Get the i-th motifPosition stored in this PCB's internal array. + /// -#ifdef WITH_ROOT - if ( i >= fMotifs.GetEntriesFast() ) return 0; -#else - if ( i >= fMotifs.size() ) return 0; -#endif - return (AliMpMotifPosition*)fMotifs[i]; + if ( i >= fMotifPositions.GetEntriesFast() ) return 0; + + return (AliMpMotifPosition*)fMotifPositions[i]; } //_____________________________________________________________________________ Int_t AliMpPCB::GetNofPadsX() const { - // - // Returns the number of pads in x-direction. - // + /// + /// Returns the number of pads in x-direction. + /// return fIxmax-fIxmin+1; } @@ -474,26 +573,37 @@ AliMpPCB::GetNofPadsX() const Int_t AliMpPCB::GetNofPadsY() const { - // - // Returns the number of pads in y-direction. - // + /// + /// Returns the number of pads in y-direction. + /// return fIymax-fIymin+1; } //_____________________________________________________________________________ -AliMpPCB::Size_t +Int_t AliMpPCB::GetSize() const { - // - // Returns the number of motifPositions stored in this PCB. - // + /// + /// Returns the number of motifPositions stored in this PCB. + /// -#ifdef WITH_ROOT - return fMotifs.GetEntriesFast(); -#else - return fMotifs.size(); -#endif + return fMotifPositions.GetEntriesFast(); +} + +//_____________________________________________________________________________ +Bool_t +AliMpPCB::HasMotifPositionID(Int_t manuId) const +{ + /// Returns whether or not we have manuId + + TIter next(&fMotifPositions); + AliMpMotifPosition* pos; + while ( ( pos = static_cast(next()) ) ) + { + if ( pos->GetID() == manuId ) return kTRUE; + } + return kFALSE; } @@ -501,9 +611,9 @@ AliMpPCB::GetSize() const Int_t AliMpPCB::Ixmin() const { - // - // Returns the index value of the leftmost pad. - // + /// + /// Returns the index value of the leftmost pad. + /// return fIxmin; } @@ -512,9 +622,9 @@ AliMpPCB::Ixmin() const Int_t AliMpPCB::Ixmax() const { - // - // Returns the index value of the rightmost pad. - // + /// + /// Returns the index value of the rightmost pad. + /// return Ixmin() + GetNofPadsX() - 1; } @@ -523,9 +633,9 @@ AliMpPCB::Ixmax() const Int_t AliMpPCB::Iymin() const { - // - // Returns the index value of the bottom pad. - // + /// + /// Returns the index value of the bottom pad. + /// return fIymin; } @@ -534,9 +644,9 @@ AliMpPCB::Iymin() const Int_t AliMpPCB::Iymax() const { - // - // Returns the index value of the top pad. - // + /// + /// Returns the index value of the top pad. + /// return Iymin() + GetNofPadsY() - 1; } @@ -545,9 +655,9 @@ AliMpPCB::Iymax() const Double_t AliMpPCB::PadSizeX() const { - // - // Returns the pad size in x-direction (in mm) - // + /// + /// Returns the pad size in x-direction (in mm) + /// return fPadSizeX; } @@ -556,9 +666,9 @@ AliMpPCB::PadSizeX() const Double_t AliMpPCB::PadSizeY() const { - // - // Returns the pad size in y-direction (in mm) - // + /// + /// Returns the pad size in y-direction (in mm) + /// return fPadSizeY; } @@ -567,10 +677,10 @@ AliMpPCB::PadSizeY() const void AliMpPCB::Print(Option_t* option) const { - // - // Printout of this PCB. - // If option="M", the contained motifs are printed too. - // + /// + /// Printout of this PCB. + /// If option="M", the contained motifs are printed too. + /// cout << "PCB " << GetID() << " PADSIZES=(" << fPadSizeX << "," << fPadSizeY << ") iMin=(" << fIxmin << "," << fIymin << ") " @@ -581,31 +691,77 @@ AliMpPCB::Print(Option_t* option) const if ( option && option[0] == 'M' ) { -#ifdef WITH_ROOT - for ( Size_t i = 0; i < fMotifs.GetEntriesFast(); ++i ) -#else - for ( Size_t i = 0; i < fMotifs.size(); ++i ) -#endif + for ( Int_t i = 0; i < fMotifPositions.GetEntriesFast(); ++i ) { if (option) { - fMotifs[i]->Print(option+1); + fMotifPositions[i]->Print(option+1); } else { - fMotifs[i]->Print(); + fMotifPositions[i]->Print(); } } } } +//_____________________________________________________________________________ +void +AliMpPCB::Save() const +{ + /// + /// Save this PCB in the file + + TString fileName(fId); + fileName += ".pcb"; + TList lines; + lines.SetOwner(kTRUE); + + for ( Int_t i = 0; i < fMotifPositions.GetEntriesFast(); ++i ) + { + AliMpMotifPosition* pos = GetMotifPosition(i); + AliMpVMotif* motif = pos->GetMotif(); + + Double_t lowerLeftX = pos->GetPositionX()-pos->GetDimensionX(); + Double_t lowerLeftY = pos->GetPositionY()-pos->GetDimensionY(); + TString id(motif->GetID()); + // id is supposed to be of the form %s-%e-%e, and we're only + // interested in the %s part of it + Ssiz_t index = id.Index("-"); + if ( index < 1 ) + { + AliError(Form("id=%s does not meet expectations",id.Data())); + return; + } + TString motifName(id(0,index)); + lines.Add(new TObjString(Form("MOTIF %s %d %d", + motifName.Data(), + TMath::Nint(lowerLeftX/fPadSizeX), + TMath::Nint(lowerLeftY/fPadSizeY)))); + } + + ofstream out(fileName.Data()); + out.precision(9); + out << "SIZES " << fPadSizeX << " " << fPadSizeY + << " " << fEnveloppeSizeX << " " << fEnveloppeSizeY + << endl; + + TIter next(&lines); + TObjString* s; + while ( ( s = (TObjString*)next() ) ) + { + out << s->String().Data() << endl; + } + out.close(); +} + //_____________________________________________________________________________ Double_t AliMpPCB::X() const { - // - // Returns the x-position of the PCB center. - // + /// + /// Returns the x-position of the PCB center. + /// return fXoffset + DX(); } @@ -614,9 +770,9 @@ AliMpPCB::X() const Double_t AliMpPCB::Xmin() const { - // - // Returns the leftmost x-position in this PCB. - // + /// + /// Returns the leftmost x-position in this PCB. + /// return X() - DX(); } @@ -625,9 +781,9 @@ AliMpPCB::Xmin() const Double_t AliMpPCB::Xmax() const { - // - // Returns the rightmost x-position in this PCB. - // + /// + /// Returns the rightmost x-position in this PCB. + /// return X() + DX(); } @@ -636,9 +792,9 @@ AliMpPCB::Xmax() const Double_t AliMpPCB::Y() const { - // - // Returns the y-position of the PCB center. - // + /// + /// Returns the y-position of the PCB center. + /// return DY(); // this works as PCB are organized in a single row within slats. } @@ -647,9 +803,9 @@ AliMpPCB::Y() const Double_t AliMpPCB::Ymin() const { - // - // Returns the smallest y-position in this PCB. - // + /// + /// Returns the smallest y-position in this PCB. + /// return Y() - DY(); } @@ -658,9 +814,9 @@ AliMpPCB::Ymin() const Double_t AliMpPCB::Ymax() const { - // - // Returns the largest y-position in this PCB. - // + /// + /// Returns the largest y-position in this PCB. + /// return Y() + DY(); }