new Digits structure
[u/mrichter/AliRoot.git] / START / AliSTART.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 $Log$
18 Revision 1.23  2001/09/19 18:41:45  alla
19 Asimmetric START geometry
20
21 Revision 1.22  2001/07/27 13:03:12  hristov
22 Default Branch split level set to 99
23
24 Revision 1.21  2001/06/27 16:06:59  hristov
25 Rotation matrix in BuildGeometry has been changed to rotx999
26
27 Revision 1.20.2.1  2001/06/27 10:51:15  alla
28 Rotation matrix in BuildGeometry has benn changed to rotx999
29
30 Revision 1.20  2001/05/16 14:57:21  alibrary
31 New files for folders and Stack
32
33 Revision 1.19  2001/04/04 12:10:18  alla
34 changes according Coding Convension
35
36 Revision 1.18  2001/03/12 17:46:43  hristov
37 Changes needed on Sun with CC 5.0
38
39 Revision 1.17  2001/01/26 19:59:53  hristov
40 Major upgrade of AliRoot code
41
42 Revision 1.16  2001/01/17 10:56:08  hristov
43 Corrections to destructors
44
45 Revision 1.15  2001/01/01 13:10:42  hristov
46 Local definition of digits removed
47
48 Revision 1.14  2000/12/22 16:17:15  hristov
49 Updated  START code from Alla
50
51 Revision 1.13  2000/12/18 11:39:41  alibrary
52 Quick fix to avoid crash in display waiting for new version
53
54 Revision 1.12  2000/12/04 08:48:19  alibrary
55 Fixing problems in the HEAD
56
57 Revision 1.11  2000/10/13 13:14:08  hristov
58 Bug fixes and code cleaning
59
60 Revision 1.10  2000/10/02 21:28:13  fca
61 Removal of useless dependecies via forward declarations
62
63 Revision 1.9  2000/07/13 16:41:29  fca
64 New START corrected for coding conventions
65
66 Revision 1.8  2000/03/27 17:24:25  alla
67 Modifing geometry
68
69 Revision 1.6  2000/01/21 15:45:23  fca
70 New Version from Alla
71
72 Revision 1.5  2000/01/19 17:17:15  fca
73 Introducing a list of lists of hits -- more hits allowed for detector now
74
75 Revision 1.4  1999/11/12 15:04:00  fca
76 Modifications from A.Maevskaya
77
78 Revision 1.3  1999/09/29 09:24:29  fca
79 Introduction of the Copyright and cvs Log
80
81 */
82
83 ///////////////////////////////////////////////////////////////////////////////
84 //                                                                           //
85 //  START (T-Zero) Detector                                            //
86 //  This class contains the base procedures for the START     //
87 //  detector                                                                 //
88 //                                                                           //
89 //Begin_Html
90 /*
91 <img src="gif/AliSTARTClass.gif">
92 </pre>
93 <br clear=left>
94 <font size=+2 color=red>
95 <p>The responsible person for this module is
96 <a href="mailto:Alla.Maevskaia@cern.ch">Alla Maevskaia</a>.
97 </font>
98 <pre>
99 */
100 //End_Html
101 //                                                                           //
102 //                                                                           //
103 ///////////////////////////////////////////////////////////////////////////////
104
105 #include <iostream.h>
106 #include <fstream.h>
107
108 #include "TMath.h"
109 #include "TTUBE.h"
110 #include "TNode.h"
111 #include "TRandom.h"
112 #include "TGeometry.h"
113 #include "TFile.h"
114 #include "TParticle.h"
115
116 #include "AliRun.h"
117 #include "AliSTART.h"
118 #include "AliSTARTdigit.h"
119 #include "AliMC.h"
120 #include "AliSTARThit.h"
121 #include "AliSTARThitPhoton.h"
122 #include "AliSTARTvertex.h"
123
124 ClassImp(AliSTART)
125
126 static  AliSTARTdigit *digits; 
127
128 //_____________________________________________________________________________
129 AliSTART::AliSTART()
130 {
131   //
132   // Default constructor for class AliSTART
133   //
134   fIshunt   = 1;
135   fHits     = 0;
136   fDigits   = 0;
137   fPhotons  = 0;
138 }
139  
140 //_____________________________________________________________________________
141 AliSTART::AliSTART(const char *name, const char *title)
142        : AliDetector(name,title)
143 {
144   //
145   // Standard constructor for START Detector
146   //
147
148   
149   //
150   // Initialise Hit array
151   fHits       = new TClonesArray("AliSTARThit",  405);
152   gAlice->AddHitList(fHits);
153
154   fPhotons  = new TClonesArray("AliSTARThitPhoton", 10000);
155   gAlice->AddHitList (fPhotons);
156   
157   fIshunt     =  1;
158   fIdSens   =  0;
159   fNPhotons =  0;
160   SetMarkerColor(kRed);
161 }
162
163 //_____________________________________________________________________________
164 AliSTART::~AliSTART() {
165   if (fHits) {
166     fHits->Delete();
167     delete fHits;
168   }
169   if (fPhotons) {
170     fPhotons->Delete();
171     delete fPhotons;
172   }
173 }
174  
175 //_____________________________________________________________________________
176 void AliSTART::AddHit(Int_t track, Int_t *vol, Float_t *hits)
177 {
178   //
179   // Add a START hit
180   //
181   TClonesArray &lhits = *fHits;
182   new(lhits[fNhits++]) AliSTARThit(fIshunt,track,vol,hits);
183 }
184
185 //_____________________________________________________________________________
186 void AliSTART::AddHitPhoton(Int_t track, Int_t *vol, Float_t *hits)
187 {
188   //  Add a START hit of photons
189   
190   TClonesArray &lhits = *fPhotons;
191   new(lhits[fNPhotons++]) AliSTARThitPhoton(fIshunt,track,vol,hits);
192 }
193
194 //_____________________________________________________________________________
195
196 void AliSTART::AddDigit(Int_t *tracks,Int_t *digits)
197 {
198   
199   //  Add a START digit to the list. Dummy function.
200   
201 }
202
203 //_____________________________________________________________________________
204 void AliSTART::BuildGeometry()
205 {
206   //
207   // Build simple ROOT TNode geometry for event display
208   //
209   TNode *node, *top;
210   const int kColorSTART  = 19;
211
212   top=gAlice->GetGeometry()->GetNode("alice");
213
214   // START define the different volumes
215   new TRotMatrix("rotx999","rot999",  90,0,90,90,180,0);
216
217   new TTUBE("S_0ST1","START  volume 1","void",5.,10.7,5.3);
218   top->cd();
219   node = new TNode("0ST1","0ST01","S_0ST1",0,0,69.7,"");
220   node->SetLineColor(kColorSTART);
221   fNodes->Add(node);
222
223   new TTUBE("S_0ST2","START volume 2","void",5.,10.7,5.3);
224   top->cd();
225   node = new TNode("0ST2","0ST2","S_0ST2",0,0,-350,"rotx999");
226   node->SetLineColor(kColorSTART);
227   fNodes->Add(node);
228 }
229  
230 //_____________________________________________________________________________
231 Int_t AliSTART::DistanceToPrimitive(Int_t px, Int_t py)
232 {
233   //
234   // Calculate the distance from the mouse to the START on the screen
235   // Dummy routine
236   //
237   return 9999;
238 }
239  
240 //-------------------------------------------------------------------------
241 void AliSTART::Init()
242 {
243   //
244   // Initialis the START after it has been built
245   Int_t i;
246   //
247   if(fDebug) {
248     printf("\n%s: ",ClassName());
249     for(i=0;i<35;i++) printf("*");
250     printf(" START_INIT ");
251     for(i=0;i<35;i++) printf("*");
252     printf("\n%s: ",ClassName());
253     //
254     // Here the START initialisation code (if any!)
255     for(i=0;i<80;i++) printf("*");
256     printf("\n");
257   }
258 }
259
260 //---------------------------------------------------------------------------
261 void AliSTART::MakeBranch(Option_t* option, const char *file)
262 {
263   //
264   // Specific START branches
265   //
266   // Create Tree branches for the START.
267   Int_t buffersize = 4000;
268   char branchname[20];
269   sprintf(branchname,"%s",GetName());
270
271   AliDetector::MakeBranch(option,file);
272
273   const char *cD = strstr(option,"D");
274   const char *cH = strstr(option,"H");
275   
276   if (cH)
277   {
278      sprintf (branchname, "%shitPhoton", GetName());
279      MakeBranchInTree (gAlice->TreeH(), branchname, &fPhotons, 50000, file);
280   } 
281
282   
283   if (cD) {
284     digits = new AliSTARTdigit();
285     MakeBranchInTree(gAlice->TreeD(), 
286                      branchname, "AliSTARTdigit", digits, buffersize, 1, file);
287   } 
288 /*
289   char *cR = strstr(option,"R");
290   
291   if (cR)   {  
292     MakeBranchInTree(gAlice->TreeR(), 
293                      branchname, "Int_t", &fZposit, buffersize, 1, file);
294   }
295   */
296 }    
297
298 //_____________________________________________________________________________
299 void AliSTART::ResetHits()
300 {
301   AliDetector::ResetHits();
302   
303   fNPhotons = 0;
304   if (fPhotons)  fPhotons->Clear();
305 }
306
307 //_____________________________________________________________________________
308 void AliSTART::SetTreeAddress()
309 {
310   TBranch       *branch;
311   TTree         *treeH;
312
313   AliDetector::SetTreeAddress();
314   treeH = gAlice->TreeH();
315   
316   if (treeH)
317     if (fPhotons)
318     {
319        branch = treeH->GetBranch ("STARThitPhoton");
320        if (branch)  branch->SetAddress (&fPhotons);
321     }
322 }
323
324
325 //_____________________________________________________________________________
326
327 void AliSTART::Hit2digit(Int_t evnum) 
328 {
329   //
330   // From hits to digits
331   //
332   /*
333   Float_t x,y,e;
334   Int_t nbytes = 0;
335   Int_t hit;
336   Int_t nhits;
337   Int_t volume,pmt;
338   char nameTH[8],nameTD[8];
339   Float_t timediff,timeright,timeleft,timeav;
340   Float_t besttimeright,besttimeleft,meanTime;
341   Int_t channelWidth=10;
342
343   TParticle *particle;
344   AliSTARThit  *startHit;
345
346   Int_t buffersize=256;
347
348   digits= new AliSTARTdigit();
349   TBranch *bDig=0;
350
351   
352  // Event ------------------------- LOOP  
353  
354     sprintf(nameTD,"TreeD%d",evnum);
355     TTree *td = new TTree(nameTD,"START");
356     bDig = td->Branch("START","AliSTARTdigit",&digits,buffersize);
357
358     besttimeright=9999.;
359     besttimeleft=9999.;
360     Int_t timeDiff=0;
361     Int_t timeAv=0;
362
363     Int_t nparticles = gAlice->GetEvent(evnum);
364     if (nparticles <= 0) return;
365     printf("\n nparticles %d\n",nparticles);
366     
367    
368     sprintf(nameTH,"TreeH%d",evnum);
369     printf("%s\n",nameTH);
370     TTree *th = gAlice->TreeH();
371     Int_t ntracks    = (Int_t) th->GetEntries();
372     if (ntracks<=0) return;
373     // Start loop on tracks in the hits containers
374     for (Int_t track=0; track<ntracks;track++) {
375       gAlice->ResetHits();
376       nbytes += th->GetEvent(track);
377       particle=gAlice->Particle(track);
378       nhits =fHits->GetEntriesFast();
379       
380       for (hit=0;hit<nhits;hit++) {
381         startHit   = (AliSTARThit*)fHits->UncheckedAt(hit);
382         pmt=startHit->fPmt;
383         e=startHit->fEtot;
384         x=startHit->X();
385         y=startHit->Y();
386         volume = startHit->fVolume;
387         if(volume==1){
388           timeright = startHit->fTime;
389           if(timeright<besttimeright) {
390             besttimeright=timeright;
391           } //timeright
392         }//time for right shoulder
393         if(volume==2){            
394           timeleft = startHit->fTime;
395           //                printf("timeleft %f\n",timeleft);
396           if(timeleft<besttimeleft) {
397             besttimeleft=timeleft;
398           } //timeleftbest
399         }//time for left shoulder
400       } //hit loop
401     } //track loop
402
403     //folding with experimental time distribution
404     Float_t besttimerightGaus=gRandom->Gaus(besttimeright,0.05);
405     Float_t besttimeleftGaus=gRandom->Gaus(besttimeleft,0.05);
406     timediff=besttimerightGaus-besttimeleftGaus;
407     meanTime=(besttimerightGaus+besttimeleftGaus)/2.;
408     if ( TMath::Abs(timediff)<2. && meanTime<3.) 
409      {
410        //we assume centre of bunch is 5ns after TTS signal
411        //TOF values are relative of the end of bunch
412        Float_t ppBunch=25;
413     
414        ppBunch=ppBunch-10/2;
415        Float_t t1=1000.*besttimeleftGaus;
416        Float_t t2=1000.*besttimerightGaus;
417        t1=t1/channelWidth+ppBunch; //time in ps to channelWidth
418        t2=t2/channelWidth+ppBunch; //time in ps to channelWidth
419      
420        timeav=(t1+t2)/2.;
421      
422        // Time to TDC signal
423        // 256 channels for timediff, range 1ns
424        
425        timediff=128+1000*timediff/channelWidth; // time in ps 
426
427        timeAv = (Int_t)(timeav);   // time (ps) channel numbres
428        timeDiff = (Int_t)(timediff); // time ( ps) channel numbres
429        digits->Set(timeAv,timeDiff);
430      }
431     else
432       {timeAv=999999; timeDiff=99999;}
433       
434     td->Fill();
435     printf("digits-> %d \n",digits->GetTime());
436     td->Write();
437   */
438 }
439
440
441
442
443
444
445
446
447
448
449
450
451  
452