New Version from Alla
[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.5  2000/01/19 17:17:15  fca
19 Introducing a list of lists of hits -- more hits allowed for detector now
20
21 Revision 1.4  1999/11/12 15:04:00  fca
22 Modifications from A.Maevskaya
23
24 Revision 1.3  1999/09/29 09:24:29  fca
25 Introduction of the Copyright and cvs Log
26
27 */
28
29 ///////////////////////////////////////////////////////////////////////////////
30 //                                                                           //
31 //  START (T-Zero) Detector                                            //
32 //  This class contains the base procedures for the START     //
33 //  detector                                                                 //
34 //                                                                           //
35 //Begin_Html
36 /*
37 <img src="gif/AliSTARTClass.gif">
38 </pre>
39 <br clear=left>
40 <font size=+2 color=red>
41 <p>The responsible person for this module is
42 <a href="mailto:Alla.Maevskaia@cern.ch">Alla Maevskaia</a>.
43 </font>
44 <pre>
45 */
46 //End_Html
47 //                                                                           //
48 //                                                                           //
49 ///////////////////////////////////////////////////////////////////////////////
50
51 #include <iostream.h>
52 #include <fstream.h>
53
54 #include "TMath.h"
55 #include "TTUBE.h"
56 #include "TNode.h"
57 #include "TGeometry.h"
58 #include "AliRun.h"
59 #include "AliSTART.h"
60 #include "AliSTARTdigit.h"
61 #include "AliMC.h"
62 #include "AliSTARThit.h"
63
64 ClassImp(AliSTART)
65  
66 //_____________________________________________________________________________
67 AliSTART::AliSTART()
68 {
69   //
70   // Default constructor for class AliSTART
71   //
72   fIshunt   = 0;
73   fHits     = 0;
74   fDigits   = 0;
75 }
76  
77 //_____________________________________________________________________________
78 AliSTART::AliSTART(const char *name, const char *title)
79        : AliDetector(name,title)
80 {
81   //
82   // Standard constructor for START Detector
83   //
84
85   AliModule *fmd = gAlice->GetModule("FMD");
86   if(fmd) {
87     Int_t fmdversion = fmd->IsVersion();
88     if(fmdversion==0 || fmdversion==1) {
89       Error("ctor","Versions 0 and 1 of FMD incompatible with START\n");
90       exit(1);
91     }
92   }
93  
94   //
95   // Initialise Hit array
96   fHits       = new TClonesArray("AliSTARThit",  405);
97   gAlice->AddHitList(fHits);
98   fDigits     = new TClonesArray("AliSTARTdigit",500);
99   
100   fIshunt     =  0;
101   fIdSens1    =  0;
102
103   SetMarkerColor(kRed);
104 }
105  
106 //_____________________________________________________________________________
107 void AliSTART::AddHit(Int_t track, Int_t *vol, Float_t *hits)
108 {
109   //
110   // Add a START hit
111   //
112   TClonesArray &lhits = *fHits;
113   new(lhits[fNhits++]) AliSTARThit(fIshunt,track,vol,hits);
114 }
115
116 //_____________________________________________________________________________
117 void AliSTART::AddDigit(Int_t *tracks,Int_t *digits)
118 {
119   //
120   // Add a START digit to the list
121   //
122   TClonesArray &ldigits = *fDigits;
123   new(ldigits[fNdigits++]) AliSTARTdigit(tracks,digits);
124 }
125  
126 //_____________________________________________________________________________
127 void AliSTART::BuildGeometry()
128 {
129   //
130   // Build simple ROOT TNode geometry for event display
131   //
132   TNode *Node, *Top;
133   const int kColorSTART  = 19;
134   //
135   Top=gAlice->GetGeometry()->GetNode("alice");
136
137   // START define the different volumes
138   new TRotMatrix("rot999","rot999",  90,0,90,90,180,0);
139
140   new TTUBE("S_STR1","START  volume 1","void",5.,10.7,5.3);
141   Top->cd();
142   Node = new TNode("STR1","STR1","S_STR1",0,0,75.,"");
143   Node->SetLineColor(kColorSTART);
144   fNodes->Add(Node);
145
146   new TTUBE("S_STR2","START volume 2","void",5.,10.7,5.3);
147   Top->cd();
148   Node = new TNode("STR2","STR2","S_STR2",0,0,-75,"rot999");
149   Node->SetLineColor(kColorSTART);
150   fNodes->Add(Node);
151 }
152  
153 //_____________________________________________________________________________
154 Int_t AliSTART::DistanceToPrimitive(Int_t px, Int_t py)
155 {
156   //
157   // Calculate the distance from the mouse to the START on the screen
158   // Dummy routine
159   //
160   return 9999;
161 }
162  
163 //-------------------------------------------------------------------------
164 void AliSTART::Init()
165 {
166   //
167   // Initialis the START after it has been built
168   Int_t i;
169   //
170   printf("\n");
171   for(i=0;i<35;i++) printf("*");
172   printf(" START_INIT ");
173   for(i=0;i<35;i++) printf("*");
174   printf("\n");
175   //
176   // Here the START initialisation code (if any!)
177   for(i=0;i<80;i++) printf("*");
178   printf("\n");
179   //
180   //
181   fIdSens1=gMC->VolId("PTOP");
182
183 }
184
185 //---------------------------------------------------------------------------
186 void AliSTART::MakeBranch(Option_t* option)
187 {
188   
189   // Create Tree branches for the START.
190   Int_t buffersize = 4000;
191   char branchname[10];
192   sprintf(branchname,"%s",GetName());
193
194   AliDetector::MakeBranch(option);
195
196   char *D = strstr(option,"D");
197
198   if (fDigits   && gAlice->TreeD() && D) {
199     gAlice->TreeD()->Branch(branchname,&fDigits, buffersize);
200     printf("Making Branch %s for digits\n",branchname);
201   }
202   
203 }    
204
205 //_____________________________________________________________________________
206 void AliSTART::Hit2digit(Int_t evnum) 
207 {
208   
209   Float_t x,y,e;
210   Int_t nbytes = 0;
211   Int_t hit,i;
212   Int_t nhits;
213   Int_t volume,pmt;
214   char nameTH[8];
215   Float_t timediff,timeright,timeleft,t1,t2,timeav;
216   Float_t besttimeright,besttimeleft;
217   Float_t pp_bunch=25;
218   Int_t channel_width=10;
219   Int_t digits[3];
220   Int_t tracks[2];
221
222   TParticle *particle;
223
224   AliSTARThit  *startHit;
225
226
227   // Event ------------------------- LOOP  
228  //   for (evnum=0; evnum<=9; evnum++){
229
230     besttimeright=9999.;
231     besttimeleft=9999.;
232
233     Int_t nparticles = gAlice->GetEvent(evnum);
234     if (nparticles <= 0) return;
235     printf("\n nparticles %d\n",nparticles);
236     
237     TClonesArray *Particles = gAlice->Particles();
238     
239     sprintf(nameTH,"TreeH%d",evnum);
240     printf("%s\n",nameTH);
241     TTree *TH = gAlice->TreeH();
242     Int_t ntracks    = (Int_t) TH->GetEntries();
243     if (ntracks<=0) return;
244     // Start loop on tracks in the hits containers
245     for (Int_t track=0; track<ntracks;track++) {
246       gAlice->ResetHits();
247       nbytes += TH->GetEvent(track);
248       particle=(TParticle*)Particles->UncheckedAt(track);
249       nhits = fHits->GetEntriesFast();
250            
251       for (hit=0;hit<nhits;hit++) {
252         startHit   = (AliSTARThit*)fHits->UncheckedAt(hit);
253         pmt=startHit->fPmt;
254         e=startHit->fEtot;
255         x=startHit->fX;
256         y=startHit->fY;
257         volume = startHit->fVolume;
258         if(volume==1){
259           timeright = startHit->fTime;
260           if(timeright<besttimeright) {
261             besttimeright=timeright;
262             tracks[0]=track;
263           } //timeright
264         }//time for right shoulder
265         if(volume==2){            
266           timeleft = startHit->fTime;
267           //                printf("timeleft %f\n",timeleft);
268           if(timeleft<besttimeleft) {
269             besttimeleft=timeleft;
270             tracks[1]=track;
271           } //timeleftbest
272         }//time for left shoulder
273       } //hit loop
274     } //track loop
275     printf("\n----time1stright %f \n",besttimeright);     
276     printf("----time1stleft %f \n",besttimeleft);     
277     timediff=besttimeright-besttimeleft;
278     if (timediff!=0 && TMath::Abs(timediff)<100) {
279       //we assume centre of bunch is 5ns after TTS signal
280       //TOF values are relative of the end of bunch
281       pp_bunch=pp_bunch-10/2;
282       t1=besttimeleft+pp_bunch;
283       t2=besttimeright+pp_bunch;
284       t1=1000*t1/channel_width; //time in ps to channel_width
285       t2=1000*t2/channel_width; //time in ps to channel_width
286       printf(" t1= %f t2= %f\n",t1,t2);
287
288       timeav=(t1+t2)/2.;
289       printf("timediff= %f timeav= %f\n",timediff,timeav);
290
291       // Time to TDC signal
292       // 1024 channels for timediff, range 1ns
293       
294      timediff=512+1000*timediff/channel_width; // time in ps
295      printf("timediff= %f timeav= %f\n",timediff,timeav);
296
297
298      digits[0]=evnum;
299      digits[1]=(Int_t)(timeav);   // time in ps
300      digits[2]=(Int_t)(timediff); // time in ps
301      //  new(ldigits[fNdigits++]) AliSTARTdigit(track,digits);
302  
303     
304      for (i=0; i<3; i++){
305        printf(" DIGITS on START  %d\n",digits[i]); } 
306      for (i=0; i<=1; i++) { printf("START track %d\n",tracks[i]);}
307      AddDigit(tracks,digits);
308      //     sprintf(nameTD,"TreeD%d",evnum);
309      //    gAlice->TreeD()->Fill();
310      //gAlice->TreeD()->Write();
311      //printf("%s\n",nameTD);
312      MakeTree(evnum);
313      if (fTreeD!=0) fTreeD->Fill();    
314      if (fTreeD!=0) fTreeD->Write();    
315     } // if timediff !=0
316     
317     //   } // event loop
318     
319 } // end of mcro
320  
321 //_____________________________________________________________________________
322 Bool_t  AliSTART::SetTree(Int_t nevent, TDirectory *dir )
323 {
324   char treeName[100];
325   // Get Hits Tree header from file
326   sprintf(treeName,"TreeD%d",nevent);
327   fTreeD = (TTree*)dir->Get(treeName);
328   if (fTreeD == 0) return kFALSE;
329   //set Digit branch 
330   TBranch *b = fTreeD->GetBranch("Digits");
331   if (b==0) return kFALSE;
332   b->SetAddress(&fDigits);
333   return kTRUE;
334 }
335
336
337 //_____________________________________________________________________________
338 Bool_t  AliSTART::MakeTree(Int_t nevent)
339 {
340   char treeName[100];
341   // Get Hits Tree header from file
342   sprintf(treeName,"TreeD%d",nevent);
343   fTreeD =  new TTree(treeName,treeName);
344   if (fTreeD == 0) return kFALSE;
345   //set Digit branch 
346   TBranch *b = fTreeD->Branch("Digits",&fDigits,40000);
347   if (b==0) return kFALSE;
348   b->SetAddress(&fDigits);
349  
350   return kTRUE;
351 }