ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/FastOpenGlDisplayer/src/Geometry.cpp
Revision: 1.12
Committed: Sat Apr 19 14:34:58 2008 UTC (17 years ago) by querten
Branch: MAIN
CVS Tags: Version_0_23
Changes since 1.11: +2 -0 lines
Log Message:
Add DT/CSC Segments and RPC Hits

File Contents

# Content
1 // Geometry.cpp: implementation of the Geometry class.
2 //
3 //////////////////////////////////////////////////////////////////////
4
5 #include "../interface/Geometry.h"
6 #include <algorithm>
7
8 Geometry::Geometry(void)
9 {
10 }
11
12 Geometry::~Geometry(void)
13 {
14 }
15
16 void Geometry::Load (char* path)
17 {
18 FILE* pFile = fopen(path,"rb" );
19 if(pFile==NULL){
20 printf("The file %s can not be open !\n",path);
21 return;
22 }
23
24 stChunk* PrimaryChunk = new stChunk;
25
26 PrimaryChunk->read =fread(&PrimaryChunk->type,1,2,pFile);
27 PrimaryChunk->read +=fread(&PrimaryChunk->size,1,4,pFile);
28
29 if(PrimaryChunk->type!=C_PRIMARY){
30 printf("PrimaryChunk has not a good Id (%i!=%i)\n",PrimaryChunk->type,C_PRIMARY);
31 printf("Exiting...\n");
32 exit(0);
33 }
34
35 Read(pFile,PrimaryChunk);
36 fclose(pFile);
37
38 sortDet();
39 }
40
41 void Geometry::Read (FILE* pFile, stChunk* ParentChunk)
42 {
43 // unsigned short temp;
44 // fread(&temp,1,2,pFile);
45 // fseek(pFile,-2,SEEK_CUR);
46 // printf("Parent = %i --> Current ChunkId = %i to read = %i\n",ParentChunk->type,temp,0);
47
48 stChunk* CurrentChunk = new stChunk;
49 ReadChunk(pFile, CurrentChunk);
50
51 switch(CurrentChunk->type)
52 {
53 case C_GEOMETRY: // Geometry
54 while(CurrentChunk->read<CurrentChunk->size){
55 Read(pFile,CurrentChunk);
56 }
57 break;
58
59
60 ////////////////////////TRACKER DATA//////////////////////////
61 case C_TRACKER: // TRACKER
62 while(CurrentChunk->read<CurrentChunk->size){
63 Read(pFile,CurrentChunk);
64 }
65 break;
66
67 case C_TRACKER_PIB:{ // PIB
68 TrackerDet* Temp = new TrackerDet;
69 CurrentChunk->read += fread(Temp,sizeof(TrackerDet),1,pFile) * sizeof(TrackerDet);
70 Det_Tracker_PIB.push_back(Temp);
71 Det_Tracker_ALL.push_back(Temp);
72 }break;
73 case C_TRACKER_PIE:{ // PIE
74 TrackerDet* Temp = new TrackerDet;
75 CurrentChunk->read += fread(Temp,sizeof(TrackerDet),1,pFile) * sizeof(TrackerDet);
76 Det_Tracker_PIE.push_back(Temp);
77 Det_Tracker_ALL.push_back(Temp);
78 }break;
79 case C_TRACKER_TIB:{ // TIB
80 TrackerDet* Temp = new TrackerDet;
81 CurrentChunk->read += fread(Temp,sizeof(TrackerDet),1,pFile) * sizeof(TrackerDet);
82 Det_Tracker_TIB.push_back(Temp);
83 Det_Tracker_ALL.push_back(Temp);
84 }break;
85 case C_TRACKER_TID:{ // TID
86 TrackerDet* Temp = new TrackerDet;
87 CurrentChunk->read += fread(Temp,sizeof(TrackerDet),1,pFile) * sizeof(TrackerDet);
88 Det_Tracker_TID.push_back(Temp);
89 Det_Tracker_ALL.push_back(Temp);
90 }break;
91 case C_TRACKER_TOB:{ // TOB
92 TrackerDet* Temp = new TrackerDet;
93 CurrentChunk->read += fread(Temp,sizeof(TrackerDet),1,pFile) * sizeof(TrackerDet);
94 Det_Tracker_TOB.push_back(Temp);
95 Det_Tracker_ALL.push_back(Temp);
96 }break;
97 case C_TRACKER_TEC:{ // TEC
98 TrackerDet* Temp = new TrackerDet;
99 CurrentChunk->read += fread(Temp,sizeof(TrackerDet),1,pFile) * sizeof(TrackerDet);
100 Det_Tracker_TEC.push_back(Temp);
101 Det_Tracker_ALL.push_back(Temp);
102 }break;
103
104 ////////////////////////ECAL DATA//////////////////////////
105 case C_ECAL: // ECAL
106 while(CurrentChunk->read<CurrentChunk->size){
107 Read(pFile,CurrentChunk);
108 }
109 break;
110
111 case C_ECAL_EB:{ // EB
112 CaloDet* Temp = new CaloDet;
113 CurrentChunk->read += fread(Temp,sizeof(CaloDet),1,pFile) * sizeof(CaloDet);
114 Det_ECAL_EB.push_back(Temp);
115 Det_ECAL_ALL.push_back(Temp);
116 }break;
117 case C_ECAL_EE:{ // EE
118 CaloDet* Temp = new CaloDet;
119 CurrentChunk->read += fread(Temp,sizeof(CaloDet),1,pFile) * sizeof(CaloDet);
120 Det_ECAL_EE.push_back(Temp);
121 Det_ECAL_ALL.push_back(Temp);
122 }break;
123 case C_ECAL_PS:{ // PS
124 CaloDet* Temp = new CaloDet;
125 CurrentChunk->read += fread(Temp,sizeof(CaloDet),1,pFile) * sizeof(CaloDet);
126 Det_ECAL_PS.push_back(Temp);
127 Det_ECAL_ALL.push_back(Temp);
128 }break;
129
130
131 ////////////////////////HCAL DATA//////////////////////////
132 case C_HCAL: // HCAL
133 while(CurrentChunk->read<CurrentChunk->size){
134 Read(pFile,CurrentChunk);
135 }
136 break;
137
138 case C_HCAL_HB:{ // HB
139 CaloDet* Temp = new CaloDet;
140 CurrentChunk->read += fread(Temp,sizeof(CaloDet),1,pFile) * sizeof(CaloDet);
141 Det_HCAL_HB.push_back(Temp);
142 Det_HCAL_ALL.push_back(Temp);
143 }break;
144 case C_HCAL_HE:{ // HE
145 CaloDet* Temp = new CaloDet;
146 CurrentChunk->read += fread(Temp,sizeof(CaloDet),1,pFile) * sizeof(CaloDet);
147 Det_HCAL_HE.push_back(Temp);
148 Det_HCAL_ALL.push_back(Temp);
149 }break;
150 case C_HCAL_HO:{ // HO
151 CaloDet* Temp = new CaloDet;
152 CurrentChunk->read += fread(Temp,sizeof(CaloDet),1,pFile) * sizeof(CaloDet);
153 Det_HCAL_HO.push_back(Temp);
154 Det_HCAL_ALL.push_back(Temp);
155 }break;
156 case C_HCAL_HF:{ // HF
157 CaloDet* Temp = new CaloDet;
158 CurrentChunk->read += fread(Temp,sizeof(CaloDet),1,pFile) * sizeof(CaloDet);
159 Det_HCAL_HF.push_back(Temp);
160 Det_HCAL_ALL.push_back(Temp);
161 }break;
162 ////////////////////////MUON DATA//////////////////////////
163 case C_MUON: // MUON
164 while(CurrentChunk->read<CurrentChunk->size){
165 Read(pFile,CurrentChunk);
166 }
167 break;
168
169 case C_MUON_DT:{ // DT
170 TrackerDet* Temp = new TrackerDet;
171 CurrentChunk->read += fread(Temp,sizeof(TrackerDet),1,pFile) * sizeof(TrackerDet);
172 Det_Muon_DT.push_back(Temp);
173 Det_Muon_ALL.push_back(Temp);
174 }break;
175 case C_MUON_CSC:{ // CSC
176 TrackerDet* Temp = new TrackerDet;
177 CurrentChunk->read += fread(Temp,sizeof(TrackerDet),1,pFile) * sizeof(TrackerDet);
178 Det_Muon_CSC.push_back(Temp);
179 Det_Muon_ALL.push_back(Temp);
180 }break;
181 case C_MUON_RPC:{ // RPC
182 TrackerDet* Temp = new TrackerDet;
183 CurrentChunk->read += fread(Temp,sizeof(TrackerDet),1,pFile) * sizeof(TrackerDet);
184 Det_Muon_RPC.push_back(Temp);
185 Det_Muon_ALL.push_back(Temp);
186 }break;
187
188
189 ////////////////////////UNKOWN CHUNK ////////////////////////
190 default:
191 printf("Unknown ChunkID (%i)\n",CurrentChunk->type);
192 printf("Chunk will be skipped\n");
193 printf("The program can not run properly\n");
194 fseek (pFile,CurrentChunk->size-CurrentChunk->read,SEEK_CUR);
195 CurrentChunk->read += CurrentChunk->size-CurrentChunk->read;
196 break;
197 }
198
199 ParentChunk->read += CurrentChunk->read;
200
201 }
202
203 void Geometry::Save (char* path)
204 {
205 sortDet();
206 stChunkToSave* Primary_chunk = new stChunkToSave;
207
208 Primary_chunk->type = C_PRIMARY;
209 Primary_chunk->size = 6;
210
211 Write(Primary_chunk);
212 /*
213 printf("%i (%i)\n",Primary_chunk->type,Primary_chunk->size);
214 for(unsigned int i=0;i<Primary_chunk->daughters.size();i++){
215 stChunkToSave* tmp = Primary_chunk->daughters[i];
216 printf(" %i (%i)\n",tmp->type,tmp->size);
217 for(unsigned int j=0;j<tmp->daughters.size();j++){
218 stChunkToSave* Tmp = tmp->daughters[j];
219 printf(" %i (%i)\n",Tmp->type,Tmp->size);
220 for(unsigned int k=0;k<Tmp->daughters.size();k++){
221 stChunkToSave* TMp = Tmp->daughters[k];
222 printf(" %i (%i)\n",TMp->type,TMp->size);
223 for(unsigned int l=0;l<TMp->daughters.size();l++){
224 stChunkToSave* TMP = TMp->daughters[l];
225 printf(" %i (%i)\n",TMP->type,TMP->size);
226 }
227 }
228 }
229 }
230 */
231
232 FILE* pFile = fopen(path,"wb" );
233 WriteChunk(pFile, Primary_chunk);
234 fclose(pFile);
235 }
236
237 void Geometry::Write(stChunkToSave* ParentChunk)
238 {
239 unsigned int i;
240 stChunkToSave* CurrentChunk;
241
242 switch(ParentChunk->type)
243 {
244 case C_PRIMARY: // PrimaryChunk
245 CurrentChunk = new stChunkToSave;
246 CurrentChunk->type = C_GEOMETRY;
247 CurrentChunk->size = 6;
248 ParentChunk->daughters.push_back(CurrentChunk);
249 break;
250
251 case C_GEOMETRY: // Geometry
252 CurrentChunk = new stChunkToSave;
253 CurrentChunk->type = C_TRACKER;
254 CurrentChunk->size = 6;
255 ParentChunk->daughters.push_back(CurrentChunk);
256
257 CurrentChunk = new stChunkToSave;
258 CurrentChunk->type = C_ECAL;
259 CurrentChunk->size = 6;
260 ParentChunk->daughters.push_back(CurrentChunk);
261
262 CurrentChunk = new stChunkToSave;
263 CurrentChunk->type = C_HCAL;
264 CurrentChunk->size = 6;
265 ParentChunk->daughters.push_back(CurrentChunk);
266
267 CurrentChunk = new stChunkToSave;
268 CurrentChunk->type = C_MUON;
269 CurrentChunk->size = 6;
270 ParentChunk->daughters.push_back(CurrentChunk);
271 break;
272
273 case C_TRACKER: // Tracker
274 for(i=0;i<Det_Tracker_PIB.size();i++){
275 CurrentChunk = new stChunkToSave;
276 CurrentChunk->type = C_TRACKER_PIB;
277 CurrentChunk->size = 6 + sizeof(TrackerDet);
278 CurrentChunk->data = Det_Tracker_PIB[i];
279 ParentChunk->daughters.push_back(CurrentChunk);
280 }
281 for(i=0;i<Det_Tracker_PIE.size();i++){
282 CurrentChunk = new stChunkToSave;
283 CurrentChunk->type = C_TRACKER_PIE;
284 CurrentChunk->size = 6 + sizeof(TrackerDet);
285 CurrentChunk->data = Det_Tracker_PIE[i];
286 ParentChunk->daughters.push_back(CurrentChunk);
287 }
288 for(i=0;i<Det_Tracker_TIB.size();i++){
289 CurrentChunk = new stChunkToSave;
290 CurrentChunk->type = C_TRACKER_TIB;
291 CurrentChunk->size = 6 + sizeof(TrackerDet);
292 CurrentChunk->data = Det_Tracker_TIB[i];
293 ParentChunk->daughters.push_back(CurrentChunk);
294 }
295 for(i=0;i<Det_Tracker_TID.size();i++){
296 CurrentChunk = new stChunkToSave;
297 CurrentChunk->type = C_TRACKER_TID;
298 CurrentChunk->size = 6 + sizeof(TrackerDet);
299 CurrentChunk->data = Det_Tracker_TID[i];
300 ParentChunk->daughters.push_back(CurrentChunk);
301 }
302 for(i=0;i<Det_Tracker_TOB.size();i++){
303 CurrentChunk = new stChunkToSave;
304 CurrentChunk->type = C_TRACKER_TOB;
305 CurrentChunk->size = 6 + sizeof(TrackerDet);
306 CurrentChunk->data = Det_Tracker_TOB[i];
307 ParentChunk->daughters.push_back(CurrentChunk);
308 }
309 for(i=0;i<Det_Tracker_TEC.size();i++){
310 CurrentChunk = new stChunkToSave;
311 CurrentChunk->type = C_TRACKER_TEC;
312 CurrentChunk->size = 6 + sizeof(TrackerDet);
313 CurrentChunk->data = Det_Tracker_TEC[i];
314 ParentChunk->daughters.push_back(CurrentChunk);
315 }
316 break;
317
318 case C_ECAL: // ECAL
319 for(i=0;i<Det_ECAL_EB.size();i++){
320 CurrentChunk = new stChunkToSave;
321 CurrentChunk->type = C_ECAL_EB;
322 CurrentChunk->size = 6 + sizeof(CaloDet);
323 CurrentChunk->data = Det_ECAL_EB[i];
324 ParentChunk->daughters.push_back(CurrentChunk);
325 }
326 for(i=0;i<Det_ECAL_EE.size();i++){
327 CurrentChunk = new stChunkToSave;
328 CurrentChunk->type = C_ECAL_EE;
329 CurrentChunk->size = 6 + sizeof(CaloDet);
330 CurrentChunk->data = Det_ECAL_EE[i];
331 ParentChunk->daughters.push_back(CurrentChunk);
332 }
333 for(i=0;i<Det_ECAL_PS.size();i++){
334 CurrentChunk = new stChunkToSave;
335 CurrentChunk->type = C_ECAL_PS;
336 CurrentChunk->size = 6 + sizeof(CaloDet);
337 CurrentChunk->data = Det_ECAL_PS[i];
338 ParentChunk->daughters.push_back(CurrentChunk);
339 }
340 break;
341
342
343 case C_HCAL: // HCAL
344 for(i=0;i<Det_HCAL_HB.size();i++){
345 CurrentChunk = new stChunkToSave;
346 CurrentChunk->type = C_HCAL_HB;
347 CurrentChunk->size = 6 + sizeof(CaloDet);
348 CurrentChunk->data = Det_HCAL_HB[i];
349 ParentChunk->daughters.push_back(CurrentChunk);
350 }
351 for(i=0;i<Det_HCAL_HE.size();i++){
352 CurrentChunk = new stChunkToSave;
353 CurrentChunk->type = C_HCAL_HE;
354 CurrentChunk->size = 6 + sizeof(CaloDet);
355 CurrentChunk->data = Det_HCAL_HE[i];
356 ParentChunk->daughters.push_back(CurrentChunk);
357 }
358 for(i=0;i<Det_HCAL_HO.size();i++){
359 CurrentChunk = new stChunkToSave;
360 CurrentChunk->type = C_HCAL_HO;
361 CurrentChunk->size = 6 + sizeof(CaloDet);
362 CurrentChunk->data = Det_HCAL_HO[i];
363 ParentChunk->daughters.push_back(CurrentChunk);
364 }
365 for(i=0;i<Det_HCAL_HF.size();i++){
366 CurrentChunk = new stChunkToSave;
367 CurrentChunk->type = C_HCAL_HF;
368 CurrentChunk->size = 6 + sizeof(CaloDet);
369 CurrentChunk->data = Det_HCAL_HF[i];
370 ParentChunk->daughters.push_back(CurrentChunk);
371 }
372 break;
373
374 case C_MUON: // MUON
375 for(i=0;i<Det_Muon_DT.size();i++){
376 CurrentChunk = new stChunkToSave;
377 CurrentChunk->type = C_MUON_DT;
378 CurrentChunk->size = 6 + sizeof(TrackerDet);
379 CurrentChunk->data = Det_Muon_DT[i];
380 ParentChunk->daughters.push_back(CurrentChunk);
381 }
382 for(i=0;i<Det_Muon_CSC.size();i++){
383 CurrentChunk = new stChunkToSave;
384 CurrentChunk->type = C_MUON_CSC;
385 CurrentChunk->size = 6 + sizeof(TrackerDet);
386 CurrentChunk->data = Det_Muon_CSC[i];
387 ParentChunk->daughters.push_back(CurrentChunk);
388 }
389 for(i=0;i<Det_Muon_RPC.size();i++){
390 CurrentChunk = new stChunkToSave;
391 CurrentChunk->type = C_MUON_RPC;
392 CurrentChunk->size = 6 + sizeof(TrackerDet);
393 CurrentChunk->data = Det_Muon_RPC[i];
394 ParentChunk->daughters.push_back(CurrentChunk);
395 }
396 break;
397
398 default:
399 break;
400 }
401
402
403 for(i=0; i<ParentChunk->daughters.size();i++)
404 {
405 // if( !(ParentChunk->type == C_PRIMARY && i!=ParentChunk->daughters.size()-1))
406 Write(ParentChunk->daughters[i]);
407 ParentChunk->size += ParentChunk->daughters[i]->size;
408 }
409 }
410
411 void Geometry::sortDet() {
412 // Tracker
413 std::sort( Det_Tracker_ALL.begin(), Det_Tracker_ALL.end(), isLowerId() );
414 std::sort( Det_Tracker_PIB.begin(), Det_Tracker_PIB.end(), isLowerId() );
415 std::sort( Det_Tracker_PIE.begin(), Det_Tracker_PIE.end(), isLowerId() );
416 std::sort( Det_Tracker_TIB.begin(), Det_Tracker_TIB.end(), isLowerId() );
417 std::sort( Det_Tracker_TID.begin(), Det_Tracker_TID.end(), isLowerId() );
418 std::sort( Det_Tracker_TOB.begin(), Det_Tracker_TOB.end(), isLowerId() );
419 std::sort( Det_Tracker_TEC.begin(), Det_Tracker_TEC.end(), isLowerId() );
420 // ECAL
421 std::sort( Det_ECAL_ALL.begin(), Det_ECAL_ALL.end(), isLowerId() );
422 std::sort( Det_ECAL_EB.begin() , Det_ECAL_EB.end() , isLowerId() );
423 std::sort( Det_ECAL_EE.begin() , Det_ECAL_EE.end() , isLowerId() );
424 std::sort( Det_ECAL_PS.begin() , Det_ECAL_PS.end() , isLowerId() );
425 // HCAL
426 std::sort( Det_HCAL_ALL.begin(), Det_HCAL_ALL.end(), isLowerId() );
427 std::sort( Det_HCAL_HB.begin() , Det_HCAL_HB.end() , isLowerId() );
428 std::sort( Det_HCAL_HE.begin() , Det_HCAL_HE.end() , isLowerId() );
429 std::sort( Det_HCAL_HO.begin() , Det_HCAL_HO.end() , isLowerId() );
430 std::sort( Det_HCAL_HF.begin() , Det_HCAL_HF.end() , isLowerId() );
431 // MUON
432 std::sort( Det_Muon_ALL.begin(), Det_Muon_ALL.end(), isLowerId() );
433 std::sort( Det_Muon_DT.begin() , Det_Muon_DT.end() , isLowerId() );
434 std::sort( Det_Muon_CSC.begin(), Det_Muon_CSC.end(), isLowerId() );
435 std::sort( Det_Muon_RPC.begin(), Det_Muon_RPC.end(), isLowerId() );
436 }
437
438
439
440 void Geometry::Add_TrackerDet(unsigned int DetId, float TrapezoidalParam,
441 float PosX, float PosY, float PosZ,
442 float WidthX, float WidthY, float WidthZ,
443 float LengthX, float LengthY, float LengthZ,
444 float ThickX, float ThickY, float ThickZ){
445
446 int Det = (DetId>>28)&0xF;
447 int SubDet = (DetId>>25)&0x7;
448
449 if(SubDet<0 || SubDet>6)
450 {
451 printf("Unknown Subdet %i\n",SubDet);
452 return;
453 }
454
455 TrackerDet* temp = new TrackerDet();
456 temp->DetId = DetId;
457 temp->PosX = PosX;
458 temp->PosY = PosY;
459 temp->PosZ = PosZ;
460 temp->WidthX = WidthX;
461 temp->WidthY = WidthY;
462 temp->WidthZ = WidthZ;
463 temp->LengthX = LengthX;
464 temp->LengthY = LengthY;
465 temp->LengthZ = LengthZ;
466 temp->ThickX = ThickX;
467 temp->ThickY = ThickY;
468 temp->ThickZ = ThickZ;
469 temp->TrapezoidalParam = TrapezoidalParam;
470
471 if(Det==1){ //Tracker
472 Det_Tracker_ALL.push_back(temp);
473 switch(SubDet)
474 {
475 case 1 : Det_Tracker_PIB.push_back(temp); break;
476 case 2 : Det_Tracker_PIE.push_back(temp); break;
477 case 3 : Det_Tracker_TIB.push_back(temp); break;
478 case 4 : Det_Tracker_TID.push_back(temp); break;
479 case 5 : Det_Tracker_TOB.push_back(temp); break;
480 case 6 : Det_Tracker_TEC.push_back(temp); break;
481 default: delete temp;
482 }
483 }else if(Det==2){ //MUON
484 Det_Muon_ALL.push_back(temp);
485 switch(SubDet)
486 {
487 case 1 : Det_Muon_DT.push_back(temp); break;
488 case 2 : Det_Muon_CSC.push_back(temp); break;
489 case 3 : Det_Muon_RPC.push_back(temp); break;
490 default: delete temp;
491 }
492 }else{
493 delete temp;
494 printf("Unknown Det %i\n",Det);
495 return;
496 }
497 }
498
499 void Geometry::Add_CaloDet(unsigned int DetId,
500 float PosX, float PosY, float PosZ,
501 float C1X, float C1Y, float C1Z,
502 float C2X, float C2Y, float C2Z,
503 float C3X, float C3Y, float C3Z,
504 float C4X, float C4Y, float C4Z,
505 float C5X, float C5Y, float C5Z,
506 float C6X, float C6Y, float C6Z,
507 float C7X, float C7Y, float C7Z,
508 float C8X, float C8Y, float C8Z){
509
510 CaloDet* temp = new CaloDet();
511 temp->DetId = DetId;
512 temp->PosX = PosX;
513 temp->PosY = PosY;
514 temp->PosZ = PosZ;
515 temp->C1X = C1X; temp->C1Y = C1Y; temp->C1Z = C1Z;
516 temp->C2X = C2X; temp->C2Y = C2Y; temp->C2Z = C2Z;
517 temp->C3X = C3X; temp->C3Y = C3Y; temp->C3Z = C3Z;
518 temp->C4X = C4X; temp->C4Y = C4Y; temp->C4Z = C4Z;
519 temp->C5X = C5X; temp->C5Y = C5Y; temp->C5Z = C5Z;
520 temp->C6X = C6X; temp->C6Y = C6Y; temp->C6Z = C6Z;
521 temp->C7X = C7X; temp->C7Y = C7Y; temp->C7Z = C7Z;
522 temp->C8X = C8X; temp->C8Y = C8Y; temp->C8Z = C8Z;
523
524
525 int Det = (DetId>>28)&0xF;
526 int SubDet = (DetId>>25)&0x7;
527
528 if(Det==3){ //ECAL
529 Det_ECAL_ALL.push_back(temp);
530
531 if(SubDet==1){ // Ecal Barrel
532 Det_ECAL_EB.push_back(temp);
533 }else if(SubDet==2){ // Ecal Endcap
534 Det_ECAL_EE.push_back(temp);
535 }else if(SubDet==3){ // Ecal Preshower
536 Det_ECAL_PS.push_back(temp);
537 }else{
538 //SubDet==4 --> EcalTriggerTower
539 //SubDet==5 --> EcalLaserPnDiode
540
541 delete temp;
542 printf("Unknown Subdet %i\n",SubDet);
543 return;
544 }
545 }else if(Det==4){ //HCAL
546 Det_HCAL_ALL.push_back(temp);
547
548 if(SubDet==1){ // Hcal Barrel
549 Det_HCAL_HB.push_back(temp);
550 }else if(SubDet==2){ // Hcal Endcap
551 Det_HCAL_HE.push_back(temp);
552 }else if(SubDet==3){ // Hcal Outer
553 Det_HCAL_HO.push_back(temp);
554 }else if(SubDet==4){ // Hcal Forward
555 Det_HCAL_HF.push_back(temp);
556 }else{
557 //SubDet==0 --> HcalEmpty
558 //SubDet==5 --> HcalTriggerTower
559 //SubDet==7 --> HcalOther (HcalOtherEmpty or HcalCalibration)
560
561 delete temp;
562 printf("Unknown Subdet %i\n",SubDet);
563 return;
564 }
565
566 }else if(Det==5){ //CALO?
567 delete temp;
568
569 }else{
570 delete temp;
571 printf("Unknown Det %i\n",Det);
572 return;
573 }
574 }
575
576 /*
577 TrackerDet* Geometry::Find_TrackerDet (unsigned int DetId){
578 int Det = (DetId>>28)&0xF;
579 int SubDet = (DetId>>25)&0x7;
580
581 std::vector<TrackerDet*>* DetColl = NULL;
582
583 printf("Det = %i SubDet = %i\n",Det,SubDet);
584
585 if(Det==1){ //Tracker
586 switch(SubDet){
587 case 1 : DetColl = &Det_Tracker_PIB; break;
588 case 2 : DetColl = &Det_Tracker_PIE; break;
589 case 3 : DetColl = &Det_Tracker_TIB; break;
590 case 4 : DetColl = &Det_Tracker_TID; break;
591 case 5 : DetColl = &Det_Tracker_TOB; break;
592 case 6 : DetColl = &Det_Tracker_TEC; break;
593 default: printf("Unknown Subdet %i\n",SubDet);return NULL;
594 }
595 }else if(Det==2){ //Muon
596 switch(SubDet){
597 case 1 : DetColl = &Det_Muon_DT; break;
598 case 2 : DetColl = &Det_Muon_CSC; break;
599 case 3 : DetColl = &Det_Muon_RPC; break;
600 default: printf("Unknown Subdet %i\n",SubDet);return NULL;
601 }
602 }else{
603 printf("Unknown Det %i\n",Det);
604 return NULL;
605 }
606
607 if(DetColl==NULL){
608 printf("No Collection has been found\n");
609 return NULL;
610 }
611
612 printf("test1\n");
613
614 TrackerDet* det = new TrackerDet();
615 det->DetId = DetId;
616 std::vector<TrackerDet*>::iterator where = std::lower_bound(DetColl->begin(), DetColl->end(), det, isLowerId());
617 delete det;
618 if( where != DetColl->end()) return *(where);
619
620 printf("test2\n");
621 return NULL;
622 }
623 */
624
625 TrackerDet* Geometry::Find_TrackerDet (unsigned int DetId){
626 int Det = (DetId>>28)&0xF;
627 int SubDet = (DetId>>25)&0x7;
628
629 //printf("DetId = %i Det = %i SubDet = %i\n",DetId,Det,SubDet);
630
631 std::vector<TrackerDet*>::iterator it;
632 std::vector<TrackerDet*>::iterator it_begin;
633 std::vector<TrackerDet*>::iterator it_end;
634
635 if(Det==1){ // Tracker
636 if(SubDet==1){ // PIB
637 it_begin = Det_Tracker_PIB.begin();
638 it_end = Det_Tracker_PIB.end();
639 }else if(SubDet==2){ // PIE
640 it_begin = Det_Tracker_PIE.begin();
641 it_end = Det_Tracker_PIE.end();
642 }else if(SubDet==3){ // TIB
643 it_begin = Det_Tracker_TIB.begin();
644 it_end = Det_Tracker_TIB.end();
645 }else if(SubDet==4){ // TID
646 it_begin = Det_Tracker_TID.begin();
647 it_end = Det_Tracker_TID.end();
648 }else if(SubDet==5){ // TOB
649 it_begin = Det_Tracker_TOB.begin();
650 it_end = Det_Tracker_TOB.end();
651 }else if(SubDet==6){ // TEC
652 it_begin = Det_Tracker_TEC.begin();
653 it_end = Det_Tracker_TEC.end();
654 }else{
655 return NULL;
656 }
657 }else if(Det==2){ // MUON
658 if(SubDet==1){ // DT
659 it_begin = Det_Muon_DT.begin();
660 it_end = Det_Muon_DT.end();
661 }else if(SubDet==2){ // CSC
662 it_begin = Det_Muon_CSC.begin();
663 it_end = Det_Muon_CSC.end();
664 }else if(SubDet==3){ // RPC
665 it_begin = Det_Muon_RPC.begin();
666 it_end = Det_Muon_RPC.end();
667 }else{
668 return NULL;
669 }
670 }
671
672 TrackerDet* det = new TrackerDet();
673 det->DetId = DetId;
674 std::vector<TrackerDet*>::iterator where = std::lower_bound(it_begin, it_end, det, isLowerId());
675 delete det;
676 if( where != it_end) return *(where);
677
678 return NULL;
679 }
680
681 CaloDet* Geometry::Find_CaloDet (unsigned int DetId){
682
683 int Det = (DetId>>28)&0xF;
684 int SubDet = (DetId>>25)&0x7;
685
686 std::vector<CaloDet*>::iterator it;
687 std::vector<CaloDet*>::iterator it_begin;
688 std::vector<CaloDet*>::iterator it_end;
689
690 if(Det==3){ //ECAL
691 if(SubDet==1){ // Ecal Barrel
692 it_begin = Det_ECAL_EB.begin();
693 it_end = Det_ECAL_EB.end();
694 }else if(SubDet==2){ // Ecal Endcap
695 it_begin = Det_ECAL_EE.begin();
696 it_end = Det_ECAL_EE.end();
697 }else if(SubDet==3){ // Ecal Preshower
698 it_begin = Det_ECAL_PS.begin();
699 it_end = Det_ECAL_PS.end();
700 }else{
701 return NULL;
702 }
703 }else if(Det==4){ //HCAL
704 if(SubDet==1){ // Hcal Barrel
705 it_begin = Det_HCAL_HB.begin();
706 it_end = Det_HCAL_HB.end();
707 }else if(SubDet==2){ // Hcal Endcap
708 it_begin = Det_HCAL_HE.begin();
709 it_end = Det_HCAL_HE.end();
710 }else if(SubDet==3){ // Hcal Outer
711 it_begin = Det_HCAL_HO.begin();
712 it_end = Det_HCAL_HO.end();
713 }else if(SubDet==4){ // Hcal Forward
714 it_begin = Det_HCAL_HF.begin();
715 it_end = Det_HCAL_HF.end();
716 }else{
717 return NULL;
718 }
719 }
720
721 CaloDet* det = new CaloDet();
722 det->DetId = DetId;
723 std::vector<CaloDet*>::iterator where = std::lower_bound(it_begin, it_end, det, isLowerId());
724 delete det;
725 if( where != it_end) return *(where);
726
727 return NULL;
728 }