+ Int_t firstModule = 0 ;
+ if (strcmp(fGeom->GetName(),"GPS2") == 0)
+ firstModule = 1;
+ else if (strcmp(fGeom->GetName(),"MIXT") == 0)
+ firstModule = fGeom->GetNModules() - fGeom->GetNPPSDModules() + 1;
+
+ for( Int_t i = firstModule; i <= fGeom->GetNModules(); i++ ) { // the number of PHOS modules
+ Float_t angle = fGeom->GetPHOSAngle(i) ;
+ sprintf(rotname, "%s%d", "rotg", number+i) ;
+ new TRotMatrix(rotname, rotname, 90, angle, 90, 90 + angle, 0, 0);
+ top->cd();
+ sprintf(nodename, "%s%d", "Moduleg", i) ;
+ Float_t x = r * TMath::Sin( angle / kRADDEG ) ;
+ Float_t y = -r * TMath::Cos( angle / kRADDEG ) ;
+ TNode * ppsdboxnode = new TNode(nodename , nodename ,"PPSDBox", x, y, 0, rotname ) ;
+ ppsdboxnode->SetLineColor(kColorPPSD) ;
+ fNodes->Add(ppsdboxnode) ;
+ ppsdboxnode->cd() ;
+ // inside the PPSD box:
+ // 1. fNumberOfModulesPhi x fNumberOfModulesZ top micromegas
+ x = ( fGeom->GetCPVBoxSize(0) - fGeom->GetPPSDModuleSize(0) ) / 2. ;
+ {
+ for ( Int_t iphi = 1; iphi <= fGeom->GetNumberOfModulesPhi(); iphi++ ) { // the number of micromegas modules in phi per PHOS module
+ Float_t z = ( fGeom->GetCPVBoxSize(2) - fGeom->GetPPSDModuleSize(2) ) / 2. ;
+ TNode * micro1node ;
+ for ( Int_t iz = 1; iz <= fGeom->GetNumberOfModulesZ(); iz++ ) { // the number of micromegas modules in z per PHOS module
+ y = ( fGeom->GetCPVBoxSize(1) - fGeom->GetMicromegas1Thickness() ) / 2. ;
+ sprintf(nodename, "%s%d%d%d", "Mic1", i, iphi, iz) ;
+ micro1node = new TNode(nodename, nodename, "PPSDModule", x, y, z) ;
+ micro1node->SetLineColor(kColorPPSD) ;
+ fNodes->Add(micro1node) ;
+ // inside top micromegas
+ micro1node->cd() ;
+ // a. top lid
+ y = ( fGeom->GetMicromegas1Thickness() - fGeom->GetLidThickness() ) / 2. ;
+ sprintf(nodename, "%s%d%d%d", "Lid", i, iphi, iz) ;
+ TNode * toplidnode = new TNode(nodename, nodename, "TopLid", 0, y, 0) ;
+ toplidnode->SetLineColor(kColorPPSD) ;
+ fNodes->Add(toplidnode) ;
+ // b. composite panel
+ y = y - fGeom->GetLidThickness() / 2. - fGeom->GetCompositeThickness() / 2. ;
+ sprintf(nodename, "%s%d%d%d", "CompU", i, iphi, iz) ;
+ TNode * compupnode = new TNode(nodename, nodename, "TopPanel", 0, y, 0) ;
+ compupnode->SetLineColor(kColorPPSD) ;
+ fNodes->Add(compupnode) ;
+ // c. anode
+ y = y - fGeom->GetCompositeThickness() / 2. - fGeom->GetAnodeThickness() / 2. ;
+ sprintf(nodename, "%s%d%d%d", "Ano", i, iphi, iz) ;
+ TNode * anodenode = new TNode(nodename, nodename, "Anode", 0, y, 0) ;
+ anodenode->SetLineColor(kColorPHOS) ;
+ fNodes->Add(anodenode) ;
+ // d. gas
+ y = y - fGeom->GetAnodeThickness() / 2. - ( fGeom->GetConversionGap() + fGeom->GetAvalancheGap() ) / 2. ;
+ sprintf(nodename, "%s%d%d%d", "GGap", i, iphi, iz) ;
+ TNode * ggapnode = new TNode(nodename, nodename, "GasGap", 0, y, 0) ;
+ ggapnode->SetLineColor(kColorGas) ;
+ fNodes->Add(ggapnode) ;
+ // f. cathode
+ y = y - ( fGeom->GetConversionGap() + fGeom->GetAvalancheGap() ) / 2. - fGeom->GetCathodeThickness() / 2. ;
+ sprintf(nodename, "%s%d%d%d", "Cathode", i, iphi, iz) ;
+ TNode * cathodenode = new TNode(nodename, nodename, "Cathode", 0, y, 0) ;
+ cathodenode->SetLineColor(kColorPHOS) ;
+ fNodes->Add(cathodenode) ;
+ // g. printed circuit
+ y = y - fGeom->GetCathodeThickness() / 2. - fGeom->GetPCThickness() / 2. ;
+ sprintf(nodename, "%s%d%d%d", "PC", i, iphi, iz) ;
+ TNode * pcnode = new TNode(nodename, nodename, "PCBoard", 0, y, 0) ;
+ pcnode->SetLineColor(kColorPPSD) ;
+ fNodes->Add(pcnode) ;
+ // h. composite panel
+ y = y - fGeom->GetPCThickness() / 2. - fGeom->GetCompositeThickness() / 2. ;
+ sprintf(nodename, "%s%d%d%d", "CompDown", i, iphi, iz) ;
+ TNode * compdownnode = new TNode(nodename, nodename, "BottomPanel", 0, y, 0) ;
+ compdownnode->SetLineColor(kColorPPSD) ;
+ fNodes->Add(compdownnode) ;
+ z = z - fGeom->GetPPSDModuleSize(2) ;
+ ppsdboxnode->cd() ;
+ } // end of Z module loop
+ x = x - fGeom->GetPPSDModuleSize(0) ;
+ ppsdboxnode->cd() ;
+ } // end of phi module loop
+ }
+ // 2. air gap
+ ppsdboxnode->cd() ;
+ y = ( fGeom->GetCPVBoxSize(1) - 2 * fGeom->GetMicromegas1Thickness() - fGeom->GetMicro1ToLeadGap() ) / 2. ;
+ sprintf(nodename, "%s%d", "GapUp", i) ;
+ TNode * gapupnode = new TNode(nodename, nodename, "LeadToM", 0, y, 0) ;
+ gapupnode->SetLineColor(kColorAir) ;
+ fNodes->Add(gapupnode) ;
+ // 3. lead converter
+ y = y - fGeom->GetMicro1ToLeadGap() / 2. - fGeom->GetLeadConverterThickness() / 2. ;
+ sprintf(nodename, "%s%d", "LeadC", i) ;
+ TNode * leadcnode = new TNode(nodename, nodename, "Lead", 0, y, 0) ;
+ leadcnode->SetLineColor(kColorPPSD) ;
+ fNodes->Add(leadcnode) ;
+ // 4. air gap
+ y = y - fGeom->GetLeadConverterThickness() / 2. - fGeom->GetLeadToMicro2Gap() / 2. ;
+ sprintf(nodename, "%s%d", "GapDown", i) ;
+ TNode * gapdownnode = new TNode(nodename, nodename, "MToLead", 0, y, 0) ;
+ gapdownnode->SetLineColor(kColorAir) ;
+ fNodes->Add(gapdownnode) ;
+ // 5. fNumberOfModulesPhi x fNumberOfModulesZ bottom micromegas
+ x = ( fGeom->GetCPVBoxSize(0) - fGeom->GetPPSDModuleSize(0) ) / 2. - fGeom->GetPhiDisplacement() ;
+ {
+ for ( Int_t iphi = 1; iphi <= fGeom->GetNumberOfModulesPhi(); iphi++ ) {
+ Float_t z = ( fGeom->GetCPVBoxSize(2) - fGeom->GetPPSDModuleSize(2) ) / 2. - fGeom->GetZDisplacement() ;;
+ TNode * micro2node ;
+ for ( Int_t iz = 1; iz <= fGeom->GetNumberOfModulesZ(); iz++ ) {
+ y = - ( fGeom->GetCPVBoxSize(1) - fGeom->GetMicromegas2Thickness() ) / 2. ;
+ sprintf(nodename, "%s%d%d%d", "Mic2", i, iphi, iz) ;
+ micro2node = new TNode(nodename, nodename, "PPSDModule", x, y, z) ;
+ micro2node->SetLineColor(kColorPPSD) ;
+ fNodes->Add(micro2node) ;
+ // inside bottom micromegas
+ micro2node->cd() ;
+ // a. top lid
+ y = ( fGeom->GetMicromegas2Thickness() - fGeom->GetLidThickness() ) / 2. ;
+ sprintf(nodename, "%s%d", "Lidb", i) ;
+ TNode * toplidbnode = new TNode(nodename, nodename, "TopLid", 0, y, 0) ;
+ toplidbnode->SetLineColor(kColorPPSD) ;
+ fNodes->Add(toplidbnode) ;
+ // b. composite panel
+ y = y - fGeom->GetLidThickness() / 2. - fGeom->GetCompositeThickness() / 2. ;
+ sprintf(nodename, "%s%d", "CompUb", i) ;
+ TNode * compupbnode = new TNode(nodename, nodename, "TopPanel", 0, y, 0) ;
+ compupbnode->SetLineColor(kColorPPSD) ;
+ fNodes->Add(compupbnode) ;
+ // c. anode
+ y = y - fGeom->GetCompositeThickness() / 2. - fGeom->GetAnodeThickness() / 2. ;
+ sprintf(nodename, "%s%d", "Anob", i) ;
+ TNode * anodebnode = new TNode(nodename, nodename, "Anode", 0, y, 0) ;
+ anodebnode->SetLineColor(kColorPPSD) ;
+ fNodes->Add(anodebnode) ;
+ // d. conversion gas
+ y = y - fGeom->GetAnodeThickness() / 2. - ( fGeom->GetConversionGap() + fGeom->GetAvalancheGap() ) / 2. ;
+ sprintf(nodename, "%s%d", "GGapb", i) ;
+ TNode * ggapbnode = new TNode(nodename, nodename, "GasGap", 0, y, 0) ;
+ ggapbnode->SetLineColor(kColorGas) ;
+ fNodes->Add(ggapbnode) ;
+ // f. cathode
+ y = y - ( fGeom->GetConversionGap() + fGeom->GetAvalancheGap() ) / 2. - fGeom->GetCathodeThickness() / 2. ;
+ sprintf(nodename, "%s%d", "Cathodeb", i) ;
+ TNode * cathodebnode = new TNode(nodename, nodename, "Cathode", 0, y, 0) ;
+ cathodebnode->SetLineColor(kColorPPSD) ;
+ fNodes->Add(cathodebnode) ;
+ // g. printed circuit
+ y = y - fGeom->GetCathodeThickness() / 2. - fGeom->GetPCThickness() / 2. ;
+ sprintf(nodename, "%s%d", "PCb", i) ;
+ TNode * pcbnode = new TNode(nodename, nodename, "PCBoard", 0, y, 0) ;
+ pcbnode->SetLineColor(kColorPPSD) ;
+ fNodes->Add(pcbnode) ;
+ // h. composite pane
+ y = y - fGeom->GetPCThickness() / 2. - fGeom->GetCompositeThickness() / 2. ;
+ sprintf(nodename, "%s%d", "CompDownb", i) ;
+ TNode * compdownbnode = new TNode(nodename, nodename, "BottomPanel", 0, y, 0) ;
+ compdownbnode->SetLineColor(kColorPPSD) ;
+ fNodes->Add(compdownbnode) ;
+ z = z - fGeom->GetPPSDModuleSize(2) ;
+ ppsdboxnode->cd() ;
+ } // end of Z module loop
+ x = x - fGeom->GetPPSDModuleSize(0) ;
+ ppsdboxnode->cd() ;
+ } // end of phi module loop
+ }
+ } // PHOS modules
+
+ delete[] rotname ;
+ delete[] nodename ;
+
+}
+
+//____________________________________________________________________________
+void AliPHOSv0:: BuildGeometryforCPV(void)