New Class' to A) separate out the simulation from the reconstruction. and
[u/mrichter/AliRoot.git] / ITS / AliITSDetTypeSim.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 /*
17  $Id$
18 */
19
20 /*********************************************************************
21  * This class defines the "Standard" reconstruction for the ITS 
22  * detector.
23  **********************************************************************/
24 #include "AliITSDetTypeSim.h"
25
26 ClassImp(AliITSDetTypeSim)
27
28 //----------------------------------------------------------------------
29 AliITSDetTypeSim::AliITSDetTypeSim():
30 TObject(),
31 fGeom(),         //
32 fSimulation(),   // [NDet]
33 fSegmentation(), // [NDet]
34 fResponse(),     // [NMod]
35 fPreProcess(),   // [] e.g. Fill fHitModule with hits
36 fPostProcess(),  // [] e.g. Wright Raw data
37 fHitModule(),    //! [NMod][Nhits]
38 fNhits(0),       //! number of hits
39 fHits(),         //! local pointer
40 fNSDigits(0),    //! number of SDigits
41 fSDigits(),      //! [NMod][NSDigits]
42 fNDigits(0),     //! number of Digits
43 fDigits(),       //! [NMod][NDigits]
44 fHitClassName(), // String with Hit class name.
45 fSDigClassName(),// String with SDigit class name.
46 fDigClassName(){ // String with digit class name.
47     // Default Constructor
48     // Inputs:
49     //    none.
50     // Outputs:
51     //    none.
52     // Return:
53     //    A properly zero-ed AliITSDetTypeSim class.
54 }
55 //----------------------------------------------------------------------
56 AliITSDetTypeSim::~AliITSDetTypeSim(){
57     // Destructor
58     // Inputs:
59     //    none.
60     // Outputs:
61     //    none.
62     // Return:
63     //    Nothing.
64
65     delete fGeom;
66     delete fSimulation;
67     delete fSegmentation;
68     delete fResponse;
69     delete fPreProcess;
70     delete fPostProcess;
71     delete fHitModule;
72     // Do not delete fSDigits Not owned by this class see AliITS
73     // Do not delete fDigits Not owned by this class see AliITS
74 }
75 //----------------------------------------------------------------------
76 AliITSDetTypeSim::AliITSDetTypeSim(const AliITSDetTypeSim &s) : TObject(s){
77     // Copy Constructor for object AliITSDetTypeSim
78     // Inputs:
79     //   AliITSDetTypeSim &s  The copy Sourse
80     // Outputs:
81     //   none.
82     // Return:
83     //   A new AliITSDetTypeSim Object with the same data as that in the
84     //   source s.
85
86     if(&s==this) return;
87     *this = source;
88     return;
89 }
90 //----------------------------------------------------------------------
91 AliITSDetTypeSim::operator=(const AliITSDetTypeSim &s) : TObject(s){
92     // The = operator for object AliITSDetTypeSim
93     // Inputs:
94     //   AliITSDetTypeSim &s  The copy Sourse
95     // Outputs:
96     //   none.
97     // Return:
98     //   A new AliITSDetTypeSim Object with the same data as that in the
99     //   source s.
100
101     if(&s==this) return;
102     // Make copies of the objects in the arrays as well
103     this->fGeom            = new AliITSgeom(s.fGeom);// Create a new instance
104     if(this->fSimulation!=0) delete this->fSimulation;
105     this->fSimulation      = new TObjArray(s.fSimulation->GetSize(),
106                                            s.fSimulation->LowerBound());
107     for(i=0;i<s.fSimulation->GetSize();i++) if(s.fSimulation[i]!=0)
108         this->fSimulation[i] = new AliITSsimulation(*(s.fSimulation[i]));
109         else this->fSimulation[i] = 0;
110     if(this->fSegmentation!=0) delete this->fSegentation;
111     this->fSegmentation = new TObjArray(s.fSegmentation->GetSize(),
112                                         s.fSegmentation->GetLowerBound());
113     for(i=0;i<s.fSegmentation->GetSize();i++) if(s.fSegmentation[i]!=0)
114         this->fSegmentation[i] = new AliITSsegmentation(*(s.fSegmentation[i]));
115         else this->fSegmentation[i] = 0;
116     if(this->fResponse!=0) delete fResponse;
117     this->fResponse = new TObjArray(s.fResponse->GetSize(),
118                                     s.fResponse->GetLowerBound());
119     for(i=0;i<s.fResponse->GetSize();i++) if(s.Response[i]!=0)
120         this->fResponse[i] = new AliITSresponse(*(s.fResponse[i]));
121         else this->fResponse[i] = 0;
122     this->fPreProcess      = s.fPreProcess;  // Improper copy
123     this->fPostProcess     = s.fPostProcess; // Improper copy
124     this->fHitModule       = s.fHitModule;   // Improper copy
125     this->fNhits           = s.fNhits;       //
126     this->fHits            = s.fHits;        // copy pointer address only
127     this->fNSDigits        = s.fNSDigits;    //
128     this->fSDigits         = s.fSDigits;     // copy pointer address only
129     this->fNDigits         = s.fNDigits;     //
130     this->fDigits          = s.fDigits;      // copy pointer address only
131     this->fHitClassName    = s.fHitClassName;
132     this->fSDigitClassName = s.fSDigitClassName;
133     this->fDigitClassName  = s.FDigitClassName;
134     return *this;
135 }
136 //______________________________________________________________________
137 void AliITSDetTypeSim::InitModules(Int_t size,Int_t &nmodules){
138     // Initialize the modules array.
139     // Inputs:
140     //      Int_t size  Size of array of the number of modules to be
141     //                  created. If size <=0 then the number of modules
142     //                  is gotten from AliITSgeom class kept in fGeom.
143     // Outputs:
144     //      Int_t &nmodules The number of modules existing.
145     // Return:
146     //      none.
147
148     if(fHitModule){ 
149         fHitModule->Delete();
150         delete fHitModule;
151     } // end fir fITSmoudles
152
153     Int_t nl,indexMAX,index;
154
155     if(size<=0){ // default to using data stored in AliITSgeom
156         if(fGeom==0) {
157             Error("InitModules","fGeom not defined");
158             return;
159         } // end if fGeom==0
160         nl = fGeom->GetNlayers();
161         indexMAX = fGeom->GetIndexMax();
162         nmodules = indexMAX;
163         fHitModule = new TObjArray(indexMAX);
164         for(index=0;index<indexMAX;index++){
165             fHitModule->AddAt( new AliITSmodule(index),index);
166         } // end for index
167     }else{
168         fHitModule = new TObjArray(size);
169         for(index=0;index<size;index++) {
170             fHitModule->AddAt( new AliITSmodule(index),index);
171         } // end for index
172
173         nmodules = size;
174     } // end i size<=0
175 }
176 //______________________________________________________________________
177 void AliITSDetTypeSim::FillModules(TTree *treeH, Int_t mask) {
178     // fill the modules with the sorted by module hits; 
179     // can be called many times to do a merging
180     // Inputs:
181     //      TTree *treeH  The tree containing the hits to be copied into
182     //                    the modules.
183     //      Int_t mask    The track number mask to indecate which file
184     //                    this hits came from.
185     // Outputs:
186     //      none.
187     // Return:
188     //      none.
189
190     if (treeH == 0x0){Error("FillModules","Tree is NULL");return;}
191
192     Int_t lay,lad,det,index;
193     AliITShit *itsHit=0;
194     AliITSmodule *mod=0;
195     TBranch *branch = treeH->GetBranch(fHitClassName.Data());
196     if (!branch){Error("FillModules","%s branch in TreeH not found",
197                        fHitClassName.Data());return;} // end if !branch
198     branch->SetAddress(&fHits);
199     Int_t nTracks =(Int_t) treeH->GetEntries();
200     Int_t iPrimTrack,h;
201     for(iPrimTrack=0; iPrimTrack<nTracks; iPrimTrack++){
202         ResetHits();
203         Int_t nBytes = treeH->GetEvent(iPrimTrack);
204         if (nBytes <= 0) continue;
205         Int_t nHits = fHits->GetEntriesFast();
206         for(h=0; h<nHits; h++){
207             itsHit = (AliITShit *)fHits->UncheckedAt(h);
208             itsHit->GetDetectorID(lay,lad,det);
209             if (fGeom) index = fGeom->GetModuleIndex(lay,lad,det);
210             else index=det-1; // This should not be used.
211             mod = GetModule(index);
212             itsHit->SetTrack(itsHit->GetTrack()+mask); // Set track mask.
213             mod->AddHit(itsHit,iPrimTrack,h);
214         } // end loop over hits 
215     } // end loop over tracks
216 }