//Generator for CbmTof Geometry //Update 01/10/2012 nh // 08/10/2012 add sensitive gas gaps #include #include #include #include #include #include "math.h" #define PI 3.14159265 FILE *geof; FILE *info; FILE *parf; using namespace std; void TOFSMs(int, float, float, float, float); void TOFSMo(int, float, float, float, float); void TofPole(int, float, float, float); void TOFBox(int, float, float, float, float, float, float); int TOFRegion(int, int, float, float, float, float, float, float, char *, int, float, float, float, float, float&, float&); int main(void) { //----------Initialization--------------------------------------- const char* c_str(); float B_factor, Xlim=0, Ylim=0, Dgap=0, Dplate=0; float Delta_Y_tmp, Dwall, box_xdim,box_ydim,width_box, Zthickness; int Nchannel = 0, chanl = 0, ngaps ; string path = "data/"; string geoname = path + "test.geo" ; geof = fopen(geoname.c_str(), "w+"); string infoname = path + "test.info"; info = fopen(infoname.c_str(), "w+"); string parname = path + "par_tof.txt"; parf = fopen(parname.c_str(), "w+"); //Initialize parameters // Common B_factor = 1.; // Relation between x and y Dgap = 0.2; // Gap size [mm] Dplate = 1.0; // Glass plate [mm] ngaps = 8; // Number of gaps Xlim = 250; // Begining of X segmentation [mm] Ylim = 250; // Begining of Y segmentation [mm] width_box = 4; // Width of the gas box [mm] box_xdim = 15000.; // x extension of wall box_ydim = 11000.; //y extension of wall float box_zdim = 2000.; Dwall = 6000; // Distance to the center of the TOF wall [mm] Zthickness = ngaps*Dgap + (ngaps+1)*Dplate + 2*width_box; // RPC thickness [mm] //Print Header for the info file fprintf(info, " -------------------------------------------------------------------\n"); fprintf(info, " Tof Geometry : %s \n", geoname.c_str()); fprintf(info, " -------------------------------------------------------------------\n"); //Print Header for the geometry file fprintf(parf,"#####################################################################################\n"); fprintf(parf,"# Geometry for the TOF detector \n"); fprintf(parf,"# Format: \n"); fprintf(parf,"# \n"); fprintf(parf,"# SMod Mod Cell smtype X[mm] Y[mm] Z[mm] Dx[mm] Dy[mm] \n"); fprintf(parf,"#####################################################################################\n"); fprintf(parf,"[TofGeoPar] \n"); fprintf(parf,"0\n"); //----------RUN--------------------------------------- float xpos=0.; float yposmax=4800.; float ypos1=700.; float dypos=500.; float dzpos=200.; float DZwall=2.*dzpos; float DXcol=1400.; int nSMs=0; int nSMo=0; int nPole=0; int nStrip=0; cout << "Start placing SMs from "<2) { nSMs++; TOFSMs(nSMs, Dwall+dzpos, 0., xpos, ypos-dypos/2.); nStrip+=5*32; nSMs++; TOFSMs(nSMs, Dwall+dzpos, 0., xpos, -ypos+dypos/2.); nStrip+=5*32; } } cout << nSMs << " SMs placed." << endl; // add mounting structure nPole++; TofPole(nPole, Dwall, 0., xpos); nPole++; TofPole(nPole, Dwall+dzpos, 0., xpos); // now place outer modules xpos=100; for(int i=1; i<4;i++){ for (float ypos=0; ypos2) { nSMo++; TOFSMo(nSMo, Dwall-i*DZwall, 0., xpos+i*DXcol, -ypos); nStrip+=5*32; nSMo++; TOFSMo(nSMo, Dwall-i*DZwall, 180.,-xpos-i*DXcol, -ypos); nStrip+=5*32; // 2. layer nSMo++; TOFSMo(nSMo, Dwall-i*DZwall+dzpos, 0., xpos+i*DXcol, ypos-dypos/2.); nStrip+=5*32; nSMo++; TOFSMo(nSMo, Dwall-i*DZwall+dzpos, 180.,-xpos-i*DXcol, ypos-dypos/2.); nStrip+=5*32; nSMo++; TOFSMo(nSMo, Dwall-i*DZwall+dzpos, 0., xpos+i*DXcol, -ypos+dypos/2.); nStrip+=5*32; nSMo++; TOFSMo(nSMo, Dwall-i*DZwall+dzpos, 180.,-xpos-i*DXcol, -ypos+dypos/2.); nStrip+=5*32; } } nPole++; TofPole(nPole, Dwall-i*DZwall, 180., xpos+i*DXcol); nPole++; TofPole(nPole, Dwall-i*DZwall+dzpos, 180., xpos+i*DXcol); nPole++; TofPole(nPole, Dwall-i*DZwall, 0., -xpos-i*DXcol); nPole++; TofPole(nPole, Dwall-i*DZwall+dzpos, 0., -xpos-i*DXcol); } Nchannel=nStrip*2; cout << nSMo << " SMo placed." << endl; cout << nStrip << " strips," << Nchannel << " channels in setup." << endl; //---------------------END---------------------------- fprintf(info, "\n"); fprintf(info, "Total number of channels in the TOF : %d \n", Nchannel); fclose(geof); fclose(info); cout<<"\n"<0 fprintf(geof,"t1reg1gla#%d \n", k); fprintf(geof,"t1reg1mod#%d \n",j); fprintf(geof, "%f %f %f \n" , 0.0, 0.0 , startzpos+(k-1)*dzpos); //position fprintf(geof, "%f %f %f " , 1.0 , 0.0 , 0.0); //rotation matrix fprintf(geof, "%f %f %f " , 0.0 , 1.0 , 0.0); fprintf(geof, "%f %f %f \n" , 0.0 , 0.0 , 1.0); if (k<9) { fprintf(geof,"t1reg1gap#%d \n", k); fprintf(geof,"t1reg1mod#%d \n",j); fprintf(geof, "%f %f %f \n" , 0.0, 0.0 , startzposg+(k-1)*dzpos); //position fprintf(geof, "%f %f %f " , 1.0 , 0.0 , 0.0); //rotation matrix fprintf(geof, "%f %f %f " , 0.0 , 1.0 , 0.0); fprintf(geof, "%f %f %f \n" , 0.0 , 0.0 , 1.0); fprintf(geof,"//------------------------------------------ \n"); if (k==4){ //take geometry from center gap (#4) cout << "write geo para1 for i="< media.geo fprintf(geof, " %f %f %f \n", dxe/2, -dye/2, -dze/2); fprintf(geof, " %f %f %f \n", dxe/2, dye/2, -dze/2); fprintf(geof, " %f %f %f \n", -dxe/2, dye/2, -dze/2); fprintf(geof, " %f %f %f \n", -dxe/2, -dye/2, -dze/2); fprintf(geof, " %f %f %f \n", dxe/2, -dye/2, dze/2); fprintf(geof, " %f %f %f \n", dxe/2, dye/2, dze/2); fprintf(geof, " %f %f %f \n", -dxe/2, dye/2, dze/2); fprintf(geof, " %f %f %f \n", -dxe/2, -dye/2, dze/2); fprintf(geof, "\n"); fprintf(geof, "%f %f %f \n" , startxpos+(j-1)*dxpos , yele , zoff*dzoff); fprintf(geof, "%f %f %f " , 1.0 , 0.0 , 0.0 ); fprintf(geof, "%f %f %f " , 0.0 , 1.0 , 0.0 ); fprintf(geof, "%f %f %f \n" , 0.0 , 0.0 , 1.0 ); fprintf(geof,"//------------------------------------------ \n"); fprintf(geof,"t1pcb#%d \n", j); fprintf(geof,"tof%dgas \n", i); fprintf(geof, "%f %f %f \n" , startxpos+(j-1)*dxpos ,-yele , zoff*dzoff); fprintf(geof, "%f %f %f " , 1.0 , 0.0 , 0.0 ); fprintf(geof, "%f %f %f " , 0.0 , 1.0 , 0.0 ); fprintf(geof, "%f %f %f \n" , 0.0 , 0.0 , 1.0 ); fprintf(geof,"//------------------------------------------ \n"); }else{ //j>1 fprintf(geof,"t%dreg%dmod#%d \n",i,i,j); fprintf(geof,"tof%dgas \n", i); fprintf(geof, "%f %f %f \n" , startxpos+(j-1)*dxpos , 0.0 , zoff*dzoff); //position fprintf(geof, "%f %f %f " , 1.0 , 0.0 , 0.0); //rotation matrix fprintf(geof, "%f %f %f " , 0.0 , 1.0 , 0.0); fprintf(geof, "%f %f %f \n" , 0.0 , 0.0 , 1.0); fprintf(geof,"//------------------------------------------ \n"); // cout << "write geo para for i="<0 fprintf(geof,"tof1#%d\n", i); fprintf(geof,"cave \n"); fprintf(geof, "%f %f %f \n" , xpos, ypos, Z); fprintf(geof, "%f %f %f " , 1.0 , 0.0 , 0.0 ); fprintf(geof, "%f %f %f " , 0.0 , 1.0 , 0.0 ); fprintf(geof, "%f %f %f \n" , 0.0 , 0.0 , 1.0 ); fprintf(geof,"//------------------------------------------ \n"); zoff=1; for (int j=1; j<6; j++){ //loop over counters (modules) zoff=-zoff; for (int l=0; l0 fprintf(geof,"t2reg1gla#%d \n", k); fprintf(geof,"t2reg1mod#%d \n",j); fprintf(geof, "%f %f %f \n" , 0.0, 0.0 , startzpos+(k-1)*dzpos); //position fprintf(geof, "%f %f %f " , 1.0 , 0.0 , 0.0); //rotation matrix fprintf(geof, "%f %f %f " , 0.0 , 1.0 , 0.0); fprintf(geof, "%f %f %f \n" , 0.0 , 0.0 , 1.0); if (k<9){ fprintf(geof,"t2reg1gap#%d \n", k); fprintf(geof,"t2reg1mod#%d \n",j); fprintf(geof, "%f %f %f \n" , 0.0, 0.0 , startzposg+(k-1)*dzpos); //position fprintf(geof, "%f %f %f " , 1.0 , 0.0 , 0.0); //rotation matrix fprintf(geof, "%f %f %f " , 0.0 , 1.0 , 0.0); fprintf(geof, "%f %f %f \n" , 0.0 , 0.0 , 1.0); fprintf(geof,"//------------------------------------------ \n"); if (k==4){ //take geometry from center gap (#4) cout << "write geo para2 for i="< media.geo fprintf(geof, " %f %f %f \n", dxe/2, -dye/2, -dze/2); fprintf(geof, " %f %f %f \n", dxe/2, dye/2, -dze/2); fprintf(geof, " %f %f %f \n", -dxe/2, dye/2, -dze/2); fprintf(geof, " %f %f %f \n", -dxe/2, -dye/2, -dze/2); fprintf(geof, " %f %f %f \n", dxe/2, -dye/2, dze/2); fprintf(geof, " %f %f %f \n", dxe/2, dye/2, dze/2); fprintf(geof, " %f %f %f \n", -dxe/2, dye/2, dze/2); fprintf(geof, " %f %f %f \n", -dxe/2, -dye/2, dze/2); fprintf(geof, "\n"); fprintf(geof, "%f %f %f \n" , startxpos+(j-1)*dxpos , yele , 0.); //position fprintf(geof, "%f %f %f " , cphi , 0.0 , sphi); //rotation matrix fprintf(geof, "%f %f %f " , 0.0 , 1.0 , 0.0); fprintf(geof, "%f %f %f \n" , -sphi , 0.0 , cphi); fprintf(geof,"//------------------------------------------ \n"); fprintf(geof,"t2pcb#%d \n",j); fprintf(geof,"tof%dgas \n", 2); fprintf(geof, "%f %f %f \n" , startxpos+(j-1)*dxpos ,-yele , 0.); //position fprintf(geof, "%f %f %f " , cphi , 0.0 , sphi); //rotation matrix fprintf(geof, "%f %f %f " , 0.0 , 1.0 , 0.0); fprintf(geof, "%f %f %f \n" , -sphi , 0.0 , cphi); fprintf(geof,"//------------------------------------------ \n"); }else{ //j>1 fprintf(geof,"t%dreg%dmod#%d \n",2,1,j); fprintf(geof,"tof%dgas \n", 2); fprintf(geof, "%f %f %f \n" , startxpos+(j-1)*dxpos , 0.0 , 0.); //position fprintf(geof, "%f %f %f " , cphi , 0.0 , sphi); //rotation matrix fprintf(geof, "%f %f %f " , 0.0 , 1.0 , 0.0); fprintf(geof, "%f %f %f \n" , -sphi , 0.0 , cphi); fprintf(geof,"//------------------------------------------ \n"); //cout << "write geo para2 for i="<0 fprintf(geof,"tof2#%d\n", i); fprintf(geof,"cave \n"); fprintf(geof, "%f %f %f \n" , xpos, ypos, Z); fprintf(geof, "%f %f %f " , cph , -sph , 0.0 ); fprintf(geof, "%f %f %f " , sph , cph , 0.0 ); fprintf(geof, "%f %f %f \n" , 0.0 , 0.0 , 1.0 ); fprintf(geof,"//------------------------------------------ \n"); for (int j=1; j<6; j++){ //loop over counters (modules) for (int l=0; l0 fprintf(geof,"tof1pol#%d\n", i); fprintf(geof,"cave \n"); fprintf(geof, "%f %f %f \n" , xpos+cphi*(-dx/2.-dxb/2.), 0., Z); fprintf(geof, "%f %f %f " , 1.0 , 0.0 , 0.0 ); fprintf(geof, "%f %f %f " , 0.0 , 1.0 , 0.0 ); fprintf(geof, "%f %f %f \n" , 0.0 , 0.0 , 1.0 ); fprintf(geof,"//------------------------------------------ \n"); } }