ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/FastOpenGlDisplayer/src/Geometry.cpp
Revision: 1.8
Committed: Wed Apr 2 16:31:54 2008 UTC (17 years, 1 month ago) by roberfro
Branch: MAIN
Changes since 1.7: +36 -0 lines
Log Message:
Use of std library to find det from detId

File Contents

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