#include <TString.h>
#include <TGeoManager.h>
#include <TGeoPhysicalNode.h>
+#include <TGeoShape.h>
+#include <TGeoBBox.h>
#include <TDatime.h>
#include <TMath.h>
#include <TSystem.h>
,fNHalfStaves(0)
,fNModules(0)
,fNChipsPerModule(0)
+ ,fNChipRowsPerModule(0)
,fNChipsPerHalfStave(0)
,fNChipsPerStave(0)
,fNChipsPerLayer(0)
,fNHalfStaves(0)
,fNModules(0)
,fNChipsPerModule(0)
+ ,fNChipRowsPerModule(0)
,fNChipsPerHalfStave(0)
,fNChipsPerStave(0)
,fNChipsPerLayer(0)
if (fNLayers) {
fNStaves = new Int_t[fNLayers];
fNChipsPerModule = new Int_t[fNLayers];
+ fNChipRowsPerModule = new Int_t[fNLayers];
fLrChipType = new Int_t[fNLayers];
fLastChipIndex = new Int_t[fNLayers];
fNChipsPerHalfStave = new Int_t[fNLayers];
fNHalfStaves[i] = src.fNHalfStaves[i];
fNModules[i] = src.fNModules[i];
fNChipsPerModule[i] = src.fNChipsPerModule[i];
+ fNChipRowsPerModule[i] = src.fNChipRowsPerModule[i];
fNChipsPerHalfStave[i] = src.fNChipsPerHalfStave[i];
fNChipsPerStave[i] = src.fNChipsPerStave[i];
fNChipsPerLayer[i] = src.fNChipsPerLayer[i];
delete[] fNModules;
delete[] fLrChipType;
delete[] fNChipsPerModule;
+ delete[] fNChipRowsPerModule;
delete[] fNChipsPerHalfStave;
delete[] fNChipsPerStave;
delete[] fNChipsPerLayer;
delete[] fNModules;
delete[] fLrChipType;
delete[] fNChipsPerModule;
+ delete[] fNChipRowsPerModule;
delete[] fNChipsPerHalfStave;
delete[] fNChipsPerStave;
delete[] fNChipsPerLayer;
fNHalfStaves = new Int_t[fNLayers];
fNModules = new Int_t[fNLayers];
fNChipsPerModule = new Int_t[fNLayers];
+ fNChipRowsPerModule = new Int_t[fNLayers];
fNChipsPerHalfStave = new Int_t[fNLayers];
fNChipsPerStave = new Int_t[fNLayers];
fNChipsPerLayer = new Int_t[fNLayers];
fNHalfStaves[i] = src.fNHalfStaves[i];
fNModules[i] = src.fNModules[i];
fNChipsPerModule[i] = src.fNChipsPerModule[i];
+ fNChipRowsPerModule[i] = src.fNChipRowsPerModule[i];
fNChipsPerHalfStave[i] = src.fNChipsPerHalfStave[i];
fNChipsPerStave[i] = src.fNChipsPerStave[i];
fNChipsPerLayer[i] = src.fNChipsPerLayer[i];
fNHalfStaves = new Int_t[fNLayers];
fNModules = new Int_t[fNLayers];
fNChipsPerModule = new Int_t[fNLayers];
+ fNChipRowsPerModule = new Int_t[fNLayers];
fNChipsPerHalfStave = new Int_t[fNLayers];
fNChipsPerStave = new Int_t[fNLayers];
fNChipsPerLayer = new Int_t[fNLayers];
fLrChipType = new Int_t[fNLayers];
fLastChipIndex = new Int_t[fNLayers];
fNChips = 0;
+
for (int i=0;i<fNLayers;i++) {
fLrChipType[i] = ExtractLayerChipType(i);
fNStaves[i] = ExtractNumberOfStaves(i);
fNHalfStaves[i] = ExtractNumberOfHalfStaves(i);
fNModules[i] = ExtractNumberOfModules(i);
- fNChipsPerModule[i] = ExtractNChipsPerModule(i);
+ fNChipsPerModule[i] = ExtractNChipsPerModule(i,fNChipRowsPerModule[i]);
fNChipsPerHalfStave[i]= fNChipsPerModule[i]*Max(1,fNModules[i]);
fNChipsPerStave[i] = fNChipsPerHalfStave[i]*Max(1,fNHalfStaves[i]);
fNChipsPerLayer[i] = fNChipsPerStave[i]*fNStaves[i];
}
//______________________________________________________________________
-Int_t AliITSUGeomTGeo::ExtractNChipsPerModule(Int_t lay) const
+Int_t AliITSUGeomTGeo::ExtractNChipsPerModule(Int_t lay, int &nrow) const
{
// Determines the number of chips per module on the (sub)stave in the Upgrade Geometry
- //
+ // Also extract the layout: span of module centers in Z and X
// Inputs:
// lay: layer number from 0
// MS
//
// Loop on all stave nodes, count Chip volumes by checking names
Int_t nNodes = volLd->GetNodes()->GetEntries();
+ //
+ double xmin=1e9,xmax=-1e9, zmin=1e9,zmax=-1e9;
+ double lab[3],loc[3]={0,0,0};
+ double dx=-1,dz=-1;
for (Int_t j=0; j<nNodes; j++) {
// AliInfo(Form("L%d %d of %d %s %s -> %d",lay,j,nNodes,volLd->GetNodes()->At(j)->GetName(),GetITSChipPattern(),numberOfChips));
- if (strstr(volLd->GetNodes()->At(j)->GetName(),GetITSChipPattern())) numberOfChips++;
+ TGeoNodeMatrix* node = (TGeoNodeMatrix*)volLd->GetNodes()->At(j);
+ if (!strstr(node->GetName(),GetITSChipPattern())) continue;
+ node->LocalToMaster(loc,lab);
+ if (lab[0]>xmax) xmax=lab[0];
+ if (lab[0]<xmin) xmin=lab[0];
+ if (lab[2]>zmax) zmax=lab[2];
+ if (lab[2]<zmin) zmin=lab[2];
+ //
+ numberOfChips++;
+ //
+ if (dx<0) {
+ TGeoShape* chShape = node->GetVolume()->GetShape();
+ TGeoBBox* bbox = dynamic_cast<TGeoBBox*>(chShape);
+ if (!bbox) {
+ AliFatal(Form("Chip %s volume is of unprocessed shape %s",node->GetName(),chShape->IsA()->GetName()));
+ }
+ else {
+ dx = 2*bbox->GetDX();
+ dz = 2*bbox->GetDZ();
+ }
+ }
}
//
+ double spanX = xmax-xmin;
+ double spanZ = zmax-zmin;
+ nrow = TMath::Nint(spanX/dx + 1);
+ int ncol = TMath::Nint(spanZ/dz + 1);
+ if (nrow*ncol != numberOfChips)
+ AliError(Form("Inconsistency between Nchips=%d and Nrow*Ncol=%d*%d->%d\n"
+ "Extracted chip dimensions (x,z): %.4f %.4f, Module Span: %.4f %.4f",
+ numberOfChips,nrow,ncol,nrow*ncol,
+ dx,dz,spanX,spanZ));
return numberOfChips;
//
}
printf("Geometry version %d, NLayers:%d NChips:%d\n",fVersion,fNLayers,fNChips);
if (fVersion==kITSVNA) return;
for (int i=0;i<fNLayers;i++) {
- printf("Lr%2d\tNStav:%2d\tNChips:%2d\tNMod:%d\tNSubSt:%d\tNSt:%3d\tChipType:%3d\tChip#:%4d:%4d\tWrapVol:%d\n",
- i,fNStaves[i],fNChipsPerModule[i],fNModules[i],fNHalfStaves[i],fNStaves[i],
+ printf("Lr%2d\tNStav:%2d\tNChips:%2d (%dx%-2d)\tNMod:%d\tNSubSt:%d\tNSt:%3d\tChipType:%3d\tChip#:%5d:%-5d\tWrapVol:%d\n",
+ i,fNStaves[i],fNChipsPerModule[i],fNChipRowsPerModule[i],
+ fNChipRowsPerModule[i] ? fNChipsPerModule[i]/fNChipRowsPerModule[i] : 0,
+ fNModules[i],fNHalfStaves[i],fNStaves[i],
fLrChipType[i],GetFirstChipIndex(i),GetLastChipIndex(i),fLr2Wrapper[i]);
}
}