00001 #include "Qset.h"
00002 #include <iostream>
00003 #include <math.h>
00004 #include "tree.h"
00005 #ifndef NDetMax
00006 #define NDetMax 1010
00007 #endif
00008 using namespace std;
00009 #define PI 3.141592653589793
00010
00011 extern Det *rcDETRegion[2][3][4];
00012 extern Det rcDET[NDetMax];
00013 extern EUppLow operator++(enum EUppLow &rs, int );
00014 extern ERegion operator++(enum ERegion &rs, int );
00015 extern Etype operator++(enum Etype &rs, int );
00016 extern Edir operator++(enum Edir &rs, int );
00017
00018
00019
00020
00021
00034
00035 int Qset::FillDetec(char *geomfile){
00036 FILE *geom;
00037 char line[256];
00038
00039 int maxchar = 256,i=0;
00040 geom = fopen(geomfile,"r");
00041 while(!feof(geom)){
00042 fgets(line,maxchar,geom);
00043 if(feof(geom))break;
00044 strcpy(rcDET[i].cName,strtok(line,"\n"));
00045 fgets(line,maxchar,geom);
00046 strcpy(rcDET[i].cType,strtok(line,"\n"));
00047 fgets(line,maxchar,geom);
00048 rcDET[i].Zpos = atof(strtok(line,"\n"));
00049 fgets(line,maxchar,geom);
00050 rcDET[i].Rot = atof(strtok(line,"\n"));
00051 rcDET[i].rRotCos = cos(rcDET[i].Rot*PI/180);
00052 rcDET[i].rRotSin = sin(rcDET[i].Rot*PI/180);
00053 fgets(line,maxchar,geom);
00054 rcDET[i].resolution = atof(strtok(line,"\n"));
00055 fgets(line,maxchar,geom);
00056 rcDET[i].TrackResolution = atof(strtok(line,"\n"));
00057 fgets(line,maxchar,geom);
00058 rcDET[i].SlopeMatching = atof(strtok(line,"\n"));
00059 fgets(line,maxchar,geom);
00060 switch(line[0]){
00061 case 'u':
00062 rcDET[i].upplow = w_upper;
00063 break;
00064 case 'd':
00065 rcDET[i].upplow = w_lower;
00066 break;
00067 default :
00068 rcDET[i].upplow = w_nowhere;
00069 break;
00070 }
00071 fgets(line,maxchar,geom);
00072 switch(line[0]){
00073 case '1':
00074 rcDET[i].region = r1;
00075 break;
00076 case '2':
00077 rcDET[i].region = r2;
00078 break;
00079 case '3':
00080 rcDET[i].region = r3;
00081 break;
00082 }
00083 fgets(line,maxchar,geom);
00084 switch(line[0]){
00085 case 'd':
00086 rcDET[i].type = d_drift;
00087 break;
00088 case 'g':
00089 rcDET[i].type = d_gem;
00090 break;
00091 case 't':
00092 rcDET[i].type = d_trigscint;
00093 break;
00094 case 'c':
00095 rcDET[i].type = d_cerenkov;
00096 break;
00097
00098 }
00099 fgets(line,maxchar,geom);
00100 switch(line[0]){
00101 case 'u':
00102 rcDET[i].dir = u_dir;
00103 break;
00104 case 'v':
00105 rcDET[i].dir = v_dir;
00106 break;
00107 case 'x':
00108 rcDET[i].dir = x_dir;
00109 break;
00110 case 'y':
00111 rcDET[i].dir = y_dir;
00112 break;
00113
00114 }
00115 fgets(line,maxchar,geom);
00116 rcDET[i].center[0]=atof(strtok(line,"\n"));
00117 fgets(line,maxchar,geom);
00118 rcDET[i].center[1]=atof(strtok(line,"\n"));
00119 fgets(line,maxchar,geom);
00120 rcDET[i].width[0]=atof(strtok(line,"\n"));
00121 fgets(line,maxchar,geom);
00122 rcDET[i].width[1]=atof(strtok(line,"\n"));
00123 fgets(line,maxchar,geom);
00124 rcDET[i].width[2]=atof(strtok(line,"\n"));
00125 fgets(line,maxchar,geom);
00126 rcDET[i].WireSpacing=atof(strtok(line,"\n"));
00127 fgets(line,maxchar,geom);
00128 rcDET[i].PosOfFirstWire=atof(strtok(line,"\n"));
00129 fgets(line,maxchar,geom);
00130 rcDET[i].rCos=atof(strtok(line,"\n"));
00131 fgets(line,maxchar,geom);
00132 rcDET[i].rSin=atof(strtok(line,"\n"));
00133 fgets(line,maxchar,geom);
00134 rcDET[i].NumOfWires=atoi(strtok(line,"\n"));
00135 fgets(line,maxchar,geom);
00136 rcDET[i].ID=atoi(strtok(line,"\n"));
00137 rcDET[i].samesearched=0;
00138 if(i!=rcDET[i].ID)cerr << "WARNING:DETECTOR ID MUST BE IN ORDER" << endl;
00139 i++;
00140 }
00141 numdetectors =i;
00142 LinkDetector();
00143 return 0;
00144 }
00145
00146 void Qset::LinkDetector(){
00147
00148
00149 enum EUppLow up_low;
00150 enum ERegion region;
00151 enum Edir dir;
00152 enum Etype type;
00153 Det *rd,*rnd,*rwd;
00154 for(int i = 0; i<=numdetectors; i++) {
00155 rd = &rcDET[i];
00156 if( !rd->samesearched ) {
00157 up_low = rd->upplow;
00158 dir = rd->dir;
00159 region = rd->region;
00160 type = rd->type;
00161 if( !rcDETRegion[up_low][region-1][dir] )
00162 rcDETRegion[up_low][region-1][dir] = rd;
00163 rd->samesearched = 1;
00164 rwd = rd;
00165
00166 for(int l = i+1; l<=numdetectors; l++ ) {
00167 rnd = &rcDET[l];
00168
00169 if( rnd->upplow == up_low
00170 && rnd->type == type
00171 && rnd->dir == dir
00172 && !rnd->samesearched
00173 && rnd->region == region ) {
00174 rnd->samesearched = 1;
00175 rwd = (rwd->nextsame = rnd);
00176 }
00177
00178 }
00179 }
00180 }
00181 }
00182
00183 Qset::Qset(){
00184 numdetectors =0;
00185 }
00186
00187