]> git.uio.no Git - u/mrichter/AliRoot.git/blob - ITS/AliITShit.cxx
28-mar-2007 NvE Explicitly included TMath.h in IceChi2.h and IcePandel.h due to a
[u/mrichter/AliRoot.git] / ITS / AliITShit.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /* $Id$ */
17
18 #include <Riostream.h>
19
20 #include<TLorentzVector.h>
21
22 #include "AliRun.h"
23 #include "AliITS.h"
24 #include "AliITSgeom.h"
25 #include "AliITShit.h"
26 #include "AliMC.h"
27
28
29 ClassImp(AliITShit)
30 ////////////////////////////////////////////////////////////////////////
31 // Version: 0
32 // Written by Rene Brun, Federico Carminati, and Roberto Barbera
33 //
34 // Version: 1
35 // Modified and documented by Bjorn S. Nilsen
36 // July 11 1999
37 //
38 // AliITShit is the hit class for the ITS. Hits are the information
39 // that comes from a Monte Carlo at each step as a particle mass through
40 // sensitive detector elements as particles are transported through a
41 // detector.
42 //
43 //Begin_Html
44 /*
45 <img src="picts/ITS/AliITShit_Class_Diagram.gif">
46 </pre>
47 <br clear=left>
48 <font size=+2 color=red>
49 <p>This show the relasionships between the ITS hit class and the rest of Aliroot.
50 </font>
51 <pre>
52 */
53 //End_Html
54 ////////////////////////////////////////////////////////////////////////
55 // Inline Member functions:
56 //
57 // AliITShit()
58 //     The default creator of the AliITShit class.
59 //
60 // ~AliITShit()
61 //     The default destructor of the AliITShit class.
62 //
63 // int GetTrack()
64 //     See AliHit for a full description. Returns the track number fTrack
65 // for this hit.
66 //
67 // SetTrack(int track)
68 //     See AliHit for a full description. Sets the track number fTrack
69 // for this hit.
70 //
71 // Int_t GetTrackStatus()
72 //     Returns the value of the track status flag fStatus. This flag
73 // indicates the track status at the time of creating this hit. It is
74 // made up of the following 8 status bits from highest order to lowest
75 // order bits
76 // 0           :  IsTrackAlive():    IsTrackStop():IsTrackDisappeared():
77 // IsTrackOut():IsTrackExiting():IsTrackEntering():IsTrackInside()     .
78 // See AliMC for a description of these functions. If the function is
79 // true then the bit is set to one, otherwise it is zero.
80 //
81 // Bool_t StatusInside()
82 //     Returns kTRUE if the particle producing this hit is still inside
83 // the present volume. Returns kFalse if this particle will be in another
84 // volume. {bit IsTrackInside is set or not}
85 //
86 // Bool_t StatusEntering()
87 //     Returns kTRUE if the particle producing this hit is has just enterd
88 // the present volume. Returns kFalse otherwise.  {bit IsTrackEntering is
89 // set or not}
90 //
91 // Bool_t StatusExiting()
92 //     Returns kTRUE if the particle producing this hit is will exit
93 // the present volume. Returns kFalse otherwise. {bit IsTrackExiting is set
94 // or not}
95 //
96 // Bool_t StatusOut()
97 //     Returns kTRUE if the particle producing this hit is goint exit the
98 // simulation. Returns kFalse otherwise. {bit IsTrackOut is set or not}
99 //
100 // Bool_t StatusDisappeared()
101 //     Returns kTRUE if the particle producing this hit is going to "disappear"
102 // for example it has interacted producing some other particles. Returns
103 //  kFalse otherwise. {bit IsTrackOut is set or not}
104 //
105 // Bool_t StatusStop()
106 //     Returns kTRUE if the particle producing this hit is has dropped below
107 // its energy cut off producing some other particles. Returns kFalse otherwise.
108 // {bit IsTrackOut is set or not}
109 //
110 // Bool_t StatuAlives()
111 //     Returns kTRUE if the particle producing this hit is going to continue
112 // to be transported. Returns kFalse otherwise. {bit IsTrackOut is set or not}
113 //
114 // Int_t GetLayer()
115 //     Returns the layer number, fLayer, for this hit.
116 //
117 // Int_t GetLadder()
118 //     Returns the ladder number, fLadder, for this hit.
119 //
120 // Int_t GetDetector()
121 //     Returns the detector number, fDet, for this hit.
122 //
123 // GetDetectorID(Int_t &layer, Int_t &ladder, Int_t &detector)
124 //     Returns the layer, ladder, and detector numbers, fLayer fLadder fDet,
125 // in one call.
126 //
127 // Float_t GetIonization()
128 //     Returns the energy lost, fDestep, by the particle creating this hit,
129 // in the units defined by the Monte Carlo.
130 //
131 // GetPositionG(Float_t &x, Float_t &y, Float_t &z)
132 //     Returns the global position, fX fY fZ, of this hit, in the units
133 // define by the Monte Carlo.
134 //
135 // GetPositionG(Double_t &x, Double_t &y, Double_t &z)
136 //     Returns the global position, fX fY fZ, of this hit, in the units
137 // define by the Monte Carlo.
138 //
139 // GetPositionG(Float_t &x, Float_t &y, Float_t &z, Float_t &tof)
140 //     Returns the global position and time of flight, fX fY fZ fTof, of
141 // this hit, in the units define by the Monte Carlo.
142 //
143 // GetPositionG(Double_t &x,Double_t &y,Double_t &z,Double_t &tof)
144 //     Returns the global position and time of flight, fX fY fZ fTof, of
145 // this hit, in the units define by the Monte Carlo.
146 //
147 // GetPositionL(Double_t &x,Double_t &y,Double_t &z)
148 //     Returns the local position, fX fY fZ, of this hit in the coordiante
149 // of this module, in the units define by the Monte Carlo.
150 //
151 // GetPositionG(Double_t &x,Double_t &y,Double_t &z,Double_t &tof)
152 //     Returns the local position and time of flight, fX fY fZ fTof, of
153 // this hit in the coordinates of this module, in the units define by the
154 //  Monte Carlo.
155 //
156 // Float_t GetXG()
157 //     Returns the global x position in the units defined by the Monte Carlo.
158 //
159 // Float_t GetYG()
160 //     Returns the global y position in the units defined by the Monte Carlo.
161 //
162 // Float_t GetYG()
163 //     Returns the global z position in the units defined by the Monte Carlo.
164 //
165 // Float_t GetTOF()
166 //     Returns the time of flight, fTof, of this hit, in the units defined
167 // by the Monte Carlo.
168 //
169 // GetMomentumG(Float_t &px, Float_t &py, Float_t &pz)
170 //     Returns the global momentum, fPx fPy fPz, of the particle that made
171 // this hit, in the units define by the Monte Carlo.
172 //
173 // GetMomentumG(Double_t &px,Double_t &py,Double_t &pz)
174 //     Returns the global momentum, fPx fPy fPz, of the particle that made
175 // this hit, in the units define by the Monte Carlo.
176 //
177 // GetMomentumL(Double_t &px,Double_t &py,Double_t &pz)
178 //     Returns the momentum, fPx fPy fPz in coordinate appropreate for this
179 // specific module, in the units define by the Monte Carlo.
180 //
181 // Float_t GetPXG()
182 //     Returns the global X momentum in the units defined by the Monte Carlo.
183 //
184 // Float_t GetPYG()
185 //     Returns the global Y momentum in the units defined by the Monte Carlo.
186 //
187 // Float_t GetPZG()
188 //     Returns the global Z momentum in the units defined by the Monte Carlo.
189 //
190 ////////////////////////////////////////////////////////////////////////
191 //_____________________________________________________________________________
192 AliITShit::AliITShit():AliHit(),
193 fStatus(0),
194 fLayer(0),
195 fLadder(0),
196 fDet(0),
197 fPx(0.0),
198 fPy(0.0),
199 fPz(0.0),
200 fDestep(0.0),
201 fTof(0.0),
202 fStatus0(0),
203 fx0(0.0),
204 fy0(0.0),
205 fz0(0.0),
206 ft0(0.0){
207     // Default Constructor
208     // Zero data member just to be safe.
209     // Intputs:
210     //    none.
211     // Outputs:
212     //    none.
213     // Return:
214     //    A default created AliITShit class.
215
216 }
217 AliITShit::AliITShit(Int_t shunt,Int_t track,Int_t *vol,Float_t edep,
218                      Float_t tof,TLorentzVector &x,TLorentzVector &x0,
219                      TLorentzVector &p) : AliHit(shunt, track),
220 fStatus(vol[3]),
221 fLayer(vol[0]),
222 fLadder(vol[2]),
223 fDet(vol[1]),
224 fPx(p.Px()),
225 fPy(p.Py()),
226 fPz(p.Pz()),
227 fDestep(edep),
228 fTof(tof),
229 fStatus0(vol[4]),
230 fx0(x0.X()),
231 fy0(x0.Y()),
232 fz0(x0.Z()),
233 ft0(x0.T()){
234 ////////////////////////////////////////////////////////////////////////
235 // Create ITS hit
236 //     The creator of the AliITShit class. The variables shunt and
237 // track are passed to the creator of the AliHit class. See the AliHit
238 // class for a full description. In the units of the Monte Carlo
239 ////////////////////////////////////////////////////////////////////////
240     // Intputs:
241     //    Int_t shunt   See AliHit
242     //    Int_t track   Track number, see AliHit
243     //    Int_t *vol     Array of integer hit data,
244     //                     vol[0] Layer where the hit is, 1-6 typicaly
245     //                     vol[1] Ladder where the hit is.
246     //                     vol[2] Detector number where the hit is
247     //                     vol[3] Set of status bits
248     //                     vol[4] Set of status bits at start
249     // Outputs:
250     //    none.
251     // Return:
252     //    A default created AliITShit class.
253
254
255
256     fX          = x.X();   // Track X global position
257     fY          = x.Y();   // Track Y global position
258     fZ          = x.Z();   // Track Z global position
259 }
260 //______________________________________________________________________
261 AliITShit::AliITShit(Int_t shunt, Int_t track, Int_t *vol, Float_t *hits):
262     AliHit(shunt, track),
263 fStatus(vol[3]),
264 fLayer(vol[0]),
265 fLadder(vol[2]),
266 fDet(vol[1]),
267 fPx(hits[3]),
268 fPy(hits[4]),
269 fPz(hits[5]),
270 fDestep(hits[6]),
271 fTof(hits[7]),
272 fStatus0(0),
273 fx0(0.0),
274 fy0(0.0),
275 fz0(0.0),
276 ft0(0.0){
277 ////////////////////////////////////////////////////////////////////////
278 // Create ITS hit
279 //     The creator of the AliITShit class. The variables shunt and
280 // track are passed to the creator of the AliHit class. See the AliHit
281 // class for a full description. the integer array *vol contains, in order,
282 // fLayer = vol[0], fDet = vol[1], fLadder = vol[2], fStatus = vol[3].
283 // The array *hits contains, in order, fX = hits[0], fY = hits[1],
284 // fZ = hits[2], fPx = hits[3], fPy = hits[4], fPz = hits[5],
285 // fDestep = hits[6], and fTof = hits[7]. In the units of the Monte Carlo
286 ////////////////////////////////////////////////////////////////////////
287     // Intputs:
288     //    Int_t shunt   See AliHit
289     //    Int_t track   Track number, see AliHit
290     //    Int_t *vol     Array of integer hit data,
291     //                     vol[0] Layer where the hit is, 1-6 typicaly
292     //                     vol[1] Ladder where the hit is.
293     //                     vol[2] Detector number where the hit is
294     //                     vol[3] Set of status bits
295     //    Float_t *hits   Array of hit information
296     //                     hits[0] X global position of this hit
297     //                     hits[1] Y global position of this hit
298     //                     hits[2] Z global position of this hit
299     //                     hits[3] Px global position of this hit
300     //                     hits[4] Py global position of this hit
301     //                     hits[5] Pz global position of this hit
302     //                     hits[6] Energy deposited by this step
303     //                     hits[7] Time of flight of this particle at this step
304     // Outputs:
305     //    none.
306     // Return:
307     //    A standard created AliITShit class.
308   fX          = hits[0];  // Track X global position
309   fY          = hits[1];  // Track Y global position
310   fZ          = hits[2];  // Track Z global position
311 }
312 //______________________________________________________________________
313 void AliITShit::GetPositionL(Float_t &x,Float_t &y,Float_t &z){
314 ////////////////////////////////////////////////////////////////////////
315 //     Returns the position of this hit in the local coordinates of this
316 // module, and in the units of the Monte Carlo.
317 ////////////////////////////////////////////////////////////////////////
318     AliITSgeom *gm = ((AliITS*)gAlice->GetDetector("ITS"))->GetITSgeom();
319     Float_t g[3],l[3];
320
321     g[0] = fX;
322     g[1] = fY;
323     g[2] = fZ;
324     if(gm) {
325       gm->GtoL(fLayer,fLadder,fDet,g,l);
326       x = l[0];
327       y = l[1];
328       z = l[2];
329     } else {
330       Error("AliITShit","NULL pointer to the geometry! return smth else",gm);
331       // AliITSv7 - SDD case
332       x=fX;
333       y=fY;
334       z=fZ;
335     }
336     return;
337 }
338 //______________________________________________________________________
339 void AliITShit::GetPositionL(Float_t &x,Float_t &y,Float_t &z,Float_t &tof){
340 ////////////////////////////////////////////////////////////////////////
341 //     Returns the position and time of flight of this hit in the local
342 // coordinates of this module, and in the units of the Monte Carlo.
343 ////////////////////////////////////////////////////////////////////////
344     AliITSgeom *gm = ((AliITS*)gAlice->GetDetector("ITS"))->GetITSgeom();
345     Float_t g[3],l[3];
346
347     g[0] = fX;
348     g[1] = fY;
349     g[2] = fZ;
350     if(gm) {
351       gm->GtoL(fLayer,fLadder,fDet,g,l);
352       x = l[0];
353       y = l[1];
354       z = l[2];
355     } else {
356       Error("AliITShit","NULL pointer to the geometry! return smth else",gm);
357       // AliITSv7 - SDD case
358       x=fX;
359       y=fY;
360       z=fZ;
361     }
362     tof = fTof;
363     return;
364 }
365 //______________________________________________________________________
366 void AliITShit::GetPositionL0(Double_t &x,Double_t &y,Double_t &z,
367                               Double_t &tof){
368 ////////////////////////////////////////////////////////////////////////
369 //     Returns the initial position and time of flight of this hit in the local
370 // coordinates of this module, and in the units of the Monte Carlo.
371 ////////////////////////////////////////////////////////////////////////
372     AliITSgeom *gm = ((AliITS*)gAlice->GetDetector("ITS"))->GetITSgeom();
373     Float_t g[3],l[3];
374
375     g[0] = fx0;
376     g[1] = fy0;
377     g[2] = fz0;
378     if(gm) {
379       gm->GtoL(fLayer,fLadder,fDet,g,l);
380       x = l[0];
381       y = l[1];
382       z = l[2];
383     } else {
384       Error("AliITShit","NULL pointer to the geometry! return smth else",gm);
385       // AliITSv7 - SDD case
386       x=fx0;
387       y=fy0;
388       z=fz0;
389     }
390     tof = ft0;
391     return;
392 }
393 //______________________________________________________________________
394 Float_t AliITShit::GetXL(){
395 ////////////////////////////////////////////////////////////////////////
396 //     Returns the x position of this hit in the local coordinates of this
397 // module, and in the units of the Monte Carlo.
398 ////////////////////////////////////////////////////////////////////////
399     AliITSgeom *gm = ((AliITS*)gAlice->GetDetector("ITS"))->GetITSgeom();
400     Float_t g[3],l[3];
401
402     g[0] = fX;
403     g[1] = fY;
404     g[2] = fZ;
405     if(gm) {
406       gm->GtoL(fLayer,fLadder,fDet,g,l);
407       return l[0];
408     } else {
409       Error("AliITShit","NULL pointer to the geometry! return smth else",gm);
410       return fX;
411     }
412 }
413 //______________________________________________________________________
414 Float_t AliITShit::GetYL(){
415 ////////////////////////////////////////////////////////////////////////
416 //     Returns the y position of this hit in the local coordinates of this
417 // module, and in the units of the Monte Carlo.
418 ////////////////////////////////////////////////////////////////////////
419     AliITSgeom *gm = ((AliITS*)gAlice->GetDetector("ITS"))->GetITSgeom();
420     Float_t g[3],l[3];
421
422     g[0] = fX;
423     g[1] = fY;
424     g[2] = fZ;
425     if (gm) {
426       gm->GtoL(fLayer,fLadder,fDet,g,l);
427       return l[1];
428     } else {
429       Error("AliITShit","NULL pointer to the geometry! return smth else",gm);
430       return fZ;
431     }
432 }
433 //______________________________________________________________________
434 Float_t AliITShit::GetZL(){
435 ////////////////////////////////////////////////////////////////////////
436 //     Returns the z position of this hit in the local coordinates of this
437 // module, and in the units of the Monte Carlo.
438 ////////////////////////////////////////////////////////////////////////
439     AliITSgeom *gm = ((AliITS*)gAlice->GetDetector("ITS"))->GetITSgeom();
440     Float_t g[3],l[3];
441
442     g[0] = fX;
443     g[1] = fY;
444     g[2] = fZ;
445     if(gm) {
446       gm->GtoL(fLayer,fLadder,fDet,g,l);
447       return l[2];
448     } else {
449       Error("AliITShit","NULL pointer to the geometry! return smth else",gm);
450       return fY;
451     }
452 }
453 //______________________________________________________________________
454 void AliITShit::GetMomentumL(Float_t &px,Float_t &py,Float_t &pz){
455 ////////////////////////////////////////////////////////////////////////
456 //     Returns the momentum of this hit in the local coordinates of this
457 // module, and in the units of the Monte Carlo.
458 ////////////////////////////////////////////////////////////////////////
459     AliITSgeom *gm = ((AliITS*)gAlice->GetDetector("ITS"))->GetITSgeom();
460     Float_t g[3],l[3];
461
462     g[0] = fPx;
463     g[1] = fPy;
464     g[2] = fPz;
465     if (gm) {
466       gm->GtoLMomentum(fLayer,fLadder,fDet,g,l);
467       px = l[0];
468       py = l[1];
469       pz = l[2];
470     } else {
471       Error("AliITShit","NULL pointer to the geometry! return smth else",gm);
472       px=fPx;
473       py=fPy;
474       pz=fPz;
475     }
476     return;
477 }
478 //______________________________________________________________________
479 Float_t AliITShit::GetPXL(){
480 ////////////////////////////////////////////////////////////////////////
481 //     Returns the X momentum of this hit in the local coordinates of this
482 // module, and in the units of the Monte Carlo.
483 ////////////////////////////////////////////////////////////////////////
484     AliITSgeom *gm = ((AliITS*)gAlice->GetDetector("ITS"))->GetITSgeom();
485     Float_t g[3],l[3];
486
487     g[0] = fPx;
488     g[1] = fPy;
489     g[2] = fPz;
490     if (gm) {
491       gm->GtoLMomentum(fLayer,fLadder,fDet,g,l);
492       return l[0];
493     } else {
494       Error("AliITShit","NULL pointer to the geometry! return smth else",gm);
495       return fPx;
496     }
497 }
498 //______________________________________________________________________
499 Float_t AliITShit::GetPYL(){
500 ////////////////////////////////////////////////////////////////////////
501 //     Returns the Y momentum of this hit in the local coordinates of this
502 // module, and in the units of the Monte Carlo.
503 ////////////////////////////////////////////////////////////////////////
504     AliITSgeom *gm = ((AliITS*)gAlice->GetDetector("ITS"))->GetITSgeom();
505     Float_t g[3],l[3];
506
507     g[0] = fPx;
508     g[1] = fPy;
509     g[2] = fPz;
510     if (gm) {
511       gm->GtoLMomentum(fLayer,fLadder,fDet,g,l);
512       return l[1];
513     } else {
514       Error("AliITShit","NULL pointer to the geometry! return smth else",gm);
515       return fPy;
516     }
517
518 }
519 //______________________________________________________________________
520 Float_t AliITShit::GetPZL(){
521 ////////////////////////////////////////////////////////////////////////
522 //     Returns the Z momentum of this hit in the local coordinates of this
523 // module, and in the units of the Monte Carlo.
524 ////////////////////////////////////////////////////////////////////////
525     AliITSgeom *gm = ((AliITS*)gAlice->GetDetector("ITS"))->GetITSgeom();
526     Float_t g[3],l[3];
527
528     g[0] = fPx;
529     g[1] = fPy;
530     g[2] = fPz;
531     if (gm) {
532       gm->GtoLMomentum(fLayer,fLadder,fDet,g,l);
533       return l[2];
534     } else {
535       Error("AliITShit","NULL pointer to the geometry! return smth else",gm);
536       return fPz;
537     }
538
539 }
540 //___________________________________________________________________________;
541 Int_t AliITShit::GetModule(){
542 ////////////////////////////////////////////////////////////////////////
543 //     Returns the module index number of the module where this hit was in.
544 ////////////////////////////////////////////////////////////////////////
545     AliITSgeom *gm = ((AliITS*)gAlice->GetDetector("ITS"))->GetITSgeom();
546
547     if (gm) return gm->GetModuleIndex(fLayer,fLadder,fDet);
548     else {
549       Error("AliITShit","NULL pointer to the geometry! return smth else",gm);
550       return 0;
551     }
552 }
553 //______________________________________________________________________
554 TParticle * AliITShit::GetParticle() const {
555 ////////////////////////////////////////////////////////////////////////
556 //     Returns the pointer to the TParticle for the particle that created
557 // this hit. From the TParticle all kinds of information about this 
558 // particle can be found. See the TParticle class.
559 ////////////////////////////////////////////////////////////////////////
560     return gAlice->GetMCApp()->Particle(GetTrack());
561 }  
562 //----------------------------------------------------------------------
563 void AliITShit::Print(ostream *os) const {
564 ////////////////////////////////////////////////////////////////////////
565 // Standard output format for this class.
566 ////////////////////////////////////////////////////////////////////////
567 #if defined __GNUC__
568 #if __GNUC__ > 2
569     ios::fmtflags fmt;
570 #else
571     Int_t fmt;
572 #endif
573 #else
574 #if defined __ICC || defined __ECC || defined __xlC__
575     ios::fmtflags fmt;
576 #else
577     Int_t fmt;
578 #endif
579 #endif
580  
581     fmt = os->setf(ios::scientific);  // set scientific floating point output
582     *os << fTrack << " " << fX << " " << fY << " " << fZ << " ";
583     fmt = os->setf(ios::hex); // set hex for fStatus only.
584     *os << fStatus << " ";
585     fmt = os->setf(ios::dec); // every thing else decimel.
586     *os << fLayer << " " << fLadder << " " << fDet << " ";;
587     *os << fPx << " " << fPy << " " << fPz << " ";
588     *os << fDestep << " " << fTof;
589     *os << " " << fx0 << " " << fy0 << " " << fz0;
590 //    *os << " " << endl;
591     os->flags(fmt); // reset back to old formating.
592     return;
593 }
594 //----------------------------------------------------------------------
595 void AliITShit::Read(istream *is) {
596 ////////////////////////////////////////////////////////////////////////
597 // Standard input format for this class.
598 ////////////////////////////////////////////////////////////////////////
599  
600
601     *is >> fTrack >> fX >> fY >> fZ;
602     *is >> fStatus >> fLayer >> fLadder >> fDet >> fPx >> fPy >> fPz >>
603            fDestep >> fTof;
604     *is >> fx0 >> fy0 >> fz0;
605     return;
606 }
607 //----------------------------------------------------------------------
608 ostream &operator<<(ostream &os,AliITShit &p){
609 ////////////////////////////////////////////////////////////////////////
610 // Standard output streaming function.
611 ////////////////////////////////////////////////////////////////////////
612  
613     p.Print(&os);
614     return os;
615 }
616 //----------------------------------------------------------------------
617 istream &operator>>(istream &is,AliITShit &r){
618 ////////////////////////////////////////////////////////////////////////
619 // Standard input streaming function.
620 ////////////////////////////////////////////////////////////////////////
621  
622     r.Read(&is);
623     return is;
624 }
625 //----------------------------------------------------------------------