+//_____________________________________________________________________________
+void AliTOFv1::TOFpc(Float_t xtof, Float_t ytof, Float_t zlenC,
+ Float_t zlenB, Float_t zlenA, Float_t ztof0)
+{
+ //
+ // Definition of the Time Of Fligh Resistive Plate Chambers
+ // xFLT, yFLT, zFLT - sizes of TOF modules (large)
+
+ Float_t ycoor, zcoor;
+ Float_t par[10];
+ Int_t *idtmed = fIdtmed->GetArray()-499;
+ Int_t idrotm[100];
+ Int_t nrot = 0;
+ Float_t hTof = fRmax-fRmin;
+
+ Float_t Radius = fRmin+2.;//cm
+
+ par[0] = xtof * 0.5;
+ par[1] = ytof * 0.5;
+ par[2] = zlenC * 0.5;
+ gMC->Gsvolu("FTOC", "BOX ", idtmed[506], par, 3);
+ par[2] = zlenB * 0.5;
+ gMC->Gsvolu("FTOB", "BOX ", idtmed[506], par, 3);
+ par[2] = zlenA * 0.5;
+ gMC->Gsvolu("FTOA", "BOX ", idtmed[506], par, 3);
+
+
+// Positioning of modules
+
+ Float_t zcor1 = ztof0 - zlenC*0.5;
+ Float_t zcor2 = ztof0 - zlenC - zlenB*0.5;
+ Float_t zcor3 = 0.;
+
+ AliMatrix(idrotm[0], 90., 0., 0., 0., 90,-90.);
+ AliMatrix(idrotm[1], 90.,180., 0., 0., 90, 90.);
+ gMC->Gspos("FTOC", 1, "BTO1", 0, zcor1, 0, idrotm[0], "ONLY");
+ gMC->Gspos("FTOC", 2, "BTO1", 0, -zcor1, 0, idrotm[1], "ONLY");
+ gMC->Gspos("FTOC", 1, "BTO2", 0, zcor1, 0, idrotm[0], "ONLY");
+ gMC->Gspos("FTOC", 2, "BTO2", 0, -zcor1, 0, idrotm[1], "ONLY");
+ gMC->Gspos("FTOC", 1, "BTO3", 0, zcor1, 0, idrotm[0], "ONLY");
+ gMC->Gspos("FTOC", 2, "BTO3", 0, -zcor1, 0, idrotm[1], "ONLY");
+
+ gMC->Gspos("FTOB", 1, "BTO1", 0, zcor2, 0, idrotm[0], "ONLY");
+ gMC->Gspos("FTOB", 2, "BTO1", 0, -zcor2, 0, idrotm[1], "ONLY");
+ gMC->Gspos("FTOB", 1, "BTO2", 0, zcor2, 0, idrotm[0], "ONLY");
+ gMC->Gspos("FTOB", 2, "BTO2", 0, -zcor2, 0, idrotm[1], "ONLY");
+ gMC->Gspos("FTOB", 1, "BTO3", 0, zcor2, 0, idrotm[0], "ONLY");
+ gMC->Gspos("FTOB", 2, "BTO3", 0, -zcor2, 0, idrotm[1], "ONLY");
+
+ gMC->Gspos("FTOA", 0, "BTO1", 0, zcor3, 0, idrotm[0], "ONLY");
+ gMC->Gspos("FTOA", 0, "BTO3", 0, zcor3, 0, idrotm[0], "ONLY");
+
+ Float_t db = 0.5;//cm
+ Float_t xFLT, xFST, yFLT, zFLTA, zFLTB, zFLTC;
+
+ xFLT = fStripLn;
+ yFLT = ytof;
+ zFLTA = zlenA;
+ zFLTB = zlenB;
+ zFLTC = zlenC;
+
+ xFST = xFLT-fDeadBndX*2;//cm
+
+// Sizes of MRPC pads
+
+ Float_t yPad = 0.505;//cm
+
+// Large not sensitive volumes with CO2
+ par[0] = xFLT*0.5;
+ par[1] = yFLT*0.5;
+
+ cout <<"************************* TOF geometry **************************"<<endl;
+
+ par[2] = (zFLTA *0.5);
+ gMC->Gsvolu("FLTA", "BOX ", idtmed[506], par, 3); // CO2
+ gMC->Gspos ("FLTA", 0, "FTOA", 0., 0., 0., 0, "ONLY");
+
+ par[2] = (zFLTB * 0.5);
+ gMC->Gsvolu("FLTB", "BOX ", idtmed[506], par, 3); // CO2
+ gMC->Gspos ("FLTB", 0, "FTOB", 0., 0., 0., 0, "ONLY");
+
+ par[2] = (zFLTC * 0.5);
+ gMC->Gsvolu("FLTC", "BOX ", idtmed[506], par, 3); // CO2
+ gMC->Gspos ("FLTC", 0, "FTOC", 0., 0., 0., 0, "ONLY");
+
+////////// Layers before detector ////////////////////
+
+// MYlar layer in front 1.0 mm thick at the beginning
+ par[0] = -1;
+ par[1] = 0.1;//cm
+ par[2] = -1;
+ ycoor = -yFLT/2 + par[1];
+ gMC->Gsvolu("FMYA", "BOX ", idtmed[508], par, 3); // Alluminium
+ gMC->Gspos ("FMYA", 0, "FLTA", 0., ycoor, 0., 0, "ONLY");
+ gMC->Gsvolu("FMYB", "BOX ", idtmed[508], par, 3); // Alluminium
+ gMC->Gspos ("FMYB", 0, "FLTB", 0., ycoor, 0., 0, "ONLY");
+ gMC->Gsvolu("FMYC", "BOX ", idtmed[508], par, 3); // Alluminium
+ gMC->Gspos ("FMYC", 0, "FLTC", 0., ycoor, 0., 0, "ONLY");
+
+// honeycomb (special Polyethilene Layer of 1cm)
+ ycoor = ycoor + par[1];
+ par[0] = -1;
+ par[1] = 0.5;//cm
+ par[2] = -1;
+ ycoor = ycoor + par[1];
+ gMC->Gsvolu("FPLA", "BOX ", idtmed[503], par, 3); // Hony
+ gMC->Gspos ("FPLA", 0, "FLTA", 0., ycoor, 0., 0, "ONLY");
+ gMC->Gsvolu("FPLB", "BOX ", idtmed[503], par, 3); // Hony
+ gMC->Gspos ("FPLB", 0, "FLTB", 0., ycoor, 0., 0, "ONLY");
+ gMC->Gsvolu("FPLC", "BOX ", idtmed[503], par, 3); // Hony
+ gMC->Gspos ("FPLC", 0, "FLTC", 0., ycoor, 0., 0, "ONLY");
+
+///////////////// Detector itself //////////////////////
+
+ const Float_t DeadBound = fDeadBndZ; //cm non-sensitive between the pad edge
+ //and the boundary of the strip
+ const Int_t nx = fNpadX; // number of pads along x
+ const Int_t nz = fNpadZ; // number of pads along z
+ const Float_t Space = fSpace; //cm distance from the front plate of the box
+
+ Float_t zSenStrip = fZpad*fNpadZ;//cm
+ Float_t StripWidth = zSenStrip + 2*DeadBound;
+
+ par[0] = xFLT*0.5;
+ par[1] = yPad*0.5;
+ par[2] = StripWidth*0.5;
+
+ // glass layer of detector STRip
+ gMC->Gsvolu("FSTR","BOX",idtmed[514],par,3);
+
+ // Non-Sesitive Freon boundaries
+ par[0] = xFLT*0.5;
+ par[1] = 0.110*0.5;//cm
+ par[2] = -1;
+ gMC->Gsvolu("FNSF","BOX",idtmed[512],par,3);
+ gMC->Gspos ("FNSF",0,"FSTR",0.,0.,0.,0,"ONLY");
+
+ // MYlar for Internal non-sesitive boundaries
+// par[1] = 0.025;//cm
+// gMC->Gsvolu("FMYI","BOX",idtmed[510],par,3);
+// gMC->Gspos ("FMYI",0,"FNSF",0.,0.,0.,0,"MANY");
+
+ // MYlar eXternal layers
+ par[1] = 0.035*0.5;//cm
+ ycoor = -yPad*0.5+par[1];
+ gMC->Gsvolu("FMYX","BOX",idtmed[510],par,3);
+ gMC->Gspos ("FMYX",1,"FSTR",0.,ycoor,0.,0,"ONLY");
+ gMC->Gspos ("FMYX",2,"FSTR",0.,-ycoor,0.,0,"ONLY");
+ ycoor += par[1];
+
+ // GRaphyte Layers
+ par[1] = 0.003*0.5;
+ ycoor += par[1];
+ gMC->Gsvolu("FGRL","BOX",idtmed[502],par,3);
+ gMC->Gspos ("FGRL",1,"FSTR",0.,ycoor,0.,0,"ONLY");
+ gMC->Gspos ("FGRL",2,"FSTR",0.,-ycoor,0.,0,"ONLY");
+
+ // freon sensitive layer (Chlorine-Fluorine-Carbon)
+ par[0] = xFST*0.5;
+ par[1] = 0.110*0.5;
+ par[2] = zSenStrip*0.5;
+ gMC->Gsvolu("FCFC","BOX",idtmed[513],par,3);
+ gMC->Gspos ("FCFC",0,"FNSF",0.,0.,0.,0,"ONLY");
+
+ // Pad definition x & z
+ gMC->Gsdvn("FLZ","FCFC", nz, 3);
+ gMC->Gsdvn("FLX","FLZ" , nx, 1);
+
+ // MRPC PAD itself
+ par[0] = -1;
+ par[1] = -1;
+ par[2] = -1;
+ gMC->Gsvolu("FPAD", "BOX ", idtmed[513], par, 3);
+ gMC->Gspos ("FPAD", 0, "FLX", 0., 0., 0., 0, "ONLY");
+
+//// Positioning the Strips (FSTR) in the FLT volumes /////
+
+ // Plate A (Central)
+
+ Float_t t = zFLTC+zFLTB+zFLTA*0.5+ 2*db;//Half Width of Barrel
+
+ Float_t Gap = fGapA; //cm distance between the strip axis
+ Float_t zpos = 0;
+ Float_t ang = 0;
+ Int_t i=1,j=1;
+ nrot = 0;
+ zcoor = 0;
+ ycoor = -14.5 + Space ; //2 cm over front plate
+
+ AliMatrix (idrotm[0], 90., 0.,90.,90.,0., 90.);
+ gMC->Gspos("FSTR",j,"FLTA",0.,ycoor, 0.,idrotm[0],"ONLY");
+
+ printf("%f, St. %2i, Pl.3 ",ang*kRaddeg,i);
+ printf("y = %f, z = %f, zpos = %f \n",ycoor,zcoor,zpos);
+
+ zcoor -= zSenStrip;
+ j++;
+ Int_t UpDown = -1; // UpDown=-1 -> Upper strip
+ // UpDown=+1 -> Lower strip
+ do{
+ ang = atan(zcoor/Radius);
+ ang *= kRaddeg;
+ AliMatrix (idrotm[nrot], 90., 0.,90.-ang,90.,-ang, 90.);
+ AliMatrix (idrotm[nrot+1],90.,180.,90.+ang,90., ang, 90.);
+ ang /= kRaddeg;
+ ycoor = -14.5+ Space; //2 cm over front plate
+ ycoor += (1-(UpDown+1)/2)*Gap;
+ gMC->Gspos("FSTR",j ,"FLTA",0.,ycoor, zcoor,idrotm[nrot], "ONLY");
+ gMC->Gspos("FSTR",j+1,"FLTA",0.,ycoor,-zcoor,idrotm[nrot+1],"ONLY");
+
+ printf("%f, St. %2i, Pl.3 ",ang*kRaddeg,i);
+ printf("y = %f, z = %f, zpos = %f \n",ycoor,zcoor,zpos);
+
+ j += 2;
+ UpDown*= -1; // Alternate strips
+ zcoor = zcoor-(zSenStrip/2)/TMath::Cos(ang)-
+ UpDown*Gap*TMath::Tan(ang)-
+ (zSenStrip/2)/TMath::Cos(ang);
+ } while (zcoor-(StripWidth/2)*TMath::Cos(ang)>-t+zFLTC+zFLTB+db*2);
+
+ zcoor = zcoor+(zSenStrip/2)/TMath::Cos(ang)+
+ UpDown*Gap*TMath::Tan(ang)+
+ (zSenStrip/2)/TMath::Cos(ang);
+
+ Gap = fGapB;
+ zcoor = zcoor-(zSenStrip/2)/TMath::Cos(ang)-
+ UpDown*Gap*TMath::Tan(ang)-
+ (zSenStrip/2)/TMath::Cos(ang);
+
+ ang = atan(zcoor/Radius);
+ ang *= kRaddeg;
+ AliMatrix (idrotm[nrot], 90., 0.,90.-ang,90.,-ang, 90.);
+ AliMatrix (idrotm[nrot+1],90.,180.,90.+ang,90., ang, 90.);
+ ang /= kRaddeg;
+
+ ycoor = -14.5+ Space; //2 cm over front plate
+ ycoor += (1-(UpDown+1)/2)*Gap;
+ gMC->Gspos("FSTR",j ,"FLTA",0.,ycoor, zcoor,idrotm[nrot], "ONLY");
+ gMC->Gspos("FSTR",j+1,"FLTA",0.,ycoor,-zcoor,idrotm[nrot+1],"ONLY");
+
+ printf("%f, St. %2i, Pl.3 ",ang*kRaddeg,i);
+ printf("y = %f, z = %f, zpos = %f \n",ycoor,zcoor,zpos);
+
+ ycoor = -hTof/2.+ Space;//2 cm over front plate
+
+ // Plate B
+
+ nrot = 0;
+ i=1;
+ UpDown = 1;
+ Float_t DeadRegion = 1.0;//cm
+
+ zpos = zcoor - (zSenStrip/2)/TMath::Cos(ang)-
+ UpDown*Gap*TMath::Tan(ang)-
+ (zSenStrip/2)/TMath::Cos(ang)-
+ DeadRegion/TMath::Cos(ang);
+
+ ang = atan(zpos/Radius);
+ ang *= kRaddeg;
+ AliMatrix (idrotm[nrot], 90., 0., 90.-ang,90.,ang, 270.);
+ ang /= kRaddeg;
+ ycoor = -hTof*0.5+ Space ; //2 cm over front plate
+ ycoor += (1-(UpDown+1)/2)*Gap;
+ zcoor = zpos+(zFLTA*0.5+zFLTB*0.5+db); // Moves to the system of the modulus FLTB
+ gMC->Gspos("FSTR",i, "FLTB", 0., ycoor, zcoor,idrotm[nrot], "ONLY");
+
+ printf("%f, St. %2i, Pl.4 ",ang*kRaddeg,i);
+ printf("y = %f, z = %f, zpos = %f \n",ycoor,zcoor,zpos);
+
+ i++;
+ UpDown*=-1;
+
+ do {
+ zpos = zpos - (zSenStrip/2)/TMath::Cos(ang)-
+ UpDown*Gap*TMath::Tan(ang)-
+ (zSenStrip/2)/TMath::Cos(ang);
+ ang = atan(zpos/Radius);
+ ang *= kRaddeg;
+ AliMatrix (idrotm[nrot], 90., 0., 90.-ang,90.,ang, 270.);
+ ang /= kRaddeg;
+ ycoor = -hTof*0.5+ Space ; //2 cm over front plate
+ ycoor += (1-(UpDown+1)/2)*Gap;
+ zcoor = zpos+(zFLTA*0.5+zFLTB*0.5+db); // Moves to the system of the modulus FLTB
+ gMC->Gspos("FSTR",i, "FLTB", 0., ycoor, zcoor,idrotm[nrot], "ONLY");
+
+ printf("%f, St. %2i, Pl.4 ",ang*kRaddeg,i);
+ printf("y = %f, z = %f, zpos = %f \n",ycoor,zcoor,zpos);
+
+ UpDown*=-1;
+ i++;
+ } while (TMath::Abs(ang*kRaddeg)<22.5);
+ //till we reach a tilting angle of 22.5 degrees
+
+ ycoor = -hTof*0.5+ Space ; //2 cm over front plate
+ zpos = zpos - zSenStrip/TMath::Cos(ang);
+
+ do {
+ ang = atan(zpos/Radius);
+ ang *= kRaddeg;
+ AliMatrix (idrotm[nrot], 90., 0., 90.-ang,90.,ang, 270.);
+ ang /= kRaddeg;
+ zcoor = zpos+(zFLTB/2+zFLTA/2+db);
+ gMC->Gspos("FSTR",i, "FLTB", 0., ycoor, zcoor,idrotm[nrot], "ONLY");
+ zpos = zpos - zSenStrip/TMath::Cos(ang);
+ printf("%f, St. %2i, Pl.4 ",ang*kRaddeg,i);
+ printf("y = %f, z = %f, zpos = %f \n",ycoor,zcoor,zpos);
+ i++;
+
+ } while (zpos-StripWidth*0.5/TMath::Cos(ang)>-t+zFLTC+db);
+
+ // Plate C
+
+ zpos = zpos + zSenStrip/TMath::Cos(ang);
+
+ zpos = zpos - (zSenStrip/2)/TMath::Cos(ang)+
+ Gap*TMath::Tan(ang)-
+ (zSenStrip/2)/TMath::Cos(ang);
+
+ nrot = 0;
+ i=0;
+ ycoor= -hTof*0.5+Space+Gap;
+
+ do {
+ i++;
+ ang = atan(zpos/Radius);
+ ang *= kRaddeg;
+ AliMatrix (idrotm[nrot], 90., 0., 90.-ang,90.,ang, 270.);
+ ang /= kRaddeg;
+ zcoor = zpos+(zFLTC*0.5+zFLTB+zFLTA*0.5+db*2);
+ gMC->Gspos("FSTR",i, "FLTC", 0., ycoor, zcoor,idrotm[nrot], "ONLY");
+
+ printf("%f, St. %2i, Pl.5 ",ang*kRaddeg,i);
+ printf("y = %f, z = %f, zpos = %f \n",ycoor,zcoor,zpos);
+
+ zpos = zpos - zSenStrip/TMath::Cos(ang);
+ } while (zpos-StripWidth*TMath::Cos(ang)*0.5>-t);
+
+
+////////// Layers after detector /////////////////
+
+// honeycomb (Polyethilene) Layer after (3cm)
+
+ Float_t OverSpace = fOverSpc;//cm
+
+ par[0] = -1;
+ par[1] = 0.6;
+ par[2] = -1;
+ ycoor = -yFLT/2 + OverSpace + par[1];
+ gMC->Gsvolu("FPEA", "BOX ", idtmed[503], par, 3); // Hony
+ gMC->Gspos ("FPEA", 0, "FLTA", 0., ycoor, 0., 0, "ONLY");
+ gMC->Gsvolu("FPEB", "BOX ", idtmed[503], par, 3); // Hony
+ gMC->Gspos ("FPEB", 0, "FLTB", 0., ycoor, 0., 0, "ONLY");
+ gMC->Gsvolu("FPEC", "BOX ", idtmed[503], par, 3); // Hony
+ gMC->Gspos ("FPEC", 0, "FLTC", 0., ycoor, 0., 0, "ONLY");
+
+// Electronics (Cu) after
+ ycoor += par[1];
+ par[0] = -1;
+ par[1] = 1.43*0.05*0.5; // 5% of X0
+ par[2] = -1;
+ ycoor += par[1];
+ gMC->Gsvolu("FECA", "BOX ", idtmed[501], par, 3); // Cu
+ gMC->Gspos ("FECA", 0, "FLTA", 0., ycoor, 0., 0, "ONLY");
+ gMC->Gsvolu("FECB", "BOX ", idtmed[501], par, 3); // Cu
+ gMC->Gspos ("FECB", 0, "FLTB", 0., ycoor, 0., 0, "ONLY");
+ gMC->Gsvolu("FECC", "BOX ", idtmed[501], par, 3); // Cu
+ gMC->Gspos ("FECC", 0, "FLTC", 0., ycoor, 0., 0, "ONLY");
+
+// cooling WAter after
+ ycoor += par[1];
+ par[0] = -1;
+ par[1] = 36.1*0.02*0.5; // 2% of X0
+ par[2] = -1;
+ ycoor += par[1];
+ gMC->Gsvolu("FWAA", "BOX ", idtmed[515], par, 3); // Water
+ gMC->Gspos ("FWAA", 0, "FLTA", 0., ycoor, 0., 0, "ONLY");
+ gMC->Gsvolu("FWAB", "BOX ", idtmed[515], par, 3); // Water
+ gMC->Gspos ("FWAB", 0, "FLTB", 0., ycoor, 0., 0, "ONLY");
+ gMC->Gsvolu("FWAC", "BOX ", idtmed[515], par, 3); // Water
+ gMC->Gspos ("FWAC", 0, "FLTC", 0., ycoor, 0., 0, "ONLY");
+
+//Back Plate honycomb (2cm)
+ par[0] = -1;
+ par[1] = 2 *0.5;
+ par[2] = -1;
+ ycoor = yFLT/2 - par[1];
+ gMC->Gsvolu("FBPA", "BOX ", idtmed[503], par, 3); // Hony
+ gMC->Gspos ("FBPA", 0, "FLTA", 0., ycoor, 0., 0, "ONLY");
+ gMC->Gsvolu("FBPB", "BOX ", idtmed[503], par, 3); // Hony
+ gMC->Gspos ("FBPB", 0, "FLTB", 0., ycoor, 0., 0, "ONLY");
+ gMC->Gsvolu("FBPC", "BOX ", idtmed[503], par, 3); // Hony
+ gMC->Gspos ("FBPC", 0, "FLTC", 0., ycoor, 0., 0, "ONLY");
+}
+