]> git.uio.no Git - u/mrichter/AliRoot.git/blob - ITS/AliITSPreprocessorSDD.cxx
New default values for baselines (F.Prino)
[u/mrichter/AliRoot.git] / ITS / AliITSPreprocessorSDD.cxx
1 /**************************************************************************
2  * Copyright(c) 2007-2009, 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 ///////////////////////////////////////////////////////////////////
19 //                                                               //
20 // Implementation of the class for SDD preprocessing             //
21 // Origin: E.Crescio, Torino, crescio@to.infn.it                 //
22 //         F.Prino, Torino, prino@to.infn.it                     //
23 //                                                               //
24 ///////////////////////////////////////////////////////////////////
25
26 #include "AliITSPreprocessorSDD.h"
27 #include "AliITSCalibrationSDD.h"
28 #include "AliITSDriftSpeedSDD.h"
29 #include "AliITSDriftSpeedArraySDD.h"
30 #include "AliITSDCSAnalyzerSDD.h"
31 #include "AliShuttleInterface.h"
32 #include "AliCDBEntry.h"
33 #include "AliCDBMetaData.h"
34 #include "TObjArray.h"
35 #include "AliLog.h"
36 #include <TObjString.h>
37 #include <TSystem.h>
38 #include <TList.h>
39
40 const TString AliITSPreprocessorSDD::fgkNameHistoPedestals = "hpedestal";
41 const TString AliITSPreprocessorSDD::fgkNameHistoNoise = "hnoise";
42 ClassImp(AliITSPreprocessorSDD)
43
44 //______________________________________________________________________
45 AliITSPreprocessorSDD::AliITSPreprocessorSDD( AliShuttleInterface* shuttle):
46     AliPreprocessor("SDD", shuttle)
47 {
48   // constructor
49   AddRunType("PULSER");
50   AddRunType("INJECTOR");
51   AddRunType("PHYSICS"); 
52 }
53
54 //______________________________________________________________________
55 UInt_t AliITSPreprocessorSDD::Process(TMap* dcsAliasMap){
56
57   // Get DDL map from OCDB
58   AliCDBEntry* entry = GetFromOCDB("Calib", "DDLMapSDD");
59   if(!entry){
60     Log("DDL map file not found in OCDB.");  
61     return 2;
62   }
63   AliITSDDLModuleMapSDD* ddlmap = (AliITSDDLModuleMapSDD*)entry->GetObject();
64   if(!ddlmap){ 
65     Log("AliITSDDLModuleMapSDD object not in file.");
66     return 2;
67   }
68   ddlmap->PrintDDLMap();
69
70   //preprocessing
71   TString runType = GetRunType();
72   Int_t retcode=0;
73
74   if (runType == "PULSER"){
75     Log("Process FXS files from PULSER RUN");
76     retcode=ProcessPulser(ddlmap);
77   }else if(runType== "INJECTOR"){
78     Log("Process FXS files from INJECTOR RUN");
79     retcode=ProcessInjector(ddlmap);
80   }
81   if(retcode!=0) return retcode;
82
83   Log("Process DCS data");
84   Bool_t retcodedcs =ProcessDCSDataPoints(dcsAliasMap);
85   if(retcodedcs) return 0; 
86   else return 1;           
87
88 }
89 //______________________________________________________________________
90 UInt_t AliITSPreprocessorSDD::ProcessPulser(AliITSDDLModuleMapSDD* ddlmap){
91   // Process FXS files from PULSER run (baseline, noise, gain)
92   // returns 0 in case of success, 
93   //         1 in case of storage error, 
94   //         2 in case of error with input files
95   TObjArray calSDD(kNumberOfSDD);
96   calSDD.SetOwner(kFALSE);
97   Char_t command[100];
98   Char_t inpFileName[100];
99   Float_t baseline,rawnoise,cmn,corn,gain;
100   Int_t isgoodan,i,im,is,isgoodmod,basmin,basoff;
101   Int_t th,tl;
102   Int_t numOfBadChannels[kNumberOfSDD];
103   
104   TList* sourceList = GetFileSources(kDAQ, "SDD_Calib");
105   if (!sourceList){ 
106     Log("Error: no sources found for SDD_Calib");
107     return 2;
108   }
109
110   Int_t ind = 0;
111   while (sourceList->At(ind)!=NULL) {
112     TObjString* tarId = (TObjString*) sourceList->At(ind);
113     TString tarName = GetFile(kDAQ, "SDD_Calib", tarId->GetString().Data());
114     if(tarName.Length()==0){
115       Log(Form("Baseline tar file from source %d not found.",ind));
116       return 2;
117     }
118     sprintf(command,"tar -xf %s",tarName.Data());
119     gSystem->Exec(command);
120     ind++;
121   }
122   delete sourceList;
123   
124   for(Int_t iddl=0;iddl<kNumberOfDDL;iddl++){
125     for(Int_t imod=0;imod<kModulesPerDDL;imod++){
126       Int_t modID=ddlmap->GetModuleNumber(iddl,imod);
127       if(modID==-1) continue;
128       modID-=240; // to have SDD modules numbering from 0 to 260
129       AliITSCalibrationSDD *cal = new AliITSCalibrationSDD("simulated");
130       cal->SetUseCorrectionMaps(0,0); // temporary disabling of maps
131       numOfBadChannels[modID]=0;
132       Int_t badch[kNumberOfChannels];
133       for(Int_t isid=0;isid<=1;isid++){
134         sprintf(inpFileName,"./SDDbase_ddl%02dc%02d_sid%d.data",iddl,imod,isid);
135         FILE* basFil = fopen(inpFileName,"read");
136         if (basFil == 0) {
137           Log(Form("File %s not found.",inpFileName));
138           cal->SetBad();
139           continue;
140         }
141         fscanf(basFil,"%d %d %d\n",&im,&is,&isgoodmod);
142         if(!isgoodmod) cal->SetBad();
143         fscanf(basFil,"%d\n",&th);
144         fscanf(basFil,"%d\n",&tl);
145         cal->SetZSLowThreshold(isid,tl);
146         cal->SetZSHighThreshold(isid,th);
147         for(Int_t ian=0;ian<(kNumberOfChannels/2);ian++){
148           fscanf(basFil,"%d %d %f %d %d %f %f %f %f\n",&i,&isgoodan,&baseline,&basmin,&basoff,&rawnoise,&cmn,&corn,&gain);
149           Int_t ich=ian;
150           if(isid==1) ich+=256;
151           if(!isgoodan){ 
152             Int_t ibad=numOfBadChannels[modID];
153             badch[ibad]=ich;
154             numOfBadChannels[modID]++;
155           }
156           cal->SetBaseline(ich,baseline-basoff);
157           cal->SetNoiseAfterElectronics(ich,rawnoise);
158           cal->SetGain(ich,gain);
159         }
160         cal->SetDeadChannels(numOfBadChannels[modID]);
161         for(Int_t ibad=0;ibad<numOfBadChannels[modID];ibad++){
162           cal->SetBadChannel(ibad,badch[ibad]);
163         }
164         fclose(basFil);
165       }
166       Log(Form("Put calib obj for module %d (DDL %d  Carlos %d)",modID,iddl,imod));
167       calSDD.AddAt(cal,modID);
168     }
169   }
170   AliCDBMetaData *md= new AliCDBMetaData();
171   md->SetResponsible("Francesco Prino");
172   md->SetBeamPeriod(0);
173   md->SetComment("AliITSCalibrationSDD from PEDESTAL+PULSER runs");
174   Bool_t retCode = Store("Calib","CalibSDD",&calSDD,md, 0, kTRUE);
175   if(retCode) return 0;
176   else return 1;
177 }
178 //______________________________________________________________________
179 UInt_t AliITSPreprocessorSDD::ProcessInjector(AliITSDDLModuleMapSDD* ddlmap){
180   // Process FXS files from injector events (INJECTOR or PHYSICS runs)
181   // returns 0 in case of success, 
182   //         1 in case of storage error, 
183   //         2 in case of error with input files
184   TObjArray vdrift(2*kNumberOfSDD);
185   vdrift.SetOwner(kFALSE);
186   Char_t command[100];
187   Char_t inpFileName[100];
188   Int_t evNumb,polDeg; 
189   UInt_t timeStamp;
190   Bool_t modSet[2*kNumberOfSDD]; // flag modules with good inj.
191   for(Int_t ihyb=0; ihyb<2*kNumberOfSDD; ihyb++) modSet[ihyb]=0;
192   Double_t nPt = 0;
193
194   Double_t param[4];    // parameters of poly fit
195   Double_t minValP0=4.; // min value for param[0]
196   Double_t maxValP0=9.; // max value for param[0]
197   Double_t minValP1=0.; // min value for param[1]
198   Double_t aveCoef[4]={0.,0.,0.,0.};  // average param for good mod.
199   Double_t defCoef[4]={6.53227,0.00128941,-5.14493e-06,0};  // default values for param
200   Float_t auxP;
201
202   TList* sourceList = GetFileSources(kDAQ, "SDD_Injec");
203   if (!sourceList){ 
204     Log("Error: no sources found for SDD_Injec");
205     return 2;
206   }
207   Int_t ind = 0;
208   while (sourceList->At(ind)!=NULL) {
209     TObjString* tarId = (TObjString*) sourceList->At(ind);
210     TString tarName = GetFile(kDAQ, "SDD_Injec", tarId->GetString().Data());
211     if(tarName.Length()==0){
212       Log(Form("Injector tar file from source %d not found.",ind));
213       return 2;
214     }
215     sprintf(command,"tar -xf %s",tarName.Data());
216     gSystem->Exec(command);
217     ind++;
218   }
219   delete sourceList;
220
221
222   for(Int_t iddl=0;iddl<kNumberOfDDL;iddl++){
223     for(Int_t imod=0;imod<kModulesPerDDL;imod++){
224       Int_t modID=ddlmap->GetModuleNumber(iddl,imod);
225       if(modID==-1) continue;
226       modID-=240; // to have SDD modules numbering from 0 to 260
227       for(Int_t isid=0;isid<=1;isid++){
228         AliITSDriftSpeedArraySDD *arr=new AliITSDriftSpeedArraySDD();
229         sprintf(inpFileName,"./SDDinj_ddl%02dc%02d_sid%d.data",iddl,imod,isid);
230         FILE* injFil = fopen(inpFileName,"read");
231         if (injFil == 0) {
232           Log(Form("File %s not found.",inpFileName));
233           AliITSDriftSpeedSDD *dsp=new AliITSDriftSpeedSDD();
234           arr->AddDriftSpeed(dsp);
235           vdrift.AddAt(arr,2*modID+isid);
236           continue;
237         }
238         fscanf(injFil,"%d",&polDeg);
239         while (!feof(injFil)){
240           fscanf(injFil,"%d %d ",&evNumb,&timeStamp);
241           if(feof(injFil)) break;
242           for(Int_t ic=0;ic<4;ic++){ 
243             fscanf(injFil,"%f ",&auxP);
244             param[ic]=auxP;
245           }
246
247           if(param[0]>minValP0 && param[0]<maxValP0 && param[1]>minValP1){
248             for(Int_t ic=0;ic<4;ic++) aveCoef[ic]+=param[ic];
249             nPt++;
250             AliITSDriftSpeedSDD *dsp=new AliITSDriftSpeedSDD(evNumb,timeStamp,polDeg,param);
251             arr->AddDriftSpeed(dsp);
252             modSet[2*modID+isid]=1;
253           }
254         }
255         Log(Form("Put calib obj for hybrid %d (DDL %d  Carlos %d)",2*modID+isid,iddl,imod));
256         if(modSet[2*modID+isid]) vdrift.AddAt(arr,2*modID+isid);
257       }
258     }
259   }
260
261   // set drift speed for modules with bad injectors
262   for(Int_t ic=0;ic<4;ic++){ 
263     if(nPt>0) aveCoef[ic]/=nPt; // mean parameters
264     else aveCoef[ic]=defCoef[ic]; // default parameters
265   }
266   AliITSDriftSpeedSDD *avdsp=new AliITSDriftSpeedSDD(evNumb,timeStamp,polDeg,aveCoef);
267
268   for(Int_t ihyb=0; ihyb<2*kNumberOfSDD; ihyb++){
269     if(modSet[ihyb]==0){ 
270       AliWarning(Form("No good injector events for mod. %d --> use average values",ihyb/2));
271       AliITSDriftSpeedArraySDD *arr=new AliITSDriftSpeedArraySDD();
272       arr->AddDriftSpeed(avdsp);
273       vdrift.AddAt(arr,ihyb);
274     }
275   }
276
277
278   AliCDBMetaData *md= new AliCDBMetaData();
279   md->SetResponsible("Francesco Prino");
280   md->SetBeamPeriod(0);
281   md->SetComment("AliITSDriftSpeedSDD from injector events");
282   Bool_t retCode = Store("Calib","DriftSpeedSDD",&vdrift,md,0, kTRUE);
283   if(retCode) return 0;
284   else return 1;
285 }
286 //______________________________________________________________________
287 Bool_t AliITSPreprocessorSDD::ProcessDCSDataPoints(TMap* dcsAliasMap){
288   // Process DCS data
289   AliITSDCSAnalyzerSDD *dcs=new AliITSDCSAnalyzerSDD();
290   dcs->AnalyzeData(dcsAliasMap);
291   TObjArray refDCS(kNumberOfSDD);
292   refDCS.SetOwner(kFALSE);
293   for(Int_t imod=0;imod<kNumberOfSDD;imod++){
294     AliITSDCSDataSDD *dcsdata=dcs->GetDCSData(imod);
295     refDCS.Add(dcsdata);
296   }    
297   AliCDBMetaData *md= new AliCDBMetaData();
298   md->SetResponsible("Francesco Prino");
299   md->SetBeamPeriod(0);
300   md->SetComment("AliITSDCSDataSDD objects from DCS DB");
301   Bool_t retCode = StoreReferenceData("DCS","DataSDD",&refDCS,md);
302   return retCode;
303 }
304