1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
17 // $MpId: AliMpSegFactory.cxx,v 1.6 2006/03/17 11:36:27 ivana Exp $
18 // Category: management
20 // -----------------------
21 // Class AliMpSegFactory
22 // -----------------------
23 // The factory for building mapping segmentations
24 // Authors: Ivana Hrivnacova, IPN Orsay
25 // Laurent Aphecetche, SUBATECH
27 #include "AliMpSegFactory.h"
29 #include "AliMpDEManager.h"
30 #include "AliMpExMap.h"
31 #include "AliMpSector.h"
32 #include "AliMpSectorReader.h"
33 #include "AliMpSectorSegmentation.h"
34 #include "AliMpSlat.h"
35 #include "AliMpSlatSegmentation.h"
36 #include "AliMpSt345Reader.h"
37 #include "AliMpTrigger.h"
38 #include "AliMpTriggerReader.h"
39 #include "AliMpTriggerSegmentation.h"
43 #include <Riostream.h>
45 #include <TObjString.h>
48 ClassImp(AliMpSegFactory)
50 //______________________________________________________________________________
51 AliMpSegFactory::AliMpSegFactory()
54 fMpMap(new AliMpExMap(true))
56 /// Standard constructor
58 fMpMap->SetOwner(true);
61 //______________________________________________________________________________
62 AliMpSegFactory::AliMpSegFactory(const AliMpSegFactory& rhs)
65 /// Protected copy constructor
67 AliFatal("Not implemented.");
70 //______________________________________________________________________________
72 AliMpSegFactory::~AliMpSegFactory()
76 // The segmentations is supposed to be deleted in the client code
80 //______________________________________________________________________________
81 AliMpSegFactory& AliMpSegFactory::operator=(const AliMpSegFactory& rhs)
83 // Protected assignement operator
85 if (this == &rhs) return *this;
87 AliFatal("Not implemented.");
96 //_____________________________________________________________________________
98 AliMpSegFactory::FillMpMap(Int_t detElemId)
100 /// Fill the map of electronic cards IDs to segmentations for
103 AliDebug(1,Form("detElemId=%d",detElemId));
105 AliMpExMap* mde = new AliMpExMap(true);
106 mde->SetOwner(kFALSE);
107 fMpMap->Add(detElemId,mde);
109 AliMpVSegmentation* seg[2];
112 // Do it in 2 steps to be able to set the AliMpExMap size once for all,
113 // to avoid annoying warning message in case of dynamical resizing.
115 for ( Int_t cathode = 0; cathode < 2; ++cathode )
117 seg[cathode] = CreateMpSegmentation(detElemId,cathode);
118 seg[cathode]->GetAllElectronicCardIDs(ecn[cathode]);
121 mde->SetSize(ecn[0].GetSize()+ecn[1].GetSize());
123 for ( Int_t cathode = 0; cathode < 2; ++ cathode )
125 for ( Int_t i = 0; i < ecn[cathode].GetSize(); ++i )
127 mde->Add(ecn[cathode][i],const_cast<AliMpVSegmentation*>(seg[cathode]));
138 //______________________________________________________________________________
140 AliMpSegFactory::CreateMpSegmentation(Int_t detElemId, Int_t cath)
142 /// Create mapping segmentation for given detElemId and cath
143 /// or return it if it was already built
145 // Check detElemId & cath
146 if ( ! AliMpDEManager::IsValid(detElemId, cath, true) ) return 0;
148 // If segmentation is already built, just return it
150 TString deName = AliMpDEManager::GetDEName(detElemId, cath);
151 TObject* object = fMpSegmentations.Get(deName);
152 if ( object ) return (AliMpVSegmentation*)object;
154 AliDebug(1,Form("Creating segmentation for detElemId=%d cath=%d",
157 // Read mapping data and create segmentation
159 AliMpStationType stationType = AliMpDEManager::GetStationType(detElemId);
160 AliMpPlaneType planeType = AliMpDEManager::GetPlaneType(detElemId, cath);
161 TString deTypeName = AliMpDEManager::GetDETypeName(detElemId, cath);
163 AliMpVSegmentation* mpSegmentation = 0;
165 if ( stationType == kStation1 || stationType == kStation2 ) {
166 AliMpSectorReader reader(stationType, planeType);
167 AliMpSector* sector = reader.BuildSector();
168 mpSegmentation = new AliMpSectorSegmentation(sector);
170 else if ( stationType == kStation345 ) {
171 AliMpSlat* slat = AliMpSt345Reader::ReadSlat(deTypeName, planeType);
172 mpSegmentation = new AliMpSlatSegmentation(slat);
174 else if ( stationType == kStationTrigger ) {
175 AliMpTrigger* trigger = AliMpTriggerReader::ReadSlat(deTypeName, planeType);
176 mpSegmentation = new AliMpTriggerSegmentation(trigger);
179 AliErrorStream() << "Unknown station type" << endl;
181 fMpSegmentations.Add(deName, mpSegmentation);
182 return mpSegmentation;
185 //_____________________________________________________________________________
187 AliMpSegFactory::CreateMpSegmentationByElectronics(Int_t detElemId,
190 /// Create mapping segmentation for given detElemId and electronic card Id
191 /// (motif position Id) or return it if it was already built
193 AliMpExMap* m = static_cast<AliMpExMap*>(fMpMap->GetValue(detElemId));
197 m = FillMpMap(detElemId);
200 return static_cast<AliMpVSegmentation*>(m->GetValue(ecId));
203 //______________________________________________________________________________
204 void AliMpSegFactory::DeleteSegmentations()
206 /// Delete all segmentations created with this manager
208 AliDebug(1,"deleting mpSegmentations");
209 fMpSegmentations.Clear();
210 AliDebug(1,"deleting mpMap");