+ new TBRIK ( "BottomPanel", "Composite bottom panel", "void", ( fGeom->GetPPSDModuleSize(0) - fGeom->GetMicromegasWallThickness() )/2,
+ fGeom->GetCompositeThickness()/2,
+ ( fGeom->GetPPSDModuleSize(2) - fGeom->GetMicromegasWallThickness() )/2 ) ;
+ // gas gap (conversion and avalanche)
+
+ new TBRIK ( "GasGap", "gas gap", "void", ( fGeom->GetPPSDModuleSize(0) - fGeom->GetMicromegasWallThickness() )/2,
+ ( fGeom->GetConversionGap() + fGeom->GetAvalancheGap() )/2,
+ ( fGeom->GetPPSDModuleSize(2) - fGeom->GetMicromegasWallThickness() )/2 ) ;
+
+ // anode and cathode
+
+ new TBRIK ( "Anode", "Anode", "void", ( fGeom->GetPPSDModuleSize(0) - fGeom->GetMicromegasWallThickness() )/2,
+ fGeom->GetAnodeThickness()/2,
+ ( fGeom->GetPPSDModuleSize(2) - fGeom->GetMicromegasWallThickness() )/2 ) ;
+
+ new TBRIK ( "Cathode", "Cathode", "void", ( fGeom->GetPPSDModuleSize(0) - fGeom->GetMicromegasWallThickness() )/2,
+ fGeom->GetCathodeThickness()/2,
+ ( fGeom->GetPPSDModuleSize(2) - fGeom->GetMicromegasWallThickness() )/2 ) ;
+ // PC
+
+ new TBRIK ( "PCBoard", "Printed Circuit", "void", ( fGeom->GetPPSDModuleSize(0) - fGeom->GetMicromegasWallThickness() )/2,
+ fGeom->GetPCThickness()/2,
+ ( fGeom->GetPPSDModuleSize(2) - fGeom->GetMicromegasWallThickness() )/2 ) ;
+ // Gap between Lead and top micromegas
+
+ new TBRIK ( "LeadToM", "Air Gap top", "void", fGeom->GetPPSDBoxSize(0)/2,
+ fGeom->GetMicro1ToLeadGap()/2,
+ fGeom->GetPPSDBoxSize(2)/2 ) ;
+
+// Gap between Lead and bottom micromegas
+
+ new TBRIK ( "MToLead", "Air Gap bottom", "void", fGeom->GetPPSDBoxSize(0)/2,
+ fGeom->GetLeadToMicro2Gap()/2,
+ fGeom->GetPPSDBoxSize(2)/2 ) ;
+ // Lead converter
+
+ new TBRIK ( "Lead", "Lead converter", "void", fGeom->GetPPSDBoxSize(0)/2,
+ fGeom->GetLeadConverterThickness()/2,
+ fGeom->GetPPSDBoxSize(2)/2 ) ;
+
+ // position PPSD into ALICE
+
+ char * nodename = new char[20] ;
+ char * rotname = new char[20] ;
+
+ Float_t R = fGeom->GetIPtoTopLidDistance() + fGeom->GetPPSDBoxSize(1) / 2.0 ;
+ Int_t number = 988 ;
+ TNode * Top = gAlice->GetGeometry()->GetNode("alice") ;
+
+ for( Int_t i = 1; i <= fGeom->GetNModules(); i++ ) { // the number of PHOS modules
+ Float_t angle = fGeom->GetPHOSAngle(i) ;
+ sprintf(rotname, "%s%d", "rotg", number++) ;
+ 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 / RADDEG ) ;
+ Float_t Y = -R * TMath::Cos( angle / RADDEG ) ;
+ 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->GetPPSDBoxSize(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->GetPPSDBoxSize(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->GetPPSDBoxSize(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->GetPPSDBoxSize(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->GetPPSDBoxSize(0) - fGeom->GetPPSDModuleSize(0) ) / 2. - fGeom->GetPhiDisplacement() ;
+ for ( Int_t iphi = 1; iphi <= fGeom->GetNumberOfModulesPhi(); iphi++ ) {
+ Float_t Z = ( fGeom->GetPPSDBoxSize(2) - fGeom->GetPPSDModuleSize(2) ) / 2. - fGeom->GetZDisplacement() ;;
+ TNode * Micro2Node ;
+ for ( Int_t iz = 1; iz <= fGeom->GetNumberOfModulesZ(); iz++ ) {
+ Y = - ( fGeom->GetPPSDBoxSize(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 ;